diff options
Diffstat (limited to 'main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java | 251 |
1 files changed, 126 insertions, 125 deletions
diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index 14e0b33..81311f1 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -1,15 +1,20 @@ package cgeo.geocaching.network; +import butterknife.InjectView; + import cgeo.geocaching.R; +import cgeo.geocaching.R.string; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; +import ch.boye.httpclientandroidlib.ParseException; import ch.boye.httpclientandroidlib.client.entity.UrlEncodedFormEntity; import ch.boye.httpclientandroidlib.util.EntityUtils; - import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import android.app.ProgressDialog; import android.content.Intent; @@ -19,27 +24,31 @@ import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; -import android.widget.EditText; import android.widget.TextView; +import java.io.IOException; import java.util.regex.Pattern; public abstract class OAuthAuthorizationActivity extends AbstractActivity { - private String host; - private String pathRequest; - private String pathAuthorize; - private String pathAccess; - private boolean https; - private String consumerKey; - private String consumerSecret; + public static final int NOT_AUTHENTICATED = 0; + public static final int AUTHENTICATED = 1; + + @NonNull final private String host; + @NonNull final private String pathRequest; + @NonNull final private String pathAuthorize; + @NonNull final private String pathAccess; + private final boolean https; + @NonNull final private String consumerKey; + @NonNull final private String consumerSecret; + @NonNull final private String callback; private String OAtoken = null; private String OAtokenSecret = null; private final Pattern paramsPattern1 = Pattern.compile("oauth_token=([a-zA-Z0-9\\-\\_.]+)"); private final Pattern paramsPattern2 = Pattern.compile("oauth_token_secret=([a-zA-Z0-9\\-\\_.]+)"); - private Button startButton = null; - private EditText pinEntry = null; - private Button pinEntryButton = null; + @InjectView(R.id.start) protected Button startButton; + @InjectView(R.id.auth_1) protected TextView auth_1; + @InjectView(R.id.auth_2) protected TextView auth_2; private ProgressDialog requestTokenDialog = null; private ProgressDialog changeTokensDialog = null; private Handler requestTokenHandler = new Handler() { @@ -55,10 +64,6 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { if (msg.what == 1) { startButton.setText(getAuthAgain()); - - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); } else { showToast(getErrAuthInitialize()); startButton.setText(getAuthStart()); @@ -74,33 +79,26 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { changeTokensDialog.dismiss(); } - pinEntryButton.setOnClickListener(new ConfirmPINListener()); - pinEntryButton.setEnabled(true); - - if (msg.what == 1) { + if (msg.what == AUTHENTICATED) { showToast(getAuthDialogCompleted()); - - pinEntryButton.setVisibility(View.GONE); - setResult(RESULT_OK); finish(); } else { showToast(getErrAuthProcess()); - - pinEntry.setVisibility(View.GONE); - pinEntryButton.setVisibility(View.GONE); startButton.setText(getAuthStart()); } } }; - public OAuthAuthorizationActivity(String host, - String pathRequest, - String pathAuthorize, - String pathAccess, - boolean https, - String consumerKey, - String consumerSecret) { + public OAuthAuthorizationActivity + (@NonNull String host, + @NonNull String pathRequest, + @NonNull String pathAuthorize, + @NonNull String pathAccess, + boolean https, + @NonNull String consumerKey, + @NonNull String consumerSecret, + @NonNull String callback) { this.host = host; this.pathRequest = pathRequest; this.pathAuthorize = pathAuthorize; @@ -108,6 +106,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { this.https = https; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; + this.callback = callback; } @Override @@ -116,26 +115,14 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTitle(getAuthTitle()); - init(); - } - - private void init() { - startButton = (Button) findViewById(R.id.start); - pinEntry = (EditText) findViewById(R.id.pin); - pinEntryButton = (Button) findViewById(R.id.pin_button); - - TextView auth = (TextView) findViewById(R.id.auth_1); - auth.setText(getAboutAuth1()); - auth = (TextView) findViewById(R.id.auth_2); - auth.setText(getAboutAuth2()); + auth_1.setText(getAuthExplainShort()); + auth_2.setText(getAuthExplainLong()); ImmutablePair<String, String> tempToken = getTempTokens(); OAtoken = tempToken.left; OAtokenSecret = tempToken.right; startButton.setText(getAuthAuthorize()); - pinEntryButton.setText(getAuthFinish()); - startButton.setEnabled(true); startButton.setOnClickListener(new StartListener()); @@ -145,60 +132,74 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { } else { // already have temporary tokens, continue from pin startButton.setText(getAuthAgain()); + } + } - pinEntry.setHint(getAuthPinHint()); - pinEntry.setVisibility(View.VISIBLE); - pinEntryButton.setVisibility(View.VISIBLE); - pinEntryButton.setOnClickListener(new ConfirmPINListener()); + @Override + public void onNewIntent(final Intent intent) { + setIntent(intent); + } + + @Override + public void onResume() { + super.onResume(); + final Uri uri = getIntent().getData(); + if (uri != null) { + final String verifier = uri.getQueryParameter("oauth_verifier"); + if (StringUtils.isNotBlank(verifier)) { + exchangeTokens(verifier); + } else { + // We can shortcut the whole verification process if we do not have a token at all. + changeTokensHandler.sendEmptyMessage(NOT_AUTHENTICATED); + } } } private void requestToken() { + final Parameters params = new Parameters(); + params.put("oauth_callback", callback); + final String method = "GET"; + OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); + final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); + int status = 0; - try { - final Parameters params = new Parameters(); - params.put("oauth_callback", "oob"); - final String method = "GET"; - OAuth.signOAuth(host, pathRequest, method, https, params, null, null, consumerKey, consumerSecret); - final String line = Network.getResponseData(Network.getRequest(getUrlPrefix() + host + pathRequest, params)); - - if (StringUtils.isNotBlank(line)) { - final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); - if (paramsMatcher1.find()) { - OAtoken = paramsMatcher1.group(1); - } - final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); - if (paramsMatcher2.find()) { - OAtokenSecret = paramsMatcher2.group(1); - } + if (StringUtils.isNotBlank(line)) { + assert line != null; + final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); + if (paramsMatcher1.find()) { + OAtoken = paramsMatcher1.group(1); + } + final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); + if (paramsMatcher2.find()) { + OAtokenSecret = paramsMatcher2.group(1); + } - if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { - setTempTokens(OAtoken, OAtokenSecret); - try { - final Parameters paramsBrowser = new Parameters(); - paramsBrowser.put("oauth_token", OAtoken); - final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); - status = 1; - } catch (Exception e) { - Log.e("OAuthAuthorizationActivity.requestToken(2)", e); - } + if (StringUtils.isNotBlank(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { + setTempTokens(OAtoken, OAtokenSecret); + try { + final Parameters paramsBrowser = new Parameters(); + paramsBrowser.put("oauth_token", OAtoken); + final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getUrlPrefix() + host + pathAuthorize + "?" + encodedParams))); + status = 1; + } catch (ParseException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); + } catch (IOException e) { + Log.e("OAuthAuthorizationActivity.requestToken", e); } } - } catch (Exception e) { - Log.e("OAuthAuthorizationActivity.requestToken(1)", e); } requestTokenHandler.sendEmptyMessage(status); } - private void changeToken() { + private void changeToken(final String verifier) { - int status = 0; + int status = NOT_AUTHENTICATED; try { - final Parameters params = new Parameters("oauth_verifier", pinEntry.getText().toString()); + final Parameters params = new Parameters("oauth_verifier", verifier); final String method = "POST"; OAuth.signOAuth(host, pathAccess, method, https, params, OAtoken, OAtokenSecret, consumerKey, consumerSecret); @@ -222,7 +223,7 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { setTokens(null, null, false); } else { setTokens(OAtoken, OAtokenSecret, true); - status = 1; + status = AUTHENTICATED; } } catch (Exception e) { Log.e("OAuthAuthorizationActivity.changeToken", e); @@ -260,68 +261,68 @@ public abstract class OAuthAuthorizationActivity extends AbstractActivity { } } - private class ConfirmPINListener implements View.OnClickListener { + private void exchangeTokens(final String verifier) { + if (changeTokensDialog == null) { + changeTokensDialog = new ProgressDialog(this); + changeTokensDialog.setCancelable(false); + changeTokensDialog.setMessage(getAuthDialogWait()); + } + changeTokensDialog.show(); - @Override - public void onClick(View arg0) { - if (StringUtils.isEmpty(((EditText) findViewById(R.id.pin)).getText().toString())) { - helpDialog(getAuthDialogPinTitle(), getAuthDialogPinMessage()); - return; - } + (new Thread() { - if (changeTokensDialog == null) { - changeTokensDialog = new ProgressDialog(OAuthAuthorizationActivity.this); - changeTokensDialog.setCancelable(false); - changeTokensDialog.setMessage(getAuthDialogWait()); + @Override + public void run() { + changeToken(verifier); } - changeTokensDialog.show(); - pinEntryButton.setEnabled(false); - pinEntryButton.setOnTouchListener(null); - pinEntryButton.setOnClickListener(null); - - (new Thread() { - - @Override - public void run() { - changeToken(); - } - }).start(); - } + }).start(); } protected abstract ImmutablePair<String, String> getTempTokens(); - protected abstract void setTempTokens(String tokenPublic, String tokenSecret); + protected abstract void setTempTokens(@Nullable String tokenPublic, @Nullable String tokenSecret); - protected abstract void setTokens(String tokenPublic, String tokenSecret, boolean enable); + protected abstract void setTokens(@Nullable String tokenPublic, @Nullable String tokenSecret, boolean enable); // get resources from derived class protected abstract String getAuthTitle(); - protected abstract String getAuthAgain(); + protected String getAuthAgain() { + return getString(R.string.auth_again); + } - protected abstract String getErrAuthInitialize(); + protected String getErrAuthInitialize() { + return getString(R.string.err_auth_initialize); + } - protected abstract String getAuthStart(); + protected String getAuthStart() { + return getString(R.string.auth_start); + } protected abstract String getAuthDialogCompleted(); - protected abstract String getErrAuthProcess(); - - protected abstract String getAuthDialogWait(); - - protected abstract String getAuthDialogPinTitle(); - - protected abstract String getAuthDialogPinMessage(); + protected String getErrAuthProcess() { + return res.getString(R.string.err_auth_process); + } - protected abstract String getAboutAuth1(); + protected String getAuthDialogWait() { + return res.getString(R.string.auth_dialog_waiting, getAuthTitle()); + } - protected abstract String getAboutAuth2(); + protected String getAuthExplainShort() { + return res.getString(R.string.auth_explain_short, getAuthTitle()); + } - protected abstract String getAuthAuthorize(); + protected String getAuthExplainLong() { + return res.getString(R.string.auth_explain_long, getAuthTitle()); + } - protected abstract String getAuthPinHint(); + protected String getAuthAuthorize() { + return res.getString(R.string.auth_authorize, getAuthTitle()); + } - protected abstract String getAuthFinish(); + protected String getAuthFinish() { + return res.getString(R.string.auth_finish, getAuthTitle()); + } } |
