Skip to content

Commit

Permalink
Updating the widget picker screen layout for deck picker widget.
Browse files Browse the repository at this point in the history
  • Loading branch information
xenonnn4w committed Jul 19, 2024
1 parent bf404ad commit bea992d
Show file tree
Hide file tree
Showing 10 changed files with 289 additions and 89 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")
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit bea992d

Please sign in to comment.