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,24 +62,25 @@ 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
modifier = Modifier.fillMaxSize().padding(it), .fillMaxSize()
widgets = widgets, .padding(it),
onWidgetSelected = { widgets = widgets,
selectAppWidget(it) onWidgetSelected = {
} selectAppWidget(it)
)
} else {
Box(
modifier = Modifier.fillMaxSize().padding(it),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator()
} }
)
} else {
Box(
modifier = Modifier
.fillMaxSize()
.padding(it),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator()
} }
} }
} }
@ -91,30 +91,14 @@ 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) {
if (widget.configure != null) { configureAppWidget(widget, appWidgetId)
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE)
intent.component = widget.configure
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
widgetHost.startAppWidgetConfigureActivityForResult(
this,
appWidgetId,
0,
RequestCodeConfigure,
null
)
} else {
finishWithResult(appWidgetId)
}
} else { } else {
startActivityForResult( startActivityForResult(
Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply {
@ -125,24 +109,45 @@ class PickAppWidgetActivity : BaseActivity() {
} }
} }
private fun configureAppWidget(widget: AppWidgetProviderInfo, appWidgetId: Int) {
if (widget.configure != null) {
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE)
intent.component = widget.configure
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
widgetHost.startAppWidgetConfigureActivityForResult(
this,
appWidgetId,
0,
RequestCodeConfigure,
null
)
} else {
finishWithResult(appWidgetId)
}
}
@Deprecated("Deprecated in super class") @Deprecated("Deprecated in super class")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
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)