diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java new file mode 100644 index 0000000000..66e4f4c61c --- /dev/null +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.uioverrides; + +import android.app.ActivityOptions; +import android.app.PendingIntent; +import android.content.Intent; +import android.util.Log; +import android.util.Pair; +import android.view.View; +import android.widget.RemoteViews; + +import com.android.launcher3.util.ActivityOptionsWrapper; +import com.android.launcher3.widget.LauncherAppWidgetHostView; + +/** Provides a Quickstep specific animation when launching an activity from an app widget. */ +class QuickstepInteractionHandler implements RemoteViews.InteractionHandler { + + private static final String TAG = "QuickstepInteractionHandler"; + + private final QuickstepLauncher mLauncher; + + QuickstepInteractionHandler(QuickstepLauncher launcher) { + mLauncher = launcher; + } + + @Override + public boolean onInteraction(View view, PendingIntent pendingIntent, + RemoteViews.RemoteResponse remoteResponse) { + LauncherAppWidgetHostView hostView = findHostViewAncestor(view); + if (hostView == null) { + Log.e(TAG, "View did not have a LauncherAppWidgetHostView ancestor."); + return RemoteViews.startPendingIntent(hostView, pendingIntent, + remoteResponse.getLaunchOptions(view)); + } + Pair options = remoteResponse.getLaunchOptions(hostView); + ActivityOptionsWrapper activityOptions = mLauncher.getAppTransitionManager() + .getActivityLaunchOptions(mLauncher, hostView); + options = Pair.create(options.first, activityOptions.options); + return RemoteViews.startPendingIntent(hostView, pendingIntent, options); + } + + private LauncherAppWidgetHostView findHostViewAncestor(View v) { + while (v != null) { + if (v instanceof LauncherAppWidgetHostView) return (LauncherAppWidgetHostView) v; + v = (View) v.getParent(); + } + return null; + } +} diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 0ceb8c74f9..f09d9e087e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -36,6 +36,7 @@ import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SY import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; +import android.os.SystemProperties; import android.view.HapticFeedbackConstants; import android.view.View; @@ -71,6 +72,7 @@ import com.android.launcher3.util.OnboardingPrefs; import com.android.launcher3.util.TouchController; import com.android.launcher3.util.UiThreadHelper; import com.android.launcher3.util.UiThreadHelper.AsyncCommand; +import com.android.launcher3.widget.LauncherAppWidgetHost; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.SysUINavigationMode.Mode; import com.android.quickstep.SystemUiProxy; @@ -88,6 +90,9 @@ import java.util.stream.Stream; public class QuickstepLauncher extends BaseQuickstepLauncher { + private static final boolean ENABLE_APP_WIDGET_LAUNCH_ANIMATION = + SystemProperties.getBoolean("persist.debug.quickstep_app_widget_launch", false); + public static final boolean GO_LOW_RAM_RECENTS_ENABLED = false; /** * Reusable command for applying the shelf height on the background thread. @@ -320,6 +325,14 @@ public class QuickstepLauncher extends BaseQuickstepLauncher { return new QuickstepAtomicAnimationFactory(this); } + protected LauncherAppWidgetHost createAppWidgetHost() { + LauncherAppWidgetHost appWidgetHost = super.createAppWidgetHost(); + if (ENABLE_APP_WIDGET_LAUNCH_ANIMATION) { + appWidgetHost.setInteractionHandler(new QuickstepInteractionHandler(this)); + } + return appWidgetHost; + } + private static final class LauncherTaskViewController extends TaskViewTouchController { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 50915439da..3236f5d542 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -436,8 +436,7 @@ public class Launcher extends StatefulActivity implements Launche mOnboardingPrefs = createOnboardingPrefs(mSharedPrefs); mAppWidgetManager = new WidgetManagerHelper(this); - mAppWidgetHost = new LauncherAppWidgetHost(this, - appWidgetId -> getWorkspace().removeWidget(appWidgetId)); + mAppWidgetHost = createAppWidgetHost(); mAppWidgetHost.startListening(); inflateRootView(R.layout.launcher); @@ -1428,6 +1427,11 @@ public class Launcher extends StatefulActivity implements Launche return mAppWidgetHost; } + protected LauncherAppWidgetHost createAppWidgetHost() { + return new LauncherAppWidgetHost(this, + appWidgetId -> getWorkspace().removeWidget(appWidgetId)); + } + public LauncherModel getModel() { return mModel; }