Skip to content

Commit ed82402

Browse files
committed
refactor(widgets): move WidgetStatus and WidgetPermissionReceiver to :widgets
Add bridge callbacks for updateSmallWidgetUi, updateAddNoteWidgets, and isLegacyNotificationEnabled. Move allDecksCounts extension to :widgets/utils. Remove remaining app-module dependencies from WidgetStatus and WidgetPermissionReceiver.
1 parent d46b463 commit ed82402

6 files changed

Lines changed: 75 additions & 11 deletions

File tree

AnkiDroid/src/main/java/com/ichi2/anki/widget/WidgetDependenciesImpl.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,15 @@ import com.ichi2.anki.CrashReportService
2626
import com.ichi2.anki.IntentHandler
2727
import com.ichi2.anki.IntentHandler.Companion.intentToReviewDeckFromShortcuts
2828
import com.ichi2.anki.MetaDB
29+
import com.ichi2.anki.R
2930
import com.ichi2.anki.libanki.Collection
3031
import com.ichi2.anki.libanki.DeckId
3132
import com.ichi2.anki.noteeditor.NoteEditorLauncher
3233
import com.ichi2.anki.pages.DeckOptionsDestination
3334
import com.ichi2.anki.preferences.sharedPrefs
3435
import com.ichi2.anki.settings.Prefs
36+
import com.ichi2.widget.AddNoteWidget
37+
import com.ichi2.widget.AnkiDroidWidgetSmall
3538
import com.ichi2.widget.SmallWidgetStatus
3639
import com.ichi2.widget.bridge.WidgetAnalytics
3740
import com.ichi2.widget.bridge.WidgetAppState
@@ -41,6 +44,8 @@ import com.ichi2.widget.bridge.WidgetDependencies
4144
import com.ichi2.widget.bridge.WidgetIntentFactory
4245
import com.ichi2.widget.bridge.WidgetMetaStorage
4346
import com.ichi2.widget.bridge.WidgetPreferences
47+
import com.ichi2.widget.getAppWidgetIdsEx
48+
import com.ichi2.widget.getAppWidgetManager
4449
import kotlinx.coroutines.CoroutineScope
4550

4651
class WidgetAnalyticsImpl : WidgetAnalytics {
@@ -99,6 +104,22 @@ class WidgetAppStateImpl : WidgetAppState {
99104
override fun scheduleNotification(context: Context) {
100105
(context.applicationContext as AnkiDroidApp).scheduleNotification()
101106
}
107+
108+
override fun updateSmallWidgetUi(context: Context) {
109+
AnkiDroidWidgetSmall
110+
.UpdateService()
111+
.doUpdate(context)
112+
}
113+
114+
override fun updateAddNoteWidgets(context: Context) {
115+
val appWidgetManager = getAppWidgetManager(context) ?: return
116+
val widgetIds =
117+
appWidgetManager.getAppWidgetIdsEx(
118+
android.content.ComponentName(context, AddNoteWidget::class.java),
119+
)
120+
AddNoteWidget
121+
.updateWidgets(context, appWidgetManager, widgetIds)
122+
}
102123
}
103124

104125
class WidgetCrashReporterImpl : WidgetCrashReporter {
@@ -129,6 +150,13 @@ class WidgetPreferencesImpl : WidgetPreferences {
129150

130151
override val newReviewRemindersEnabled: Boolean
131152
get() = Prefs.newReviewRemindersEnabled
153+
154+
override fun isLegacyNotificationEnabled(context: Context): Boolean {
155+
val preferences = context.sharedPrefs()
156+
return preferences
157+
.getString(context.getString(R.string.pref_notifications_minimum_cards_due_key), "1000001")!!
158+
.toInt() < 1000000
159+
}
132160
}
133161

134162
/**

AnkiDroid/src/main/java/com/ichi2/widget/WidgetPermissionReceiver.kt renamed to widgets/src/main/java/com/ichi2/widget/WidgetPermissionReceiver.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
package com.ichi2.widget
1919

2020
import android.content.BroadcastReceiver
21-
import android.content.ComponentName
2221
import android.content.Context
2322
import android.content.Intent
2423
import com.ichi2.widget.bridge.WidgetDependencies
@@ -33,9 +32,7 @@ class WidgetPermissionReceiver : BroadcastReceiver() {
3332
intent: Intent,
3433
) {
3534
if (WidgetDependencies.intentFactory.grantedStoragePermissions(context, showToast = false)) {
36-
val appWidgetManager = getAppWidgetManager(context) ?: return
37-
val widgetIds = appWidgetManager.getAppWidgetIdsEx(ComponentName(context, AddNoteWidget::class.java))
38-
AddNoteWidget.updateWidgets(context, appWidgetManager, widgetIds)
35+
WidgetDependencies.appState.updateAddNoteWidgets(context)
3936
}
4037
}
4138
}

AnkiDroid/src/main/java/com/ichi2/widget/WidgetStatus.kt renamed to widgets/src/main/java/com/ichi2/widget/WidgetStatus.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@
1515
package com.ichi2.widget
1616

1717
import android.content.Context
18-
import com.ichi2.anki.R
19-
import com.ichi2.anki.utils.ext.allDecksCounts
2018
import com.ichi2.widget.bridge.WidgetDependencies
19+
import com.ichi2.widget.utils.allDecksCounts
2120
import kotlinx.coroutines.DelicateCoroutinesApi
2221
import kotlinx.coroutines.GlobalScope
2322
import kotlinx.coroutines.Job
@@ -50,10 +49,7 @@ object WidgetStatus {
5049
Timber.d("WidgetStatus.update(): already running or not enabled")
5150
}
5251
} else {
53-
val notificationEnabled =
54-
preferences
55-
.getString(context.getString(R.string.pref_notifications_minimum_cards_due_key), "1000001")!!
56-
.toInt() < 1000000
52+
val notificationEnabled = WidgetDependencies.preferences.isLegacyNotificationEnabled(context)
5753
if ((smallWidgetEnabled || notificationEnabled) && canExecuteTask) {
5854
Timber.d("WidgetStatus.update(): updating")
5955
smallWidgetUpdateJob = launchSmallWidgetUpdateJob(context)
@@ -83,7 +79,7 @@ object WidgetStatus {
8379
WidgetDependencies.metaStorage.storeSmallWidgetStatus(context, status)
8480
if (smallWidgetEnabled) {
8581
Timber.i("triggering small widget UI update")
86-
AnkiDroidWidgetSmall.UpdateService().doUpdate(context)
82+
WidgetDependencies.appState.updateSmallWidgetUi(context)
8783
}
8884
if (!WidgetDependencies.preferences.newReviewRemindersEnabled) {
8985
WidgetDependencies.appState.scheduleNotification(context)

widgets/src/main/java/com/ichi2/widget/bridge/WidgetAppState.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,10 @@ interface WidgetAppState {
3636

3737
/** Schedules a notification for review reminders */
3838
fun scheduleNotification(context: Context)
39+
40+
/** Triggers the small widget UI update */
41+
fun updateSmallWidgetUi(context: Context)
42+
43+
/** Triggers AddNoteWidget update after permission grant */
44+
fun updateAddNoteWidgets(context: Context)
3945
}

widgets/src/main/java/com/ichi2/widget/bridge/WidgetPreferences.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,7 @@ interface WidgetPreferences {
2929

3030
/** Whether the new review reminders feature is enabled */
3131
val newReviewRemindersEnabled: Boolean
32+
33+
/** Whether legacy notification is enabled (minimumCardsDue < 1000000) */
34+
fun isLegacyNotificationEnabled(context: Context): Boolean
3235
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2025 Brayan Oliveira <69634269+brayandso@users.noreply.github.com>
3+
*
4+
* This program is free software; you can redistribute it and/or modify it under
5+
* the terms of the GNU General Public License as published by the Free Software
6+
* Foundation; either version 3 of the License, or (at your option) any later
7+
* version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
10+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11+
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License along with
14+
* this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
package com.ichi2.widget.utils
17+
18+
import com.ichi2.anki.libanki.sched.Counts
19+
import com.ichi2.anki.libanki.sched.Scheduler
20+
21+
/**
22+
* @return Number of new, rev and lrn card to review in all decks.
23+
*/
24+
fun Scheduler.allDecksCounts(): Counts {
25+
val total = Counts()
26+
// Only count the top-level decks in the total
27+
val nodes = deckDueTree().children
28+
for (node in nodes) {
29+
total.addNew(node.newCount)
30+
total.addLrn(node.lrnCount)
31+
total.addRev(node.revCount)
32+
}
33+
return total
34+
}

0 commit comments

Comments
 (0)