package de.blau.android.prefs; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.acra.ACRA; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import de.blau.android.Main; import de.blau.android.R; import de.blau.android.prefs.AdvancedPrefDatabase.PresetInfo; import de.blau.android.prefs.URLListEditActivity.ListEditItem; import de.blau.android.util.OAuthHelper; import de.blau.android.util.Snack; import oauth.signpost.exception.OAuthException; /** * Will process vespucci:// URLs. * Accepts the following URL parameters:<br> * apiurl - API URL<br> * apiname - name for the API (if it gets added)<br> * apiuser, apipass - login data for the API (if it gets added)<br> * apipreseturl - preset URL to be set for the API after adding (only if present!)<br> * apiicons - set to 1 if icons should be shown<br> * Note the above are no longer used. * preseturl - preset URL to add to the preset list<br> * presetname - name for the preset (if it gets added)<br> * oauth_token = oauth token, used during retrieving oauth access tokens<br> * oauth_verifier - oauth verifier, used during retrieving oauth access tokens<br> * @author Jan * */ public class VespucciURLActivity extends Activity implements OnClickListener { private static final String DEBUG_TAG = "VespucciURLActivity"; private static final int REQUEST_PRESETEDIT = 0; private static final int REQUEST_APIEDIT = 1; private String command; private String apiurl, apiname, apiuser, apipass, apipreseturl, apiicons, apioauth; private String preseturl, presetname; private PresetInfo existingPreset = null; private PresetInfo apiPresetInfo = null; private String oauth_token, oauth_verifier; private AdvancedPrefDatabase prefdb; private boolean downloadSucessful = false; private View mainView; @Override protected void onCreate(Bundle savedInstanceState) { Preferences prefs = new Preferences(this); if (prefs.lightThemeEnabled()) { setTheme(R.style.Theme_customMain_Light); } else { setTheme(R.style.Theme_customMain); } super.onCreate(savedInstanceState); mainView = View.inflate(this, R.layout.url_activity, null); setContentView(mainView); prefdb = new AdvancedPrefDatabase(this); } @Override protected void onStart() { Uri data = getIntent().getData(); if (data != null) { try { command = data.getPath(); Log.d(DEBUG_TAG,"Command " + command); apiurl = data.getQueryParameter("apiurl"); apiname = data.getQueryParameter("apiname"); apiuser = data.getQueryParameter("apiuser"); apipass = data.getQueryParameter("apipass"); apipreseturl = data.getQueryParameter("apipreset"); apiicons = data.getQueryParameter("apiicons"); apioauth = data.getQueryParameter("apioauth"); preseturl = data.getQueryParameter("preseturl"); presetname = data.getQueryParameter("presetname"); oauth_token = data.getQueryParameter("oauth_token"); oauth_verifier = data.getQueryParameter("oauth_verifier"); } catch (Exception ex) { Log.e(DEBUG_TAG,"Uri " + data + " caused " + ex); ACRA.getErrorReporter().putCustomData("STATUS","NOCRASH"); ACRA.getErrorReporter().handleException(ex); finish(); } } else { Log.e(DEBUG_TAG,"Received null Uri, ignoring"); } super.onStart(); } @Override protected void onResume() { Log.i(DEBUG_TAG, "onResume"); // determining what activity to do based purely on the parameters is rather hackish if ((oauth_token != null) && (oauth_verifier != null)) { mainView.setVisibility(View.GONE); Log.i(DEBUG_TAG, "got oauth verifier " + oauth_token + " " + oauth_verifier); String errorMessage = null; try { oAuthHandshake(oauth_verifier); } catch (OAuthException e) { errorMessage = OAuthHelper.getErrorMessage(this, e); } catch (InterruptedException e) { errorMessage = getString(R.string.toast_oauth_communication); } catch (ExecutionException e) { errorMessage = getString(R.string.toast_oauth_communication); } catch (TimeoutException e) { errorMessage = getString(R.string.toast_oauth_timeout); } if (errorMessage != null) { Snack.toastTopError(this, errorMessage); } setResult(RESULT_OK); finish(); } else { mainView.findViewById(R.id.urldialog_nodata).setVisibility(preseturl == null && apiurl == null ? View.VISIBLE : View.GONE); if (preseturl != null) { mainView.findViewById(R.id.urldialog_layoutPreset).setVisibility(View.VISIBLE); mainView.findViewById(R.id.urldialog_layoutAPI).setVisibility(View.GONE); ((TextView)mainView.findViewById(R.id.urldialog_textPresetName)).setText(presetname); ((TextView)mainView.findViewById(R.id.urldialog_textPresetURL)).setText(preseturl); existingPreset = prefdb.getPresetByURL(preseturl); if (downloadSucessful) { mainView.findViewById(R.id.urldialog_textPresetSuccessful).setVisibility(View.VISIBLE); mainView.findViewById(R.id.urldialog_textPresetExists).setVisibility(View.GONE); } else { mainView.findViewById(R.id.urldialog_textPresetExists).setVisibility(existingPreset != null ? View.VISIBLE : View.GONE); mainView.findViewById(R.id.urldialog_textPresetSuccessful).setVisibility(View.GONE); } mainView.findViewById(R.id.urldialog_checkboxEnable).setVisibility(existingPreset == null ? View.VISIBLE : View.GONE); mainView.findViewById(R.id.urldialog_buttonAddPreset).setVisibility(existingPreset == null ? View.VISIBLE : View.GONE); ((Button)mainView.findViewById(R.id.urldialog_buttonAddPreset)).setOnClickListener(this); } else if (apiurl != null) { mainView.findViewById(R.id.urldialog_layoutAPI).setVisibility(View.VISIBLE); mainView.findViewById(R.id.urldialog_layoutPreset).setVisibility(View.GONE); ((TextView)mainView.findViewById(R.id.urldialog_textAPIName)).setText(apiname); ((TextView)mainView.findViewById(R.id.urldialog_textAPIURL)).setText(apiurl); boolean hasAPI = false; for (API api : prefdb.getAPIs()) { if (api.url.equals(apiurl)) { hasAPI = true; break; } } if (downloadSucessful) { mainView.findViewById(R.id.urldialog_textAPISuccessful).setVisibility(View.VISIBLE); mainView.findViewById(R.id.urldialog_textAPIExists).setVisibility(View.GONE); } else { mainView.findViewById(R.id.urldialog_textAPIExists).setVisibility(hasAPI ? View.VISIBLE : View.GONE); mainView.findViewById(R.id.urldialog_textAPISuccessful).setVisibility(View.GONE); } if (apipreseturl != null) { apiPresetInfo = prefdb.getPresetByURL(apipreseturl); mainView.findViewById(R.id.urldialog_textAPIPresetMissing).setVisibility(apiPresetInfo == null? View.VISIBLE : View.GONE); } else { mainView.findViewById(R.id.urldialog_textAPIPresetMissing).setVisibility(View.GONE); apiPresetInfo = null; } ((Button)mainView.findViewById(R.id.urldialog_buttonAddAPI)).setOnClickListener(this); } } super.onResume(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.urldialog_buttonAddPreset: CheckBox enableCheckBox = (CheckBox)mainView.findViewById(R.id.urldialog_checkboxEnable); boolean enable = enableCheckBox != null && enableCheckBox.isChecked(); PresetEditorActivity.startForResult(this, presetname, preseturl, enable, REQUEST_PRESETEDIT); break; case R.id.urldialog_buttonAddAPI: APIEditorActivity.startForResult(this, apiname, apiurl, REQUEST_APIEDIT); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_APIEDIT && resultCode == RESULT_OK) { ListEditItem item = (ListEditItem)data.getExtras().get(URLListEditActivity.EXTRA_ITEM); if (item != null) { prefdb.selectAPI(item.id); if (apiuser != null && !apiuser.equals("")) { prefdb.setCurrentAPILogin(apiuser, apipass == null ? "" : apipass); } } downloadSucessful = true; } else if (requestCode == REQUEST_PRESETEDIT && resultCode == RESULT_OK) { downloadSucessful = true; } } private void oAuthHandshake(String verifier) throws OAuthException, InterruptedException, ExecutionException, TimeoutException { String[] s = {verifier}; class MyTask extends AsyncTask<String, Void, Boolean> { private OAuthException ex = null; @Override protected Boolean doInBackground(String... s) { OAuthHelper oa = new OAuthHelper(); // if we got here it has already been initialized once try { String access[] = oa.getAccessToken(s[0]); prefdb.setAPIAccessToken(access[0], access[1]); } catch (OAuthException e) { Log.d("VespucciURL", "oAuthHandshake: " + e); ex = e; return false; } return true; } @Override protected void onPostExecute(Boolean success) { Log.d(DEBUG_TAG, "oAuthHandshake onPostExecute"); Intent intent = new Intent(VespucciURLActivity.this, Main.class); intent.setAction(Main.ACTION_FINISH_OAUTH); startActivity(intent); } OAuthException getException() { return ex; } } MyTask loader = new MyTask(); loader.execute(s); if (!loader.get(60, TimeUnit.SECONDS)) { OAuthException ex = loader.getException(); if (ex != null) { throw ex; } } } }