Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.CollectionHelper
import com.ichi2.anki.CollectionHelper.getDefaultAnkiDroidDirectory
import com.ichi2.anki.CollectionManager
import com.ichi2.anki.DeckPicker
import com.ichi2.anki.R
import com.ichi2.anki.common.preferences.sharedPrefs
import com.ichi2.anki.common.storage.CollectionHelper
import com.ichi2.anki.startup.getDefaultAnkiDroidDirectory
import com.ichi2.anki.tests.InstrumentedTest
import com.ichi2.anki.testutil.disableIntroductionSlide
import com.ichi2.anki.testutil.discardPreliminaryViews
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ import androidx.test.espresso.matcher.RootMatchers.isDialog
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.CollectionHelper.getCurrentAnkiDroidDirectory
import com.ichi2.anki.CollectionManager
import com.ichi2.anki.DeckPicker
import com.ichi2.anki.R
import com.ichi2.anki.backend.DatabaseCorruption
import com.ichi2.anki.common.storage.CollectionHelper.getCurrentAnkiDroidDirectory
import com.ichi2.anki.tests.InstrumentedTest
import com.ichi2.anki.tests.Shared
import com.ichi2.anki.testutil.discardPreliminaryViews
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ import android.net.Uri
import anki.cards.FsrsMemoryState
import anki.collection.OpChanges
import anki.notetypes.StockNotetype
import com.ichi2.anki.CollectionHelper
import com.ichi2.anki.CollectionManager
import com.ichi2.anki.FlashCardsContract
import com.ichi2.anki.common.storage.CollectionHelper
import com.ichi2.anki.common.storage.StorageDecision
import com.ichi2.anki.common.time.TimeManager
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
import com.ichi2.anki.common.utils.emptyStringArray
Expand All @@ -49,7 +50,6 @@ import com.ichi2.anki.libanki.getStockNotetype
import com.ichi2.anki.libanki.sched.Scheduler
import com.ichi2.anki.observability.ChangeManager
import com.ichi2.anki.provider.pureAnswer
import com.ichi2.anki.storage.StorageDecision
import com.ichi2.anki.testutil.DatabaseUtils.cursorFillWindow
import com.ichi2.anki.testutil.GrantStoragePermission.storagePermission
import com.ichi2.anki.testutil.addNote
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteDatabaseCorruptException
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.CollectionHelper
import com.ichi2.anki.libanki.DB
import com.ichi2.anki.startup.getDefaultAnkiDroidDirectory
import com.ichi2.anki.tests.InstrumentedTest
import com.ichi2.anki.testutil.GrantStoragePermission
import net.ankiweb.rsdroid.database.AnkiSupportSQLiteDatabase
Expand All @@ -40,7 +40,7 @@ class DBTest : InstrumentedTest() {
@Test
@Throws(Exception::class)
fun testDBCorruption() {
val storagePath = CollectionHelper.getDefaultAnkiDroidDirectory(testContext)
val storagePath = getDefaultAnkiDroidDirectory(testContext)
val illFatedDBFile = File(storagePath, "illFatedDB.anki2")

// Make sure we have clean state to start with
Expand Down
13 changes: 12 additions & 1 deletion AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import com.ichi2.anki.common.coroutines.applicationScope
import com.ichi2.anki.common.crashreporting.CrashReportService.sendExceptionReport
import com.ichi2.anki.common.permissions.hasLegacyStorageAccessPermission
import com.ichi2.anki.common.preferences.sharedPrefs
import com.ichi2.anki.common.storage.CollectionHelper
import com.ichi2.anki.common.utils.android.SdCard
import com.ichi2.anki.common.utils.android.showThemedToast
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
Expand All @@ -57,6 +58,8 @@ import com.ichi2.anki.services.AlarmManagerService
import com.ichi2.anki.services.NotificationService
import com.ichi2.anki.settings.Prefs
import com.ichi2.anki.settings.PrefsRepository
import com.ichi2.anki.startup.ensureCollectionPathSet
import com.ichi2.anki.startup.getDefaultAnkiDroidDirectory
import com.ichi2.anki.ui.dialogs.ActivityAgnosticDialogs
import com.ichi2.utils.ExceptionUtil
import com.ichi2.utils.LanguageUtil
Expand Down Expand Up @@ -257,6 +260,7 @@ open class AnkiDroidApp :
// is not considered to be a fatal error, unless the directory itself is not writable.
val ankiDroidDir =
try {
ensureCollectionPathSet(this)
CollectionHelper.getCurrentAnkiDroidDirectory(this)
} catch (e: SystemStorageException) {
fatalInitializationError = FatalInitializationError.StorageError(e)
Expand All @@ -273,7 +277,7 @@ open class AnkiDroidApp :
} catch (e: StorageAccessException) {
Timber.e(e, "Could not initialize AnkiDroid directory")
try {
val defaultDir = CollectionHelper.getDefaultAnkiDroidDirectory(this)
val defaultDir = getDefaultAnkiDroidDirectory(this)
if (SdCard.isMounted && CollectionHelper.getCurrentAnkiDroidDirectory(this) == defaultDir) {
// Don't send report if the user is using a custom directory as SD cards trip up here a lot
sendExceptionReport(e, "AnkiDroidApp.onCreate")
Expand Down Expand Up @@ -530,6 +534,13 @@ open class AnkiDroidApp :
*/
fun sharedPrefs() = sharedPreferencesTestingOverride ?: instance.sharedPrefs()

/**
* [sharedPrefs], or `null` if unavailable: [instance] is not initialized when running
* under a test-only [Application] (e.g. `EmptyApplication`) or in pure JVM tests
*/
fun sharedPrefsOrNull(): SharedPreferences? =
sharedPreferencesTestingOverride ?: if (isInitialized) instance.sharedPrefs() else null

/** HACK: Whether an exception report has been thrown - TODO: Rewrite an ACRA Listener to do this */
@VisibleForTesting
var sentExceptionReportHack = false
Expand Down
Loading
Loading