Fix app widget binding when used does not select always allow

This commit is contained in:
MM20 2022-08-05 00:51:10 +02:00
parent 3feb339d28
commit ca4a3840af
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 47 additions and 50 deletions

View File

@ -19,10 +19,10 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import de.mm20.launcher2.ui.theme.LauncherTheme
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.BaseActivity import de.mm20.launcher2.ui.base.BaseActivity
import de.mm20.launcher2.ui.base.ProvideSettings import de.mm20.launcher2.ui.base.ProvideSettings
import de.mm20.launcher2.ui.theme.LauncherTheme
class PickAppWidgetActivity : BaseActivity() { class PickAppWidgetActivity : BaseActivity() {
@ -39,7 +39,6 @@ class PickAppWidgetActivity : BaseActivity() {
appWidgetManager = AppWidgetManager.getInstance(this) appWidgetManager = AppWidgetManager.getInstance(this)
val availableWidgets = viewModel.getAvailableWidgets(this) val availableWidgets = viewModel.getAvailableWidgets(this)
val selectedAppWidget = viewModel.selectedAppWidget
setContent { setContent {
LauncherTheme { LauncherTheme {
ProvideSettings { ProvideSettings {
@ -63,12 +62,12 @@ class PickAppWidgetActivity : BaseActivity() {
} }
) { ) {
val available by availableWidgets.observeAsState() val available by availableWidgets.observeAsState()
val selected by selectedAppWidget.observeAsState()
val widgets = available val widgets = available
if (selected == null) {
if (widgets != null) { if (widgets != null) {
AppWidgetList( AppWidgetList(
modifier = Modifier.fillMaxSize().padding(it), modifier = Modifier
.fillMaxSize()
.padding(it),
widgets = widgets, widgets = widgets,
onWidgetSelected = { onWidgetSelected = {
selectAppWidget(it) selectAppWidget(it)
@ -76,7 +75,9 @@ class PickAppWidgetActivity : BaseActivity() {
) )
} else { } else {
Box( Box(
modifier = Modifier.fillMaxSize().padding(it), modifier = Modifier
.fillMaxSize()
.padding(it),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
) { ) {
CircularProgressIndicator() CircularProgressIndicator()
@ -87,20 +88,28 @@ class PickAppWidgetActivity : BaseActivity() {
} }
} }
} }
}
private fun selectAppWidget(widget: AppWidgetProviderInfo) { private fun selectAppWidget(widget: AppWidgetProviderInfo) {
val appWidgetId = widgetHost.allocateAppWidgetId() val appWidgetId = widgetHost.allocateAppWidgetId()
viewModel.selectAppWidget(widget, appWidgetId) bindAppWidget(widget, appWidgetId)
configureWidget()
} }
private fun configureWidget() { private fun bindAppWidget(widget: AppWidgetProviderInfo, appWidgetId: Int) {
val appWidgetId = viewModel.appWidgetId.value ?: return
val widget = viewModel.selectedAppWidget.value ?: return
val canBind = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, widget.provider) val canBind = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, widget.provider)
Log.d("MM20", "Can bind: $canBind") Log.d("MM20", "Can bind: $canBind")
if (canBind) { if (canBind) {
configureAppWidget(widget, appWidgetId)
} else {
startActivityForResult(
Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider)
}, RequestCodeBind
)
}
}
private fun configureAppWidget(widget: AppWidgetProviderInfo, appWidgetId: Int) {
if (widget.configure != null) { if (widget.configure != null) {
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE) val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE)
intent.component = widget.configure intent.component = widget.configure
@ -115,14 +124,6 @@ class PickAppWidgetActivity : BaseActivity() {
} else { } else {
finishWithResult(appWidgetId) finishWithResult(appWidgetId)
} }
} else {
startActivityForResult(
Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, widget.provider)
}, RequestCodeBind
)
}
} }
@Deprecated("Deprecated in super class") @Deprecated("Deprecated in super class")
@ -130,19 +131,23 @@ class PickAppWidgetActivity : BaseActivity() {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
when (requestCode) { when (requestCode) {
RequestCodeBind -> { RequestCodeBind -> {
val appWidgetId =
data?.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
configureWidget() val widget = appWidgetManager.getAppWidgetInfo(appWidgetId)
configureAppWidget(widget, appWidgetId)
} else { } else {
viewModel.appWidgetId.value?.let { widgetHost.deleteAppWidgetId(it) } widgetHost.deleteAppWidgetId(appWidgetId)
cancel() cancel()
} }
} }
RequestCodeConfigure -> { RequestCodeConfigure -> {
val widgetId = viewModel.appWidgetId.value ?: return cancel() val appWidgetId =
data?.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return cancel()
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
finishWithResult(widgetId) finishWithResult(appWidgetId)
} else { } else {
widgetHost.deleteAppWidgetId(widgetId) widgetHost.deleteAppWidgetId(appWidgetId)
cancel() cancel()
} }
} }

View File

@ -21,14 +21,6 @@ inline val AppWidgetGroup.widgets: List<AppWidgetProviderInfo>
get() = this.second get() = this.second
class PickAppWidgetVM : ViewModel() { class PickAppWidgetVM : ViewModel() {
var appWidgetId: MutableLiveData<Int?> = MutableLiveData(null)
val selectedAppWidget: MutableLiveData<AppWidgetProviderInfo?> = MutableLiveData(null)
fun selectAppWidget(appWidget: AppWidgetProviderInfo, appWidgetId: Int) {
this.appWidgetId.value = appWidgetId
this.selectedAppWidget.value = appWidget
}
fun getAvailableWidgets(context: Context): LiveData<List<AppWidgetGroup>?> = liveData { fun getAvailableWidgets(context: Context): LiveData<List<AppWidgetGroup>?> = liveData {
emit(null) emit(null)
val appWidgetManager = AppWidgetManager.getInstance(context) val appWidgetManager = AppWidgetManager.getInstance(context)