aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java')
-rw-r--r--main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java251
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());
+ }
}