(try to) fix #172

This commit is contained in:
Josia Pietsch 2025-05-17 12:12:03 +02:00
parent 31a9049861
commit bd7df4f6a0
Signed by: jrpie
GPG key ID: E70B571D66986A2D
9 changed files with 72 additions and 25 deletions

View file

@ -10,6 +10,7 @@ import de.jrpie.android.launcher.apps.AbstractAppInfo.Companion.INVALID_USER
import de.jrpie.android.launcher.apps.AppInfo import de.jrpie.android.launcher.apps.AppInfo
import de.jrpie.android.launcher.apps.DetailedAppInfo import de.jrpie.android.launcher.apps.DetailedAppInfo
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1 import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion1
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion100
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2 import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion2
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion3 import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion3
import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion4 import de.jrpie.android.launcher.preferences.legacy.migratePreferencesFromVersion4
@ -21,12 +22,13 @@ import de.jrpie.android.launcher.widgets.DebugInfoWidget
import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.deleteAllWidgets import de.jrpie.android.launcher.widgets.deleteAllWidgets
import de.jrpie.android.launcher.widgets.generateInternalId
/* Current version of the structure of preferences. /* Current version of the structure of preferences.
* Increase when breaking changes are introduced and write an appropriate case in * Increase when breaking changes are introduced and write an appropriate case in
* `migratePreferencesToNewVersion` * `migratePreferencesToNewVersion`
*/ */
const val PREFERENCE_VERSION = 100 const val PREFERENCE_VERSION = 101
const val UNKNOWN_PREFERENCE_VERSION = -1 const val UNKNOWN_PREFERENCE_VERSION = -1
private const val TAG = "Launcher - Preferences" private const val TAG = "Launcher - Preferences"
@ -65,6 +67,10 @@ fun migratePreferencesToNewVersion(context: Context) {
migratePreferencesFromVersion4(context) migratePreferencesFromVersion4(context)
Log.i(TAG, "migration of preferences complete (4 -> ${PREFERENCE_VERSION}).") Log.i(TAG, "migration of preferences complete (4 -> ${PREFERENCE_VERSION}).")
} }
100 -> {
migratePreferencesFromVersion100(context)
Log.i(TAG, "migration of preferences complete (100 -> ${PREFERENCE_VERSION}).")
}
else -> { else -> {
Log.w( Log.w(
@ -91,7 +97,7 @@ fun resetPreferences(context: Context) {
LauncherPreferences.widgets().widgets( LauncherPreferences.widgets().widgets(
setOf( setOf(
ClockWidget( ClockWidget(
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(), generateInternalId(),
WidgetPosition(1, 3, 10, 4), WidgetPosition(1, 3, 10, 4),
WidgetPanel.HOME.id WidgetPanel.HOME.id
) )
@ -103,7 +109,7 @@ fun resetPreferences(context: Context) {
LauncherPreferences.widgets().widgets().also { LauncherPreferences.widgets().widgets().also {
it.add( it.add(
DebugInfoWidget( DebugInfoWidget(
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(), generateInternalId(),
WidgetPosition(1, 1, 10, 4), WidgetPosition(1, 1, 10, 4),
WidgetPanel.HOME.id WidgetPanel.HOME.id
) )

View file

@ -0,0 +1,39 @@
package de.jrpie.android.launcher.preferences.legacy
import android.content.Context
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.preferences.LauncherPreferences
import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.DebugInfoWidget
import de.jrpie.android.launcher.widgets.generateInternalId
import de.jrpie.android.launcher.widgets.updateWidget
fun migratePreferencesFromVersion100(context: Context) {
assert(PREFERENCE_VERSION == 101)
assert(LauncherPreferences.internal().versionCode() == 100)
val widgets = LauncherPreferences.widgets().widgets() ?: setOf()
widgets.forEach { widget ->
when (widget) {
is ClockWidget -> {
val id = widget.id
val newId = generateInternalId()
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
widget.delete(context)
widget.id = newId
updateWidget(widget)
}
is DebugInfoWidget -> {
val id = widget.id
val newId = generateInternalId()
(context.applicationContext as Application).appWidgetHost.deleteAppWidgetId(id)
widget.delete(context)
widget.id = newId
updateWidget(widget)
}
else -> {}
}
}
LauncherPreferences.internal().versionCode(101)
}

View file

@ -7,19 +7,20 @@ import de.jrpie.android.launcher.preferences.PREFERENCE_VERSION
import de.jrpie.android.launcher.widgets.ClockWidget import de.jrpie.android.launcher.widgets.ClockWidget
import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.generateInternalId
fun migratePreferencesFromVersion4(context: Context) { fun migratePreferencesFromVersion4(context: Context) {
assert(PREFERENCE_VERSION == 100)
assert(LauncherPreferences.internal().versionCode() < 100) assert(LauncherPreferences.internal().versionCode() < 100)
LauncherPreferences.widgets().widgets( LauncherPreferences.widgets().widgets(
setOf( setOf(
ClockWidget( ClockWidget(
(context.applicationContext as Application).appWidgetHost.allocateAppWidgetId(), generateInternalId(),
WidgetPosition(1, 3, 10, 4), WidgetPosition(1, 3, 10, 4),
WidgetPanel.HOME.id WidgetPanel.HOME.id
) )
) )
) )
LauncherPreferences.internal().versionCode(100) LauncherPreferences.internal().versionCode(100)
migratePreferencesFromVersion100(context)
} }

View file

@ -135,10 +135,6 @@ class ManageWidgetsActivity : UIObject, Activity() {
val appWidgetHost = (application as Application).appWidgetHost val appWidgetHost = (application as Application).appWidgetHost
startActivityForResult( startActivityForResult(
Intent(this, SelectWidgetActivity::class.java).also { Intent(this, SelectWidgetActivity::class.java).also {
it.putExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetHost.allocateAppWidgetId()
)
it.putExtra( it.putExtra(
EXTRA_PANEL_ID, EXTRA_PANEL_ID,
panelId panelId

View file

@ -14,6 +14,7 @@ import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.R import de.jrpie.android.launcher.R
import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding import de.jrpie.android.launcher.databinding.ActivitySelectWidgetBinding
import de.jrpie.android.launcher.ui.UIObject import de.jrpie.android.launcher.ui.UIObject
@ -24,7 +25,7 @@ import de.jrpie.android.launcher.widgets.LauncherWidgetProvider
import de.jrpie.android.launcher.widgets.WidgetPanel import de.jrpie.android.launcher.widgets.WidgetPanel
import de.jrpie.android.launcher.widgets.WidgetPosition import de.jrpie.android.launcher.widgets.WidgetPosition
import de.jrpie.android.launcher.widgets.bindAppWidgetOrRequestPermission import de.jrpie.android.launcher.widgets.bindAppWidgetOrRequestPermission
import de.jrpie.android.launcher.widgets.getAppWidgetHost import de.jrpie.android.launcher.widgets.generateInternalId
import de.jrpie.android.launcher.widgets.getAppWidgetProviders import de.jrpie.android.launcher.widgets.getAppWidgetProviders
import de.jrpie.android.launcher.widgets.updateWidget import de.jrpie.android.launcher.widgets.updateWidget
@ -38,12 +39,13 @@ private const val REQUEST_WIDGET_PERMISSION = 29
*/ */
class SelectWidgetActivity : AppCompatActivity(), UIObject { class SelectWidgetActivity : AppCompatActivity(), UIObject {
lateinit var binding: ActivitySelectWidgetBinding lateinit var binding: ActivitySelectWidgetBinding
var widgetId: Int = -1
var widgetPanelId: Int = WidgetPanel.HOME.id var widgetPanelId: Int = WidgetPanel.HOME.id
private fun tryBindWidget(info: LauncherWidgetProvider) { private fun tryBindWidget(info: LauncherWidgetProvider) {
when (info) { when (info) {
is LauncherAppWidgetProvider -> { is LauncherAppWidgetProvider -> {
val widgetId =
(applicationContext as Application).appWidgetHost.allocateAppWidgetId()
if (bindAppWidgetOrRequestPermission( if (bindAppWidgetOrRequestPermission(
this, this,
info.info, info.info,
@ -62,7 +64,7 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject {
} }
} }
is LauncherClockWidgetProvider -> { is LauncherClockWidgetProvider -> {
updateWidget(ClockWidget(widgetId, WidgetPosition(0, 4, 12, 3), widgetPanelId)) updateWidget(ClockWidget(generateInternalId(), WidgetPosition(0, 4, 12, 3), widgetPanelId))
finish() finish()
} }
} }
@ -81,11 +83,7 @@ class SelectWidgetActivity : AppCompatActivity(), UIObject {
setContentView(binding.root) setContentView(binding.root)
widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id) widgetPanelId = intent.getIntExtra(EXTRA_PANEL_ID, WidgetPanel.HOME.id)
if (widgetId == -1) {
widgetId = getAppWidgetHost().allocateAppWidgetId()
}
val viewManager = LinearLayoutManager(this) val viewManager = LinearLayoutManager(this)
val viewAdapter = SelectWidgetRecyclerAdapter() val viewAdapter = SelectWidgetRecyclerAdapter()

View file

@ -12,7 +12,7 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
@SerialName("widget:clock") @SerialName("widget:clock")
class ClockWidget( class ClockWidget(
override val id: Int, override var id: Int,
override var position: WidgetPosition, override var position: WidgetPosition,
override val panelId: Int, override val panelId: Int,
override var allowInteraction: Boolean = true override var allowInteraction: Boolean = true

View file

@ -12,7 +12,7 @@ import kotlinx.serialization.Serializable
@Serializable @Serializable
@SerialName("widget:debuginfo") @SerialName("widget:debuginfo")
class DebugInfoWidget( class DebugInfoWidget(
override val id: Int, override var id: Int,
override var position: WidgetPosition, override var position: WidgetPosition,
override val panelId: Int, override val panelId: Int,
override var allowInteraction: Boolean = true override var allowInteraction: Boolean = true

View file

@ -27,7 +27,9 @@ sealed class Widget {
abstract fun configure(activity: Activity, requestCode: Int) abstract fun configure(activity: Activity, requestCode: Int)
fun delete(context: Context) { fun delete(context: Context) {
if (id >= 0) {
context.getAppWidgetHost().deleteAppWidgetId(id) context.getAppWidgetHost().deleteAppWidgetId(id)
}
LauncherPreferences.widgets().widgets( LauncherPreferences.widgets().widgets(
LauncherPreferences.widgets().widgets()?.also { LauncherPreferences.widgets().widgets()?.also {

View file

@ -13,6 +13,7 @@ import android.os.UserManager
import android.util.Log import android.util.Log
import de.jrpie.android.launcher.Application import de.jrpie.android.launcher.Application
import de.jrpie.android.launcher.preferences.LauncherPreferences import de.jrpie.android.launcher.preferences.LauncherPreferences
import kotlin.math.min
fun deleteAllWidgets(context: Context) { fun deleteAllWidgets(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -29,12 +30,9 @@ fun deleteAllWidgets(context: Context) {
* *
* @return true iff the app widget was bound successfully. * @return true iff the app widget was bound successfully.
*/ */
fun bindAppWidgetOrRequestPermission(activity: Activity, providerInfo: AppWidgetProviderInfo, id: Int, requestCode: Int? = null): Boolean { fun bindAppWidgetOrRequestPermission(activity: Activity, providerInfo: AppWidgetProviderInfo, appWidgetId: Int, requestCode: Int? = null): Boolean {
val appWidgetId = if(id == -1) {
activity.getAppWidgetHost().allocateAppWidgetId()
} else { id }
Log.i("Launcher", "Binding new widget ${appWidgetId}") Log.i("Launcher", "Binding new widget $appWidgetId")
if (!activity.getAppWidgetManager().bindAppWidgetIdIfAllowed( if (!activity.getAppWidgetManager().bindAppWidgetIdIfAllowed(
appWidgetId, appWidgetId,
providerInfo.provider providerInfo.provider
@ -79,6 +77,13 @@ fun updateWidget(widget: Widget) {
) )
} }
// TODO: this needs to be improved
fun generateInternalId(): Int {
val minId = min(-5,(LauncherPreferences.widgets().widgets() ?: setOf()).minOfOrNull { it.id } ?: 0)
return minId -1
}
fun updateWidgetPanel(widgetPanel: WidgetPanel) { fun updateWidgetPanel(widgetPanel: WidgetPanel) {
LauncherPreferences.widgets().customPanels( LauncherPreferences.widgets().customPanels(
(LauncherPreferences.widgets().customPanels() ?: setOf()) (LauncherPreferences.widgets().customPanels() ?: setOf())