Move widget specific settings to widgets
This commit is contained in:
@@ -15,16 +15,13 @@ import java.util.UUID
|
||||
data class AppWidgetConfig(
|
||||
val widgetId: Int,
|
||||
val height: Int,
|
||||
val borderless: Boolean = false,
|
||||
)
|
||||
|
||||
data class AppWidget(
|
||||
override val id: UUID,
|
||||
val config: AppWidgetConfig,
|
||||
val widgetProviderInfo: AppWidgetProviderInfo
|
||||
) : Widget() {
|
||||
override fun loadLabel(context: Context): String {
|
||||
return widgetProviderInfo.loadLabel(context.packageManager)
|
||||
}
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
@@ -34,22 +31,6 @@ data class AppWidget(
|
||||
)
|
||||
}
|
||||
|
||||
override val isConfigurable: Boolean = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
widgetProviderInfo.widgetFeatures and AppWidgetProviderInfo.WIDGET_FEATURE_RECONFIGURABLE != 0
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
||||
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
|
||||
appWidgetHost.startAppWidgetConfigureActivityForResult(
|
||||
context,
|
||||
config.widgetId,
|
||||
0,
|
||||
0,
|
||||
null
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "app"
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ import android.content.Intent
|
||||
import de.mm20.launcher2.database.entities.PartialWidgetEntity
|
||||
import de.mm20.launcher2.ktx.tryStartActivity
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.util.UUID
|
||||
|
||||
@Serializable
|
||||
@@ -19,33 +21,14 @@ data class CalendarWidget(
|
||||
override val id: UUID,
|
||||
val config: CalendarWidgetConfig = CalendarWidgetConfig(),
|
||||
) : Widget() {
|
||||
override fun loadLabel(context: Context): String {
|
||||
return context.getString(R.string.widget_name_calendar)
|
||||
}
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
id = id,
|
||||
type = Type,
|
||||
config = null,
|
||||
config = Json.encodeToString(config),
|
||||
)
|
||||
}
|
||||
|
||||
override val isConfigurable: Boolean = true
|
||||
|
||||
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
|
||||
val intent = Intent()
|
||||
intent.component = ComponentName(
|
||||
context.getPackageName(),
|
||||
"de.mm20.launcher2.ui.settings.SettingsActivity"
|
||||
)
|
||||
intent.putExtra(
|
||||
"de.mm20.launcher2.settings.ROUTE",
|
||||
"settings/widgets/calendar"
|
||||
)
|
||||
context.tryStartActivity(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "calendar"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package de.mm20.launcher2.widgets
|
||||
|
||||
import de.mm20.launcher2.database.entities.PartialWidgetEntity
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.util.UUID
|
||||
|
||||
@Serializable
|
||||
data class FavoritesWidgetConfig(
|
||||
val editButton: Boolean = true,
|
||||
)
|
||||
|
||||
data class FavoritesWidget(
|
||||
override val id: UUID,
|
||||
val config: FavoritesWidgetConfig = FavoritesWidgetConfig(),
|
||||
) : Widget() {
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
id = id,
|
||||
type = Type,
|
||||
config = Json.encodeToString(config),
|
||||
)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "favorites"
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,7 @@
|
||||
package de.mm20.launcher2.widgets
|
||||
|
||||
import org.koin.android.ext.koin.androidContext
|
||||
import org.koin.dsl.module
|
||||
|
||||
val widgetsModule = module {
|
||||
single<WidgetRepository> { WidgetRepositoryImpl(androidContext(), get()) }
|
||||
single<WidgetRepository> { WidgetRepositoryImpl(get()) }
|
||||
}
|
||||
@@ -22,9 +22,6 @@ data class WeatherWidget(
|
||||
override val id: UUID,
|
||||
val config: WeatherWidgetConfig = WeatherWidgetConfig(),
|
||||
) : Widget() {
|
||||
override fun loadLabel(context: Context): String {
|
||||
return context.getString(R.string.widget_name_weather)
|
||||
}
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
@@ -34,21 +31,6 @@ data class WeatherWidget(
|
||||
)
|
||||
}
|
||||
|
||||
override val isConfigurable: Boolean = true
|
||||
|
||||
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
|
||||
val intent = Intent()
|
||||
intent.component = ComponentName(
|
||||
context.getPackageName(),
|
||||
"de.mm20.launcher2.ui.settings.SettingsActivity"
|
||||
)
|
||||
intent.putExtra(
|
||||
"de.mm20.launcher2.settings.ROUTE",
|
||||
"settings/widgets/weather"
|
||||
)
|
||||
context.tryStartActivity(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "weather"
|
||||
}
|
||||
|
||||
@@ -1,23 +1,15 @@
|
||||
package de.mm20.launcher2.widgets
|
||||
|
||||
import android.app.Activity
|
||||
import android.appwidget.AppWidgetHost
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import de.mm20.launcher2.database.entities.PartialWidgetEntity
|
||||
import de.mm20.launcher2.database.entities.WidgetEntity
|
||||
import de.mm20.launcher2.ktx.decodeFromStringOrNull
|
||||
import de.mm20.launcher2.ktx.tryStartActivity
|
||||
import kotlinx.serialization.json.Json
|
||||
import java.util.UUID
|
||||
|
||||
sealed class Widget {
|
||||
|
||||
abstract val id: UUID
|
||||
abstract fun loadLabel(context: Context): String
|
||||
fun toDatabaseEntity(position: Int, parentId: UUID? = null): WidgetEntity {
|
||||
internal fun toDatabaseEntity(position: Int, parentId: UUID? = null): WidgetEntity {
|
||||
return toDatabaseEntity().let {
|
||||
WidgetEntity(
|
||||
id = it.id,
|
||||
@@ -31,11 +23,8 @@ sealed class Widget {
|
||||
|
||||
abstract fun toDatabaseEntity(): PartialWidgetEntity
|
||||
|
||||
open val isConfigurable: Boolean = false
|
||||
open fun configure(context: Activity, appWidgetHost: AppWidgetHost) {}
|
||||
|
||||
companion object {
|
||||
fun fromDatabaseEntity(context: Context, entity: WidgetEntity): Widget? {
|
||||
fun fromDatabaseEntity(entity: WidgetEntity): Widget? {
|
||||
return when (entity.type) {
|
||||
WeatherWidget.Type -> {
|
||||
val config: WeatherWidgetConfig =
|
||||
@@ -43,7 +32,6 @@ sealed class Widget {
|
||||
?: WeatherWidgetConfig()
|
||||
WeatherWidget(entity.id, config)
|
||||
}
|
||||
|
||||
MusicWidget.Type -> MusicWidget(entity.id)
|
||||
CalendarWidget.Type -> {
|
||||
val config: CalendarWidgetConfig =
|
||||
@@ -51,8 +39,12 @@ sealed class Widget {
|
||||
?: CalendarWidgetConfig()
|
||||
CalendarWidget(entity.id, config)
|
||||
}
|
||||
|
||||
FavoritesWidget.Type -> FavoritesWidget(entity.id)
|
||||
FavoritesWidget.Type -> {
|
||||
val config: FavoritesWidgetConfig =
|
||||
Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() })
|
||||
?: FavoritesWidgetConfig()
|
||||
FavoritesWidget(entity.id, config)
|
||||
}
|
||||
AppWidget.Type -> {
|
||||
val config: AppWidgetConfig =
|
||||
Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() })
|
||||
@@ -60,8 +52,6 @@ sealed class Widget {
|
||||
AppWidget(
|
||||
entity.id,
|
||||
config,
|
||||
widgetProviderInfo = AppWidgetManager.getInstance(context)
|
||||
.getAppWidgetInfo(config.widgetId)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -75,10 +65,6 @@ sealed class Widget {
|
||||
data class MusicWidget(
|
||||
override val id: UUID,
|
||||
) : Widget() {
|
||||
override fun loadLabel(context: Context): String {
|
||||
return context.getString(R.string.widget_name_music)
|
||||
}
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
id = id,
|
||||
@@ -87,62 +73,12 @@ data class MusicWidget(
|
||||
)
|
||||
}
|
||||
|
||||
override val isConfigurable: Boolean = true
|
||||
|
||||
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
|
||||
val intent = Intent()
|
||||
intent.component = ComponentName(
|
||||
context.getPackageName(),
|
||||
"de.mm20.launcher2.ui.settings.SettingsActivity"
|
||||
)
|
||||
intent.putExtra(
|
||||
"de.mm20.launcher2.settings.ROUTE",
|
||||
"settings/widgets/music"
|
||||
)
|
||||
context.tryStartActivity(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "music"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
data class FavoritesWidget(
|
||||
override val id: UUID,
|
||||
) : Widget() {
|
||||
override fun loadLabel(context: Context): String {
|
||||
return context.getString(R.string.widget_name_favorites)
|
||||
}
|
||||
|
||||
override fun toDatabaseEntity(): PartialWidgetEntity {
|
||||
return PartialWidgetEntity(
|
||||
id = id,
|
||||
type = Type,
|
||||
config = null,
|
||||
)
|
||||
}
|
||||
|
||||
override val isConfigurable: Boolean = true
|
||||
|
||||
override fun configure(context: Activity, appWidgetHost: AppWidgetHost) {
|
||||
val intent = Intent()
|
||||
intent.component = ComponentName(
|
||||
context.getPackageName(),
|
||||
"de.mm20.launcher2.ui.settings.SettingsActivity"
|
||||
)
|
||||
intent.putExtra(
|
||||
"de.mm20.launcher2.settings.ROUTE",
|
||||
"settings/favorites"
|
||||
)
|
||||
context.tryStartActivity(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val Type = "favorites"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
enum class WidgetType(val value: String) {
|
||||
INTERNAL("internal"),
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package de.mm20.launcher2.widgets
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.withTransaction
|
||||
import de.mm20.launcher2.crashreporter.CrashReporter
|
||||
import de.mm20.launcher2.database.AppDatabase
|
||||
@@ -28,7 +27,6 @@ interface WidgetRepository {
|
||||
}
|
||||
|
||||
internal class WidgetRepositoryImpl(
|
||||
private val context: Context,
|
||||
private val database: AppDatabase,
|
||||
) : WidgetRepository {
|
||||
|
||||
@@ -40,7 +38,7 @@ internal class WidgetRepositoryImpl(
|
||||
} else {
|
||||
dao.queryByParent(parent, limit, offset)
|
||||
}.map {
|
||||
it.mapNotNull { Widget.fromDatabaseEntity(context, it) }
|
||||
it.mapNotNull { Widget.fromDatabaseEntity(it) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user