updated OrbotHelper with silent start
This commit is contained in:
@@ -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();
|
||||
}
|
||||
};
|
||||
OrbotHelper.DialogActions dialogActions =
|
||||
new OrbotHelper.DialogActions() {
|
||||
@Override
|
||||
public void onOrbotStarted() {
|
||||
mShowingOrbotDialog = false;
|
||||
restartLoaders();
|
||||
}
|
||||
|
||||
final Runnable dialogDismiss = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mShowingOrbotDialog = false;
|
||||
}
|
||||
};
|
||||
@Override
|
||||
public void onNeutralButton() {
|
||||
mParcelableProxy = ParcelableProxy
|
||||
.getForNoProxy();
|
||||
mShowingOrbotDialog = false;
|
||||
restartLoaders();
|
||||
}
|
||||
|
||||
if (OrbotHelper.putOrbotInRequiredState(
|
||||
ignoreTor, dialogDismiss, getActivity())) {
|
||||
@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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -250,9 +250,6 @@ public class SettingsKeyserverFragment extends Fragment implements RecyclerItemC
|
||||
public class KeyserverListAdapter extends RecyclerView.Adapter<KeyserverListAdapter.ViewHolder>
|
||||
implements ItemTouchHelperAdapter {
|
||||
|
||||
// to update the ViewHolder associated with first item, for when an item is deleted
|
||||
private ViewHolder mFirstItem;
|
||||
|
||||
private final List<String> mKeyservers;
|
||||
|
||||
public KeyserverListAdapter(List<String> 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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 run() {
|
||||
public void onOrbotStarted() {
|
||||
verifyConnection(keyserverUrl,
|
||||
proxyPrefs.parcelableProxy.getProxy());
|
||||
}
|
||||
|
||||
@Override
|
||||
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 {
|
||||
|
||||
@@ -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,23 +97,6 @@ public class OrbotStartDialogFragment extends DialogFragment {
|
||||
}
|
||||
});
|
||||
|
||||
builder.setPositiveButton(R.string.orbot_start_dialog_start, 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;
|
||||
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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
builder.setNeutralButton(middleButton, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
@@ -121,6 +112,52 @@ public class OrbotStartDialogFragment extends DialogFragment {
|
||||
}
|
||||
});
|
||||
|
||||
builder.setPositiveButton(R.string.orbot_start_dialog_start, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user