From fe3952bfeb003e915205fe3404d6038d4826daa0 Mon Sep 17 00:00:00 2001 From: Gabriel Wong Date: Tue, 12 Sep 2017 15:17:29 +0700 Subject: [PATCH] Migrate KeyboardInfoViewController to Swift --- .../KeymanEngine.xcodeproj/project.pbxproj | 18 +- .../KeyboardInfoViewController.h | 21 -- .../KeyboardInfoViewController.m | 285 ------------------ .../KeyboardInfoViewController.swift | 176 +++++++++++ .../KeyboardPickerViewController.m | 2 +- 5 files changed, 181 insertions(+), 321 deletions(-) delete mode 100644 ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.h delete mode 100644 ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.m create mode 100644 ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.swift diff --git a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj index 4784d613d7..a99d513881 100644 --- a/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj +++ b/ios/engine/KMEI/KeymanEngine.xcodeproj/project.pbxproj @@ -61,17 +61,12 @@ 9878F77E1B8BF07E00360B8D /* UIView+Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 9878F7701B8BF00F00360B8D /* UIView+Helpers.m */; }; 987F00071AB8FD0A00998116 /* KMKeyboardMenuView.m in Sources */ = {isa = PBXBuildFile; fileRef = 987F00061AB8FD0A00998116 /* KMKeyboardMenuView.m */; }; 987F3E9F1941AAB700209D4F /* KMKeyPreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 989FDF91193C1C7100EECAF9 /* KMKeyPreviewView.m */; }; - 987F3EA01941AAC900209D4F /* KeyboardInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 989BDF31193D8CEC00278BBC /* KeyboardInfoViewController.m */; }; 987F3EA11941AAE900209D4F /* KMKeyPreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 989FDF91193C1C7100EECAF9 /* KMKeyPreviewView.m */; }; - 987F3EA21941AAF800209D4F /* KeyboardInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 989BDF31193D8CEC00278BBC /* KeyboardInfoViewController.m */; }; 987F3EA31941ABF600209D4F /* KMKeyPreviewView.h in Headers */ = {isa = PBXBuildFile; fileRef = 989FDF90193C1C7100EECAF9 /* KMKeyPreviewView.h */; }; - 987F3EA41941AC0800209D4F /* KeyboardInfoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 989BDF30193D8CEC00278BBC /* KeyboardInfoViewController.h */; }; 987F3EA51941AC2700209D4F /* KMKeyPreviewView.h in Headers */ = {isa = PBXBuildFile; fileRef = 989FDF90193C1C7100EECAF9 /* KMKeyPreviewView.h */; }; - 987F3EA61941AC3400209D4F /* KeyboardInfoViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 989BDF30193D8CEC00278BBC /* KeyboardInfoViewController.h */; }; 988B36B61ADF67290008752C /* inuktitut_pirurvik-1.0.js in Resources */ = {isa = PBXBuildFile; fileRef = 988B36B51ADF67290008752C /* inuktitut_pirurvik-1.0.js */; }; 988B36B91ADF728A0008752C /* inuktitut_latin-1.0.js in Resources */ = {isa = PBXBuildFile; fileRef = 988B36B71ADF728A0008752C /* inuktitut_latin-1.0.js */; }; 988B36BA1ADF728A0008752C /* inuktitut_naqittaut-1.0.js in Resources */ = {isa = PBXBuildFile; fileRef = 988B36B81ADF728A0008752C /* inuktitut_naqittaut-1.0.js */; }; - 989BDF32193D8CEC00278BBC /* KeyboardInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 989BDF31193D8CEC00278BBC /* KeyboardInfoViewController.m */; }; 989FDF92193C1C7100EECAF9 /* KMKeyPreviewView.m in Sources */ = {isa = PBXBuildFile; fileRef = 989FDF91193C1C7100EECAF9 /* KMKeyPreviewView.m */; }; 98ACCE0817A9EEEB00B7C780 /* KeyboardPickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 98C2648717A0F59900940E4F /* KeyboardPickerViewController.m */; }; 98ACCE0917A9EF0700B7C780 /* LanguageDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 98C0B11617A204BF007ECAFC /* LanguageDetailViewController.m */; }; @@ -114,6 +109,7 @@ C08C620C1F6792A200268D03 /* KeyboardPickerBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C08C620B1F6792A200268D03 /* KeyboardPickerBarButtonItem.swift */; }; C08C62101F67BD4500268D03 /* KeyboardPickerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C08C620F1F67BD4500268D03 /* KeyboardPickerButton.swift */; }; C08C62131F67C31100268D03 /* KeyboardNameTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C08C62121F67C31100268D03 /* KeyboardNameTableViewCell.swift */; }; + C08C62151F67C8D500268D03 /* KeyboardInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C08C62141F67C8D500268D03 /* KeyboardInfoViewController.swift */; }; C0A5FF371F6682EB00BE740C /* PopoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A5FF361F6682EB00BE740C /* PopoverView.swift */; }; CE25CCBD1F1DA7BB005AA2BC /* KMHTTPDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = CE25CCBC1F1DA7BB005AA2BC /* KMHTTPDownloader.m */; }; CE25CCBE1F1DA7BB005AA2BC /* KMHTTPDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = CE25CCBC1F1DA7BB005AA2BC /* KMHTTPDownloader.m */; }; @@ -232,8 +228,6 @@ 988B36B51ADF67290008752C /* inuktitut_pirurvik-1.0.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "inuktitut_pirurvik-1.0.js"; path = "Keyboards/inuktitut_pirurvik-1.0.js"; sourceTree = SOURCE_ROOT; }; 988B36B71ADF728A0008752C /* inuktitut_latin-1.0.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "inuktitut_latin-1.0.js"; path = "Keyboards/inuktitut_latin-1.0.js"; sourceTree = SOURCE_ROOT; }; 988B36B81ADF728A0008752C /* inuktitut_naqittaut-1.0.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "inuktitut_naqittaut-1.0.js"; path = "Keyboards/inuktitut_naqittaut-1.0.js"; sourceTree = SOURCE_ROOT; }; - 989BDF30193D8CEC00278BBC /* KeyboardInfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyboardInfoViewController.h; sourceTree = ""; }; - 989BDF31193D8CEC00278BBC /* KeyboardInfoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KeyboardInfoViewController.m; sourceTree = ""; }; 989FDF90193C1C7100EECAF9 /* KMKeyPreviewView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMKeyPreviewView.h; sourceTree = ""; }; 989FDF91193C1C7100EECAF9 /* KMKeyPreviewView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMKeyPreviewView.m; sourceTree = ""; }; 98B34AB817F3B82000DF079E /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -255,6 +249,7 @@ C08C620B1F6792A200268D03 /* KeyboardPickerBarButtonItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardPickerBarButtonItem.swift; sourceTree = ""; }; C08C620F1F67BD4500268D03 /* KeyboardPickerButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardPickerButton.swift; sourceTree = ""; }; C08C62121F67C31100268D03 /* KeyboardNameTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardNameTableViewCell.swift; sourceTree = ""; }; + C08C62141F67C8D500268D03 /* KeyboardInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyboardInfoViewController.swift; sourceTree = ""; }; C0A5FF351F6682EA00BE740C /* KMEI-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "KMEI-Bridging-Header.h"; sourceTree = ""; }; C0A5FF361F6682EB00BE740C /* PopoverView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopoverView.swift; sourceTree = ""; }; CE25CCBC1F1DA7BB005AA2BC /* KMHTTPDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMHTTPDownloader.m; sourceTree = ""; }; @@ -595,8 +590,7 @@ F2607212158FBCB500F37184 /* KeyboardPicker */ = { isa = PBXGroup; children = ( - 989BDF30193D8CEC00278BBC /* KeyboardInfoViewController.h */, - 989BDF31193D8CEC00278BBC /* KeyboardInfoViewController.m */, + C08C62141F67C8D500268D03 /* KeyboardInfoViewController.swift */, 98C2648617A0F59900940E4F /* KeyboardPickerViewController.h */, 98C2648717A0F59900940E4F /* KeyboardPickerViewController.m */, 98C0B11517A204BF007ECAFC /* LanguageDetailViewController.h */, @@ -739,7 +733,6 @@ CE25CCC61F1F2325005AA2BC /* KMHTTPDownloader.h in Headers */, 98EF3BA719A5B05000A1365F /* KMSubKeysView.h in Headers */, 980CC8E519D522060089BB57 /* KMURLProtocol.h in Headers */, - 987F3EA41941AC0800209D4F /* KeyboardInfoViewController.h in Headers */, 987F3EA31941ABF600209D4F /* KMKeyPreviewView.h in Headers */, 98ACCE0F17A9EFA500B7C780 /* KeyboardPickerViewController.h in Headers */, 98ACCE0E17A9EF9700B7C780 /* LanguageViewController.h in Headers */, @@ -763,7 +756,6 @@ 98EF3BA819A5B06100A1365F /* KMSubKeysView.h in Headers */, CE25CCC41F1F2310005AA2BC /* KMHTTPDownloader.h in Headers */, CE25CCC51F1F2314005AA2BC /* KMHTTPDownloadRequest.h in Headers */, - 987F3EA61941AC3400209D4F /* KeyboardInfoViewController.h in Headers */, 987F3EA51941AC2700209D4F /* KMKeyPreviewView.h in Headers */, 98ACCE1717A9F03000B7C780 /* KeyboardPickerViewController.h in Headers */, 98ACCE1617A9F02300B7C780 /* LanguageViewController.h in Headers */, @@ -1004,6 +996,7 @@ C08C62131F67C31100268D03 /* KeyboardNameTableViewCell.swift in Sources */, 987F00071AB8FD0A00998116 /* KMKeyboardMenuView.m in Sources */, 980CC8E419D51F3C0089BB57 /* KMURLProtocol.m in Sources */, + C08C62151F67C8D500268D03 /* KeyboardInfoViewController.swift in Sources */, CE25CCC31F1DBF6F005AA2BC /* KMHTTPDownloadRequest.m in Sources */, F273AB9915641EC500A47CEE /* KMManager.m in Sources */, CECB38951F2199BC0098882F /* Reachability.m in Sources */, @@ -1012,7 +1005,6 @@ 9878F7731B8BF00F00360B8D /* UIView+Helpers.m in Sources */, C0A5FF371F6682EB00BE740C /* PopoverView.swift in Sources */, 98F9D6F019545AB60087AA43 /* KMInputViewController.m in Sources */, - 989BDF32193D8CEC00278BBC /* KeyboardInfoViewController.m in Sources */, 989FDF92193C1C7100EECAF9 /* KMKeyPreviewView.m in Sources */, CE25CCBD1F1DA7BB005AA2BC /* KMHTTPDownloader.m in Sources */, 9878F7711B8BF00F00360B8D /* NSString+Helpers.m in Sources */, @@ -1032,7 +1024,6 @@ 98EF3BA619A5B03800A1365F /* KMSubKeysView.m in Sources */, 98F9D6F7195463390087AA43 /* KMInputViewController.m in Sources */, 9878F7741B8BF01F00360B8D /* NSString+Helpers.m in Sources */, - 987F3EA01941AAC900209D4F /* KeyboardInfoViewController.m in Sources */, 987F3E9F1941AAB700209D4F /* KMKeyPreviewView.m in Sources */, 98ACCE0817A9EEEB00B7C780 /* KeyboardPickerViewController.m in Sources */, 98F9D692195402F90087AA43 /* KMTextView.m in Sources */, @@ -1059,7 +1050,6 @@ 98EF3BA919A5B07100A1365F /* KMSubKeysView.m in Sources */, 98F9D6F61954632A0087AA43 /* KMInputViewController.m in Sources */, 9878F7751B8BF01F00360B8D /* NSString+Helpers.m in Sources */, - 987F3EA21941AAF800209D4F /* KeyboardInfoViewController.m in Sources */, 987F3EA11941AAE900209D4F /* KMKeyPreviewView.m in Sources */, 98ACCE1317A9EFED00B7C780 /* KeyboardPickerViewController.m in Sources */, 98ACCE1217A9EFE100B7C780 /* LanguageViewController.m in Sources */, diff --git a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.h b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.h deleted file mode 100644 index 3c58ee14a3..0000000000 --- a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// KeyboardInfoViewController.h -// KeymanEngine -// -// Created by Serkan Kurt on 3/06/2014. -// Copyright (c) 2017 SIL International. All rights reserved. -// - -#import - -@interface KeyboardInfoViewController : UITableViewController - -@property (nonatomic, assign) NSUInteger keyboardCount; -@property (nonatomic, assign) NSInteger keyboardIndex; -@property (nonatomic, strong) NSString *keyboardID; -@property (nonatomic, strong) NSString *languageID; -@property (nonatomic, strong) NSString *keyboardVersion; -@property (nonatomic, strong) NSString *keyboardCopyright; -@property (assign) BOOL isCustomKeyboard; - -@end diff --git a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.m b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.m deleted file mode 100644 index 7128b73dcc..0000000000 --- a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.m +++ /dev/null @@ -1,285 +0,0 @@ -// -// KeyboardInfoViewController.m -// KeymanEngine -// -// Created by Serkan Kurt on 3/06/2014. -// Copyright (c) 2017 SIL International. All rights reserved. -// - -#import "KeyboardInfoViewController.h" -#import "KMManager+Internal.h" - -#define KMBackgroundQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) - -@interface KeyboardInfoViewController () - @property (nonatomic, strong) NSMutableArray *infoArray; - @property (nonatomic, strong) NSDictionary *kbDict; -@end - -@implementation KeyboardInfoViewController -@synthesize keyboardCount, keyboardIndex; -@synthesize keyboardID, languageID, keyboardVersion, keyboardCopyright; -@synthesize infoArray, isCustomKeyboard; - -- (id)initWithStyle:(UITableViewStyle)style -{ - self = [super initWithStyle:style]; - if (self) { - // Custom initialization - } - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - // Copyright info is disabled - /* - NSString *kbCopyright; - NSString *deviceType = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)?@"iphone":@"ipad"; - NSString *urlStr = [NSString stringWithFormat:@"%@languages/%@/%@?device=%@", kKeymanApiBaseURL, languageID, keyboardID, deviceType]; - - if (keyboardCopyright == nil || ![keyboardCopyright length]) { - kbCopyright = @"Unknown"; - dispatch_async(KMBackgroundQueue, ^{ - NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr]]; - [self performSelectorOnMainThread:@selector(fetchedKeyboardData:) - withObject:data waitUntilDone:YES]; - }); - } - else - kbCopyright = keyboardCopyright; - */ - - infoArray = [[NSMutableArray alloc] initWithCapacity:3]; - [infoArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Keyboard version", @"title", keyboardVersion, @"subtitle", nil]]; - //[infoArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Copyright", @"title", kbCopyright, @"subtitle", nil]]; - if (!isCustomKeyboard) { - [infoArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Help link", @"title", @"", @"subtitle", nil]]; - } - [infoArray addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@"Delete", @"title", @"", @"subtitle", nil]]; - - // Uncomment the following line to preserve selection between presentations. - // self.clearsSelectionOnViewWillAppear = NO; - - // Uncomment the following line to display an Edit button in the navigation bar for this view controller. - // self.navigationItem.rightBarButtonItem = self.editButtonItem; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self.navigationController setToolbarHidden:YES animated:YES]; -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -#pragma mark - Table view data source - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - if (isCustomKeyboard) - return 2; - else - return 3; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *cellIdentifier = @"Cell"; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; - } - - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - if (!isCustomKeyboard) { - if( indexPath.row == 1) { - NSString *helpUrlStr = [NSString stringWithFormat:@"http://help.keyman.com/keyboard/%@/%@/", keyboardID, keyboardVersion]; - [[UIApplication sharedApplication] openURL:[NSURL URLWithString:helpUrlStr]]; - } - else if (indexPath.row == 2) { - [self showDeleteKeyboard]; - } - } - else if (indexPath.row == 1) { - [self showDeleteKeyboard]; - } -} - -/* -// 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. -} -*/ - -- (void)fetchedKeyboardData:(NSData *)data { - NSError *error; - NSDictionary *json = [NSJSONSerialization - JSONObjectWithData:data - options:0 - error:&error]; - if (error == nil) { - NSArray *keyboards = [[json objectForKey:kKeymanLanguageKey] objectForKey:kKeymanLanguageKeyboardsKey]; - NSDictionary *kbDict = [keyboards objectAtIndex:0]; - NSMutableDictionary *info = [infoArray objectAtIndex:1]; - NSString *copyright = [kbDict objectForKey:kKeymanKeyboardCopyrightKey]; - if (copyright == nil) - copyright = @"Unknown"; - - [info setObject:copyright forKey:@"subtitle"]; - [infoArray replaceObjectAtIndex:1 withObject:info]; - [self.tableView reloadData]; - } -} - -#pragma mark - Table view delegate - -- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { - [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; - [cell setAccessoryType:UITableViewCellAccessoryNone]; - cell.textLabel.text = [[infoArray objectAtIndex:indexPath.row] objectForKey:@"title"]; - cell.detailTextLabel.text = [[infoArray objectAtIndex:indexPath.row] objectForKey:@"subtitle"]; - cell.tag = indexPath.row; - if (!isCustomKeyboard) { - if (indexPath.row == 1) - [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; - else if (indexPath.row == 2 && ![self canDeleteKeyboard]) { - cell.userInteractionEnabled = NO; - cell.textLabel.enabled = NO; - cell.detailTextLabel.enabled = NO; - } - } - else if (indexPath.row == 1 && ![self canDeleteKeyboard]) { - cell.userInteractionEnabled = NO; - cell.textLabel.enabled = NO; - cell.detailTextLabel.enabled = NO; - } -} - -- (BOOL)isCurrentKeyboard { - if ([[KMManager sharedInstance].keyboardID isEqualToString:keyboardID] && [[KMManager sharedInstance].languageID isEqualToString:languageID]) { - return YES; - } - else { - return NO; - } -} - -- (BOOL)canDeleteKeyboard { - if (![[KMManager sharedInstance] canRemoveKeyboards]) - return NO; - - if (![[KMManager sharedInstance] canRemoveDefaultKeyboard]) { - if (keyboardIndex == 0) - return NO; - else - return YES; - } - else { - if (keyboardIndex > 0) - return YES; - else if (keyboardCount > 1) - return YES; - else - return NO; - } -} - -- (void)showDeleteKeyboard { - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:self.title - message:@"Would you like to delete this keyboard?" - delegate:self - cancelButtonTitle:@"Cancel" - otherButtonTitles:@"Delete", nil]; - alert.tag = 1; - [alert show]; -} - -#pragma mark - Alert view delegate - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if (buttonIndex == alertView.cancelButtonIndex) - return; - - if (alertView.tag == 1) { - NSUserDefaults *userData = [[KMManager sharedInstance] activeUserDefaults]; - NSArray *userKeyboards = [userData arrayForKey:kKeymanUserKeyboardsListKey]; - NSDictionary *kbDict = [NSDictionary dictionaryWithDictionary:[userKeyboards objectAtIndex:keyboardIndex]]; - - if ([[KMManager sharedInstance] removeKeyboardAtIndex:keyboardIndex]) { - if ([self isCurrentKeyboard]) { - NSString *kbID = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanKeyboardIdKey]; - NSString *langID = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanLanguageIdKey]; - NSString *kbName = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanKeyboardNameKey]; - NSString *langName = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanLanguageNameKey]; - NSString *font = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanFontKey]; - NSString *oskFont = [[userKeyboards objectAtIndex:0] objectForKey:kKeymanOskFontKey]; - [[KMManager sharedInstance] setKeyboardWithID:kbID languageID:langID keyboardName:kbName languageName:langName font:font oskFont:oskFont]; - } - - [[NSNotificationCenter defaultCenter] postNotificationName:kKeymanKeyboardRemovedNotification - object:self - userInfo:[NSDictionary dictionaryWithObjectsAndKeys:kbDict, kKeymanKeyboardInfoKey, nil]]; - [self.navigationController popToRootViewControllerAnimated:YES]; - } - } -} - -@end diff --git a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.swift b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.swift new file mode 100644 index 0000000000..c5c08f849d --- /dev/null +++ b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardInfoViewController.swift @@ -0,0 +1,176 @@ +// +// KeyboardInfoViewController.swift +// KeymanEngine +// +// Created by Gabriel Wong on 2017-09-12. +// Copyright © 2017 SIL International. All rights reserved. +// + +import UIKit + +class KeyboardInfoViewController: UITableViewController, UIAlertViewDelegate { + var keyboardCount: Int = 0 + var keyboardIndex: Int = 0 + var keyboardID: String = "" + var languageID: String = "" + var keyboardVersion: String = "" + var keyboardCopyright: String = "" + var isCustomKeyboard: Bool = false + var infoArray = [[String: String]]() + + override func viewDidLoad() { + super.viewDidLoad() + + infoArray = [[String: String]]() + infoArray.append([ + "title": "Keyboard version", + "subtitle": keyboardVersion + ]) + + if !isCustomKeyboard { + infoArray.append([ + "title": "Help link", + "subtitle": "" + ]) + } + infoArray.append([ + "title": "Delete", + "subtitle": "" + ]) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + navigationController?.setToolbarHidden(true, animated: true) + } + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if isCustomKeyboard { + return 2 + } else { + return 3 + } + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cellIdentifier = "Cell" + if let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) { + return cell + } + return UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if !isCustomKeyboard { + if indexPath.row == 1 { + let helpUrlStr = "http://help.keyman.com/keyboard/\(keyboardID)/\(keyboardVersion)/" + UIApplication.shared.openURL(URL(string: helpUrlStr)!) + } else if indexPath.row == 2 { + showDeleteKeyboard() + } + } else if indexPath.row == 1 { + showDeleteKeyboard() + } + } + + func fetchedKeyboardData(_ data: Data) { + guard let json = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [AnyHashable: Any] else { + return + } + let keyboards = json[kKeymanLanguageKey] as? [Any] + let kbDict = keyboards?[0] as? [AnyHashable: Any] + var info = infoArray[1] + let copyright = kbDict?[kKeymanKeyboardCopyrightKey] as? String ?? "Unknown" + + info["subtitle"] = copyright + infoArray[1] = info + tableView.reloadData() + } + + override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + cell.selectionStyle = .none + cell.accessoryType = .none + cell.textLabel?.text = infoArray[indexPath.row]["title"] + cell.detailTextLabel?.text = infoArray[indexPath.row]["subtitle"] + cell.tag = indexPath.row + + if !isCustomKeyboard { + if indexPath.row == 1 { + cell.accessoryType = .disclosureIndicator + } else if indexPath.row == 2 && !canDeleteKeyboard() { + cell.isUserInteractionEnabled = false + cell.textLabel?.isEnabled = false + cell.detailTextLabel?.isEnabled = false + } + } else if indexPath.row == 1 && !canDeleteKeyboard() { + cell.isUserInteractionEnabled = false + cell.textLabel?.isEnabled = false + cell.detailTextLabel?.isEnabled = false + } + } + + func isCurrentKeyboard() -> Bool { + return KMManager.sharedInstance().keyboardID == keyboardID && + KMManager.sharedInstance().languageID == languageID + } + + func canDeleteKeyboard() -> Bool { + if !KMManager.sharedInstance().canRemoveKeyboards { + return false + } + + if !KMManager.sharedInstance().canRemoveDefaultKeyboard { + return keyboardIndex != 0 + } + + if keyboardIndex > 0 { + return true + } + return keyboardCount > 1 + } + + func showDeleteKeyboard() { + let alert = UIAlertView(title: title ?? "", + message: "Would you like to delete this keyboard?", + delegate: self, + cancelButtonTitle: "Cancel", + otherButtonTitles: "Delete") + alert.tag = 1 + alert.show() + } + + func alertView(_ alertView: UIAlertView, clickedButtonAt buttonIndex: Int) { + if buttonIndex == alertView.cancelButtonIndex { + return + } + + if alertView.tag == 1 { + let userData = KMManager.sharedInstance().activeUserDefaults() + let userKeyboards = userData!.array(forKey: kKeymanUserKeyboardsListKey) as! [[String: String]] + let kbDict = userKeyboards[keyboardIndex] + + if KMManager.sharedInstance().removeKeyboard(at: UInt(keyboardIndex)) { + if isCurrentKeyboard() { + // Select default keyboard + + let kbID = userKeyboards[0][kKeymanKeyboardIdKey] + let langID = userKeyboards[0][kKeymanLanguageIdKey] + let kbName = userKeyboards[0][kKeymanKeyboardNameKey] + let langName = userKeyboards[0][kKeymanLanguageNameKey] + let font = userKeyboards[0][kKeymanFontKey] + let oskFont = userKeyboards[0][kKeymanOskFontKey] + KMManager.sharedInstance().setKeyboardWithID(kbID, languageID: langID, + keyboardName: kbName, languageName: langName, font: font, oskFont: oskFont) + } + NotificationCenter.default.post(name: NSNotification.Name.keymanKeyboardRemoved, + object: self, userInfo: [ kKeymanKeyboardInfoKey: kbDict ] + ) + navigationController?.popToRootViewController(animated: true) + } + } + } +} diff --git a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardPickerViewController.m b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardPickerViewController.m index e7139ee55a..a688ea7ab1 100644 --- a/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardPickerViewController.m +++ b/ios/engine/KMEI/KeymanEngine/Classes/LanguagePicker/KeyboardPickerViewController.m @@ -8,8 +8,8 @@ #import "KeyboardPickerViewController.h" #import "LanguageViewController.h" -#import "KeyboardInfoViewController.h" #import "KMManager+Internal.h" +#import static const NSInteger kmErrorAlertTag = -1; static const NSInteger kmToolbarButtonTag = 100;