diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java
index 158441292..c4c7005dc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java
@@ -9,6 +9,8 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import org.thoughtcrime.securesms.devicetransfer.olddevice.OldDeviceTransferLockedDialog;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.util.AppStartup;
import org.thoughtcrime.securesms.util.CachedInflater;
import org.thoughtcrime.securesms.util.CommunicationActions;
@@ -70,6 +72,9 @@ public class MainActivity extends PassphraseRequiredActivity {
protected void onResume() {
super.onResume();
dynamicTheme.onResume(this);
+ if (SignalStore.misc().isOldDeviceTransferLocked()) {
+ OldDeviceTransferLockedDialog.show(getSupportFragmentManager());
+ }
}
@Override
diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java
index 798e18e42..0d38525b9 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java
@@ -49,6 +49,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements
private static final int STATE_CREATE_PROFILE_NAME = 6;
private static final int STATE_CREATE_SIGNAL_PIN = 7;
private static final int STATE_TRANSFER_ONGOING = 8;
+ private static final int STATE_TRANSFER_LOCKED = 9;
private SignalServiceNetworkAccess networkAccess;
private BroadcastReceiver clearKeyReceiver;
@@ -151,6 +152,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements
case STATE_CREATE_SIGNAL_PIN: return getCreateSignalPinIntent();
case STATE_CREATE_PROFILE_NAME: return getCreateProfileNameIntent();
case STATE_TRANSFER_ONGOING: return getOldDeviceTransferIntent();
+ case STATE_TRANSFER_LOCKED: return getOldDeviceTransferLockedIntent();
default: return null;
}
}
@@ -172,6 +174,8 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements
return STATE_CREATE_SIGNAL_PIN;
} else if (EventBus.getDefault().getStickyEvent(TransferStatus.class) != null && getClass() != OldDeviceTransferActivity.class) {
return STATE_TRANSFER_ONGOING;
+ } else if (SignalStore.misc().isOldDeviceTransferLocked()) {
+ return STATE_TRANSFER_LOCKED;
} else {
return STATE_NORMAL;
}
@@ -232,6 +236,13 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements
return intent;
}
+ private @Nullable Intent getOldDeviceTransferLockedIntent() {
+ if (getClass() == MainActivity.class) {
+ return null;
+ }
+ return MainActivity.clearTop(this);
+ }
+
private Intent getRoutedIntent(Class> destination, @Nullable Intent nextIntent) {
final Intent intent = new Intent(this, destination);
if (nextIntent != null) intent.putExtra("next_intent", nextIntent);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java
index d91083b2c..25e74cb3b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferFragment.java
@@ -15,6 +15,7 @@ import org.signal.devicetransfer.DeviceToDeviceTransferService;
import org.signal.devicetransfer.TransferStatus;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.devicetransfer.DeviceTransferFragment;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
/**
* Shows transfer progress on the old device. Most logic is in {@link DeviceTransferFragment}
@@ -54,6 +55,7 @@ public final class OldDeviceTransferFragment extends DeviceTransferFragment {
ignoreTransferStatusEvents();
EventBus.getDefault().removeStickyEvent(TransferStatus.class);
DeviceToDeviceTransferService.stop(requireContext());
+ SignalStore.misc().markOldDeviceTransferLocked();
NavHostFragment.findNavController(OldDeviceTransferFragment.this).navigate(R.id.action_oldDeviceTransfer_to_oldDeviceTransferComplete);
} else {
status.setText(getString(R.string.DeviceTransfer__d_messages_so_far, event.getMessageCount()));
diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferLockedDialog.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferLockedDialog.java
new file mode 100644
index 000000000..f9bb9d500
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferLockedDialog.java
@@ -0,0 +1,60 @@
+package org.thoughtcrime.securesms.devicetransfer.olddevice;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.view.Window;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+
+import org.signal.core.util.logging.Log;
+import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
+import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor;
+
+/**
+ * Blocking dialog shown on old devices after a successful transfer to prevent use unless
+ * the user takes action to reactivate.
+ */
+public final class OldDeviceTransferLockedDialog extends DialogFragment {
+
+ private static final String TAG = Log.tag(OldDeviceTransferLockedDialog.class);
+ private static final String FRAGMENT_TAG = "OldDeviceTransferLockedDialog";
+
+ public static void show(@NonNull FragmentManager fragmentManager) {
+ if (fragmentManager.findFragmentByTag(FRAGMENT_TAG) != null) {
+ Log.i(TAG, "Locked dialog already being shown");
+ return;
+ }
+
+ new OldDeviceTransferLockedDialog().show(fragmentManager, FRAGMENT_TAG);
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setCancelable(false);
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ MaterialAlertDialogBuilder dialogBuilder = new MaterialAlertDialogBuilder(requireContext(), R.style.Signal_ThemeOverlay_Dialog_Rounded);
+ dialogBuilder.setView(R.layout.old_device_transfer_locked_dialog_fragment)
+ .setPositiveButton(R.string.OldDeviceTransferLockedDialog__done, (d, w) -> OldDeviceExitActivity.exit(requireActivity()))
+ .setNegativeButton(R.string.OldDeviceTransferLockedDialog__cancel_and_activate_this_device, (d, w) -> onUnlockRequest());
+
+ Dialog dialog = dialogBuilder.create();
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+ return dialog;
+ }
+
+ private void onUnlockRequest() {
+ SignalStore.misc().clearOldDeviceTransferLocked();
+ DeviceTransferBlockingInterceptor.getInstance().unblockNetwork();
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java
index eaf2fd3fe..f7f593f32 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/olddevice/OldDeviceTransferSetupFragment.java
@@ -92,7 +92,7 @@ public final class OldDeviceTransferSetupFragment extends DeviceTransferSetupFra
switch (step) {
case SETTING_UP:
case WAITING:
- return R.string.OldDeviceTransferSetup__searching_for_your_new_android_device;
+ return R.string.OldDeviceTransferSetup__searching_for_new_android_device;
case ERROR:
return R.string.OldDeviceTransferSetup__an_unexpected_error_occurred_while_attempting_to_connect_to_your_old_device;
case TROUBLESHOOTING:
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
index c0bb184ff..2c37520e5 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.java
@@ -4,12 +4,13 @@ import androidx.annotation.NonNull;
public final class MiscellaneousValues extends SignalStoreValues {
- private static final String LAST_PREKEY_REFRESH_TIME = "last_prekey_refresh_time";
- private static final String MESSAGE_REQUEST_ENABLE_TIME = "message_request_enable_time";
- private static final String LAST_PROFILE_REFRESH_TIME = "misc.last_profile_refresh_time";
- private static final String LAST_GV1_ROUTINE_MIGRATION_TIME = "misc.last_gv1_routine_migration_time";
- private static final String USERNAME_SHOW_REMINDER = "username.show.reminder";
- private static final String CLIENT_DEPRECATED = "misc.client_deprecated";
+ private static final String LAST_PREKEY_REFRESH_TIME = "last_prekey_refresh_time";
+ private static final String MESSAGE_REQUEST_ENABLE_TIME = "message_request_enable_time";
+ private static final String LAST_PROFILE_REFRESH_TIME = "misc.last_profile_refresh_time";
+ private static final String LAST_GV1_ROUTINE_MIGRATION_TIME = "misc.last_gv1_routine_migration_time";
+ private static final String USERNAME_SHOW_REMINDER = "username.show.reminder";
+ private static final String CLIENT_DEPRECATED = "misc.client_deprecated";
+ private static final String OLD_DEVICE_TRANSFER_LOCKED = "misc.old_device.transfer.locked";
MiscellaneousValues(@NonNull KeyValueStore store) {
super(store);
@@ -67,4 +68,16 @@ public final class MiscellaneousValues extends SignalStoreValues {
public void clearClientDeprecated() {
putBoolean(CLIENT_DEPRECATED, false);
}
+
+ public boolean isOldDeviceTransferLocked() {
+ return getBoolean(OLD_DEVICE_TRANSFER_LOCKED, false);
+ }
+
+ public void markOldDeviceTransferLocked() {
+ putBoolean(OLD_DEVICE_TRANSFER_LOCKED, true);
+ }
+
+ public void clearOldDeviceTransferLocked() {
+ putBoolean(OLD_DEVICE_TRANSFER_LOCKED, false);
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/net/DeviceTransferBlockingInterceptor.java b/app/src/main/java/org/thoughtcrime/securesms/net/DeviceTransferBlockingInterceptor.java
index e5d79ad8c..e7f30db7c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/net/DeviceTransferBlockingInterceptor.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/net/DeviceTransferBlockingInterceptor.java
@@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
+import org.thoughtcrime.securesms.keyvalue.SignalStore;
import java.io.IOException;
@@ -21,12 +22,16 @@ public final class DeviceTransferBlockingInterceptor implements Interceptor {
private static final DeviceTransferBlockingInterceptor INSTANCE = new DeviceTransferBlockingInterceptor();
- private volatile boolean blockNetworking = false;
+ private volatile boolean blockNetworking;
public static DeviceTransferBlockingInterceptor getInstance() {
return INSTANCE;
}
+ public DeviceTransferBlockingInterceptor() {
+ this.blockNetworking = SignalStore.misc().isOldDeviceTransferLocked();
+ }
+
@Override
public @NonNull Response intercept(@NonNull Chain chain) throws IOException {
if (!blockNetworking) {
diff --git a/app/src/main/res/drawable-night/ic_complete_reg.xml b/app/src/main/res/drawable-night/ic_complete_reg.xml
new file mode 100644
index 000000000..bb38c76c7
--- /dev/null
+++ b/app/src/main/res/drawable-night/ic_complete_reg.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_complete_reg.xml b/app/src/main/res/drawable/ic_complete_reg.xml
new file mode 100644
index 000000000..345207063
--- /dev/null
+++ b/app/src/main/res/drawable/ic_complete_reg.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/group_invite_link_enable_and_share_bottom_sheet.xml b/app/src/main/res/layout/group_invite_link_enable_and_share_bottom_sheet.xml
index c2a227a52..e2457f981 100644
--- a/app/src/main/res/layout/group_invite_link_enable_and_share_bottom_sheet.xml
+++ b/app/src/main/res/layout/group_invite_link_enable_and_share_bottom_sheet.xml
@@ -8,7 +8,7 @@
diff --git a/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml b/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml
index a0eb5c539..29e47b0cd 100644
--- a/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml
+++ b/app/src/main/res/layout/groups_learn_more_bottom_sheet.xml
@@ -14,7 +14,7 @@
android:layout_marginTop="24dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_legacy_vs_new_groups"
- android:textAppearance="@style/TextAppearance.Signal.Title2"
+ android:textAppearance="@style/TextAppearance.Signal.Title2.Bold"
android:textColor="@color/signal_text_primary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_1_header"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/invite_activity.xml b/app/src/main/res/layout/invite_activity.xml
index aca13221a..7c8f00356 100644
--- a/app/src/main/res/layout/invite_activity.xml
+++ b/app/src/main/res/layout/invite_activity.xml
@@ -35,7 +35,7 @@
+ android:paddingBottom="16dp">
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintVertical_bias="0"
+ app:layout_constraintVertical_chainStyle="packed" />
-
+ app:layout_constraintTop_toBottomOf="@+id/old_device_trasnfer_complete_fragment_subtitle"
+ app:srcCompat="@drawable/ic_complete_reg" />
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/old_device_transfer_locked_dialog_fragment.xml b/app/src/main/res/layout/old_device_transfer_locked_dialog_fragment.xml
new file mode 100644
index 000000000..84732ba2b
--- /dev/null
+++ b/app/src/main/res/layout/old_device_transfer_locked_dialog_fragment.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/onboarding_megaphone.xml b/app/src/main/res/layout/onboarding_megaphone.xml
index 3c8b87910..94dc90e64 100644
--- a/app/src/main/res/layout/onboarding_megaphone.xml
+++ b/app/src/main/res/layout/onboarding_megaphone.xml
@@ -36,7 +36,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
- style="@style/TextAppearance.Signal.Title2"
+ style="@style/TextAppearance.Signal.Title2.Bold"
android:text="@string/Megaphones_get_started"
app:layout_constraintTop_toTopOf="parent" />
diff --git a/app/src/main/res/layout/profile_create_fragment.xml b/app/src/main/res/layout/profile_create_fragment.xml
index d6f879718..c1880c266 100644
--- a/app/src/main/res/layout/profile_create_fragment.xml
+++ b/app/src/main/res/layout/profile_create_fragment.xml
@@ -35,7 +35,7 @@
@color/core_grey_50
+
+
+
+
+
+
+
+
@@ -95,4 +113,13 @@
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e4d2dac1a..11d5b8f5c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2787,7 +2787,7 @@
An unexpected error occurred while attempting to connect to your old Android device.
- Searching for your new Android device…
+ Searching for new Android device…
Signal needs the location permission to discover and connect to your new Android device.
Signal needs location services enabled to discover and connect with your new Android device.
Signal needs Wi-Fi on to discover and connect with your new Android device. Wi-Fi needs to be on but it does not have to be connected to a Wi-Fi network.
@@ -2874,6 +2874,12 @@
Verification required
Transferring account…
+
+ Complete registration on your new device
+ Your Signal account has been transferred to your new device, but you must complete registration on it to continue. Signal will be inactive on this device.
+ Done
+ Cancel and activate this device
+
Block
Unblock
diff --git a/app/src/main/res/values/text_styles.xml b/app/src/main/res/values/text_styles.xml
index fbf0173a4..8c9f4b8c1 100644
--- a/app/src/main/res/values/text_styles.xml
+++ b/app/src/main/res/values/text_styles.xml
@@ -63,7 +63,9 @@
- @color/signal_text_primary
-