blob: b60c9757d0b33d319db37a7cb8f891a249dae560 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "WXScannerHistoryVC.h"
#import "DemoDefine.h"
#import "WXDemoViewController.h"
#import "UIViewController+WXDemoNaviBar.h"
#import <CoreText/CoreText.h>
@interface WXScannerHistoryVC ()
@property(nonatomic)NSMutableArray * scanner_history;
@property(nonatomic)UIImageView * qrCodeImageView;
@end
@implementation WXScannerHistoryVC
- (instancetype)init {
if (self = [super init]) {
_scanner_history = [[[NSUserDefaults standardUserDefaults] objectForKey:WX_SCANNER_HISTORY] mutableCopy];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupNaviBar];
UITapGestureRecognizer * tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)];
[self.tableView addGestureRecognizer:tapGestureRecognizer];
tapGestureRecognizer.delegate = self;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadHistory) name:NSUserDefaultsDidChangeNotification object:nil];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 88.0f;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [_scanner_history count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"WX_SCANNER_HISTORY_CELL"];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WX_SCANNER_HISTORY_CELL" forIndexPath:indexPath];
if (!cell) {
cell = [UITableViewCell new];
}
UILongPressGestureRecognizer * longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPressGesture.minimumPressDuration = 1.0;
longPressGesture.delegate = self;
[cell addGestureRecognizer:longPressGesture];
NSMutableAttributedString * attributeString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%ld %@",(long)indexPath.row+1,[_scanner_history objectAtIndex:indexPath.row]]];
[attributeString addAttribute:(NSString*)NSForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 1)];
NSDictionary<NSString*, id> *attributes = @{
NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName: [UIFont boldSystemFontOfSize:25.0],
};
[attributeString addAttributes:attributes range:NSMakeRange(0, 2)];
cell.textLabel.attributedText = attributeString;
cell.textLabel.numberOfLines = 0;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *urlStr = _scanner_history[indexPath.row];
if (urlStr) {
WXDemoViewController * demoVC = [WXDemoViewController new];
demoVC.url = [NSURL URLWithString:urlStr];
[self.navigationController pushViewController:demoVC animated:YES];
}
}
- (void)reloadHistory
{
if ([_scanner_history count]) {
[_qrCodeImageView removeFromSuperview];
[_scanner_history removeAllObjects];
_scanner_history = [[[NSUserDefaults standardUserDefaults] objectForKey:WX_SCANNER_HISTORY] mutableCopy];
[self.tableView reloadData];
}
}
- (void)handleClick:(UITapGestureRecognizer*)gestureRecognizer
{
CGPoint clickPoint = [gestureRecognizer locationInView:self.tableView];
if (!CGRectContainsPoint(_qrCodeImageView.frame, clickPoint)) {
[_qrCodeImageView removeFromSuperview];
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
if ([_qrCodeImageView superview]) {
return YES;
}
}
if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
return YES;
}
return NO;
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
return ;
}
CGPoint pressPoint = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pressPoint];
if (indexPath == nil) {
return;
}
NSString * url = _scanner_history[indexPath.row];
UIImage * qrCodeImage = [self getQRCodeWithData:url size:CGSizeMake(300, 300)];
_qrCodeImageView.contentMode = UIViewContentModeScaleAspectFill;
if (![_qrCodeImageView superview]) {
_qrCodeImageView = [[UIImageView alloc] initWithImage:qrCodeImage];
[_qrCodeImageView setCenter:self.view.center];
[self.view addSubview:_qrCodeImageView];
}else {
_qrCodeImageView.image = qrCodeImage;
}
}
- (UIImage*)getQRCodeWithData:(NSString*)url size:(CGSize)size {
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
NSString *info = url;
NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:infoData forKeyPath:@"inputMessage"];
CIImage *outputImage = [filter outputImage];
CGRect extent = CGRectIntegral(outputImage.extent);
CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.width/CGRectGetHeight(extent));
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:outputImage fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
*/
/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
*/
/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/
/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end