File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -82,6 +82,7 @@ import com.ichi2.anki.InitialActivity.StartupFailure.DirectoryNotAccessible
8282import com.ichi2.anki.InitialActivity.StartupFailure.DiskFull
8383import com.ichi2.anki.InitialActivity.StartupFailure.FutureAnkidroidVersion
8484import com.ichi2.anki.InitialActivity.StartupFailure.SDCardNotMounted
85+ import com.ichi2.anki.InitialActivity.StartupFailure.StorageUndecided
8586import com.ichi2.anki.IntentHandler.Companion.intentToReviewDeckFromShortcuts
8687import com.ichi2.anki.account.AccountActivity
8788import com.ichi2.anki.analytics.UsageAnalytics
@@ -1028,6 +1029,11 @@ open class DeckPicker :
10281029 is StartupFailure .InitializationError -> FatalErrorDialog .build(this , failure).show()
10291030 is DiskFull -> displayNoStorageError()
10301031 is DBError -> displayDatabaseFailure(CustomExceptionData .fromException(failure.exception))
1032+ is StorageUndecided -> {
1033+ Timber .i(" Displaying storage setup required" )
1034+ // unreachable: storageDecision() cannot yet return Undecided outside tests
1035+ TODO (" #19552 - replace with the storage setup flow." )
1036+ }
10311037 }
10321038 }
10331039
Original file line number Diff line number Diff line change @@ -37,6 +37,7 @@ import com.ichi2.anki.servicelayer.PreferenceUpgradeService
3737import com.ichi2.anki.servicelayer.PreferenceUpgradeService.setPreferencesUpToDate
3838import com.ichi2.anki.servicelayer.ScopedStorageService.isLegacyStorage
3939import com.ichi2.anki.storage.AnkiDroidFolder
40+ import com.ichi2.anki.storage.StorageDecision
4041import com.ichi2.anki.ui.windows.permissions.InternetPermissionFragment
4142import com.ichi2.anki.ui.windows.permissions.NotificationsPermissionFragment
4243import com.ichi2.anki.ui.windows.permissions.PermissionsFragment
@@ -61,6 +62,13 @@ object InitialActivity {
6162 return StartupFailure .InitializationError (it)
6263 }
6364
65+ // Opening the collection would throw a StorageNotConfiguredException, which is not worth
66+ // a crash report
67+ if (CollectionHelper .storageDecision() != StorageDecision .Decided ) {
68+ Timber .i(" storage location is undecided" )
69+ return StartupFailure .StorageUndecided
70+ }
71+
6472 val failure =
6573 try {
6674 CollectionManager .getColUnsafe()
@@ -187,6 +195,13 @@ object InitialActivity {
187195 }
188196
189197 data object DiskFull : StartupFailure ()
198+
199+ /* *
200+ * The user has not yet decided where the collection is stored.
201+ *
202+ * @see CollectionHelper.storageDecision
203+ */
204+ data object StorageUndecided : StartupFailure ()
190205 }
191206}
192207
Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import com.ichi2.anki.exception.StorageNotConfiguredException
77import com.ichi2.anki.storage.StorageDecision
88import org.junit.Test
99import org.junit.runner.RunWith
10+ import kotlin.test.assertEquals
1011import kotlin.test.assertFailsWith
1112
1213/* *
@@ -25,4 +26,16 @@ class StorageDecisionGateTest : RobolectricTest() {
2526 CollectionHelper .storageDecisionTestOverride = null
2627 }
2728 }
29+
30+ /* * No collection access should be attempted: a crash report would otherwise be generated */
31+ @Test
32+ fun `startup failure is StorageUndecided when storage is undecided` () {
33+ CollectionHelper .storageDecisionTestOverride = StorageDecision .Undecided
34+ try {
35+ val failure = InitialActivity .getStartupFailureType { true }
36+ assertEquals(InitialActivity .StartupFailure .StorageUndecided , failure)
37+ } finally {
38+ CollectionHelper .storageDecisionTestOverride = null
39+ }
40+ }
2841}
You can’t perform that action at this time.
0 commit comments