From 4538223f856fc1d5ee6d246c47110cf8487b9454 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Mon, 22 Nov 2021 18:02:49 +0100 Subject: [PATCH] Animate the cast dialog This CL animates the Cast dialog when opened from its QS tile. See b/202264918#comment6 for before/after videos. Bug: 202264918 Test: Manual Change-Id: I148074ad02b7a6495b40ab714cd2539c15188f16 --- .../android/systemui/qs/tiles/CastTile.java | 35 ++++++++++++++----- .../systemui/qs/tiles/CastTileTest.java | 7 +++- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 0427e38aa8115..b83dc52240b33 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -31,7 +31,6 @@ import android.util.Log; import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; -import android.view.WindowManager.LayoutParams; import android.widget.Button; import androidx.annotation.Nullable; @@ -40,6 +39,7 @@ import com.android.internal.app.MediaRouteDialogPresenter; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -76,6 +76,7 @@ public class CastTile extends QSTileImpl { private final CastDetailAdapter mDetailAdapter; private final KeyguardStateController mKeyguard; private final NetworkController mNetworkController; + private final DialogLaunchAnimator mDialogLaunchAnimator; private final Callback mCallback = new Callback(); private Dialog mDialog; private boolean mWifiConnected; @@ -94,7 +95,8 @@ public class CastTile extends QSTileImpl { CastController castController, KeyguardStateController keyguardStateController, NetworkController networkController, - HotspotController hotspotController + HotspotController hotspotController, + DialogLaunchAnimator dialogLaunchAnimator ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); @@ -102,6 +104,7 @@ public class CastTile extends QSTileImpl { mDetailAdapter = new CastDetailAdapter(); mKeyguard = keyguardStateController; mNetworkController = networkController; + mDialogLaunchAnimator = dialogLaunchAnimator; mController.observe(this, mCallback); mKeyguard.observe(this, mCallback); mNetworkController.observe(this, mSignalCallback); @@ -153,9 +156,15 @@ public class CastTile extends QSTileImpl { List activeDevices = getActiveDevices(); if (willPopDetail()) { - mActivityStarter.postQSRunnableDismissingKeyguard(() -> { - showDetail(true); - }); + if (!mKeyguard.isShowing()) { + showDetail(view); + } else { + mActivityStarter.postQSRunnableDismissingKeyguard(() -> { + // Dismissing the keyguard will collapse the shade, so we don't animate from the + // view here as it would not look good. + showDetail(null /* view */); + }); + } } else { mController.stopCasting(activeDevices.get(0)); } @@ -184,19 +193,29 @@ public class CastTile extends QSTileImpl { @Override public void showDetail(boolean show) { + showDetail(null /* view */); + } + + private void showDetail(@Nullable View view) { mUiHandler.post(() -> { mDialog = MediaRouteDialogPresenter.createDialog(mContext, ROUTE_TYPE_REMOTE_DISPLAY, v -> { + mDialogLaunchAnimator.disableAllCurrentDialogsExitAnimations(); mDialog.dismiss(); mActivityStarter .postStartActivityDismissingKeyguard(getLongClickIntent(), 0); }); - mDialog.getWindow().setType(LayoutParams.TYPE_KEYGUARD_DIALOG); SystemUIDialog.setShowForAllUsers(mDialog, true); SystemUIDialog.registerDismissListener(mDialog); SystemUIDialog.setWindowOnTop(mDialog); - mUiHandler.post(() -> mDialog.show()); - mHost.collapsePanels(); + + mUiHandler.post(() -> { + if (view != null) { + mDialogLaunchAnimator.showFromView(mDialog, view); + } else { + mDialog.show(); + } + }); }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java index 5a49337fe640e..b40a20c27820f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java @@ -38,6 +38,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -90,6 +91,8 @@ public class CastTileTest extends SysuiTestCase { private HotspotController.Callback mHotspotCallback; @Mock private QSLogger mQSLogger; + @Mock + private DialogLaunchAnimator mDialogLaunchAnimator; private TestableLooper mTestableLooper; private CastTile mCastTile; @@ -113,7 +116,8 @@ public class CastTileTest extends SysuiTestCase { mController, mKeyguard, mNetworkController, - mHotspotController + mHotspotController, + mDialogLaunchAnimator ); mCastTile.initialize(); @@ -241,6 +245,7 @@ public class CastTileTest extends SysuiTestCase { List devices = new ArrayList<>(); devices.add(device); when(mController.getCastDevices()).thenReturn(devices); + when(mKeyguard.isShowing()).thenReturn(true); enableWifiAndProcessMessages(); mCastTile.handleClick(null /* view */);