| // Copyright 2016 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| import GoogleSignIn |
| import Syncbase |
| import UIKit |
| |
| class LoginViewController: UIViewController, GIDSignInUIDelegate { |
| @IBOutlet weak var signInButton: GIDSignInButton! |
| @IBOutlet weak var spinner: UIActivityIndicatorView! |
| |
| override func viewDidLoad() { |
| super.viewDidLoad() |
| GIDSignIn.sharedInstance().delegate = self |
| GIDSignIn.sharedInstance().uiDelegate = self |
| signInButton.colorScheme = .Light |
| spinner.alpha = 0 |
| // Advance if already logged in or we have exchangable oauth keys. |
| do { |
| if try Syncbase.isLoggedIn() { |
| didSignIn() |
| return |
| } |
| } catch let e { |
| print("Syncbase error: \(e) ") |
| } |
| if GIDSignIn.sharedInstance().hasAuthInKeychain() { |
| showSpinner() |
| GIDSignIn.sharedInstance().signInSilently() |
| } |
| } |
| |
| func didSignIn() { |
| spinner.stopAnimating() |
| spinner.alpha = 0 |
| performSegueWithIdentifier("MainNavControllerSegue", sender: self) |
| } |
| |
| func showSpinner() { |
| signInButton.alpha = 0 |
| spinner.alpha = 1 |
| spinner.startAnimating() |
| } |
| |
| func showSignInButton() { |
| spinner.stopAnimating() |
| spinner.alpha = 0 |
| signInButton.alpha = 1 |
| } |
| |
| func showErrorMsg(msg: String) { |
| let ac = UIAlertController(title: "Oops!", message: msg, preferredStyle: .Alert) |
| ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) |
| presentViewController(ac, animated: true, completion: nil) |
| } |
| } |
| |
| extension LoginViewController: GIDSignInDelegate { |
| func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) { |
| dispatch_async(dispatch_get_main_queue()) { |
| guard error == nil else { |
| self.showSignInButton() |
| print("Got error signing into Google: \(error)") |
| let errorCode = GIDSignInErrorCode(rawValue: error.code) |
| if errorCode != .Canceled && errorCode != .HasNoAuthInKeychain { |
| self.showErrorMsg("Couldn't sign in to Google. Try again.") |
| } |
| return |
| } |
| |
| Syncbase.login(GoogleOAuthCredentials(token: user.authentication.accessToken)) { err in |
| if err == nil { |
| self.didSignIn() |
| } else { |
| print("Unable to login to Syncbase: \(err) ") |
| self.showSignInButton() |
| self.showErrorMsg("Unable to login to Syncbase. Try again.") |
| } |
| } |
| } |
| } |
| } |