From 05583d1ee0ffaa5ef51412a77cb89db4d6786310 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Sep 2022 14:03:03 +0200 Subject: [PATCH] override AppWidgetHostView to be able to respond to long presses --- .../launcher/views/HomeScreenGrid.kt | 5 ++- .../launcher/views/MyAppWidgetHost.kt | 12 +++++++ .../launcher/views/MyAppWidgetHostView.kt | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHost.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHostView.kt 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 0189aef9..d9708f07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/HomeScreenGrid.kt @@ -1,7 +1,6 @@ package com.simplemobiletools.launcher.views import android.annotation.SuppressLint -import android.appwidget.AppWidgetHost import android.appwidget.AppWidgetManager import android.content.Context import android.graphics.Canvas @@ -263,7 +262,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel val infoList = AppWidgetManager.getInstance(context).installedProviders val appWidgetProviderInfo = infoList.firstOrNull { it.provider.shortClassName == item.shortClassName } if (appWidgetProviderInfo != null) { - val appWidgetHost = AppWidgetHost(context, WIDGET_HOST_ID) + val appWidgetHost = MyAppWidgetHost(context, WIDGET_HOST_ID) val appWidgetId = appWidgetHost.allocateAppWidgetId() val appWidgetManager = AppWidgetManager.getInstance(context) val canCreateWidget = appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetProviderInfo.provider) @@ -271,7 +270,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel if (appWidgetProviderInfo.configure != null && !isInitialDrawAfterLaunch) { appWidgetHost.startAppWidgetConfigureActivityForResult(context as MainActivity, appWidgetId, 0, REQUEST_CONFIGURE_WIDGET, null) } else { - val widgetView = appWidgetHost.createView(context, appWidgetId, appWidgetProviderInfo) + val widgetView = appWidgetHost.createView(context, appWidgetId, appWidgetProviderInfo) as MyAppWidgetHostView widgetView.x = item.left * rowWidth + sideMargins.left.toFloat() widgetView.y = item.top * rowHeight + sideMargins.top.toFloat() val widgetWidth = item.widthCells * rowWidth diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHost.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHost.kt new file mode 100644 index 00000000..b789aecb --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHost.kt @@ -0,0 +1,12 @@ +package com.simplemobiletools.launcher.views + +import android.appwidget.AppWidgetHost +import android.appwidget.AppWidgetHostView +import android.appwidget.AppWidgetProviderInfo +import android.content.Context + +class MyAppWidgetHost(context: Context, hostId: Int) : AppWidgetHost(context, hostId) { + override fun onCreateView(context: Context, appWidgetId: Int, appWidget: AppWidgetProviderInfo): AppWidgetHostView { + return MyAppWidgetHostView(context) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHostView.kt b/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHostView.kt new file mode 100644 index 00000000..cc760f8d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/launcher/views/MyAppWidgetHostView.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.launcher.views + +import android.appwidget.AppWidgetHostView +import android.content.Context +import android.os.Handler +import android.view.MotionEvent +import android.view.ViewConfiguration +import com.simplemobiletools.commons.extensions.performHapticFeedback + +class MyAppWidgetHostView(context: Context) : AppWidgetHostView(context) { + private var longPressHandler = Handler() + private var hasLongPressed = false + + override fun onInterceptTouchEvent(event: MotionEvent): Boolean { + if (hasLongPressed) { + hasLongPressed = false + return true + } + + when (event.actionMasked) { + MotionEvent.ACTION_DOWN -> longPressHandler.postDelayed(longPressRunnable, ViewConfiguration.getLongPressTimeout().toLong()) + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> longPressHandler.removeCallbacksAndMessages(null) + } + + return false + } + + private val longPressRunnable = Runnable { + longPressHandler.removeCallbacksAndMessages(null) + hasLongPressed = true + performHapticFeedback() + } +}