-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathAppWidgetConfigActivity.kt
More file actions
102 lines (89 loc) · 4.09 KB
/
AppWidgetConfigActivity.kt
File metadata and controls
102 lines (89 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package to.bitkit.appwidget.config
import android.app.Activity
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.glance.appwidget.updateAll
import dagger.hilt.android.AndroidEntryPoint
import to.bitkit.appwidget.AppWidgetRefreshWorker
import to.bitkit.appwidget.model.AppWidgetType
import to.bitkit.appwidget.ui.blocks.BlocksGlanceReceiver
import to.bitkit.appwidget.ui.blocks.BlocksGlanceWidget
import to.bitkit.appwidget.ui.headlines.HeadlinesGlanceReceiver
import to.bitkit.appwidget.ui.headlines.HeadlinesGlanceWidget
import to.bitkit.appwidget.ui.price.PriceGlanceReceiver
import to.bitkit.appwidget.ui.price.PriceGlanceWidget
import to.bitkit.appwidget.ui.weather.WeatherGlanceReceiver
import to.bitkit.appwidget.ui.weather.WeatherGlanceWidget
import to.bitkit.ui.theme.AppThemeSurface
import to.bitkit.utils.Logger
@AndroidEntryPoint
class AppWidgetConfigActivity : ComponentActivity() {
companion object {
const val EXTRA_WIDGET_TYPE = "extra_widget_type"
private const val TAG = "AppWidgetConfigActivity"
}
private val viewModel: AppWidgetConfigViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val appWidgetId = intent?.extras?.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID,
) ?: AppWidgetManager.INVALID_APPWIDGET_ID
setResult(RESULT_CANCELED)
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish()
return
}
val type = resolveWidgetType(appWidgetId)
if (savedInstanceState == null) viewModel.init(appWidgetId, type)
setContent {
AppThemeSurface {
AppWidgetConfigScreen(
viewModel = viewModel,
onConfirm = {
when (viewModel.uiState.value.type) {
AppWidgetType.PRICE -> PriceGlanceWidget().updateAll(this@AppWidgetConfigActivity)
AppWidgetType.HEADLINES -> HeadlinesGlanceWidget().updateAll(this@AppWidgetConfigActivity)
AppWidgetType.BLOCKS -> BlocksGlanceWidget().updateAll(this@AppWidgetConfigActivity)
AppWidgetType.FACTS -> Unit
AppWidgetType.WEATHER -> WeatherGlanceWidget().updateAll(this@AppWidgetConfigActivity)
}
AppWidgetRefreshWorker.enqueue(this@AppWidgetConfigActivity)
val result = Intent().putExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetId,
)
setResult(Activity.RESULT_OK, result)
finish()
},
onCancel = { finish() },
)
}
}
}
private fun resolveWidgetType(appWidgetId: Int): AppWidgetType {
val extraType = intent?.getStringExtra(EXTRA_WIDGET_TYPE)
?.let { runCatching { AppWidgetType.valueOf(it) }.getOrNull() }
if (extraType != null) return extraType
val providerClass = AppWidgetManager.getInstance(this)
.getAppWidgetInfo(appWidgetId)?.provider?.className
return when (providerClass) {
PriceGlanceReceiver::class.java.name -> AppWidgetType.PRICE
HeadlinesGlanceReceiver::class.java.name -> AppWidgetType.HEADLINES
BlocksGlanceReceiver::class.java.name -> AppWidgetType.BLOCKS
WeatherGlanceReceiver::class.java.name -> AppWidgetType.WEATHER
else -> {
Logger.warn(
"Encountered unknown provider class '$providerClass' " +
"for appWidgetId='$appWidgetId', defaulting to PRICE",
context = TAG,
)
AppWidgetType.PRICE
}
}
}
}