offer to start/install orbot for edit account screen. fixes #1980 closes #2834

This commit is contained in:
Daniel Gultsch 2018-12-03 13:15:06 +01:00
parent c02676ea4c
commit 875810e1c7
3 changed files with 87 additions and 2 deletions

View File

@ -39,6 +39,7 @@ import java.net.URL;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import eu.siacs.conversations.Config; import eu.siacs.conversations.Config;
@ -64,6 +65,7 @@ import eu.siacs.conversations.ui.util.StyledAttributes;
import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.Resolver; import eu.siacs.conversations.utils.Resolver;
import eu.siacs.conversations.utils.SignupUtils; import eu.siacs.conversations.utils.SignupUtils;
import eu.siacs.conversations.utils.TorServiceUtils;
import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.utils.XmppUri; import eu.siacs.conversations.utils.XmppUri;
import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Element;
@ -82,7 +84,9 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
private static final int REQUEST_DATA_SAVER = 0xf244; private static final int REQUEST_DATA_SAVER = 0xf244;
private static final int REQUEST_CHANGE_STATUS = 0xee11; private static final int REQUEST_CHANGE_STATUS = 0xee11;
private static final int REQUEST_ORBOT = 0xff22;
private final PendingItem<PresenceTemplate> mPendingPresenceTemplate = new PendingItem<>(); private final PendingItem<PresenceTemplate> mPendingPresenceTemplate = new PendingItem<>();
private final AtomicBoolean mPendingReconnect = new AtomicBoolean(false);
private AlertDialog mCaptchaDialog = null; private AlertDialog mCaptchaDialog = null;
private Jid jidToEdit; private Jid jidToEdit;
private boolean mInitMode = false; private boolean mInitMode = false;
@ -155,8 +159,17 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
} }
XmppConnection connection = mAccount == null ? null : mAccount.getXmppConnection(); XmppConnection connection = mAccount == null ? null : mAccount.getXmppConnection();
boolean openRegistrationUrl = registerNewAccount && !accountInfoEdited && mAccount != null && mAccount.getStatus() == Account.State.REGISTRATION_WEB; final boolean startOrbot = mAccount != null && mAccount.getStatus() == Account.State.TOR_NOT_AVAILABLE;
boolean openPaymentUrl = mAccount != null && mAccount.getStatus() == Account.State.PAYMENT_REQUIRED; if (startOrbot) {
if (TorServiceUtils.isOrbotInstalled(EditAccountActivity.this)) {
TorServiceUtils.startOrbot(EditAccountActivity.this, REQUEST_ORBOT);
} else {
TorServiceUtils.downloadOrbot(EditAccountActivity.this, REQUEST_ORBOT);
}
return;
}
final boolean openRegistrationUrl = registerNewAccount && !accountInfoEdited && mAccount != null && mAccount.getStatus() == Account.State.REGISTRATION_WEB;
final boolean openPaymentUrl = mAccount != null && mAccount.getStatus() == Account.State.PAYMENT_REQUIRED;
final boolean redirectionWorthyStatus = openPaymentUrl || openRegistrationUrl; final boolean redirectionWorthyStatus = openPaymentUrl || openRegistrationUrl;
URL url = connection != null && redirectionWorthyStatus ? connection.getRedirectionUrl() : null; URL url = connection != null && redirectionWorthyStatus ? connection.getRedirectionUrl() : null;
if (url != null && !wasDisabled) { if (url != null && !wasDisabled) {
@ -420,6 +433,13 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
Log.d(Config.LOGTAG, "pgp result not ok"); Log.d(Config.LOGTAG, "pgp result not ok");
} }
} }
if (requestCode == REQUEST_ORBOT) {
if (xmppConnectionService != null && mAccount != null) {
xmppConnectionService.reconnectAccountInBackground(mAccount);
} else {
mPendingReconnect.set(true);
}
}
} }
@Override @Override
@ -456,6 +476,12 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
} else if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !mInitMode) { } else if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !mInitMode) {
this.binding.saveButton.setEnabled(true); this.binding.saveButton.setEnabled(true);
this.binding.saveButton.setText(R.string.enable); this.binding.saveButton.setText(R.string.enable);
} else if (torNeedsInstall(mAccount)) {
this.binding.saveButton.setEnabled(true);
this.binding.saveButton.setText(R.string.install_orbot);
} else if (torNeedsStart(mAccount)) {
this.binding.saveButton.setEnabled(true);
this.binding.saveButton.setText(R.string.start_orbot);
} else { } else {
this.binding.saveButton.setEnabled(true); this.binding.saveButton.setEnabled(true);
if (!mInitMode) { if (!mInitMode) {
@ -485,6 +511,14 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
} }
} }
private boolean torNeedsInstall(final Account account) {
return account != null && account.getStatus() == Account.State.TOR_NOT_AVAILABLE && !TorServiceUtils.isOrbotInstalled(this);
}
private boolean torNeedsStart(final Account account) {
return account != null && account.getStatus() == Account.State.TOR_NOT_AVAILABLE;
}
protected boolean accountInfoEdited() { protected boolean accountInfoEdited() {
if (this.mAccount == null) { if (this.mAccount == null) {
return false; return false;
@ -685,6 +719,11 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
} }
if (mAccount != null) { if (mAccount != null) {
if (mPendingReconnect.compareAndSet(true, false)) {
xmppConnectionService.reconnectAccountInBackground(mAccount);
}
this.mInitMode |= this.mAccount.isOptionSet(Account.OPTION_REGISTER); this.mInitMode |= this.mAccount.isOptionSet(Account.OPTION_REGISTER);
this.mUsernameMode |= mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) && mAccount.isOptionSet(Account.OPTION_REGISTER); this.mUsernameMode |= mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) && mAccount.isOptionSet(Account.OPTION_REGISTER);
if (this.mAccount.getPrivateKeyAlias() != null) { if (this.mAccount.getPrivateKeyAlias() != null) {

View File

@ -0,0 +1,43 @@
package eu.siacs.conversations.utils;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import eu.siacs.conversations.R;
import me.drakeet.support.toast.ToastCompat;
public class TorServiceUtils {
private final static String URI_ORBOT = "org.torproject.android";
private static final Uri ORBOT_PLAYSTORE_URI = Uri.parse("market://details?id=" + URI_ORBOT);
private final static String ACTION_START_TOR = "org.torproject.android.START_TOR";
public static boolean isOrbotInstalled(Context context) {
try {
context.getPackageManager().getPackageInfo(URI_ORBOT, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
public static void downloadOrbot(Activity activity, int requestCode) {
final Intent intent = new Intent(Intent.ACTION_VIEW, ORBOT_PLAYSTORE_URI);
try {
activity.startActivityForResult(intent, requestCode);
} catch (ActivityNotFoundException e) {
ToastCompat.makeText(activity, R.string.no_market_app_installed, ToastCompat.LENGTH_SHORT).show();
}
}
public static void startOrbot(Activity activity, int requestCode) {
final Intent launchIntent = new Intent(URI_ORBOT);
launchIntent.setAction(ACTION_START_TOR);
activity.startActivityForResult(launchIntent, requestCode);
}
}

View File

@ -800,4 +800,7 @@
<string name="enter_your_name">Enter your name</string> <string name="enter_your_name">Enter your name</string>
<string name="no_name_set_instructions">Use the edit button to set your name.</string> <string name="no_name_set_instructions">Use the edit button to set your name.</string>
<string name="reject_request">Reject request</string> <string name="reject_request">Reject request</string>
<string name="install_orbot">Install Orbot</string>
<string name="start_orbot">Start Orbot</string>
<string name="no_market_app_installed">No market app installed.</string>
</resources> </resources>