From cd15023c3abc692b7ef741324abbb1df694bf26f Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Sep 2022 21:35:11 +0200 Subject: [PATCH] handle the permission for binding widgets --- .../launcher/activities/MainActivity.kt | 26 +++++++++-- .../launcher/helpers/Constants.kt | 1 + .../launcher/views/HomeScreenGrid.kt | 45 ++++++++++++------- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/activities/MainActivity.kt index f2f7efa..269185a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/activities/MainActivity.kt @@ -2,6 +2,9 @@ package com.simplemobiletools.launcher.activities import android.animation.ObjectAnimator import android.annotation.SuppressLint +import android.app.Activity +import android.appwidget.AppWidgetManager +import android.appwidget.AppWidgetProviderInfo import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -25,10 +28,7 @@ import com.simplemobiletools.launcher.extensions.* import com.simplemobiletools.launcher.fragments.AllAppsFragment import com.simplemobiletools.launcher.fragments.MyFragment import com.simplemobiletools.launcher.fragments.WidgetsFragment -import com.simplemobiletools.launcher.helpers.ITEM_TYPE_ICON -import com.simplemobiletools.launcher.helpers.ITEM_TYPE_WIDGET -import com.simplemobiletools.launcher.helpers.ROW_COUNT -import com.simplemobiletools.launcher.helpers.UNINSTALL_APP_REQUEST_CODE +import com.simplemobiletools.launcher.helpers.* import com.simplemobiletools.launcher.interfaces.FlingListener import com.simplemobiletools.launcher.models.AppLauncher import com.simplemobiletools.launcher.models.HomeScreenGridItem @@ -47,6 +47,7 @@ class MainActivity : SimpleActivity(), FlingListener { private var mOpenPopupMenu: PopupMenu? = null private var mCachedLaunchers = ArrayList() private var mLastTouchCoords = Pair(0f, 0f) + private var mActionOnCanBindWidget: ((granted: Boolean) -> Unit)? = null private lateinit var mDetector: GestureDetectorCompat @@ -117,6 +118,8 @@ class MainActivity : SimpleActivity(), FlingListener { ensureBackgroundThread { refetchLaunchers() } + } else if (requestCode == REQUEST_ALLOW_BINDING_WIDGET) { + mActionOnCanBindWidget?.invoke(resultCode == Activity.RESULT_OK) } } @@ -482,6 +485,21 @@ class MainActivity : SimpleActivity(), FlingListener { homeScreenGridItemsDB.insertAll(homeScreenGridItems) } + fun handleWidgetBinding(appWidgetManager: AppWidgetManager, appWidgetId: Int, appWidgetInfo: AppWidgetProviderInfo, callback: (canBind: Boolean) -> Unit) { + mActionOnCanBindWidget = null + val canCreateWidget = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetInfo.provider) + if (canCreateWidget) { + callback(true) + } else { + mActionOnCanBindWidget = callback + Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { + putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, appWidgetInfo.provider) + startActivityForResult(this, REQUEST_ALLOW_BINDING_WIDGET) + } + } + } + // taken from https://gist.github.com/maxjvh/a6ab15cbba9c82a5065d private fun calculateAverageColor(bitmap: Bitmap): Int { var red = 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/helpers/Constants.kt index b6f1623..36d5ddc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/helpers/Constants.kt @@ -12,6 +12,7 @@ const val COLUMN_COUNT = 5 const val UNINSTALL_APP_REQUEST_CODE = 50 const val REQUEST_CONFIGURE_WIDGET = 51 +const val REQUEST_ALLOW_BINDING_WIDGET = 52 const val ITEM_TYPE_ICON = 0 const val ITEM_TYPE_WIDGET = 1 diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt index d4500de..1567cc6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt @@ -248,9 +248,12 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel bottom = widgetRect.bottom } - bindWidget(widgetItem, false) ensureBackgroundThread { - context.homeScreenGridItemsDB.insert(widgetItem) + val itemId = context.homeScreenGridItemsDB.insert(widgetItem) + widgetItem.id = itemId + post { + bindWidget(widgetItem, false) + } } } else { performHapticFeedback() @@ -263,23 +266,35 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel } private fun bindWidget(item: HomeScreenGridItem, isInitialDrawAfterLaunch: Boolean) { - val infoList = appWidgetManager.installedProviders + val activity = context as MainActivity + val infoList = appWidgetManager!!.installedProviders val appWidgetProviderInfo = infoList.firstOrNull { it.provider.shortClassName == item.shortClassName } if (appWidgetProviderInfo != null) { val appWidgetId = appWidgetHost.allocateAppWidgetId() - val canCreateWidget = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetProviderInfo.provider) - if (canCreateWidget) { - if (appWidgetProviderInfo.configure != null && !isInitialDrawAfterLaunch) { - appWidgetHost.startAppWidgetConfigureActivityForResult(context as MainActivity, appWidgetId, 0, REQUEST_CONFIGURE_WIDGET, null) - } else { - val widgetView = appWidgetHost.createView(context, appWidgetId, appWidgetProviderInfo) as MyAppWidgetHostView - widgetView.setAppWidget(appWidgetId, appWidgetProviderInfo) + activity.handleWidgetBinding(appWidgetManager, appWidgetId, appWidgetProviderInfo) { canBind -> + if (canBind) { + if (appWidgetProviderInfo.configure != null && !isInitialDrawAfterLaunch) { + appWidgetHost.startAppWidgetConfigureActivityForResult( + context as MainActivity, + appWidgetId, + 0, + REQUEST_CONFIGURE_WIDGET, + null + ) + } else { + val widgetView = appWidgetHost.createView(context, appWidgetId, appWidgetProviderInfo) as MyAppWidgetHostView + widgetView.setAppWidget(appWidgetId, appWidgetProviderInfo) - widgetView.x = item.left * rowWidth + sideMargins.left.toFloat() - widgetView.y = item.top * rowHeight + sideMargins.top.toFloat() - val widgetWidth = item.widthCells * rowWidth - val widgetHeight = item.heightCells * rowHeight - addView(widgetView, widgetWidth, widgetHeight) + widgetView.x = item.left * rowWidth + sideMargins.left.toFloat() + widgetView.y = item.top * rowHeight + sideMargins.top.toFloat() + val widgetWidth = item.widthCells * rowWidth + val widgetHeight = item.heightCells * rowHeight + addView(widgetView, widgetWidth, widgetHeight) + } + } else if (item.id != null) { + ensureBackgroundThread { + context.homeScreenGridItemsDB.deleteById(item.id!!) + } } } }