Loading quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +18 −39 Original line number Diff line number Diff line Loading @@ -364,13 +364,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // before our internal listeners. mLauncher.getStateManager().setCurrentAnimation(anim); final int rotationChange = getRotationChange(appTargets); // Note: the targetBounds are relative to the launcher int startDelay = getSingleFrameMs(mLauncher); Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange); Animator windowAnimator = getOpeningWindowAnimators(v, appTargets, wallpaperTargets, nonAppTargets, windowTargetBounds, areAllTargetsTranslucent(appTargets), rotationChange); Animator windowAnimator = getOpeningWindowAnimators( v, appTargets, wallpaperTargets, nonAppTargets, launcherClosing); windowAnimator.setStartDelay(startDelay); anim.play(windowAnimator); if (launcherClosing) { Loading @@ -384,17 +381,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener launcherContentAnimator.second.run(); } }); } else { anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mLauncher.addOnResumeCallback(() -> ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, MULTI_PROPERTY_VALUE, mLauncher.getStateManager().getState().getDepth( mLauncher)).start()); } }); } } Loading @@ -403,23 +389,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener @NonNull LauncherAppWidgetHostView v, @NonNull RemoteAnimationTarget[] appTargets, @NonNull RemoteAnimationTarget[] wallpaperTargets, @NonNull RemoteAnimationTarget[] nonAppTargets) { @NonNull RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing) { mLauncher.getStateManager().setCurrentAnimation(anim); Rect windowTargetBounds = getWindowTargetBounds(appTargets, getRotationChange(appTargets)); anim.play(getOpeningWindowAnimatorsForWidget(v, appTargets, wallpaperTargets, nonAppTargets, windowTargetBounds, areAllTargetsTranslucent(appTargets))); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mLauncher.addOnResumeCallback(() -> ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, MULTI_PROPERTY_VALUE, mLauncher.getStateManager().getState().getDepth( mLauncher)).start()); } }); anim.play(getOpeningWindowAnimatorsForWidget( v, appTargets, wallpaperTargets, nonAppTargets, launcherClosing)); } /** Loading Loading @@ -657,7 +631,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener RemoteAnimationTarget[] appTargets, RemoteAnimationTarget[] wallpaperTargets, RemoteAnimationTarget[] nonAppTargets, Rect windowTargetBounds, boolean appTargetsAreTranslucent, int rotationChange) { boolean launcherClosing) { int rotationChange = getRotationChange(appTargets); Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange); boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets); RectF launcherIconBounds = new RectF(); FloatingIconView floatingView = FloatingIconView.getFloatingIconView(mLauncher, v, !appTargetsAreTranslucent, launcherIconBounds, true /* isOpening */); Loading Loading @@ -853,7 +831,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener .setShadowRadius(mShadowRadius.value); } else if (target.mode == MODE_CLOSING) { if (target.localBounds != null) { final Rect localBounds = target.localBounds; tmpPos.set(target.localBounds.left, target.localBounds.top); } else { tmpPos.set(target.position.x, target.position.y); Loading Loading @@ -898,7 +875,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // If app targets are translucent, do not animate the background as it causes a visible // flicker when it resets itself at the end of its animation. if (appTargetsAreTranslucent) { if (appTargetsAreTranslucent || !launcherClosing) { animatorSet.play(appAnimator); } else { animatorSet.playTogether(appAnimator, getBackgroundAnimator()); Loading @@ -909,8 +886,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private Animator getOpeningWindowAnimatorsForWidget(LauncherAppWidgetHostView v, RemoteAnimationTarget[] appTargets, RemoteAnimationTarget[] wallpaperTargets, RemoteAnimationTarget[] nonAppTargets, Rect windowTargetBounds, boolean appTargetsAreTranslucent) { RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing) { Rect windowTargetBounds = getWindowTargetBounds(appTargets, getRotationChange(appTargets)); boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets); final RectF widgetBackgroundBounds = new RectF(); final Rect appWindowCrop = new Rect(); final Matrix matrix = new Matrix(); Loading Loading @@ -1037,7 +1016,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // If app targets are translucent, do not animate the background as it causes a visible // flicker when it resets itself at the end of its animation. if (appTargetsAreTranslucent) { if (appTargetsAreTranslucent || !launcherClosing) { animatorSet.play(appAnimator); } else { animatorSet.playTogether(appAnimator, getBackgroundAnimator()); Loading Loading @@ -1717,7 +1696,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final boolean skipFirstFrame; if (launchingFromWidget) { composeWidgetLaunchAnimator(anim, (LauncherAppWidgetHostView) mV, appTargets, wallpaperTargets, nonAppTargets); wallpaperTargets, nonAppTargets, launcherClosing); addCujInstrumentation( anim, InteractionJankMonitorWrapper.CUJ_APP_LAUNCH_FROM_WIDGET); skipFirstFrame = true; Loading tests/AndroidManifest-common.xml +22 −1 Original line number Diff line number Diff line Loading @@ -61,6 +61,17 @@ android:resource="@xml/appwidget_with_config"/> </receiver> <receiver android:name="com.android.launcher3.testcomponent.AppWidgetWithDialog" android:exported="true" android:label="With Dialog"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_no_config"/> </receiver> <receiver android:name="com.android.launcher3.testcomponent.AppWidgetDynamicColors" android:exported="true" Loading Loading @@ -276,7 +287,17 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity android:name="com.android.launcher3.testcomponent.DialogTestActivity" android:label="Dialog Activity" android:theme="@android:style/Theme.Dialog" android:exported="true" android:taskAffinity="com.android.launcher3.testcomponent.Affinity2"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.android.launcher3.testcomponent.ImeTestActivity" android:label="ImeTestActivity" android:icon="@drawable/test_theme_icon" Loading tests/res/layout/test_layout_appwidget_blue.xml +1 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/content" android:orientation="vertical" android:background="#FF0000FF" android:layout_width="match_parent" Loading tests/src/com/android/launcher3/testcomponent/AppWidgetWithDialog.java 0 → 100644 +41 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.testcomponent; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; /** * A simple app widget with shows a dialog on clicking. */ public class AppWidgetWithDialog extends AppWidgetNoConfig { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { int layoutId = context.getResources().getIdentifier( "test_layout_appwidget_blue", "layout", context.getPackageName()); RemoteViews views = new RemoteViews(context.getPackageName(), layoutId); PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, DialogTestActivity.class), PendingIntent.FLAG_IMMUTABLE); views.setOnClickPendingIntent(android.R.id.content, pi); AppWidgetManager.getInstance(context).updateAppWidget(appWidgetIds, views); } } tests/src/com/android/launcher3/testcomponent/DialogTestActivity.java 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.testcomponent; /** * Extension of BaseTestingActivity with a Dialog theme */ public class DialogTestActivity extends BaseTestingActivity {} Loading
quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +18 −39 Original line number Diff line number Diff line Loading @@ -364,13 +364,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // before our internal listeners. mLauncher.getStateManager().setCurrentAnimation(anim); final int rotationChange = getRotationChange(appTargets); // Note: the targetBounds are relative to the launcher int startDelay = getSingleFrameMs(mLauncher); Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange); Animator windowAnimator = getOpeningWindowAnimators(v, appTargets, wallpaperTargets, nonAppTargets, windowTargetBounds, areAllTargetsTranslucent(appTargets), rotationChange); Animator windowAnimator = getOpeningWindowAnimators( v, appTargets, wallpaperTargets, nonAppTargets, launcherClosing); windowAnimator.setStartDelay(startDelay); anim.play(windowAnimator); if (launcherClosing) { Loading @@ -384,17 +381,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener launcherContentAnimator.second.run(); } }); } else { anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mLauncher.addOnResumeCallback(() -> ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, MULTI_PROPERTY_VALUE, mLauncher.getStateManager().getState().getDepth( mLauncher)).start()); } }); } } Loading @@ -403,23 +389,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener @NonNull LauncherAppWidgetHostView v, @NonNull RemoteAnimationTarget[] appTargets, @NonNull RemoteAnimationTarget[] wallpaperTargets, @NonNull RemoteAnimationTarget[] nonAppTargets) { @NonNull RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing) { mLauncher.getStateManager().setCurrentAnimation(anim); Rect windowTargetBounds = getWindowTargetBounds(appTargets, getRotationChange(appTargets)); anim.play(getOpeningWindowAnimatorsForWidget(v, appTargets, wallpaperTargets, nonAppTargets, windowTargetBounds, areAllTargetsTranslucent(appTargets))); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { mLauncher.addOnResumeCallback(() -> ObjectAnimator.ofFloat(mLauncher.getDepthController().stateDepth, MULTI_PROPERTY_VALUE, mLauncher.getStateManager().getState().getDepth( mLauncher)).start()); } }); anim.play(getOpeningWindowAnimatorsForWidget( v, appTargets, wallpaperTargets, nonAppTargets, launcherClosing)); } /** Loading Loading @@ -657,7 +631,11 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener RemoteAnimationTarget[] appTargets, RemoteAnimationTarget[] wallpaperTargets, RemoteAnimationTarget[] nonAppTargets, Rect windowTargetBounds, boolean appTargetsAreTranslucent, int rotationChange) { boolean launcherClosing) { int rotationChange = getRotationChange(appTargets); Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange); boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets); RectF launcherIconBounds = new RectF(); FloatingIconView floatingView = FloatingIconView.getFloatingIconView(mLauncher, v, !appTargetsAreTranslucent, launcherIconBounds, true /* isOpening */); Loading Loading @@ -853,7 +831,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener .setShadowRadius(mShadowRadius.value); } else if (target.mode == MODE_CLOSING) { if (target.localBounds != null) { final Rect localBounds = target.localBounds; tmpPos.set(target.localBounds.left, target.localBounds.top); } else { tmpPos.set(target.position.x, target.position.y); Loading Loading @@ -898,7 +875,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // If app targets are translucent, do not animate the background as it causes a visible // flicker when it resets itself at the end of its animation. if (appTargetsAreTranslucent) { if (appTargetsAreTranslucent || !launcherClosing) { animatorSet.play(appAnimator); } else { animatorSet.playTogether(appAnimator, getBackgroundAnimator()); Loading @@ -909,8 +886,10 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private Animator getOpeningWindowAnimatorsForWidget(LauncherAppWidgetHostView v, RemoteAnimationTarget[] appTargets, RemoteAnimationTarget[] wallpaperTargets, RemoteAnimationTarget[] nonAppTargets, Rect windowTargetBounds, boolean appTargetsAreTranslucent) { RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing) { Rect windowTargetBounds = getWindowTargetBounds(appTargets, getRotationChange(appTargets)); boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets); final RectF widgetBackgroundBounds = new RectF(); final Rect appWindowCrop = new Rect(); final Matrix matrix = new Matrix(); Loading Loading @@ -1037,7 +1016,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener // If app targets are translucent, do not animate the background as it causes a visible // flicker when it resets itself at the end of its animation. if (appTargetsAreTranslucent) { if (appTargetsAreTranslucent || !launcherClosing) { animatorSet.play(appAnimator); } else { animatorSet.playTogether(appAnimator, getBackgroundAnimator()); Loading Loading @@ -1717,7 +1696,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener final boolean skipFirstFrame; if (launchingFromWidget) { composeWidgetLaunchAnimator(anim, (LauncherAppWidgetHostView) mV, appTargets, wallpaperTargets, nonAppTargets); wallpaperTargets, nonAppTargets, launcherClosing); addCujInstrumentation( anim, InteractionJankMonitorWrapper.CUJ_APP_LAUNCH_FROM_WIDGET); skipFirstFrame = true; Loading
tests/AndroidManifest-common.xml +22 −1 Original line number Diff line number Diff line Loading @@ -61,6 +61,17 @@ android:resource="@xml/appwidget_with_config"/> </receiver> <receiver android:name="com.android.launcher3.testcomponent.AppWidgetWithDialog" android:exported="true" android:label="With Dialog"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_no_config"/> </receiver> <receiver android:name="com.android.launcher3.testcomponent.AppWidgetDynamicColors" android:exported="true" Loading Loading @@ -276,7 +287,17 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity android:name="com.android.launcher3.testcomponent.DialogTestActivity" android:label="Dialog Activity" android:theme="@android:style/Theme.Dialog" android:exported="true" android:taskAffinity="com.android.launcher3.testcomponent.Affinity2"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.android.launcher3.testcomponent.ImeTestActivity" android:label="ImeTestActivity" android:icon="@drawable/test_theme_icon" Loading
tests/res/layout/test_layout_appwidget_blue.xml +1 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/content" android:orientation="vertical" android:background="#FF0000FF" android:layout_width="match_parent" Loading
tests/src/com/android/launcher3/testcomponent/AppWidgetWithDialog.java 0 → 100644 +41 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.testcomponent; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; /** * A simple app widget with shows a dialog on clicking. */ public class AppWidgetWithDialog extends AppWidgetNoConfig { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { int layoutId = context.getResources().getIdentifier( "test_layout_appwidget_blue", "layout", context.getPackageName()); RemoteViews views = new RemoteViews(context.getPackageName(), layoutId); PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, DialogTestActivity.class), PendingIntent.FLAG_IMMUTABLE); views.setOnClickPendingIntent(android.R.id.content, pi); AppWidgetManager.getInstance(context).updateAppWidget(appWidgetIds, views); } }
tests/src/com/android/launcher3/testcomponent/DialogTestActivity.java 0 → 100644 +23 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 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.testcomponent; /** * Extension of BaseTestingActivity with a Dialog theme */ public class DialogTestActivity extends BaseTestingActivity {}