From 659639842cf0dca88d308524904015b6022650eb Mon Sep 17 00:00:00 2001 From: Suphon Thanakornpakapong Date: Fri, 13 May 2022 14:32:03 +0700 Subject: [PATCH] Add smartspace to widgets picker --- lawnchair/AndroidManifest.xml | 10 +++++ lawnchair/res/values/strings.xml | 1 + .../res/xml/smartspace_appwidget_info.xml | 13 ++++++ .../lawnchair/LawnchairAppWidgetHostView.kt | 41 +++++++++++++++++++ .../smartspace/SmartspaceAppWidgetProvider.kt | 12 ++++++ src/com/android/launcher3/Workspace.java | 25 +++++++++++ .../widget/LauncherAppWidgetHost.java | 6 ++- .../widget/PendingItemDragHelper.java | 4 +- .../android/launcher3/widget/WidgetCell.java | 4 +- .../android/launcher3/model/WidgetsModel.java | 13 +++++- 10 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 lawnchair/res/xml/smartspace_appwidget_info.xml create mode 100644 lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt create mode 100644 lawnchair/src/app/lawnchair/smartspace/SmartspaceAppWidgetProvider.kt diff --git a/lawnchair/AndroidManifest.xml b/lawnchair/AndroidManifest.xml index f45a3b080a..af98197719 100644 --- a/lawnchair/AndroidManifest.xml +++ b/lawnchair/AndroidManifest.xml @@ -100,6 +100,16 @@ android:name="app.lawnchair.bugreport.UploaderService" android:process=":bugReport" /> + + + + + + + diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index baa7fa270c..b7344f7f99 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -236,4 +236,5 @@ Charged Battery Low Page %1$d of %2$d + At a Glance diff --git a/lawnchair/res/xml/smartspace_appwidget_info.xml b/lawnchair/res/xml/smartspace_appwidget_info.xml new file mode 100644 index 0000000000..0c06e0cb75 --- /dev/null +++ b/lawnchair/res/xml/smartspace_appwidget_info.xml @@ -0,0 +1,13 @@ + + diff --git a/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt b/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt new file mode 100644 index 0000000000..710195a8d1 --- /dev/null +++ b/lawnchair/src/app/lawnchair/LawnchairAppWidgetHostView.kt @@ -0,0 +1,41 @@ +package app.lawnchair + +import android.appwidget.AppWidgetProviderInfo +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.widget.RemoteViews +import app.lawnchair.smartspace.SmartspaceAppWidgetProvider +import com.android.launcher3.R +import com.android.launcher3.widget.LauncherAppWidgetHostView + +class LawnchairAppWidgetHostView(context: Context) : LauncherAppWidgetHostView(context) { + + private var customView: ViewGroup? = null + + override fun setAppWidget(appWidgetId: Int, info: AppWidgetProviderInfo) { + super.setAppWidget(appWidgetId, info) + customView = null + + val layoutId = customLayouts[info.provider] ?: return + removeAllViews() + customView = LayoutInflater.from(context).inflate(layoutId, this, false) as ViewGroup + customView!!.setOnLongClickListener(this) + } + + override fun updateAppWidget(remoteViews: RemoteViews?) { + if (customView != null) { + removeAllViews() + addView(customView, MATCH_PARENT, MATCH_PARENT) + } + super.updateAppWidget(remoteViews) + } + + companion object { + + private val customLayouts = mapOf( + SmartspaceAppWidgetProvider.componentName to R.layout.search_container_workspace + ) + } +} diff --git a/lawnchair/src/app/lawnchair/smartspace/SmartspaceAppWidgetProvider.kt b/lawnchair/src/app/lawnchair/smartspace/SmartspaceAppWidgetProvider.kt new file mode 100644 index 0000000000..06ed7e7c09 --- /dev/null +++ b/lawnchair/src/app/lawnchair/smartspace/SmartspaceAppWidgetProvider.kt @@ -0,0 +1,12 @@ +package app.lawnchair.smartspace + +import android.appwidget.AppWidgetProvider +import android.content.ComponentName +import com.android.launcher3.BuildConfig + +class SmartspaceAppWidgetProvider : AppWidgetProvider() { + + companion object { + @JvmField val componentName = ComponentName(BuildConfig.APPLICATION_ID, SmartspaceAppWidgetProvider::class.java.name) + } +} diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 952d1ddecd..8ecde1d1f0 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -130,6 +130,8 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; +import app.lawnchair.smartspace.SmartspaceAppWidgetProvider; + /** * The workspace is a wide area with a wallpaper and a finite number of pages. * Each page contains a number of icons, folders or widgets the user can @@ -1078,6 +1080,29 @@ public class Workspace extends PagedView } else { mIsEventOverQsb = false; } + if (!mIsEventOverQsb) { + mIsEventOverQsb = isEventOverQsb(mXDown, mYDown); + } + } + + private boolean isEventOverQsb(float x, float y) { + CellLayout target = (CellLayout) getChildAt(mCurrentPage); + ShortcutAndWidgetContainer container = target.getShortcutsAndWidgets(); + mTempFXY[0] = x; + mTempFXY[1] = y; + Utilities.mapCoordInSelfToDescendant(container, this, mTempFXY); + for (int i = 0; i < container.getChildCount(); i++) { + View child = container.getChildAt(i); + Object tag = child.getTag(); + if (!(tag instanceof LauncherAppWidgetInfo)) continue; + LauncherAppWidgetInfo info = (LauncherAppWidgetInfo) tag; + if (!info.providerName.equals(SmartspaceAppWidgetProvider.componentName)) continue; + + boolean isOverQsb = child.getLeft() <= mTempFXY[0] && child.getRight() >= mTempFXY[0] + && child.getTop() <= mTempFXY[1] && child.getBottom() >= mTempFXY[1]; + if (isOverQsb) return true; + } + return false; } @Override diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java index fe83f3f606..68db77f652 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java @@ -46,6 +46,8 @@ import com.android.launcher3.widget.custom.CustomWidgetManager; import java.util.ArrayList; import java.util.function.IntConsumer; +import app.lawnchair.LawnchairAppWidgetHostView; + /** * Specific {@link AppWidgetHost} that creates our {@link LauncherAppWidgetHostView} @@ -96,7 +98,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost { view = mPendingViews.get(appWidgetId); mPendingViews.remove(appWidgetId); } else { - view = new LauncherAppWidgetHostView(context); + view = new LawnchairAppWidgetHostView(context); } mViews.put(appWidgetId, view); return view; @@ -216,7 +218,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost { public AppWidgetHostView createView(Context context, int appWidgetId, LauncherAppWidgetProviderInfo appWidget) { if (appWidget.isCustomWidget()) { - LauncherAppWidgetHostView lahv = new LauncherAppWidgetHostView(context); + LauncherAppWidgetHostView lahv = new LawnchairAppWidgetHostView(context); lahv.setAppWidget(0, appWidget); CustomWidgetManager.INSTANCE.get(context).onViewCreated(lahv); return lahv; diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java index 463f4ac1b1..818311ad71 100644 --- a/src/com/android/launcher3/widget/PendingItemDragHelper.java +++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java @@ -46,6 +46,8 @@ import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.widget.dragndrop.AppWidgetHostViewDragListener; import com.android.launcher3.widget.util.WidgetSizes; +import app.lawnchair.LawnchairAppWidgetHostView; + /** * Extension of {@link DragPreviewProvider} with logic specific to pending widgets/shortcuts * dragged from the widget tray. @@ -121,7 +123,7 @@ public class PendingItemDragHelper extends DragPreviewProvider { int[] previewSizeBeforeScale = new int[1]; if (mRemoteViewsPreview != null) { - mAppWidgetHostViewPreview = new LauncherAppWidgetHostView(launcher); + mAppWidgetHostViewPreview = new LawnchairAppWidgetHostView(launcher); mAppWidgetHostViewPreview.setAppWidget(/* appWidgetId= */ -1, ((PendingAddWidgetInfo) mAddInfo).info); DeviceProfile deviceProfile = launcher.getDeviceProfile(); diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java index c92fe5a516..d1d728e724 100644 --- a/src/com/android/launcher3/widget/WidgetCell.java +++ b/src/com/android/launcher3/widget/WidgetCell.java @@ -58,6 +58,8 @@ import com.android.launcher3.widget.util.WidgetSizes; import java.util.function.Consumer; +import app.lawnchair.LawnchairAppWidgetHostView; + /** * Represents the individual cell of the widget inside the widget tray. The preview is drawn * horizontally centered, and scaled down if needed. @@ -299,7 +301,7 @@ public class WidgetCell extends LinearLayout { // a preview during drag & drop. And thus, we should use LauncherAppWidgetHostView, which // supports applying local color extraction during drag & drop. mAppWidgetHostViewPreview = isLauncherContext(context) - ? new LauncherAppWidgetHostView(context) + ? new LawnchairAppWidgetHostView(context) : createAppWidgetHostView(context); LauncherAppWidgetProviderInfo launcherAppWidgetProviderInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(context, item.widgetInfo.clone()); diff --git a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java index 702f3430aa..9358273f5b 100644 --- a/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java +++ b/src_shortcuts_overrides/com/android/launcher3/model/WidgetsModel.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import androidx.collection.ArrayMap; import com.android.launcher3.AppFilter; +import com.android.launcher3.BuildConfig; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; @@ -41,6 +42,7 @@ import com.android.launcher3.widget.model.WidgetsListBaseEntry; import com.android.launcher3.widget.model.WidgetsListContentEntry; import com.android.launcher3.widget.model.WidgetsListHeaderEntry; import com.android.launcher3.widget.picker.WidgetsDiffReporter; +import com.patrykmichalik.preferencemanager.PreferenceExtensionsKt; import java.util.ArrayList; import java.util.Arrays; @@ -53,6 +55,8 @@ import java.util.Map.Entry; import java.util.Set; import java.util.function.Predicate; +import app.lawnchair.preferences2.PreferenceManager2; + /** * Widgets data model that is used by the adapters of the widget views and controllers. * @@ -267,18 +271,23 @@ public class WidgetsModel { private final InvariantDeviceProfile mIdp; private final AppFilter mAppFilter; + private PreferenceManager2 prefs; WidgetValidityCheck(LauncherAppState app) { mIdp = app.getInvariantDeviceProfile(); mAppFilter = new AppFilter(app.getContext()); + prefs = PreferenceManager2.getInstance(app.getContext()); } @Override public boolean test(WidgetItem item) { if (item.widgetInfo != null) { if ((item.widgetInfo.getWidgetFeatures() & WIDGET_FEATURE_HIDE_FROM_PICKER) != 0) { - // Widget is hidden from picker - return false; + boolean isSelf = item.componentName.getPackageName().equals(BuildConfig.APPLICATION_ID); + if (!isSelf || !PreferenceExtensionsKt.firstBlocking(prefs.getEnableEnhancedSmartspace())) { + // Widget is hidden from picker + return false; + } } // Ensure that all widgets we show can be added on a workspace of this size