Skip to content

Commit

Permalink
Working on feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
xenonnn4w committed Jul 19, 2024
1 parent 8c43879 commit 7dd093a
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 52 deletions.
44 changes: 22 additions & 22 deletions AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,28 +40,6 @@ data class DeckPickerWidgetData(
val newCount: Int
)

suspend fun getDeckNameAndStats(deckIds: List<Long>): List<DeckPickerWidgetData> {
val result = mutableListOf<DeckPickerWidgetData>()

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(
Expand Down Expand Up @@ -181,3 +159,25 @@ class DeckPickerWidget : AppWidgetProvider() {
}
}
}

suspend fun getDeckNameAndStats(deckIds: List<Long>): List<DeckPickerWidgetData> {
val result = mutableListOf<DeckPickerWidgetData>()

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] }
}
48 changes: 37 additions & 11 deletions AnkiDroid/src/main/java/com/ichi2/widget/DeckPickerWidgetConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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) }
Expand All @@ -194,4 +204,20 @@ class DeckPickerWidgetConfig : FragmentActivity(), DeckSelectionListener {
private fun getSelectedDeckIds(): List<Long> {
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) }
}
}
}
}
}
46 changes: 46 additions & 0 deletions AnkiDroid/src/main/java/com/ichi2/widget/DeckPreferences.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
Copyright (c) 2024 Anoop <[email protected]>
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/>.
*/

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<Long>) {
sharedPreferences.edit {
putString("selected_decks_$appWidgetId", selectedDecks.joinToString(","))
}
}

fun loadSelectedDecks(appWidgetId: Int): List<Long> {
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")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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" />
</RelativeLayout>
Expand Down
22 changes: 4 additions & 18 deletions AnkiDroid/src/main/res/values/08-widget.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,11 @@
<string name="widget_add_note_button">Add new AnkiDroid note</string>
<string name="app_widget_description">Deck Picker</string>

<string name="select_deck_title">Mark Favourite</string>
<string name="no_favourite_deck_placeholder_title">"No decks are marked favourite "</string>
<string name="no_favourite_deck_placeholder_description">Start marking decks favourite using the + icon.</string>
<!-- Strings to explain out usage in Deck Picker Widget Configuration screen -->
<string name="select_deck_title">Mark as Favorite</string>
<string name="no_favourite_deck_placeholder_title">No decks are marked as favorites</string>
<string name="no_favourite_deck_placeholder_description">Start marking decks as favorites using the + icon.</string>
<string name="deck_limit_reached">Only 5 decks can be marked favourite.</string>
<string name="widget_config_screen_deck_name">Deck Name</string>
<string name="widget_config_screen_done_button" comment="This will redirect the user to widget deck picker and will mark the end of configuration screen of widget deck picker">Done</string>
<string name="deck1Name_deck_picker_widget" >chemistry</string>
<string name="deck2Name_deck_picker_widget">physics</string>
<string name="deck3Name_deck_picker_widget">math</string>
<string name="deck1New_deck_picker_widget">50</string>
<string name="deck2New_deck_picker_widget">30</string>
<string name="deck3New_deck_picker_widget">25</string>
<string name="deck1Due_deck_picker_widget">52</string>
<string name="deck2Due_deck_picker_widget">20</string>
<string name="deck3Due_deck_picker_widget">15</string>
<string name="deck1Learn_deck_picker_widget">54</string>
<string name="deck2Learn_deck_picker_widget">10</string>
<string name="deck3Learn_deck_picker_widget">5</string>



</resources>
14 changes: 14 additions & 0 deletions AnkiDroid/src/main/res/values/constants.xml
Original file line number Diff line number Diff line change
Expand Up @@ -298,4 +298,18 @@
<string name="show_onboarding" maxLength="41">Show onboarding walkthrough</string>
<string name="show_onboarding_desc">Display feature tutorial to learn more about the app</string>
<string name="reset_onboarding_desc">Show all tutorials again</string>

<!-- sample deck names and properties for Deck Picker Widget layout in widget picker screen -->
<string name="deck1Name_deck_picker_widget" >chemistry</string>
<string name="deck2Name_deck_picker_widget">physics</string>
<string name="deck3Name_deck_picker_widget">math</string>
<string name="deck1New_deck_picker_widget">50</string>
<string name="deck2New_deck_picker_widget">30</string>
<string name="deck3New_deck_picker_widget">25</string>
<string name="deck1Due_deck_picker_widget">52</string>
<string name="deck2Due_deck_picker_widget">20</string>
<string name="deck3Due_deck_picker_widget">15</string>
<string name="deck1Learn_deck_picker_widget">54</string>
<string name="deck2Learn_deck_picker_widget">10</string>
<string name="deck3Learn_deck_picker_widget">5</string>
</resources>

0 comments on commit 7dd093a

Please sign in to comment.