mirror of
https://github.com/jrpie/Launcher.git
synced 2025-06-08 02:11:24 +02:00
(try to) fix #172
This commit is contained in:
parent
31a9049861
commit
bd7df4f6a0
9 changed files with 72 additions and 25 deletions
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
|
@ -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)
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
context.getAppWidgetHost().deleteAppWidgetId(id)
|
if (id >= 0) {
|
||||||
|
context.getAppWidgetHost().deleteAppWidgetId(id)
|
||||||
|
}
|
||||||
|
|
||||||
LauncherPreferences.widgets().widgets(
|
LauncherPreferences.widgets().widgets(
|
||||||
LauncherPreferences.widgets().widgets()?.also {
|
LauncherPreferences.widgets().widgets()?.also {
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue