Skip to content

Commit 0f35eb7

Browse files
cody-signalalex-signal
authored andcommitted
Fix bad state when in restore flow and become unregistered.
1 parent a5cca5b commit 0f35eb7

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

app/src/main/java/org/thoughtcrime/securesms/registration/ui/restore/RemoteRestoreActivity.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,14 @@ import androidx.lifecycle.Lifecycle
4848
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4949
import androidx.lifecycle.lifecycleScope
5050
import androidx.lifecycle.repeatOnLifecycle
51+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
5152
import kotlinx.collections.immutable.ImmutableList
5253
import kotlinx.collections.immutable.persistentListOf
54+
import kotlinx.coroutines.delay
5355
import kotlinx.coroutines.flow.filterIsInstance
5456
import kotlinx.coroutines.flow.firstOrNull
5557
import kotlinx.coroutines.flow.map
58+
import kotlinx.coroutines.isActive
5659
import kotlinx.coroutines.launch
5760
import org.greenrobot.eventbus.EventBus
5861
import org.greenrobot.eventbus.Subscribe
@@ -62,6 +65,8 @@ import org.signal.core.ui.compose.DayNightPreviews
6265
import org.signal.core.ui.compose.Dialogs
6366
import org.signal.core.ui.compose.Previews
6467
import org.signal.core.ui.compose.theme.SignalTheme
68+
import org.signal.core.util.AppUtil
69+
import org.signal.core.util.ThreadUtil
6570
import org.signal.core.util.bytes
6671
import org.thoughtcrime.securesms.BaseActivity
6772
import org.thoughtcrime.securesms.MainActivity
@@ -81,6 +86,7 @@ import org.thoughtcrime.securesms.registration.ui.shared.RegistrationScreenTitle
8186
import org.thoughtcrime.securesms.registration.util.RegistrationUtil
8287
import org.thoughtcrime.securesms.util.DateUtils
8388
import org.thoughtcrime.securesms.util.PlayStoreUtil
89+
import org.thoughtcrime.securesms.util.TextSecurePreferences
8490
import org.thoughtcrime.securesms.util.viewModel
8591
import java.util.Locale
8692
import kotlin.time.Duration
@@ -150,6 +156,18 @@ class RemoteRestoreActivity : BaseActivity() {
150156
}
151157
}
152158

159+
lifecycleScope.launch {
160+
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
161+
while (isActive) {
162+
if (TextSecurePreferences.isUnauthorizedReceived(this@RemoteRestoreActivity)) {
163+
ThreadUtil.runOnMain { showUnregisteredDialog() }
164+
break
165+
}
166+
delay(1000)
167+
}
168+
}
169+
}
170+
153171
setContent {
154172
val state: RemoteRestoreViewModel.ScreenState by viewModel.state.collectAsStateWithLifecycle()
155173
val contactSupportState: ContactSupportViewModel.ContactSupportState<ContactSupportReason> by contactSupportViewModel.state.collectAsStateWithLifecycle()
@@ -225,6 +243,15 @@ class RemoteRestoreActivity : BaseActivity() {
225243
viewModel.updateRestoreProgress(restoreEvent)
226244
}
227245

246+
private fun showUnregisteredDialog() {
247+
MaterialAlertDialogBuilder(this)
248+
.setTitle(R.string.RestoreActivity__no_longer_registered_title)
249+
.setMessage(R.string.RestoreActivity__no_longer_registered_message)
250+
.setCancelable(false)
251+
.setPositiveButton(android.R.string.ok) { _, _ -> AppUtil.clearData(this) }
252+
.show()
253+
}
254+
228255
enum class ContactSupportReason {
229256
NetworkError, SvrBFailure
230257
}

app/src/main/java/org/thoughtcrime/securesms/restore/RestoreActivity.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,18 @@ import android.content.Intent
1010
import android.os.Bundle
1111
import androidx.activity.OnBackPressedCallback
1212
import androidx.activity.viewModels
13+
import androidx.lifecycle.Lifecycle
14+
import androidx.lifecycle.lifecycleScope
15+
import androidx.lifecycle.repeatOnLifecycle
1316
import androidx.navigation.NavController
1417
import androidx.navigation.Navigation
1518
import androidx.navigation.fragment.NavHostFragment
19+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
20+
import kotlinx.coroutines.delay
21+
import kotlinx.coroutines.isActive
22+
import kotlinx.coroutines.launch
23+
import org.signal.core.util.AppUtil
24+
import org.signal.core.util.ThreadUtil
1625
import org.signal.core.util.getParcelableExtraCompat
1726
import org.signal.core.util.logging.Log
1827
import org.thoughtcrime.securesms.BaseActivity
@@ -21,6 +30,7 @@ import org.thoughtcrime.securesms.R
2130
import org.thoughtcrime.securesms.RestoreDirections
2231
import org.thoughtcrime.securesms.registration.ui.restore.RemoteRestoreActivity
2332
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme
33+
import org.thoughtcrime.securesms.util.TextSecurePreferences
2434
import org.thoughtcrime.securesms.util.navigation.safeNavigate
2535

2636
/**
@@ -80,6 +90,18 @@ class RestoreActivity : BaseActivity() {
8090
}
8191
}
8292
)
93+
94+
lifecycleScope.launch {
95+
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
96+
while (isActive) {
97+
if (TextSecurePreferences.isUnauthorizedReceived(this@RestoreActivity)) {
98+
ThreadUtil.runOnMain { showUnregisteredDialog() }
99+
break
100+
}
101+
delay(1000)
102+
}
103+
}
104+
}
83105
}
84106

85107
override fun onResume() {
@@ -106,6 +128,15 @@ class RestoreActivity : BaseActivity() {
106128
finish()
107129
}
108130

131+
private fun showUnregisteredDialog() {
132+
MaterialAlertDialogBuilder(this)
133+
.setTitle(R.string.RestoreActivity__no_longer_registered_title)
134+
.setMessage(R.string.RestoreActivity__no_longer_registered_message)
135+
.setCancelable(false)
136+
.setPositiveButton(android.R.string.ok) { _, _ -> AppUtil.clearData(this) }
137+
.show()
138+
}
139+
109140
companion object {
110141

111142
private val TAG = Log.tag(RestoreActivity::class)

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,6 +1494,10 @@
14941494
<string name="RemoteRestoreActivity__not_now">Not now</string>
14951495
<!-- Text shown on restore screen as information on what will happen if you skip -->
14961496
<string name="RemoteRestoreActivity__your_media_will_restore_in_the_background">Your media will restore in the background. If you choose not to restore now, you won\'t be able to restore later.</string>
1497+
<!-- Dialog title -->
1498+
<string name="RestoreActivity__no_longer_registered_title">This device is no longer registered</string>
1499+
<!-- Dialog message -->
1500+
<string name="RestoreActivity__no_longer_registered_message">This is likely because you registered your Signal account on a different device.</string>
14971501

14981502
<!-- GroupMentionSettingDialog -->
14991503
<string name="GroupMentionSettingDialog_notify_me_for_mentions">Notify me for Mentions</string>

core-util/src/main/java/org/signal/core/util/AppUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package org.signal.core.util;
22

3+
import android.app.ActivityManager;
34
import android.content.Context;
45
import android.content.Intent;
56

67
import androidx.annotation.NonNull;
8+
import androidx.core.content.ContextCompat;
79

810
public final class AppUtil {
911

@@ -21,4 +23,11 @@ public static void restart(@NonNull Context context) {
2123
context.startActivity(defaultIntent);
2224
Runtime.getRuntime().exit(0);
2325
}
26+
27+
/**
28+
* Clears all app data, will cause the app to stop running.
29+
*/
30+
public static void clearData(@NonNull Context context) {
31+
ContextCompat.getSystemService(context, ActivityManager.class).clearApplicationUserData();
32+
}
2433
}

0 commit comments

Comments
 (0)