diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index fa4c96a8eb..9f61d19e95 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -131,6 +131,12 @@
+
+
+
+
+
+
Invalid QR code.
Sorry, you have too many devices linked already, try removing some...
Sorry, this is not a valid device link QR code.
+ Link a Signal device?
+ It looks like you\'re trying to link a Signal device using a 3rd party scanner. For your protection, please scan the code again from within Signal.
Enter passphrase
diff --git a/src/org/thoughtcrime/securesms/DeviceActivity.java b/src/org/thoughtcrime/securesms/DeviceActivity.java
index 0234ad8cf7..b9b10aa6a9 100644
--- a/src/org/thoughtcrime/securesms/DeviceActivity.java
+++ b/src/org/thoughtcrime/securesms/DeviceActivity.java
@@ -63,7 +63,11 @@ public class DeviceActivity extends PassphraseRequiredActionBarActivity
this.deviceListFragment.setAddDeviceButtonListener(this);
this.deviceAddFragment.setScanListener(this);
- initFragment(android.R.id.content, deviceListFragment, masterSecret, dynamicLanguage.getCurrentLocale());
+ if (getIntent().getBooleanExtra("add", false)) {
+ initFragment(android.R.id.content, deviceAddFragment, masterSecret, dynamicLanguage.getCurrentLocale());
+ } else {
+ initFragment(android.R.id.content, deviceListFragment, masterSecret, dynamicLanguage.getCurrentLocale());
+ }
}
@Override
diff --git a/src/org/thoughtcrime/securesms/DeviceProvisioningActivity.java b/src/org/thoughtcrime/securesms/DeviceProvisioningActivity.java
index 0cf49f65f0..577e17d193 100644
--- a/src/org/thoughtcrime/securesms/DeviceProvisioningActivity.java
+++ b/src/org/thoughtcrime/securesms/DeviceProvisioningActivity.java
@@ -1,42 +1,18 @@
package org.thoughtcrime.securesms;
-import android.content.Context;
import android.content.DialogInterface;
-import android.net.Uri;
+import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
-import android.text.SpannableStringBuilder;
-import android.util.Log;
-import android.view.View;
import android.view.Window;
-import android.widget.Toast;
-import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.crypto.MasterSecret;
-import org.thoughtcrime.securesms.push.TextSecureCommunicationFactory;
-import org.thoughtcrime.securesms.util.Base64;
-import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
-import org.thoughtcrime.securesms.util.TextSecurePreferences;
-import org.whispersystems.libaxolotl.IdentityKeyPair;
-import org.whispersystems.libaxolotl.InvalidKeyException;
-import org.whispersystems.libaxolotl.ecc.Curve;
-import org.whispersystems.libaxolotl.ecc.ECPublicKey;
-import org.whispersystems.textsecure.api.TextSecureAccountManager;
-import org.whispersystems.textsecure.api.push.exceptions.NotFoundException;
-import org.whispersystems.textsecure.internal.push.DeviceLimitExceededException;
-
-import java.io.IOException;
-
-import static org.thoughtcrime.securesms.util.SpanUtil.small;
public class DeviceProvisioningActivity extends PassphraseRequiredActionBarActivity {
private static final String TAG = DeviceProvisioningActivity.class.getSimpleName();
- private Uri uri;
- private MasterSecret masterSecret;
-
@Override
protected void onPreCreate() {
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
@@ -44,119 +20,36 @@ public class DeviceProvisioningActivity extends PassphraseRequiredActionBarActiv
@Override
protected void onCreate(Bundle bundle, @NonNull MasterSecret masterSecret) {
- this.masterSecret = masterSecret;
getSupportActionBar().hide();
- initializeResources();
- SpannableStringBuilder content = new SpannableStringBuilder();
- content.append(getString(R.string.DeviceProvisioningActivity_content_intro))
- .append("\n")
- .append(small(getString(R.string.DeviceProvisioningActivity_content_bullets)));
+ AlertDialog dialog = new AlertDialog.Builder(this)
+ .setTitle(getString(R.string.DeviceProvisioningActivity_link_a_signal_device))
+ .setMessage(getString(R.string.DeviceProvisioningActivity_it_looks_like_youre_trying_to_link_a_signal_device_using_a_3rd_party_scanner))
+ .setPositiveButton(R.string.DeviceProvisioningActivity_continue, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(DeviceProvisioningActivity.this, DeviceActivity.class);
+ intent.putExtra("add", true);
+ startActivity(intent);
+ finish();
+ }
+ })
+ .setNegativeButton(R.string.DeviceProvisioningActivity_cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ finish();
+ }
+ })
+ .setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ finish();
+ }
+ })
+ .create();
- final AlertDialog dialog = new AlertDialog.Builder(this)
- .setTitle(R.string.DeviceProvisioningActivity_link_this_device)
- .setIconAttribute(R.drawable.icon_dialog)
- .setMessage(content)
- .setPositiveButton(R.string.DeviceProvisioningActivity_continue, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
-
- }
- })
- .setNegativeButton(R.string.DeviceProvisioningActivity_cancel, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- finish();
- }
- })
- .setOnDismissListener(new DialogInterface.OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- finish();
- }
- })
- .create();
+ dialog.setIcon(getResources().getDrawable(R.drawable.icon_dialog));
dialog.show();
- dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- handleProvisioning(dialog);
- }
- });
- }
-
- private void initializeResources() {
- this.uri = getIntent().getData();
- }
-
- private void handleProvisioning(final AlertDialog dialog) {
- new ProgressDialogAsyncTask(this,
- R.string.DeviceProvisioningActivity_content_progress_title,
- R.string.DeviceProvisioningActivity_content_progress_content)
- {
- private static final int SUCCESS = 0;
- private static final int NO_DEVICE = 1;
- private static final int NETWORK_ERROR = 2;
- private static final int KEY_ERROR = 3;
- private static final int LIMIT_EXCEEDED = 4;
-
- @Override
- protected Integer doInBackground(Void... params) {
- try {
- Context context = DeviceProvisioningActivity.this;
- TextSecureAccountManager accountManager = TextSecureCommunicationFactory.createManager(context);
- String verificationCode = accountManager.getNewDeviceVerificationCode();
- String ephemeralId = uri.getQueryParameter("uuid");
- String publicKeyEncoded = uri.getQueryParameter("pub_key");
- ECPublicKey publicKey = Curve.decodePoint(Base64.decode(publicKeyEncoded), 0);
- IdentityKeyPair identityKeyPair = IdentityKeyUtil.getIdentityKeyPair(context);
-
- accountManager.addDevice(ephemeralId, publicKey, identityKeyPair, verificationCode);
- TextSecurePreferences.setMultiDevice(context, true);
- return SUCCESS;
-
-
- } catch (NotFoundException e) {
- Log.w(TAG, e);
- return NO_DEVICE;
- } catch (DeviceLimitExceededException e) {
- Log.w(TAG, e);
- return LIMIT_EXCEEDED;
- } catch (IOException e) {
- Log.w(TAG, e);
- return NETWORK_ERROR;
- } catch (InvalidKeyException e) {
- Log.w(TAG, e);
- return KEY_ERROR;
- }
- }
-
- @Override
- protected void onPostExecute(Integer result) {
- super.onPostExecute(result);
-
- Context context = DeviceProvisioningActivity.this;
-
- switch (result) {
- case SUCCESS:
- Toast.makeText(context, R.string.DeviceProvisioningActivity_content_progress_success, Toast.LENGTH_SHORT).show();
- break;
- case NO_DEVICE:
- Toast.makeText(context, R.string.DeviceProvisioningActivity_content_progress_no_device, Toast.LENGTH_LONG).show();
- break;
- case NETWORK_ERROR:
- Toast.makeText(context, R.string.DeviceProvisioningActivity_content_progress_network_error, Toast.LENGTH_LONG).show();
- break;
- case KEY_ERROR:
- Toast.makeText(context, R.string.DeviceProvisioningActivity_content_progress_key_error, Toast.LENGTH_LONG).show();
- break;
- case LIMIT_EXCEEDED:
- Toast.makeText(context, R.string.DeviceProvisioningActivity_sorry_you_have_too_many_devices_linked_already, Toast.LENGTH_LONG).show();
- break;
- }
- dialog.dismiss();
- }
- }.execute();
}
}