package cgeo.geocaching.twitter; import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.OAuth; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; 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 android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import java.util.regex.Pattern; public class TwitterAuthorizationActivity extends AbstractActivity { 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; private ProgressDialog requestTokenDialog = null; private ProgressDialog changeTokensDialog = null; private Handler requestTokenHandler = new Handler() { @Override public void handleMessage(Message msg) { if (requestTokenDialog != null && requestTokenDialog.isShowing()) { requestTokenDialog.dismiss(); } startButton.setOnClickListener(new StartListener()); startButton.setEnabled(true); if (msg.what == 1) { startButton.setText(res.getString(R.string.auth_again)); pinEntry.setVisibility(View.VISIBLE); pinEntryButton.setVisibility(View.VISIBLE); pinEntryButton.setOnClickListener(new ConfirmPINListener()); } else { showToast(res.getString(R.string.err_auth_initialize)); startButton.setText(res.getString(R.string.auth_start)); } } }; private Handler changeTokensHandler = new Handler() { @Override public void handleMessage(Message msg) { if (changeTokensDialog != null && changeTokensDialog.isShowing()) { changeTokensDialog.dismiss(); } pinEntryButton.setOnClickListener(new ConfirmPINListener()); pinEntryButton.setEnabled(true); if (msg.what == 1) { showToast(res.getString(R.string.auth_dialog_completed)); pinEntryButton.setVisibility(View.GONE); finish(); } else { showToast(res.getString(R.string.err_auth_process)); pinEntry.setVisibility(View.GONE); pinEntryButton.setVisibility(View.GONE); startButton.setText(res.getString(R.string.auth_start)); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(); setContentView(R.layout.twitter_authorization_activity); setTitle(res.getString(R.string.auth_twitter)); init(); } @Override public void onResume() { super.onResume(); } private void init() { startButton = (Button) findViewById(R.id.start); pinEntry = (EditText) findViewById(R.id.pin); pinEntryButton = (Button) findViewById(R.id.pin_button); ImmutablePair tempToken = Settings.getTempToken(); OAtoken = tempToken.left; OAtokenSecret = tempToken.right; startButton.setEnabled(true); startButton.setOnClickListener(new StartListener()); if (StringUtils.isBlank(OAtoken) && StringUtils.isBlank(OAtokenSecret)) { // start authorization process startButton.setText(res.getString(R.string.auth_start)); } else { // already have temporary tokens, continue from pin startButton.setText(res.getString(R.string.auth_again)); pinEntry.setVisibility(View.VISIBLE); pinEntryButton.setVisibility(View.VISIBLE); pinEntryButton.setOnClickListener(new ConfirmPINListener()); } } private void requestToken() { int status = 0; try { final Parameters params = new Parameters(); final String method = "GET"; final String pathRequest = "/oauth/request_token"; final String host = "api.twitter.com"; OAuth.signOAuth(host, pathRequest, method, true, params, null, null); final String line = Network.getResponseData(Network.getRequest("https://" + 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(OAtoken) && StringUtils.isNotBlank(OAtokenSecret)) { Settings.setTwitterTempTokens(OAtoken, OAtokenSecret); try { final Parameters paramsBrowser = new Parameters(); paramsBrowser.put("oauth_callback", "oob"); final String pathAuthorize = "/oauth/authorize"; OAuth.signOAuth(host, pathAuthorize, "GET", true, paramsBrowser, OAtoken, OAtokenSecret); final String encodedParams = EntityUtils.toString(new UrlEncodedFormEntity(paramsBrowser)); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://" + host + pathAuthorize + "?" + encodedParams))); status = 1; } catch (Exception e) { Log.e("TwitterAuthorizationActivity.requestToken(2)", e); } } } } catch (Exception e) { Log.e("TwitterAuthorizationActivity.requestToken(1)", e); } requestTokenHandler.sendEmptyMessage(status); } private void changeToken() { int status = 0; try { final Parameters params = new Parameters("oauth_verifier", pinEntry.getText().toString()); final String method = "POST"; final String path = "/oauth/access_token"; final String host = "api.twitter.com"; OAuth.signOAuth(host, path, method, true, params, OAtoken, OAtokenSecret); final String line = StringUtils.defaultString(Network.getResponseData(Network.postRequest("https://" + host + path, params))); OAtoken = ""; OAtokenSecret = ""; final MatcherWrapper paramsMatcher1 = new MatcherWrapper(paramsPattern1, line); if (paramsMatcher1.find()) { OAtoken = paramsMatcher1.group(1); } final MatcherWrapper paramsMatcher2 = new MatcherWrapper(paramsPattern2, line); if (paramsMatcher2.find() && paramsMatcher2.groupCount() > 0) { OAtokenSecret = paramsMatcher2.group(1); } if (StringUtils.isBlank(OAtoken) && StringUtils.isBlank(OAtokenSecret)) { OAtoken = ""; OAtokenSecret = ""; Settings.setTwitterTokens(null, null, false); } else { Settings.setTwitterTokens(OAtoken, OAtokenSecret, true); status = 1; } } catch (Exception e) { Log.e("TwitterAuthorizationActivity.changeToken", e); } changeTokensHandler.sendEmptyMessage(status); } private class StartListener implements View.OnClickListener { @Override public void onClick(View arg0) { if (requestTokenDialog == null) { requestTokenDialog = new ProgressDialog(TwitterAuthorizationActivity.this); requestTokenDialog.setCancelable(false); requestTokenDialog.setMessage(res.getString(R.string.auth_dialog_wait)); } requestTokenDialog.show(); startButton.setEnabled(false); startButton.setOnTouchListener(null); startButton.setOnClickListener(null); Settings.setTwitterTempTokens(null, null); (new Thread() { @Override public void run() { requestToken(); } }).start(); } } private class ConfirmPINListener implements View.OnClickListener { @Override public void onClick(View arg0) { if (StringUtils.isEmpty(((EditText) findViewById(R.id.pin)).getText().toString())) { helpDialog(res.getString(R.string.auth_dialog_pin_title), res.getString(R.string.auth_dialog_pin_message)); return; } if (changeTokensDialog == null) { changeTokensDialog = new ProgressDialog(TwitterAuthorizationActivity.this); changeTokensDialog.setCancelable(false); changeTokensDialog.setMessage(res.getString(R.string.auth_dialog_wait)); } changeTokensDialog.show(); pinEntryButton.setEnabled(false); pinEntryButton.setOnTouchListener(null); pinEntryButton.setOnClickListener(null); (new Thread() { @Override public void run() { changeToken(); } }).start(); } } }