From 5ca77e38bfd8070de80225d58b05f5a149f4bd26 Mon Sep 17 00:00:00 2001 From: Anoop Date: Fri, 19 Jul 2024 23:51:27 +0530 Subject: [PATCH] Working on feedback --- .../java/com/ichi2/widget/DeckPickerWidget.kt | 44 ++++++++--------- .../ichi2/widget/DeckPickerWidgetConfig.kt | 48 ++++++++++++++----- .../java/com/ichi2/widget/DeckPreferences.kt | 46 ++++++++++++++++++ .../res/layout/widget_deck_picker_config.xml | 2 +- AnkiDroid/src/main/res/values/08-widget.xml | 22 ++------- AnkiDroid/src/main/res/values/constants.xml | 3 -- 6 files changed, 110 insertions(+), 55 deletions(-) create mode 100644 AnkiDroid/src/main/java/com/ichi2/widget/DeckPreferences.kt diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidget.kt b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidget.kt index 6b4bbd972a14..4088786d7929 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidget.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidget.kt @@ -40,28 +40,6 @@ data class DeckPickerWidgetData( val newCount: Int ) -suspend fun getDeckNameAndStats(deckIds: List): List { - val result = mutableListOf() - - val deckTree = withCol { sched.deckDueTree() } - - deckTree.forEach { node -> - if (node.did !in deckIds) return@forEach - result.add( - DeckPickerWidgetData( - deckId = node.did, - name = node.lastDeckNameComponent, - reviewCount = node.revCount, - learnCount = node.lrnCount, - newCount = node.newCount - ) - ) - } - - val deckIdToData = result.associateBy { it.deckId } - return deckIds.mapNotNull { deckIdToData[it] } -} - class DeckPickerWidget : AppWidgetProvider() { override fun onUpdate( @@ -181,3 +159,25 @@ class DeckPickerWidget : AppWidgetProvider() { } } } + +suspend fun getDeckNameAndStats(deckIds: List): List { + val result = mutableListOf() + + val deckTree = withCol { sched.deckDueTree() } + + deckTree.forEach { node -> + if (node.did !in deckIds) return@forEach + result.add( + DeckPickerWidgetData( + deckId = node.did, + name = node.lastDeckNameComponent, + reviewCount = node.revCount, + learnCount = node.lrnCount, + newCount = node.newCount + ) + ) + } + + val deckIdToData = result.associateBy { it.deckId } + return deckIds.mapNotNull { deckIdToData[it] } +} diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidgetConfig.kt b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidgetConfig.kt index f8c26402f03d..b679315a70d0 100644 --- a/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidgetConfig.kt +++ b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidgetConfig.kt @@ -17,8 +17,10 @@ This program is free software; you can redistribute it and/or modify it under package com.ichi2.widget import android.appwidget.AppWidgetManager +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.os.Bundle import android.view.View import android.widget.Button @@ -41,12 +43,15 @@ class DeckPickerWidgetConfig : FragmentActivity(), DeckSelectionListener { private var appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID private lateinit var deckAdapter: DeckPickerWidgetAdapter + private lateinit var deckPreferences: DeckPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) setContentView(R.layout.widget_deck_picker_config) + deckPreferences = DeckPreferences(this) + val intent = intent val extras = intent.extras if (extras != null) { @@ -92,6 +97,14 @@ class DeckPickerWidgetConfig : FragmentActivity(), DeckSelectionListener { loadSelectedDecksFromPreferences() updateViewVisibility() + + // Register broadcast receiver to handle widget deletion + registerReceiver(widgetRemovedReceiver, IntentFilter(AppWidgetManager.ACTION_APPWIDGET_DELETED)) + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver(widgetRemovedReceiver) } private fun showDeckSelectionDialog() { @@ -162,26 +175,23 @@ class DeckPickerWidgetConfig : FragmentActivity(), DeckSelectionListener { } private fun saveSelectedDecksToPreferences() { - val sharedPreferences = getSharedPreferences("DeckPickerWidgetPrefs", Context.MODE_PRIVATE) - val editor = sharedPreferences.edit() - val selectedDecks = deckAdapter.decks.map { it.deckId.toString() } - editor.putString("selected_decks_$appWidgetId", selectedDecks.joinToString(",")) - editor.apply() + val selectedDecks = getSelectedDeckIds() + deckPreferences.saveSelectedDecks(appWidgetId, selectedDecks) - // Trigger widget update + // Create an intent to trigger a widget update val updateIntent = Intent(this, DeckPickerWidget::class.java).apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(appWidgetId)) - putExtra("selected_deck_ids", selectedDecks.map { it.toLong() }.toLongArray()) + putExtra("selected_deck_ids", selectedDecks.toLongArray()) } + + // Send the broadcast to update the widget sendBroadcast(updateIntent) } private fun loadSelectedDecksFromPreferences() { - val sharedPreferences = getSharedPreferences("DeckPickerWidgetPrefs", Context.MODE_PRIVATE) - val selectedDecksString = sharedPreferences.getString("selected_decks_$appWidgetId", "") - if (!selectedDecksString.isNullOrEmpty()) { - val selectedDecks = selectedDecksString.split(",").map { it.toLong() } + val selectedDecks = deckPreferences.loadSelectedDecks(appWidgetId) + if (selectedDecks.isNotEmpty()) { lifecycleScope.launch { val decks = fetchDecks() val selectedDeckObjects = decks.filter { selectedDecks.contains(it.deckId) } @@ -194,4 +204,20 @@ class DeckPickerWidgetConfig : FragmentActivity(), DeckSelectionListener { private fun getSelectedDeckIds(): List { return deckAdapter.decks.map { it.deckId } } + + private fun deleteWidgetData(appWidgetId: Int) { + deckPreferences.deleteWidgetData(appWidgetId) + } + + // BroadcastReceiver to handle widget removal + private val widgetRemovedReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == AppWidgetManager.ACTION_APPWIDGET_DELETED) { + val appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) + if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { + context?.let { deleteWidgetData(appWidgetId) } + } + } + } + } } diff --git a/AnkiDroid/src/main/java/com/ichi2/widget/DeckPreferences.kt b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPreferences.kt new file mode 100644 index 000000000000..e3f096918f4f --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/widget/DeckPreferences.kt @@ -0,0 +1,46 @@ +/* + Copyright (c) 2024 Anoop + +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 . +*/ + +package com.ichi2.widget + +import android.content.Context +import androidx.core.content.edit + +class DeckPreferences(context: Context) { + + private val sharedPreferences = context.getSharedPreferences("DeckPickerWidgetPrefs", Context.MODE_PRIVATE) + + fun saveSelectedDecks(appWidgetId: Int, selectedDecks: List) { + sharedPreferences.edit { + putString("selected_decks_$appWidgetId", selectedDecks.joinToString(",")) + } + } + + fun loadSelectedDecks(appWidgetId: Int): List { + val selectedDecksString = sharedPreferences.getString("selected_decks_$appWidgetId", "") + return if (!selectedDecksString.isNullOrEmpty()) { + selectedDecksString.split(",").map { it.toLong() } + } else { + emptyList() + } + } + + fun deleteWidgetData(appWidgetId: Int) { + sharedPreferences.edit { + remove("selected_decks_$appWidgetId") + } + } +} diff --git a/AnkiDroid/src/main/res/layout/widget_deck_picker_config.xml b/AnkiDroid/src/main/res/layout/widget_deck_picker_config.xml index 47d2a4677392..1491caf74bcf 100644 --- a/AnkiDroid/src/main/res/layout/widget_deck_picker_config.xml +++ b/AnkiDroid/src/main/res/layout/widget_deck_picker_config.xml @@ -75,7 +75,7 @@ android:clickable="true" android:paddingStart="12dp" android:paddingTop="0dp" - android:text="@string/widget_config_screen_done_button" + android:text="@string/save" android:textColor="?android:attr/textColorPrimary" android:textSize="16sp" /> diff --git a/AnkiDroid/src/main/res/values/08-widget.xml b/AnkiDroid/src/main/res/values/08-widget.xml index 58b8c24c3b4f..fb09c40bf2c5 100644 --- a/AnkiDroid/src/main/res/values/08-widget.xml +++ b/AnkiDroid/src/main/res/values/08-widget.xml @@ -40,25 +40,11 @@ Add new AnkiDroid note Deck Picker - Mark Favourite - "No decks are marked favourite " - Start marking decks favourite using the + icon. + + Mark as Favorite + No decks are marked as favorites + Start marking decks as favorites using the + icon. Only 5 decks can be marked favourite. Deck Name - Done - chemistry - physics - math - 50 - 30 - 25 - 52 - 20 - 15 - 54 - 10 - 5 - - diff --git a/AnkiDroid/src/main/res/values/constants.xml b/AnkiDroid/src/main/res/values/constants.xml index 19614061d0e9..091ebc9735e4 100644 --- a/AnkiDroid/src/main/res/values/constants.xml +++ b/AnkiDroid/src/main/res/values/constants.xml @@ -319,7 +319,4 @@ Show onboarding walkthrough Display feature tutorial to learn more about the app Show all tutorials again - - - Open Instant Editor