diff --git a/res/values/strings.xml b/res/values/strings.xml index 64b50a2..6d06605 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9,5 +9,6 @@ Sign In Again Authenticating… Please Wait + Please set the authentication parameters in the authentication.xml file. diff --git a/src/org/oclc/mobile/authentication/android/AuthenticatingWebView.java b/src/org/oclc/mobile/authentication/android/AuthenticatingWebView.java index 70ee2d1..4d99824 100644 --- a/src/org/oclc/mobile/authentication/android/AuthenticatingWebView.java +++ b/src/org/oclc/mobile/authentication/android/AuthenticatingWebView.java @@ -1,7 +1,7 @@ package org.oclc.mobile.authentication.android; /******************************************************************************* - * Copyright (c) 2013 OCLC Inc. + * Copyright (c) 2014 OCLC Inc. * * Licensed 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 @@ -23,125 +23,111 @@ import android.webkit.WebViewClient; /** - * This class extends a generic webView to execute an Oauth2 authentication - * process to return a token and its associated parameters for use in calling - * OCLC web services. + * Extends a generic webView to execute an Oauth2 authentication. Returns a token and its associated parameters for use + * in calling OCLC web services. * * @see android.webkit.WebView */ public class AuthenticatingWebView { /** - * The parameters returned by a successful authentication + * Parameters returned by a successful authentication. */ private final HashMap authorizationReturnParameters = new HashMap(); /** - * A browser window used to perform authentication in + * Browser Window that hosts the authentication process. */ private final WebView webView; /** - * A listener for callbacks from webView + * Listener for callbacks from webView. */ private final AuthenticatingWebViewCallbackMethods listener; /** - * Class constructor. - *

- * Store the webview and call back listener into class instance variables - * for later use. + * Stores the webview and call back listener into class instance variables for later use. * - * @param webView the WebView that is handling the authentication - * interaction with the user - * @param listener handle to the callback methods to MainActivity.java + * @param webView the WebView that is handling the authentication interaction with the user. + * @param listener handle to the callback methods to MainActivity.java. */ - public AuthenticatingWebView(final WebView webView, - final AuthenticatingWebViewCallbackMethods listener) { + public AuthenticatingWebView(final WebView webView, final AuthenticatingWebViewCallbackMethods listener) { this.webView = webView; this.listener = listener; } /** - * Sets up the WebView to make a a HTTP GET to the OCLC Authentication - * server to retrieve an access token. + * Sets up the WebView to make a a HTTP GET to the OCLC Authentication server to retrieve an access token. *

* The request URL is of this form: *

- * {baseURL}/authorizeCode?client_id={wskey client - * ID}&authenticatingInstitutionId={Inst ID} &contextInstitutionId={Inst - * ID}&redirect_uri={redirect Url}&response_type={token} &scope={scope_1 - * scope_2 ...} + * {baseURL}/authorizeCode?client_id={wskey client ID}&authenticatingInstitutionId={Inst ID} + * &contextInstitutionId={Inst ID}&redirect_uri={redirect Url}&response_type={token} &scope={scope_1 scope_2 ...} * * @param requestUrl the request URL that initiates the token request */ @SuppressLint("SetJavaScriptEnabled") public final void makeRequest(final String requestUrl) { - /** - * Clear the webView, in case it is showing a previous authentication - * error. Make the webView visible, in case the last attempt succeeded - * and it is hidden. + /* + * Clear the webView, in case it is showing a previous authentication error. Make the webView visible, in case + * the last attempt succeeded and it is hidden. */ webView.loadUrl("about:blank"); webView.setVisibility(View.VISIBLE); - /** + /* * Enable javascript in the WebView (off by default). The annotation */ WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); - /** - * Set the callback function for the webview. Inspect the URL before - * loading to detect successful or failed loads. + /* + * Set the callback function for the webview. Inspect the URL before loading to detect successful or failed + * loads. */ webView.setWebViewClient(new MyCustomWebViewClient()); - /** + /* * Execute the token request */ webView.loadUrl(requestUrl); } /** - * This nested class handles callbacks from webView. + * Handles callbacks from the webView. */ private class MyCustomWebViewClient extends WebViewClient { /** - * Callback executes BEFORE the WebView makes the http request We - * examine the url to see if it contains the redirect URI, and if so - * intercept it, hide the webview and display the token. Note - if - * something goes wrong in the long OAuth2 dance, the user will end up - * with an error displayed on the webview. They can restart sign in by - * pushing the [Sign In Again] button. + * Callback executes BEFORE the WebView makes the http request We examine the url to see if it contains the + * redirect URI, and if so intercept it, hide the webview and display the token. Note - if something goes wrong + * in the long OAuth2 dance, the user will end up with an error displayed on the webview. They can restart sign + * in by pushing the [Sign In Again] button. * * @param view the WebView that executed the callback * @param url the URL that the WebView is about to load * @return returns true to permit the url to be loaded into the webview */ @Override - public boolean shouldOverrideUrlLoading(final WebView view, - final String url) { + public boolean shouldOverrideUrlLoading(final WebView view, final String url) { /* - * Is this the "redirect URI" that we are about to load? If so, - * parse it and don't load it. Parsing is based on the # and the & - * characters, so make sure they are present before accepting this - * as a valid redirect URI. + * Is this the "redirect URI" that we are about to load? If so, parse it and don't load it. Parsing is based + * on the # and the & characters, so make sure they are present before accepting this as a valid redirect + * URI. */ - if (url.indexOf("ncipapp://user_agent_flow#") == 0 - && url.indexOf("&") != -1) { + if (url.indexOf("ncipapp://user_agent_flow#") == 0 && url.indexOf("&") != -1) { parseRedirectURI(url); - /** - * Clear the webView and hide it */ + /* + * Clear the webView and hide it + */ view.loadUrl("about:blank"); webView.setVisibility(View.INVISIBLE); - /** + /* * Display all the parameters returned with the token */ listener.displayResults(authorizationReturnParameters); @@ -150,12 +136,10 @@ public boolean shouldOverrideUrlLoading(final WebView view, } else { - /** - * The url we are about to load is not the "redirect URI", so - * load it. Note that if anything goes wrong with the - * authentication, the last message in the webview, and - * listener.displayResults(authorizationReturnParameters) will - * never be called. + /* + * The url we are about to load is not the "redirect URI", so load it. Note that if anything goes wrong + * with the authentication, the last message in the webview, and + * listener.displayResults(authorizationReturnParameters) will never be called. */ view.loadUrl(url); return true; @@ -163,22 +147,19 @@ public boolean shouldOverrideUrlLoading(final WebView view, } /** - * Callback fires when page starts to load. Used to start the Progress - * Dialog. + * Callback fires when page starts to load. Used to start the Progress Dialog. * * @param view the webView referred to by this callback * @param url the URL that the webView started to load * @param favicon the favicon of the page being loaded */ @Override - public void onPageStarted(final WebView view, final String url, - final Bitmap favicon) { + public void onPageStarted(final WebView view, final String url, final Bitmap favicon) { listener.startProgressDialog(); } /** - * Callback fires when page finishes loading. We use it to turn off the - * Progress Dialog. + * Callback fires when page finishes loading. We use it to turn off the Progress Dialog. * * @param view the webView referred to by this callback * @param url the URL that this page is loading @@ -197,12 +178,13 @@ public void onPageFinished(final WebView view, final String url) { */ private void parseRedirectURI(final String redirectUrl) { - String[] strArr = redirectUrl.split("#")[1].split("&"); + String[] params = redirectUrl.split("#")[1].split("&"); - for (String parameter : strArr) { - if (parameter.indexOf("=") != -1) { - authorizationReturnParameters.put(parameter.split("=")[0], - parameter.split("=")[1]); + for (String parameter : params) { + if (parameter.contains("=")) { + authorizationReturnParameters.put(parameter.split("=")[0], parameter.split("=")[1]); + } else { + authorizationReturnParameters.put(parameter, ""); } } } diff --git a/src/org/oclc/mobile/authentication/android/AuthenticatingWebViewCallbackMethods.java b/src/org/oclc/mobile/authentication/android/AuthenticatingWebViewCallbackMethods.java index 74a93be..ac74302 100644 --- a/src/org/oclc/mobile/authentication/android/AuthenticatingWebViewCallbackMethods.java +++ b/src/org/oclc/mobile/authentication/android/AuthenticatingWebViewCallbackMethods.java @@ -1,7 +1,7 @@ package org.oclc.mobile.authentication.android; /******************************************************************************* - * Copyright (c) 2013 OCLC Inc. + * Copyright (c) 2014 OCLC Inc. * * Licensed 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 @@ -16,15 +16,13 @@ import java.util.HashMap; /** - * This interface defines the callback functions that AuthenticatingWebView.java - * will execute in MainActivity.java, since the MainActivity handles displaying - * results on the screen, and AuthenticatingWebView makes asynchronous http + * This interface defines the callback functions that AuthenticatingWebView.java will execute in MainActivity.java, + * since the MainActivity handles displaying results on the screen, and AuthenticatingWebView makes asynchronous http * requests. */ public interface AuthenticatingWebViewCallbackMethods { /** - * Method is called when it is time to display the progress spinner, for - * example when loading on the web view. + * Method is called when it is time to display the progress spinner, for example when loading on the web view. */ void startProgressDialog(); diff --git a/src/org/oclc/mobile/authentication/android/MainActivity.java b/src/org/oclc/mobile/authentication/android/MainActivity.java index 6785741..cac6275 100644 --- a/src/org/oclc/mobile/authentication/android/MainActivity.java +++ b/src/org/oclc/mobile/authentication/android/MainActivity.java @@ -1,7 +1,7 @@ package org.oclc.mobile.authentication.android; /******************************************************************************* - * Copyright (c) 2013 OCLC Inc. + * Copyright (c) 2014 OCLC Inc. * * Licensed 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 @@ -28,20 +28,18 @@ import android.widget.TextView; /** - * Displays the view for the application and handles UI interaction. The - * following resources are loaded into this Activity: + * Displays the view for the application and handles UI interaction. The following resources are loaded into this + * Activity: *

*

- * This class calls an instance of AuthenticatingWebView to handle the actual - * sign in process with the OCLC Authentication servers. Call back methods are - * defined by interfaces in AuthenticatingWebViewCallbackMethods, so that the - * AuthenticatingWebView can turn an activity indicator on and off, and return - * the authentication results for display. + * This class calls an instance of AuthenticatingWebView to handle the actual sign in process with the OCLC + * Authentication servers. Call back methods are defined by interfaces in AuthenticatingWebViewCallbackMethods, so that + * the AuthenticatingWebView can turn an activity indicator on and off, and return the authentication results for + * display. *

* The request and result parameters are as follows: *

@@ -66,13 +64,12 @@ *

  • expires_at
  • * *

    - * The Cookie Manager, myCookieManager, gives access to this app's cookies so - * that we can clear them when restarting the sign-in activity from scratch. + * The Cookie Manager, myCookieManager, gives access to this app's cookies so that we can clear them when restarting the + * sign-in activity from scratch. * * @see android.app.Activity */ -public class MainActivity extends Activity implements -AuthenticatingWebViewCallbackMethods { +public class MainActivity extends Activity implements AuthenticatingWebViewCallbackMethods { /** * Multiplier to convert seconds to milliseconds @@ -80,14 +77,13 @@ public class MainActivity extends Activity implements private static final int SECONDS_TO_MILLISECONDS = 1000; /** - * An extension that is passed a webview and uses it to handle - * authentication + * An extension that is passed a webview and uses it to handle authentication */ private AuthenticatingWebView authenticatingWebView; /** - * Holds the context of MainActivity so it can be passed to the WebView. The - * WebView uses that context to call back to the MainActivity to + * Holds the context of MainActivity so it can be passed to the WebView. The WebView uses that context to call back + * to the MainActivity to *