Skip to content

Commit 8b93e25

Browse files
feat: classify undecided storage as a startup failure
Assisted-by: Claude Fable 5 Co-authored-by: Ashish Yadav <48384865+criticalAY@users.noreply.github.com>
1 parent 281729f commit 8b93e25

3 files changed

Lines changed: 34 additions & 0 deletions

File tree

AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ import com.ichi2.anki.InitialActivity.StartupFailure.DirectoryNotAccessible
8282
import com.ichi2.anki.InitialActivity.StartupFailure.DiskFull
8383
import com.ichi2.anki.InitialActivity.StartupFailure.FutureAnkidroidVersion
8484
import com.ichi2.anki.InitialActivity.StartupFailure.SDCardNotMounted
85+
import com.ichi2.anki.InitialActivity.StartupFailure.StorageUndecided
8586
import com.ichi2.anki.IntentHandler.Companion.intentToReviewDeckFromShortcuts
8687
import com.ichi2.anki.account.AccountActivity
8788
import com.ichi2.anki.analytics.UsageAnalytics
@@ -1025,6 +1026,11 @@ open class DeckPicker :
10251026
is StartupFailure.InitializationError -> FatalErrorDialog.build(this, failure).show()
10261027
is DiskFull -> displayNoStorageError()
10271028
is DBError -> displayDatabaseFailure(CustomExceptionData.fromException(failure.exception))
1029+
is StorageUndecided -> {
1030+
Timber.i("Displaying storage setup required")
1031+
// unreachable: storageDecision() cannot yet return Undecided outside tests
1032+
TODO("#19552 - replace with the storage setup flow.")
1033+
}
10281034
}
10291035
}
10301036

AnkiDroid/src/main/java/com/ichi2/anki/InitialActivity.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import com.ichi2.anki.servicelayer.PreferenceUpgradeService
3737
import com.ichi2.anki.servicelayer.PreferenceUpgradeService.setPreferencesUpToDate
3838
import com.ichi2.anki.servicelayer.ScopedStorageService.isLegacyStorage
3939
import com.ichi2.anki.storage.AnkiDroidFolder
40+
import com.ichi2.anki.storage.StorageDecision
4041
import com.ichi2.anki.ui.windows.permissions.InternetPermissionFragment
4142
import com.ichi2.anki.ui.windows.permissions.NotificationsPermissionFragment
4243
import 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

AnkiDroid/src/test/java/com/ichi2/anki/StorageDecisionGateTest.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.ichi2.anki.exception.StorageNotConfiguredException
77
import com.ichi2.anki.storage.StorageDecision
88
import org.junit.Test
99
import org.junit.runner.RunWith
10+
import kotlin.test.assertEquals
1011
import 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
}

0 commit comments

Comments
 (0)