Skip to content

Commit

Permalink
Code review fixes, javadoc fixes, set width to 120 chars, moved 'miss…
Browse files Browse the repository at this point in the history
…ing params' message to a string file.
  • Loading branch information
campbelg committed Jan 14, 2014
1 parent ba10835 commit 4fc1d0a
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 215 deletions.
1 change: 1 addition & 0 deletions res/values/strings.xml
Expand Up @@ -9,5 +9,6 @@
<string name="sign_in">Sign In Again</string>
<string name="authenticating">Authenticating&#8230;</string>
<string name="please_wait">Please Wait</string>
<string name="authParamsNotSet">Please set the authentication parameters in the authentication.xml file.</string>

</resources>
114 changes: 48 additions & 66 deletions 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
Expand All @@ -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<String, String> authorizationReturnParameters = new HashMap<String, String>();

/**
* 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.
* <p>
* 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.
* <p>
* The request URL is of this form:
* <p>
* {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);
Expand All @@ -150,35 +136,30 @@ 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;
}
}

/**
* 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
Expand All @@ -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, "");
}
}
}
Expand Down
@@ -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
Expand All @@ -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();

Expand Down

0 comments on commit 4fc1d0a

Please sign in to comment.