From c6caa72daeaf33d04f1a712ff666729a2205ea2f Mon Sep 17 00:00:00 2001 From: Gabriel Wong Date: Thu, 7 Sep 2017 08:33:27 +0700 Subject: [PATCH] Migrate KMWebBrowserViewController to Swift --- .../Keyman/Keyman.xcodeproj/project.pbxproj | 20 +- .../BookmarksViewController.swift | 2 +- .../KMWebBrowser/KMWebBrowserViewController.h | 16 - .../KMWebBrowser/KMWebBrowserViewController.m | 347 ------------------ .../WebBrowserViewController.swift | 289 +++++++++++++++ ...oller.xib => WebBrowserViewController.xib} | 17 +- .../Keyman/Keyman/Keyman-Bridging-Header.h | 1 - ios/keyman/Keyman/Keyman/MainViewController.m | 7 +- 8 files changed, 313 insertions(+), 386 deletions(-) delete mode 100644 ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.h delete mode 100644 ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.m create mode 100644 ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.swift rename ios/keyman/Keyman/Keyman/KMWebBrowser/{KMWebBrowserViewController.xib => WebBrowserViewController.xib} (88%) diff --git a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj index 5587675e0a..52db0643cd 100644 --- a/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj +++ b/ios/keyman/Keyman/Keyman.xcodeproj/project.pbxproj @@ -85,8 +85,7 @@ 982D149D19FF462A007D4629 /* textsize_selected@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 982D148719FF462A007D4629 /* textsize_selected@3x.png */; }; 982D149F19FF462A007D4629 /* textsize_up@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 982D148819FF462A007D4629 /* textsize_up@3x.png */; }; 982D14A119FF462A007D4629 /* textsize@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 982D148919FF462A007D4629 /* textsize@3x.png */; }; - 9845A7AA1A43983300544E2E /* KMWebBrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9845A79C1A43983300544E2E /* KMWebBrowserViewController.m */; }; - 9845A7AB1A43983300544E2E /* KMWebBrowserViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9845A79D1A43983300544E2E /* KMWebBrowserViewController.xib */; }; + 9845A7AB1A43983300544E2E /* WebBrowserViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9845A79D1A43983300544E2E /* WebBrowserViewController.xib */; }; 9845A7AC1A43983300544E2E /* kmwb-navbar-Landscape-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9845A79F1A43983300544E2E /* kmwb-navbar-Landscape-568h@2x.png */; }; 9845A7AD1A43983300544E2E /* kmwb-navbar-Landscape-568h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9845A7A01A43983300544E2E /* kmwb-navbar-Landscape-568h@3x.png */; }; 9845A7AE1A43983300544E2E /* kmwb-navbar-Landscape.png in Resources */ = {isa = PBXBuildFile; fileRef = 9845A7A11A43983300544E2E /* kmwb-navbar-Landscape.png */; }; @@ -189,6 +188,7 @@ C0A1A6311F5E4F4300EAF822 /* InfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A1A6301F5E4F4300EAF822 /* InfoViewController.swift */; }; C0A1A6331F5E749000EAF822 /* SetUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A1A6321F5E749000EAF822 /* SetUpViewController.swift */; }; C0A1A6351F5E786A00EAF822 /* BookmarksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A1A6341F5E786A00EAF822 /* BookmarksViewController.swift */; }; + C0A1A6371F5E8C9100EAF822 /* WebBrowserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A1A6361F5E8C9100EAF822 /* WebBrowserViewController.swift */; }; C0FF769B1F5D368C00BD23C3 /* KeyboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FF769A1F5D368C00BD23C3 /* KeyboardViewController.swift */; }; C0FF769E1F5D4ECB00BD23C3 /* ActivityItemProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FF769D1F5D4ECB00BD23C3 /* ActivityItemProvider.swift */; }; CE06AA681F171CA0006D91C3 /* Keyman.h in Headers */ = {isa = PBXBuildFile; fileRef = 98D418F71769486C008D2FF3 /* Keyman.h */; }; @@ -263,9 +263,7 @@ 982D148719FF462A007D4629 /* textsize_selected@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "textsize_selected@3x.png"; path = "Keyman Icons/textsize_selected@3x.png"; sourceTree = ""; }; 982D148819FF462A007D4629 /* textsize_up@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "textsize_up@3x.png"; path = "Keyman Icons/textsize_up@3x.png"; sourceTree = ""; }; 982D148919FF462A007D4629 /* textsize@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "textsize@3x.png"; path = "Keyman Icons/textsize@3x.png"; sourceTree = ""; }; - 9845A79B1A43983300544E2E /* KMWebBrowserViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMWebBrowserViewController.h; sourceTree = ""; }; - 9845A79C1A43983300544E2E /* KMWebBrowserViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMWebBrowserViewController.m; sourceTree = ""; }; - 9845A79D1A43983300544E2E /* KMWebBrowserViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMWebBrowserViewController.xib; sourceTree = ""; }; + 9845A79D1A43983300544E2E /* WebBrowserViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = WebBrowserViewController.xib; sourceTree = ""; }; 9845A79F1A43983300544E2E /* kmwb-navbar-Landscape-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "kmwb-navbar-Landscape-568h@2x.png"; sourceTree = ""; }; 9845A7A01A43983300544E2E /* kmwb-navbar-Landscape-568h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "kmwb-navbar-Landscape-568h@3x.png"; sourceTree = ""; }; 9845A7A11A43983300544E2E /* kmwb-navbar-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "kmwb-navbar-Landscape.png"; sourceTree = ""; }; @@ -405,6 +403,7 @@ C0A1A6301F5E4F4300EAF822 /* InfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = InfoViewController.swift; sourceTree = ""; tabWidth = 2; }; C0A1A6321F5E749000EAF822 /* SetUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = SetUpViewController.swift; sourceTree = ""; tabWidth = 2; }; C0A1A6341F5E786A00EAF822 /* BookmarksViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = BookmarksViewController.swift; sourceTree = ""; tabWidth = 2; }; + C0A1A6361F5E8C9100EAF822 /* WebBrowserViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = WebBrowserViewController.swift; sourceTree = ""; tabWidth = 2; }; C0FF76991F5D368B00BD23C3 /* SWKeyboard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SWKeyboard-Bridging-Header.h"; sourceTree = ""; }; C0FF769A1F5D368C00BD23C3 /* KeyboardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.swift; path = KeyboardViewController.swift; sourceTree = ""; tabWidth = 2; }; C0FF769C1F5D4ECA00BD23C3 /* Keyman-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Keyman-Bridging-Header.h"; sourceTree = ""; }; @@ -454,11 +453,10 @@ children = ( 9845A8BD1A439F1000544E2E /* Icons */, 9845A8DC1A439FB200544E2E /* BookmarksViewController.xib */, - 9845A79B1A43983300544E2E /* KMWebBrowserViewController.h */, - 9845A79C1A43983300544E2E /* KMWebBrowserViewController.m */, - 9845A79D1A43983300544E2E /* KMWebBrowserViewController.xib */, + 9845A79D1A43983300544E2E /* WebBrowserViewController.xib */, 9845A79E1A43983300544E2E /* NavBar */, C0A1A6341F5E786A00EAF822 /* BookmarksViewController.swift */, + C0A1A6361F5E8C9100EAF822 /* WebBrowserViewController.swift */, ); path = KMWebBrowser; sourceTree = ""; @@ -1068,7 +1066,7 @@ 982D149F19FF462A007D4629 /* textsize_up@3x.png in Resources */, 982D149119FF462A007D4629 /* 711-trash@3x.png in Resources */, 982D148D19FF462A007D4629 /* 702-share@3x.png in Resources */, - 9845A7AB1A43983300544E2E /* KMWebBrowserViewController.xib in Resources */, + 9845A7AB1A43983300544E2E /* WebBrowserViewController.xib in Resources */, 9822CB691A3A77D200D73CAA /* MainViewController_.xib in Resources */, 9845A8741A439B8F00544E2E /* font-size-a.png in Resources */, ); @@ -1132,7 +1130,7 @@ 981AFA7B19EF44DE006706BF /* main.m in Sources */, 9845A7CF1A439A9200544E2E /* GetStartedViewController.m in Sources */, 981AFA7C19EF44DE006706BF /* AppDelegate.m in Sources */, - 9845A7AA1A43983300544E2E /* KMWebBrowserViewController.m in Sources */, + C0A1A6371F5E8C9100EAF822 /* WebBrowserViewController.swift in Sources */, 9845A7BC1A4398B200544E2E /* KMDropDownListView.m in Sources */, 981AFA7F19EF44DE006706BF /* MainViewController.m in Sources */, C0A1A6351F5E786A00EAF822 /* BookmarksViewController.swift in Sources */, @@ -1295,6 +1293,7 @@ "-force_load", Keyman/libKeyman/libKeyman.a, ); + "OTHER_SWIFT_FLAGS[arch=*]" = "-D DEBUG"; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -1377,7 +1376,6 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = NO; - "OTHER_SWIFT_FLAGS[arch=*]" = "-D DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = Tavultesoft.Keyman.SWKeyboard; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = "5d7c5750-a8be-473c-80ef-ed8773404e65"; diff --git a/ios/keyman/Keyman/Keyman/KMWebBrowser/BookmarksViewController.swift b/ios/keyman/Keyman/Keyman/KMWebBrowser/BookmarksViewController.swift index f38d8d9efd..f5fac08d01 100644 --- a/ios/keyman/Keyman/Keyman/KMWebBrowser/BookmarksViewController.swift +++ b/ios/keyman/Keyman/Keyman/KMWebBrowser/BookmarksViewController.swift @@ -15,7 +15,7 @@ let bookmarkUrlKey: String = "BookMarkUrl" class BookmarksViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate { - weak var webBrowser: KMWebBrowserViewController? + weak var webBrowser: WebBrowserViewController? @IBOutlet var tableView: UITableView! @IBOutlet var doneButton: UIBarButtonItem! diff --git a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.h b/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.h deleted file mode 100644 index e8e4e6d2e7..0000000000 --- a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// KMWebBrowserViewController.h -// Keyman -// -// Created by Serkan Kurt on 9/12/2014. -// Copyright (c) 2017 SIL International. All rights reserved. -// - -#import - -@interface KMWebBrowserViewController : UIViewController - -@property (strong, nonatomic) IBOutlet UIWebView *webView; -@property (strong, nonatomic) NSString *fontFamily; - -@end diff --git a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.m b/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.m deleted file mode 100644 index 031bfbf1ea..0000000000 --- a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.m +++ /dev/null @@ -1,347 +0,0 @@ -// -// KMWebBrowserViewController.m -// Keyman -// -// Created by Serkan Kurt on 9/12/2014. -// Copyright (c) 2017 SIL International. All rights reserved. -// - -#import "KMWebBrowserViewController.h" -#import "AppDelegate.h" -#import "UIImage+Helpers.h" -#import "KMManager.h" -#import - -@interface KMWebBrowserViewController () - -@property (strong, nonatomic) IBOutlet UINavigationBar *navBar; -@property (strong, nonatomic) IBOutlet UIToolbar *toolBar; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *navBarTopConstraint; -@property (strong, nonatomic) UITextField *addressField; -@property (strong, nonatomic) UIView *rightView; -@property (strong, nonatomic) UIButton *refreshButton; -@property (strong, nonatomic) UIButton *stopButton; -@property (strong, nonatomic) IBOutlet UIBarButtonItem *backButton; -@property (strong, nonatomic) IBOutlet UIBarButtonItem *forwardButton; -@property (strong, nonatomic) IBOutlet UIBarButtonItem *bookmarksButton; -@property (strong, nonatomic) IBOutlet UIBarButtonItem *globeButton; -@property (strong, nonatomic) IBOutlet UIBarButtonItem *closeButton; -@property (strong, nonatomic) NSString *nFontFamily; - -@end - -@implementation KMWebBrowserViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardChanged:) name:kKeymanKeyboardChangedNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardPickerDismissed:) name:kKeymanKeyboardPickerDismissedNotification object:nil]; - - self.webView.delegate = self; - self.webView.scalesPageToFit = YES; - - // Setup NavigationBar - CGRect screenRect = [[UIScreen mainScreen] bounds]; - UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - CGFloat size = screenRect.size.height > screenRect.size.width?screenRect.size.height:screenRect.size.width; - if (size > 568.0) { - // Navbar for iPhone 6 & 6 Plus - UIImage *bgImg = nil; - if (UIInterfaceOrientationIsPortrait(orientation)) - bgImg = [[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] - resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) - resizingMode:UIImageResizingModeStretch]; - else - bgImg = [[UIImage imageNamed:@"kmwb-navbar-Landscape-568h.png"] - resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) - resizingMode:UIImageResizingModeStretch]; - - [self.navBar setBackgroundImage:bgImg forBarMetrics:UIBarMetricsDefault]; - //[self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Landscape-568h.png"] forBarMetrics:UIBarMetricsCompact]; - } - else if (size == 568) { - // Navbar for iPhone and iPod Touch with 4" Display - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] forBarMetrics:UIBarMetricsDefault]; - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Landscape-568h.png"] forBarMetrics:UIBarMetricsCompact]; - } - else if (size < 568.0) { - // Navbar for iPhone and iPod Touch with 3.5" Display - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] forBarMetrics:UIBarMetricsDefault]; - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Landscape.png"] forBarMetrics:UIBarMetricsCompact]; - } - } - else { - // Navbar for iPad - if (UIInterfaceOrientationIsPortrait(orientation)) - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] forBarMetrics:UIBarMetricsDefault]; - else - [self.navBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Landscape.png"] forBarMetrics:UIBarMetricsDefault]; - } - - // Setup address field - CGRect addressFrame = CGRectMake(10, 4.0, self.navBar.frame.size.width - 20, 28); - self.addressField = [[UITextField alloc] initWithFrame:addressFrame]; - self.addressField.clearButtonMode = UITextFieldViewModeWhileEditing; - self.addressField.rightViewMode = UITextFieldViewModeUnlessEditing; - self.addressField.autoresizingMask = UIViewAutoresizingFlexibleWidth; - self.addressField.borderStyle = UITextBorderStyleRoundedRect; - self.addressField.autocapitalizationType = UITextAutocapitalizationTypeNone; - self.addressField.autocorrectionType = UITextAutocorrectionTypeNo; - self.addressField.font = [UIFont systemFontOfSize:17]; - self.addressField.placeholder = @"http://"; - self.addressField.text = @""; - self.addressField.keyboardType = UIKeyboardTypeURL; - [self.addressField addTarget:self - action:@selector(loadAddress:event:) - forControlEvents:UIControlEventEditingDidEndOnExit]; - - [self.navBar addSubview:self.addressField]; - - self.rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 28)]; - self.addressField.rightView = self.rightView; - - UIImage *refreshIcon = [[UIImage imageNamed:@"UIButtonBarRefresh.png"] - scaleToSize:CGSizeMake(18, 22)]; - if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) - refreshIcon = [refreshIcon imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; - self.refreshButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [self.refreshButton setImage:refreshIcon forState:UIControlStateNormal]; - [self.refreshButton setFrame:self.rightView.frame]; - [self.refreshButton addTarget:self - action:@selector(refresh:) - forControlEvents:UIControlEventTouchUpInside]; - [self.refreshButton setHidden:YES]; - [self.rightView addSubview:self.refreshButton]; - - UIImage *stopIcon = [[UIImage imageNamed:@"UIButtonBarStop.png"] - scaleToSize:CGSizeMake(17, 17)]; - if ([UIImage instancesRespondToSelector:@selector(imageWithRenderingMode:)]) - stopIcon = [stopIcon imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; - - self.stopButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [self.stopButton setImage:stopIcon forState:UIControlStateNormal]; - [self.stopButton setFrame:self.rightView.frame]; - [self.stopButton addTarget:self - action:@selector(stop:) - forControlEvents:UIControlEventTouchUpInside]; - [self.stopButton setHidden:YES]; - [self.rightView addSubview:self.stopButton]; - - [self updateButtons]; - - NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - NSString *lastUrlStr = [userData objectForKey:@"KMWebBrowserLastURL"]; - if (lastUrlStr == nil) - lastUrlStr = @"http://www.google.com/"; - NSURL *url = [NSURL URLWithString:lastUrlStr]; - NSURLRequest *request = [NSURLRequest requestWithURL:url]; - [self.webView loadRequest:request]; -} - -- (void)viewWillAppear:(BOOL)animated{ - [super viewWillAppear:animated]; - - self.navBarTopConstraint.constant = [AppDelegate statusBarHeight]; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { - UIInterfaceOrientation orientation = toInterfaceOrientation; - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - CGRect screenRect = [[UIScreen mainScreen] bounds]; - CGFloat size = screenRect.size.height > screenRect.size.width?screenRect.size.height:screenRect.size.width; - if (size > 568.0) { - // Navbar for iPhone 6 & 6 Plus - UIImage *bgImg = nil; - if (UIInterfaceOrientationIsPortrait(orientation)) - bgImg = [[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] - resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) - resizingMode:UIImageResizingModeStretch]; - else - bgImg = [[UIImage imageNamed:@"kmwb-navbar-Landscape-568h.png"] - resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0) - resizingMode:UIImageResizingModeStretch]; - - [self.navigationController.navigationBar setBackgroundImage:bgImg - forBarMetrics:UIBarMetricsDefault]; - } - } - else { - if (UIInterfaceOrientationIsPortrait(orientation)) - [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Portrait.png"] forBarMetrics:UIBarMetricsDefault]; - else - [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"kmwb-navbar-Landscape.png"] forBarMetrics:UIBarMetricsDefault]; - } -} - -- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { - self.navBarTopConstraint.constant = [AppDelegate statusBarHeight]; -} - -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -- (void)loadAddress:(id)sender event:(UIEvent *)event { - NSString *urlString = self.addressField.text; - NSURL *url = [NSURL URLWithString:urlString]; - if (!url.scheme) - url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", urlString]]; - - NSURLRequest *request = [NSURLRequest requestWithURL:url]; - [self.webView loadRequest:request]; -} - -- (void)updateAddress:(NSURLRequest*)request { - NSURL *url = [request mainDocumentURL]; - self.addressField.text = [url absoluteString]; - NSUserDefaults *userData = [NSUserDefaults standardUserDefaults]; - [userData setObject:[url absoluteString] forKey:@"KMWebBrowserLastURL"]; - [userData synchronize]; -} - -- (void)refresh:(id)sender { - [self.webView reload]; -} - -- (void)stop:(id)sender { - [self.webView stopLoading]; -} - -- (IBAction)back:(id)sender { - [self.webView goBack]; -} - -- (IBAction)forward:(id)sender { - [self.webView goForward]; -} - -- (IBAction)bookmarks:(id)sender { - BookmarksViewController *bookmarksVC = [[BookmarksViewController alloc] init]; - bookmarksVC.webBrowser = self; - [self presentViewController:bookmarksVC animated:YES completion:nil]; -} - -- (IBAction)globe:(id)sender { - [[KMManager sharedInstance] showKeyboardPickerInViewController:self shouldAddKeyboard:NO]; -} - -- (IBAction)close:(id)sender { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - UIWebViewDelegate methods - -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { - [self updateAddress:request]; - return YES; -} - -- (void)webViewDidStartLoad:(UIWebView *)webView { - [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; - [self updateButtons]; -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; - [self appendCSSFontFamily]; - [self updateButtons]; -} - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; - [self updateButtons]; - - if (error.code == -1003 || error.code == -1009) { - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Cannot Open Page" - message:error.localizedDescription - delegate:self - cancelButtonTitle:@"OK" - otherButtonTitles:nil]; - [alert show]; - } - - /* - NSString *htmlFormat = - @"" - @"" - @"" - @"" - @"" - @"" - @"%@" - @"" - @"" - @"

%@

" - @"" - @""; - if (error.code == -1003 || error.code == -1009) { - NSString *html = [NSString stringWithFormat:htmlFormat, - @"Cannot Open Page", error.localizedDescription]; - [self.webView loadHTMLString:html baseURL:self.webView.request.URL]; - } - */ -} - -- (void)updateButtons { - self.refreshButton.hidden = self.webView.loading; - self.stopButton.hidden = !self.webView.loading; - self.backButton.enabled = self.webView.canGoBack; - self.forwardButton.enabled = self.webView.canGoForward; -} - -- (void)appendCSSFontFamily { - NSString *jsStr = [NSString stringWithFormat: - @"var style = document.createElement('style');" - "style.type = 'text/css';" - "style.innerHTML = '*{font-family:\"%@\" !important;}';" - "document.getElementsByTagName('head')[0].appendChild(style);", self.fontFamily]; - [self.webView stringByEvaluatingJavaScriptFromString:jsStr]; -} - -- (void)setFontFamily:(NSString *)fontFamily { - _fontFamily = fontFamily; - _nFontFamily = [NSString stringWithString:fontFamily]; -} - -- (void)keyboardChanged:(NSNotification *)notification { - NSDictionary *kbInfo = [[notification userInfo] objectForKey:kKeymanKeyboardInfoKey]; - NSString *kbID = [kbInfo objectForKey:kKeymanKeyboardIdKey]; - NSString *langID = [kbInfo objectForKey:kKeymanLanguageIdKey]; - NSString *fontName = [[KMManager sharedInstance] fontNameForKeyboardWithID:kbID languageID:langID]; - if (fontName != nil) - _nFontFamily = [NSString stringWithString:fontName]; - else - _nFontFamily = [NSString stringWithString:[UIFont systemFontOfSize:[UIFont systemFontSize]].fontName]; -} - -- (void)keyboardPickerDismissed:(NSNotification *)notification { - if (![_nFontFamily isEqualToString:_fontFamily]) { - self.fontFamily = [NSString stringWithString:_nFontFamily]; - [self.webView reload]; - } -} - -@end diff --git a/ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.swift b/ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.swift new file mode 100644 index 0000000000..64479ecf7d --- /dev/null +++ b/ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.swift @@ -0,0 +1,289 @@ +// +// WebBrowserViewController.swift +// Keyman +// +// Created by Gabriel Wong on 2017-09-05. +// Copyright © 2017 SIL International. All rights reserved. +// + +import Foundation +import UIKit + +class WebBrowserViewController: UIViewController, UIWebViewDelegate, UIAlertViewDelegate { + @IBOutlet var webView: UIWebView! + @IBOutlet var navBar: UINavigationBar! + @IBOutlet var toolBar: UIToolbar! + @IBOutlet var navBarTopConstraint: NSLayoutConstraint! + var addressField: UITextField! + var rightView: UIView! + var refreshButton: UIButton! + var stopButton: UIButton! + @IBOutlet var backButton: UIBarButtonItem! + @IBOutlet var forwardButton: UIBarButtonItem! + @IBOutlet var bookmarksButton: UIBarButtonItem! + @IBOutlet var globeButton: UIBarButtonItem! + @IBOutlet var closeButton: UIBarButtonItem! + + var fontFamily: String = UIFont.systemFont(ofSize: UIFont.systemFontSize).fontName + var newFontFamily: String = "" + + let webBrowserLastURLKey = "KMWebBrowserLastURL" + + override func viewDidLoad() { + super.viewDidLoad() + + NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardChanged), name: NSNotification.Name.keymanKeyboardChanged, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardPickerDismissed), name: NSNotification.Name.keymanKeyboardPickerDismissed, object: nil) + + webView.delegate = self + webView.scalesPageToFit = true + + // Setup NavigationBar + let screenRect = UIScreen.main.bounds + let orientation = UIApplication.shared.statusBarOrientation + if UIDevice.current.userInterfaceIdiom == .phone { + let size = CGFloat.maximum(screenRect.size.height, screenRect.size.width) + if size > 568.0 { + // Navbar for iPhone 6 & 6 Plus + let bgImg: UIImage? + if UIInterfaceOrientationIsPortrait(orientation) { + bgImg = UIImage(named: "kmwb-navbar-Portrait.png")?.resizableImage(withCapInsets: UIEdgeInsetsMake(0, 0, 0, 0), resizingMode: .stretch) + } + else { + bgImg = UIImage(named: "kmwb-navbar-Landscape-568h.png")?.resizableImage(withCapInsets: UIEdgeInsetsMake(0, 0, 0, 0), resizingMode: .stretch) + } + navBar.setBackgroundImage(bgImg, for: UIBarMetrics.default) + } + else if size == 568 { + // Navbar for iPhone and iPod Touch with 4" Display + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Portrait.png"), for: UIBarMetrics.default) + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Landscape-568h.png"), for: UIBarMetrics.compact) + } + else if size < 568.0 { + // Navbar for iPhone and iPod Touch with 3.5" Display + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Portrait.png"), for: UIBarMetrics.default) + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Landscape.png"), for: UIBarMetrics.compact) + } + } + else { + // Navbar for iPad + if UIInterfaceOrientationIsPortrait(orientation) { + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Portrait.png"), for: UIBarMetrics.default) + } + else { + navBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Landscape.png"), for: UIBarMetrics.default) + } + } + + // Setup address field + let addressFrame = CGRect(x: 10, y: 4.0, width: navBar.frame.size.width - 20, height: 28) + addressField = UITextField(frame: addressFrame) + addressField.clearButtonMode = .whileEditing + addressField.rightViewMode = .unlessEditing + addressField.autoresizingMask = .flexibleWidth + addressField.borderStyle = .roundedRect + addressField.autocapitalizationType = .none + addressField.autocorrectionType = .no + addressField.font = UIFont.systemFont(ofSize: 17) + addressField.placeholder = "http://" + addressField.text = "" + addressField.keyboardType = UIKeyboardType.URL + addressField.addTarget(self, action: #selector(self.loadAddress), for: .editingDidEndOnExit) + navBar.addSubview(addressField) + + rightView = UIView(frame: CGRect(x: 0, y: 0, width: 40, height: 28)) + addressField.rightView = rightView + + let refreshSize = CGSize(width: 18, height: 22) + let refreshIcon = UIImage(named: "UIButtonBarRefresh.png")?.resize(to: refreshSize).withRenderingMode(.alwaysOriginal) + refreshButton = UIButton(type: UIButtonType.system) + refreshButton.setImage(refreshIcon, for: .normal) + refreshButton.frame = rightView.frame + refreshButton.addTarget(self, action: #selector(self.refresh), for: .touchUpInside) + refreshButton.isHidden = true + rightView.addSubview(refreshButton) + + let stopSize = CGSize(width: 17, height: 17) + let stopIcon = UIImage(named: "UIButtonBarStop.png")?.resize(to: stopSize).withRenderingMode(.alwaysOriginal) + stopButton = UIButton(type: UIButtonType.system) + stopButton.setImage(stopIcon, for: .normal) + stopButton.frame = rightView.frame + stopButton.addTarget(self, action: #selector(self.stop), for: .touchUpInside) + stopButton.isHidden = true + rightView.addSubview(stopButton) + + updateButtons() + + let userData = UserDefaults.standard + let lastUrlStr = userData.object(forKey: webBrowserLastURLKey) as? String ?? "https://www.google.com/" + if let url = URL(string: lastUrlStr) { + let request = URLRequest(url: url) + webView.loadRequest(request) + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + navBarTopConstraint.constant = AppDelegate.statusBarHeight() + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) { + let orientation: UIInterfaceOrientation = toInterfaceOrientation + if UIDevice.current.userInterfaceIdiom == .phone { + let screenRect: CGRect = UIScreen.main.bounds + let size: CGFloat = screenRect.size.height > screenRect.size.width ? screenRect.size.height : screenRect.size.width + if size > 568.0 { + // Navbar for iPhone 6 & 6 Plus + var bgImg: UIImage? = nil + if UIInterfaceOrientationIsPortrait(orientation) { + bgImg = UIImage(named: "kmwb-navbar-Portrait.png")?.resizableImage(withCapInsets: UIEdgeInsetsMake(0, 0, 0, 0), resizingMode: .stretch) + } + else { + bgImg = UIImage(named: "kmwb-navbar-Landscape-568h.png")?.resizableImage(withCapInsets: UIEdgeInsetsMake(0, 0, 0, 0), resizingMode: .stretch) + } + navigationController?.navigationBar.setBackgroundImage(bgImg, for: UIBarMetrics.default) + } + } + else { + if UIInterfaceOrientationIsPortrait(orientation) { + navigationController?.navigationBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Portrait.png"), for: UIBarMetrics.default) + } + else { + navigationController?.navigationBar.setBackgroundImage(UIImage(named: "kmwb-navbar-Landscape.png"), for: UIBarMetrics.default) + } + } + } + + override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) { + navBarTopConstraint.constant = AppDelegate.statusBarHeight() + } + + func loadAddress(_ sender: Any, event: UIEvent) { + guard let urlString = addressField?.text, var url = URL(string: urlString) else { + NSLog("Attempting to load invalid URL: %@", addressField?.text ?? "nil") + return + } + if url.scheme == nil { + url = URL(string: "http://\(urlString)") ?? url + } + let request = URLRequest(url: url) + webView.loadRequest(request) + } + + func updateAddress(_ request: URLRequest) { + let url: URL? = request.mainDocumentURL + addressField.text = url?.absoluteString + let userData = UserDefaults.standard + userData.set(url?.absoluteString, forKey: "KMWebBrowserLastURL") + userData.synchronize() + } + + func refresh(_ sender: Any) { + webView.reload() + } + + func stop(_ sender: Any?) { + webView.stopLoading() + } + + @IBAction func back(_ sender: Any) { + webView.goBack() + } + + @IBAction func forward(_ sender: Any) { + webView.goForward() + } + + @IBAction func bookmarks(_ sender: Any) { + let bookmarksVC = BookmarksViewController() + bookmarksVC.webBrowser = self + present(bookmarksVC, animated: true, completion: nil) + } + + @IBAction func globe(_ sender: Any) { + KMManager.sharedInstance().showKeyboardPicker(in: self, shouldAddKeyboard: false) + } + + func close(_ sender: Any?) { + dismiss(animated: true, completion: nil) + } + + // MARK: - UIWebViewDelegate methods + func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { + updateAddress(request) + return true + } + + func webViewDidStartLoad(_ webView: UIWebView) { + UIApplication.shared.isNetworkActivityIndicatorVisible = true + updateButtons() + } + + func webViewDidFinishLoad(_ webView: UIWebView) { + UIApplication.shared.isNetworkActivityIndicatorVisible = false + appendCSSFontFamily() + updateButtons() + } + + func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { + UIApplication.shared.isNetworkActivityIndicatorVisible = false + updateButtons() + let alert = UIAlertView(title: "Cannot Open Page", + message: error.localizedDescription, + delegate: self, + cancelButtonTitle: "OK", + otherButtonTitles: "") + alert.show() + } + + func updateButtons() { + refreshButton.isHidden = webView.isLoading + stopButton.isHidden = !webView.isLoading + backButton.isEnabled = webView.canGoBack + forwardButton.isEnabled = webView.canGoForward + } + + func appendCSSFontFamily() { + let jsStr: String = "var style = document.createElement('style');" + + "style.type = 'text/css';" + + "style.innerHTML = '*{font-family:\"\(fontFamily)\" !important;}';" + + "document.getElementsByTagName('head')[0].appendChild(style);" + webView?.stringByEvaluatingJavaScript(from: jsStr) + } + + func keyboardChanged(_ notification: Notification) { + let kbInfo = notification.userInfo?[kKeymanKeyboardInfoKey] as? [AnyHashable: Any] ?? [AnyHashable: Any]() + if let kbID = kbInfo[kKeymanKeyboardIdKey] as? String, let langID = kbInfo[kKeymanLanguageIdKey] as? String { + newFontFamily = KMManager.sharedInstance().fontNameForKeyboard(withID: kbID, languageID: langID) + } + else { + newFontFamily = UIFont.systemFont(ofSize: UIFont.systemFontSize).fontName + } + } + + func keyboardPickerDismissed(_ notification: Notification) { + if !(newFontFamily == fontFamily) { + fontFamily = newFontFamily + webView?.reload() + } + } +} + +extension UIImage { + func resize(to newSize: CGSize) -> UIImage { + let horizontalRatio = newSize.width / size.width + let verticalRatio = newSize.height / size.height + + let ratio = max(horizontalRatio, verticalRatio) + let newSize = CGSize(width: size.width * ratio, height: size.height * ratio) + UIGraphicsBeginImageContextWithOptions(newSize, true, 0) + draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize)) + let newImage = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return newImage! + } +} diff --git a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.xib b/ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.xib similarity index 88% rename from ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.xib rename to ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.xib index cd78d7ad26..91903fc3c0 100644 --- a/ios/keyman/Keyman/Keyman/KMWebBrowser/KMWebBrowserViewController.xib +++ b/ios/keyman/Keyman/Keyman/KMWebBrowser/WebBrowserViewController.xib @@ -1,10 +1,15 @@ - - + + + + + - + + + - + @@ -31,7 +36,7 @@ - + @@ -68,7 +73,7 @@ - + diff --git a/ios/keyman/Keyman/Keyman/Keyman-Bridging-Header.h b/ios/keyman/Keyman/Keyman/Keyman-Bridging-Header.h index bace653e71..cdb387e8ba 100644 --- a/ios/keyman/Keyman/Keyman/Keyman-Bridging-Header.h +++ b/ios/keyman/Keyman/Keyman/Keyman-Bridging-Header.h @@ -5,4 +5,3 @@ #import "AppDelegate.h" #import "Keyman.h" #import "Reachability.h" -#import "KMWebBrowserViewController.h" diff --git a/ios/keyman/Keyman/Keyman/MainViewController.m b/ios/keyman/Keyman/Keyman/MainViewController.m index c5e70a5957..dfff1b279a 100644 --- a/ios/keyman/Keyman/Keyman/MainViewController.m +++ b/ios/keyman/Keyman/Keyman/MainViewController.m @@ -9,7 +9,6 @@ #import "MainViewController.h" #import "AppDelegate.h" #import "GetStartedViewController.h" -#import "KMWebBrowserViewController.h" #import "KMDropDownListView.h" #import "UIImage+Helpers.h" #import "CoreText/CTFontManager.h" @@ -1534,9 +1533,9 @@ NSUInteger const minIOSVersion4FontInstall = 7; - (void)showKMWebBrowserView:(id)sender { [popover dismissPopoverAnimated:NO]; [self dismissDropDownMenu]; - KMWebBrowserViewController *kmWebBrowserVC = [[KMWebBrowserViewController alloc] init]; - [kmWebBrowserVC setFontFamily:[[textView font] fontName]]; - [self presentViewController:kmWebBrowserVC animated:YES completion:nil]; + WebBrowserViewController *webBrowserVC = [[WebBrowserViewController alloc] init]; + [webBrowserVC setFontFamily:[[textView font] fontName]]; + [self presentViewController:webBrowserVC animated:YES completion:nil]; } #endif