Skip to content
Merged
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 @@ -97,6 +97,8 @@ import com.ichi2.anki.cardviewer.ViewerCommand
import com.ichi2.anki.cardviewer.ViewerRefresh
import com.ichi2.anki.cardviewer.handledGamepadKeyDown
import com.ichi2.anki.cardviewer.handledGamepadKeyUp
import com.ichi2.anki.common.android.animationDisabled
import com.ichi2.anki.common.android.animationEnabled
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.common.preferences.sharedPrefs
import com.ichi2.anki.common.utils.HashUtil.hashSetInit
Expand Down
20 changes: 1 addition & 19 deletions AnkiDroid/src/main/java/com/ichi2/anki/AnkiActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import com.ichi2.anki.android.input.ShortcutGroup
import com.ichi2.anki.android.input.ShortcutGroupProvider
import com.ichi2.anki.android.input.shortcut
import com.ichi2.anki.common.android.AnkiBroadcastReceiver
import com.ichi2.anki.common.android.animationDisabled
import com.ichi2.anki.common.annotations.LegacyNotifications
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.common.crashreporting.CrashReportService
Expand All @@ -88,7 +89,6 @@ import com.ichi2.anki.libanki.Collection
import com.ichi2.anki.receiver.SdCardReceiver
import com.ichi2.anki.settings.Prefs
import com.ichi2.anki.snackbar.showSnackbar
import com.ichi2.anki.utils.AnimUtils
import com.ichi2.anki.utils.ext.requireString
import com.ichi2.anki.utils.ext.showDialogFragment
import com.ichi2.anki.workarounds.AppLoadedFromBackupWorkaround.showedActivityFailedScreen
Expand Down Expand Up @@ -294,24 +294,6 @@ open class AnkiActivity(

fun colIsOpenUnsafe(): Boolean = CollectionManager.isOpenUnsafe()

/**
* Whether animations should not be displayed
* This is used to improve the UX for e-ink devices
* Can be tested via Settings - Advanced - Safe display mode
*
* @see .animationEnabled
*/
fun animationDisabled(): Boolean = !AnimUtils.areAnimationsEnabled(this)

/**
* Whether animations should be displayed
* This is used to improve the UX for e-ink devices
* Can be tested via Settings - Advanced - Safe display mode
*
* @see .animationDisabled
*/
fun animationEnabled(): Boolean = !animationDisabled()

override fun setContentView(view: View?) {
if (animationDisabled()) {
view?.clearAnimation()
Expand Down
3 changes: 3 additions & 0 deletions AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import anki.collection.OpChanges
import com.ichi2.anki.AnkiDroidApp.Companion.sharedPreferencesTestingOverride
import com.ichi2.anki.analytics.UsageAnalytics
import com.ichi2.anki.browser.SharedPreferencesLastDeckIdRepository
import com.ichi2.anki.common.android.Animations
import com.ichi2.anki.common.android.ApplicationContextInitializer
import com.ichi2.anki.common.android.getCurrentLocaleTag
import com.ichi2.anki.common.android.withAppLocale
Expand Down Expand Up @@ -53,6 +54,7 @@ import com.ichi2.anki.servicelayer.ThrowableFilterService
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.ui.dialogs.ActivityAgnosticDialogs
import com.ichi2.utils.AdaptionUtil
import com.ichi2.utils.ExceptionUtil
Expand Down Expand Up @@ -138,6 +140,7 @@ open class AnkiDroidApp :

initializeAcraCrashReporter()
initializeNavigator()
Animations.setPreferencesProvider { context -> PrefsRepository(context) }
val logType = LogType.value
when (logType) {
LogType.DEBUG -> Timber.plant(DebugTree())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import com.ichi2.anki.CollectionManager.withCol
import com.ichi2.anki.android.input.ShortcutGroup
import com.ichi2.anki.android.input.shortcut
import com.ichi2.anki.cardviewer.SingleCardSide
import com.ichi2.anki.common.android.animationDisabled
import com.ichi2.anki.common.android.appContext
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.common.utils.android.getColorFromAttr
Expand Down
1 change: 1 addition & 0 deletions AnkiDroid/src/main/java/com/ichi2/anki/DeckPicker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ import com.ichi2.anki.android.back.exitViaDoubleTapBackCallback
import com.ichi2.anki.android.input.ShortcutGroup
import com.ichi2.anki.android.input.shortcut
import com.ichi2.anki.android.view.locationInWindow
import com.ichi2.anki.common.android.animationDisabled
import com.ichi2.anki.common.android.appContext
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.common.crashreporting.CrashReportService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import android.widget.LinearLayout
import androidx.annotation.VisibleForTesting
import com.google.android.material.color.MaterialColors
import com.ichi2.anki.CollectionManager.TR
import com.ichi2.anki.common.android.animationEnabled
import com.ichi2.anki.databinding.ActivityHomescreenBinding
import com.ichi2.anki.databinding.IncludeFloatingAddButtonBinding
import com.ichi2.anki.ui.DoubleTapListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import com.google.android.material.color.MaterialColors
import com.google.android.material.navigation.NavigationView
import com.ichi2.anki.IntentHandler.Companion.grantedStoragePermissions
import com.ichi2.anki.NoteEditorFragment.Companion.NoteEditorCaller
import com.ichi2.anki.common.android.animationEnabled
import com.ichi2.anki.common.preferences.sharedPrefs
import com.ichi2.anki.common.utils.android.HandlerUtils
import com.ichi2.anki.dialogs.help.HelpDialog
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ import com.ichi2.anki.OnContextAndLongClickListener.Companion.setOnContextAndLon
import com.ichi2.anki.android.input.ShortcutGroup
import com.ichi2.anki.android.input.ShortcutGroupProvider
import com.ichi2.anki.android.input.shortcut
import com.ichi2.anki.common.android.animationEnabled
import com.ichi2.anki.common.android.appContext
import com.ichi2.anki.common.annotations.NeedsTest
import com.ichi2.anki.common.crashreporting.CrashReportService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ package com.ichi2.anki.preferences
import androidx.preference.Preference
import androidx.preference.SwitchPreferenceCompat
import com.ichi2.anki.R
import com.ichi2.anki.common.android.Animations
import com.ichi2.anki.settings.Prefs
import com.ichi2.anki.utils.AnimUtils

/**
* Fragment with preferences related to notifications
Expand Down Expand Up @@ -48,7 +48,7 @@ class AccessibilitySettingsFragment : SettingsFragment() {
override fun onResume() {
super.onResume()
requirePreference<SwitchPreferenceCompat>(R.string.safe_display_key).isEnabled =
AnimUtils.areSystemAnimationsEnabled(requireContext())
Animations.areSystemAnimationsEnabled(requireContext())
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ import com.google.android.material.appbar.CollapsingToolbarLayout
import com.google.android.material.appbar.MaterialToolbar
import com.ichi2.anki.R
import com.ichi2.anki.SingleFragmentActivity
import com.ichi2.anki.common.android.Animations
import com.ichi2.anki.common.annotations.LegacyNotifications
import com.ichi2.anki.common.utils.android.getResFromAttr
import com.ichi2.anki.preferences.HeaderFragment.Companion.getHeaderKeyForFragment
import com.ichi2.anki.reviewreminders.ReviewReminderScope
import com.ichi2.anki.reviewreminders.ScheduleRemindersFragment
import com.ichi2.anki.utils.AnimUtils
import com.ichi2.anki.utils.isWindowCompact
import com.ichi2.utils.FragmentFactoryUtils
import timber.log.Timber
Expand Down Expand Up @@ -208,7 +208,7 @@ class PreferencesFragment :
}

private fun setFadeTransition(fragmentTransaction: FragmentTransaction) {
if (AnimUtils.areAnimationsEnabled(requireContext())) {
if (Animations.areAnimationsEnabled(requireContext())) {
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.Context
import com.ichi2.anki.AnkiActivity
import com.ichi2.anki.R
import com.ichi2.anki.cardviewer.ViewerCommand
import com.ichi2.anki.common.android.animationEnabled
import com.ichi2.anki.common.utils.android.getColorsFromAttrs
import com.ichi2.anki.common.utils.android.getResFromAttr

Expand Down
5 changes: 3 additions & 2 deletions AnkiDroid/src/main/java/com/ichi2/anki/settings/Prefs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.ichi2.anki.AnkiDroidApp
import com.ichi2.anki.BuildConfig
import com.ichi2.anki.R
import com.ichi2.anki.cardviewer.TapGestureMode
import com.ichi2.anki.common.preferences.AnimationPreferences
import com.ichi2.anki.common.preferences.sharedPrefs
import com.ichi2.anki.common.utils.isRunningAsUnitTest
import com.ichi2.anki.settings.enums.AppTheme
Expand All @@ -45,7 +46,7 @@ object Prefs : PrefsRepository(AnkiDroidApp.sharedPrefs(), AnkiDroidApp.appResou
open class PrefsRepository(
val sharedPrefs: SharedPreferences,
private val resources: Resources,
) {
) : AnimationPreferences {
constructor(context: Context) : this(context.sharedPrefs(), context.resources)

@VisibleForTesting
Expand Down Expand Up @@ -381,7 +382,7 @@ open class PrefsRepository(

val answerButtonsSize: Int by intPref(R.string.answer_button_size_preference, 100)
val cardZoom: Int by intPref(R.string.card_zoom_preference, 100)
val removeAppAnimations by booleanPref(R.string.safe_display_key, defaultValue = false)
override val removeAppAnimations by booleanPref(R.string.safe_display_key, defaultValue = false)

// **************************************** Advanced **************************************** //

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import android.view.animation.Animation
import android.view.animation.AnimationUtils
import androidx.appcompat.widget.AppCompatImageView
import com.ichi2.anki.R
import com.ichi2.anki.utils.AnimUtils
import com.ichi2.anki.common.android.Animations
import com.ichi2.anki.utils.postDelayed
import kotlin.time.Duration.Companion.milliseconds

Expand All @@ -47,7 +47,7 @@ class AnswerFeedbackView : AppCompatImageView {
fadeOutRunnable = null
}

if (!AnimUtils.areAnimationsEnabled(context)) {
if (!Animations.areAnimationsEnabled(context)) {
visibility = VISIBLE
fadeOutRunnable =
Runnable {
Expand Down
48 changes: 0 additions & 48 deletions AnkiDroid/src/main/java/com/ichi2/anki/utils/AnimUtils.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// SPDX-License-Identifier: GPL-3.0-or-later

package com.ichi2.anki.testutils

import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.common.android.Animations
import com.ichi2.testutils.EmptyApplication
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config

@RunWith(AndroidJUnit4::class)
@Config(application = EmptyApplication::class)
class EmptyApplicationTest {
@Test
fun `Animations provider is registered`() {
// Must not throw UninitializedPropertyAccessException
Animations.areAnimationsEnabled(getApplicationContext())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: GPL-3.0-or-later

package com.ichi2.anki.testutils

import android.app.Application
import com.ichi2.anki.common.android.Animations
import com.ichi2.anki.navigation.initializeNavigator
import com.ichi2.anki.settings.PrefsRepository
import com.ichi2.testutils.EmptyApplication

/**
* Registers the global singletons that [com.ichi2.anki.AnkiDroidApp.onCreate] wires up, for tests
* which use [EmptyApplication] (and therefore skip `AnkiDroidApp.onCreate`).
*/
context(_: Application)
fun registerTestApplicationSingletons() {
initializeNavigator()
Animations.setPreferencesProvider { context -> PrefsRepository(context) }
}
22 changes: 7 additions & 15 deletions AnkiDroid/src/test/java/com/ichi2/testutils/EmptyApplication.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
/*
* Copyright (c) 2020 David Allison <davidallisongithub@gmail.com>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
// SPDX-License-Identifier: GPL-3.0-or-later

package com.ichi2.testutils

import android.app.Application
import com.ichi2.anki.AnkiDroidApp
import com.ichi2.anki.testutils.registerTestApplicationSingletons

/**
* A performance improvement to be used to avoid the startup cost of [AnkiDroidApp].
Expand All @@ -40,5 +28,9 @@ class EmptyApplication : Application() {

// reset the static state of the app
AnkiDroidApp.simulateRestoreFromBackup()

// EmptyApplication skips AnkiDroidApp.onCreate, so register the global singletons that
// activity code relies on (e.g. Animations, used by `Context.animationDisabled()`)
registerTestApplicationSingletons()
}
}
1 change: 1 addition & 0 deletions common/android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ dependencies {
implementation(libs.androidx.annotation)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.fragment.ktx)
implementation(libs.androidx.preference.ktx)
implementation(libs.google.material)
implementation(libs.jakewharton.timber)
Expand Down
Loading
Loading