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
This commit is contained in:
Jordan Demeulenaere
2021-11-22 18:02:49 +01:00
parent 27b6052322
commit 4538223f85
2 changed files with 33 additions and 9 deletions

View File

@@ -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<BooleanState> {
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<BooleanState> {
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<BooleanState> {
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<BooleanState> {
List<CastDevice> 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<BooleanState> {
@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();
}
});
});
}

View File

@@ -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<CastDevice> devices = new ArrayList<>();
devices.add(device);
when(mController.getCastDevices()).thenReturn(devices);
when(mKeyguard.isShowing()).thenReturn(true);
enableWifiAndProcessMessages();
mCastTile.handleClick(null /* view */);