From 37864a9d42436081eb6132dc0c8b1e0868a15272 Mon Sep 17 00:00:00 2001 From: Adithya Abraham Philip Date: Thu, 6 Aug 2015 01:59:11 +0530 Subject: updated OrbotHelper with silent start --- .../keychain/ui/ImportKeysListFragment.java | 46 ++++++------ .../keychain/ui/OrbotRequiredDialogActivity.java | 81 ++++++++++++++-------- .../keychain/ui/SettingsKeyserverFragment.java | 9 +-- .../keychain/ui/ViewKeyTrustFragment.java | 23 ++++-- .../ui/dialog/AddEditKeyserverDialogFragment.java | 19 +++-- .../ui/dialog/OrbotStartDialogFragment.java | 73 ++++++++++++++----- .../ui/dialog/SupportInstallDialogFragment.java | 12 ++-- 7 files changed, 173 insertions(+), 90 deletions(-) (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui') diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java index 53e5efabe..8502798cd 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -371,32 +371,38 @@ public class ImportKeysListFragment extends ListFragment implements Runnable showOrbotDialog = new Runnable() { @Override public void run() { - final Runnable ignoreTor = new Runnable() { - @Override - public void run() { - mParcelableProxy = ParcelableProxy - .getForNoProxy(); - mShowingOrbotDialog = false; - restartLoaders(); - } - }; - - final Runnable dialogDismiss = new Runnable() { - @Override - public void run() { - mShowingOrbotDialog = false; - } - }; - - if (OrbotHelper.putOrbotInRequiredState( - ignoreTor, dialogDismiss, getActivity())) { + OrbotHelper.DialogActions dialogActions = + new OrbotHelper.DialogActions() { + @Override + public void onOrbotStarted() { + mShowingOrbotDialog = false; + restartLoaders(); + } + + @Override + public void onNeutralButton() { + mParcelableProxy = ParcelableProxy + .getForNoProxy(); + mShowingOrbotDialog = false; + restartLoaders(); + } + + @Override + public void onCancel() { + mShowingOrbotDialog = false; + } + }; + + if (OrbotHelper.putOrbotInRequiredState(dialogActions, + getActivity())) { // looks like we didn't have to show the // dialog after all + mShowingOrbotDialog = false; restartLoaders(); } } }; - new Handler().post(showOrbotDialog ); + new Handler().post(showOrbotDialog); mShowingOrbotDialog = true; } } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/OrbotRequiredDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/OrbotRequiredDialogActivity.java index 587044659..d1c247a76 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/OrbotRequiredDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/OrbotRequiredDialogActivity.java @@ -22,18 +22,20 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.app.FragmentActivity; -import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.util.ParcelableProxy; -import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.orbot.OrbotHelper; /** * Simply encapsulates a dialog. If orbot is not installed, it shows an install dialog, else a * dialog to enable orbot. */ -public class OrbotRequiredDialogActivity extends FragmentActivity { +public class OrbotRequiredDialogActivity extends FragmentActivity + implements OrbotHelper.DialogActions { + + // if suppplied and true will start Orbot directly without showing dialog + public static final String EXTRA_START_ORBOT = "start_orbot"; // to provide any previous crypto input into which proxy preference is merged public static final String EXTRA_CRYPTO_INPUT = "extra_crypto_input"; @@ -45,47 +47,68 @@ public class OrbotRequiredDialogActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mCryptoInputParcel = getIntent().getParcelableExtra(EXTRA_CRYPTO_INPUT); if (mCryptoInputParcel == null) { + // compatibility with usages that don't use a CryptoInputParcel mCryptoInputParcel = new CryptoInputParcel(); } - showDialog(); + + boolean startOrbotDirect = getIntent().getBooleanExtra(EXTRA_START_ORBOT, false); + if (startOrbotDirect) { + OrbotHelper.bestPossibleOrbotStart(this, this); + } else { + showDialog(); + } } /** - * Displays an install or start orbot dialog depending on orbot's presence and state + * Displays an install or start orbot dialog (or silent orbot start) depending on orbot's + * presence and state */ public void showDialog() { DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() { public void run() { - Runnable ignoreTor = new Runnable() { - @Override - public void run() { - Intent intent = new Intent(); - mCryptoInputParcel.addParcelableProxy(ParcelableProxy.getForNoProxy()); - intent.putExtra(RESULT_CRYPTO_INPUT, mCryptoInputParcel); - setResult(RESULT_OK, intent); - finish(); - } - }; - - Runnable dialogDismissed = new Runnable() { - @Override - public void run() { - finish(); - } - }; - - if (OrbotHelper.putOrbotInRequiredState(R.string.orbot_ignore_tor, ignoreTor, dialogDismissed, - Preferences.getPreferences(OrbotRequiredDialogActivity.this) - .getProxyPrefs(), + + if (OrbotHelper.putOrbotInRequiredState(OrbotRequiredDialogActivity.this, OrbotRequiredDialogActivity.this)) { // no action required after all - Intent intent = new Intent(); - intent.putExtra(RESULT_CRYPTO_INPUT, mCryptoInputParcel); - setResult(RESULT_OK, intent); + onOrbotStarted(); } } }); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case OrbotHelper.START_TOR_RESULT: { + onOrbotStarted(); // assumption that orbot was started, no way to tell for sure + } + } + } + + @Override + public void onOrbotStarted() { + Intent intent = new Intent(); + // send back unmodified CryptoInputParcel for a retry + intent.putExtra(RESULT_CRYPTO_INPUT, mCryptoInputParcel); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onNeutralButton() { + Intent intent = new Intent(); + mCryptoInputParcel.addParcelableProxy(ParcelableProxy.getForNoProxy()); + intent.putExtra(RESULT_CRYPTO_INPUT, mCryptoInputParcel); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onCancel() { + finish(); + } } \ No newline at end of file diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java index 2ae64d90b..d8edbe4f8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsKeyserverFragment.java @@ -250,9 +250,6 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC public class KeyserverListAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter { - // to update the ViewHolder associated with first item, for when an item is deleted - private ViewHolder mFirstItem; - private final List mKeyservers; public KeyserverListAdapter(List keyservers) { @@ -263,15 +260,11 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.settings_keyserver_item, parent, false); - ViewHolder viewHolder = new ViewHolder(view); - return viewHolder; + return new ViewHolder(view); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { - if (position == 0) { - mFirstItem = holder; - } holder.keyserverUrl.setText(mKeyservers.get(position)); // Start a drag whenever the handle view it touched diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java index b118c3ad0..150acdc90 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java @@ -200,19 +200,30 @@ public class ViewKeyTrustFragment extends LoaderFragment implements mStartSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - final Preferences.ProxyPrefs proxyPrefs = Preferences.getPreferences(getActivity()) - .getProxyPrefs(); + final Preferences.ProxyPrefs proxyPrefs = + Preferences.getPreferences(getActivity()).getProxyPrefs(); - Runnable ignoreTor = new Runnable() { + OrbotHelper.DialogActions dialogActions = new OrbotHelper.DialogActions() { @Override - public void run() { + public void onOrbotStarted() { mStartSearch.setEnabled(false); new DescribeKey(proxyPrefs.parcelableProxy).execute(fingerprint); } + + @Override + public void onNeutralButton() { + mStartSearch.setEnabled(false); + new DescribeKey(ParcelableProxy.getForNoProxy()) + .execute(fingerprint); + } + + @Override + public void onCancel() { + + } }; - if (OrbotHelper.putOrbotInRequiredState(R.string.orbot_ignore_tor, ignoreTor, proxyPrefs, - getActivity())) { + if (OrbotHelper.putOrbotInRequiredState(dialogActions, getActivity())) { mStartSearch.setEnabled(false); new DescribeKey(proxyPrefs.parcelableProxy).execute(fingerprint); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java index 691cc009d..47bc7dfda 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddEditKeyserverDialogFragment.java @@ -50,6 +50,7 @@ import android.widget.TextView.OnEditorActionListener; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; @@ -216,15 +217,25 @@ public class AddEditKeyserverDialogFragment extends DialogFragment implements On if (mVerifyKeyserverCheckBox.isChecked()) { final Preferences.ProxyPrefs proxyPrefs = Preferences.getPreferences(getActivity()) .getProxyPrefs(); - Runnable ignoreTor = new Runnable() { + OrbotHelper.DialogActions dialogActions = new OrbotHelper.DialogActions() { + @Override + public void onOrbotStarted() { + verifyConnection(keyserverUrl, + proxyPrefs.parcelableProxy.getProxy()); + } + @Override - public void run() { + public void onNeutralButton() { verifyConnection(keyserverUrl, null); } + + @Override + public void onCancel() { + // do nothing + } }; - if (OrbotHelper.putOrbotInRequiredState(R.string.orbot_ignore_tor, ignoreTor, proxyPrefs, - getActivity())) { + if (OrbotHelper.putOrbotInRequiredState(dialogActions, getActivity())) { verifyConnection(keyserverUrl, proxyPrefs.parcelableProxy.getProxy()); } } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java index d1d22b6d7..b06e05c30 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/OrbotStartDialogFragment.java @@ -18,15 +18,19 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Activity; -import android.support.v7.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; +import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; +import android.support.v7.app.AlertDialog; import android.view.ContextThemeWrapper; +import android.view.View; +import android.widget.Button; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; @@ -43,8 +47,11 @@ public class OrbotStartDialogFragment extends DialogFragment { private static final String ARG_MESSAGE = "message"; private static final String ARG_MIDDLE_BUTTON = "middleButton"; + private static final int ORBOT_REQUEST_CODE = 1; + public static final int MESSAGE_MIDDLE_BUTTON = 1; - public static final int MESSAGE_DIALOG_DISMISSED = 2; // for either cancel or enable pressed + public static final int MESSAGE_DIALOG_CANCELLED = 2; // for either cancel or enable pressed + public static final int MESSAGE_ORBOT_STARTED = 3; // for either cancel or enable pressed public static OrbotStartDialogFragment newInstance(Messenger messenger, int title, int message, int middleButton) { Bundle args = new Bundle(); @@ -59,6 +66,7 @@ public class OrbotStartDialogFragment extends DialogFragment { return fragment; } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -77,7 +85,7 @@ public class OrbotStartDialogFragment extends DialogFragment { @Override public void onClick(DialogInterface dialog, int which) { Message msg = Message.obtain(); - msg.what = MESSAGE_DIALOG_DISMISSED; + msg.what = MESSAGE_DIALOG_CANCELLED; try { messenger.send(msg); } catch (RemoteException e) { @@ -89,13 +97,11 @@ public class OrbotStartDialogFragment extends DialogFragment { } }); - builder.setPositiveButton(R.string.orbot_start_dialog_start, new DialogInterface.OnClickListener() { + builder.setNeutralButton(middleButton, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - getActivity().startActivityForResult(OrbotHelper.getOrbotStartIntent(), 1); - - Message msg = Message.obtain(); - msg.what = MESSAGE_DIALOG_DISMISSED; + Message msg = new Message(); + msg.what = MESSAGE_MIDDLE_BUTTON; try { messenger.send(msg); } catch (RemoteException e) { @@ -106,21 +112,52 @@ public class OrbotStartDialogFragment extends DialogFragment { } }); - builder.setNeutralButton(middleButton, new DialogInterface.OnClickListener() { + builder.setPositiveButton(R.string.orbot_start_dialog_start, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - Message msg = new Message(); - msg.what = MESSAGE_MIDDLE_BUTTON; - try { - messenger.send(msg); - } catch (RemoteException e) { - Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); - } catch (NullPointerException e) { - Log.w(Constants.TAG, "Messenger is null!", e); - } + // actual onClick defined in onStart, this is just to make the button appear } }); return builder.show(); } + + @Override + public void onStart() { + super.onStart(); + //super.onStart() is where dialog.show() is actually called on the underlying dialog, + // so we have to do it after this point + AlertDialog d = (AlertDialog) getDialog(); + if (d != null) { + Button positiveButton = d.getButton(Dialog.BUTTON_POSITIVE); + positiveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + startActivityForResult(OrbotHelper.getShowOrbotStartIntent(), + ORBOT_REQUEST_CODE); + } + }); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == ORBOT_REQUEST_CODE) { + // assume Orbot was started + final Messenger messenger = getArguments().getParcelable(ARG_MESSENGER); + + Message msg = Message.obtain(); + msg.what = MESSAGE_ORBOT_STARTED; + try { + messenger.send(msg); + } catch (RemoteException e) { + Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); + } catch (NullPointerException e) { + Log.w(Constants.TAG, "Messenger is null!", e); + } + dismiss(); + } + } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java index b2b71b364..82d1be4ed 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/SupportInstallDialogFragment.java @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.dialog; import android.app.Dialog; import android.os.Bundle; import android.os.Messenger; +import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import org.sufficientlysecure.keychain.ui.util.InstallDialogFragmentHelper; @@ -34,7 +35,7 @@ public class SupportInstallDialogFragment extends DialogFragment { * and "Cancel") and an optional third button. Callbacks are provided only for the middle button, if set. * * @param messenger required only for callback from middle button if it has been set - * @param title + * @param title xml resource for title of the install dialog * @param message content of dialog * @param packageToInstall package name of application to install * @param middleButton if not null, adds a third button to the app with a call back @@ -57,16 +58,17 @@ public class SupportInstallDialogFragment extends DialogFragment { /** * To create a DialogFragment with only two buttons * - * @param title - * @param message - * @param packageToInstall + * @param title xml string resource for title of the dialog + * @param message xml string resource to display as dialog body + * @param packageToInstall name of package to install * @return */ public static SupportInstallDialogFragment newInstance(int title, int message, - String packageToInstall) { + String packageToInstall) { return newInstance(null, title, message, packageToInstall, -1, false); } + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { -- cgit v1.2.3