Loading packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +10 −5 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -133,7 +134,8 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite IWindowManager iWindowManager, IWindowManager iWindowManager, @Background Executor backgroundExecutor, @Background Executor backgroundExecutor, UiEventLogger uiEventLogger, UiEventLogger uiEventLogger, RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) { RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, StatusBar statusBar) { super(context, windowManagerFuncs, super(context, windowManagerFuncs, audioManager, iDreamManager, audioManager, iDreamManager, Loading @@ -152,7 +154,7 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite backgroundExecutor, backgroundExecutor, uiEventLogger, uiEventLogger, null, null, ringerModeTracker, sysUiState, handler); ringerModeTracker, sysUiState, handler, statusBar); mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController; Loading Loading @@ -227,7 +229,8 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite ActionsDialog dialog = new ActionsDialog(getContext(), mAdapter, mOverflowAdapter, ActionsDialog dialog = new ActionsDialog(getContext(), mAdapter, mOverflowAdapter, this::getWalletViewController, mDepthController, mSysuiColorExtractor, this::getWalletViewController, mDepthController, mSysuiColorExtractor, mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController, mSysUiState, this::onRotate, isKeyguardShowing(), mPowerAdapter, getEventLogger()); mSysUiState, this::onRotate, isKeyguardShowing(), mPowerAdapter, getEventLogger(), getStatusBar()); if (shouldShowLockMessage(dialog)) { if (shouldShowLockMessage(dialog)) { dialog.showLockMessage(); dialog.showLockMessage(); Loading Loading @@ -295,11 +298,13 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger) { MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, StatusBar statusBar) { super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions, super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions, adapter, overflowAdapter, depthController, sysuiColorExtractor, adapter, overflowAdapter, depthController, sysuiColorExtractor, statusBarService, notificationShadeWindowController, sysuiState, statusBarService, notificationShadeWindowController, sysuiState, onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger, null); onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger, null, statusBar); mWalletFactory = walletFactory; mWalletFactory = walletFactory; // Update window attributes // Update window attributes Loading packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +80 −6 Original line number Original line Diff line number Diff line Loading @@ -74,8 +74,10 @@ import android.telephony.TelephonyManager; import android.util.ArraySet; import android.util.ArraySet; import android.util.Log; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper; import android.view.GestureDetector; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.view.Window; import android.view.Window; Loading Loading @@ -119,6 +121,7 @@ import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -228,6 +231,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms protected Handler mMainHandler; protected Handler mMainHandler; private int mSmallestScreenWidthDp; private int mSmallestScreenWidthDp; private final StatusBar mStatusBar; @VisibleForTesting @VisibleForTesting public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { Loading Loading @@ -322,7 +326,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Background Executor backgroundExecutor, @Background Executor backgroundExecutor, UiEventLogger uiEventLogger, UiEventLogger uiEventLogger, GlobalActionsInfoProvider infoProvider, GlobalActionsInfoProvider infoProvider, RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) { RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, StatusBar statusBar) { mContext = context; mContext = context; mWindowManagerFuncs = windowManagerFuncs; mWindowManagerFuncs = windowManagerFuncs; mAudioManager = audioManager; mAudioManager = audioManager; Loading Loading @@ -352,6 +357,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mSysUiState = sysUiState; mSysUiState = sysUiState; mMainHandler = handler; mMainHandler = handler; mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp; mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp; mStatusBar = statusBar; // receive broadcasts // receive broadcasts IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); Loading Loading @@ -392,6 +398,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene return mUiEventLogger; return mUiEventLogger; } } protected StatusBar getStatusBar() { return mStatusBar; } /** /** * Show the global actions dialog (creating if necessary) * Show the global actions dialog (creating if necessary) * * Loading Loading @@ -625,7 +635,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mDepthController, mSysuiColorExtractor, mDepthController, mSysuiColorExtractor, mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController, mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mInfoProvider); mInfoProvider, mStatusBar); dialog.setOnDismissListener(this); dialog.setOnDismissListener(this); dialog.setOnShowListener(this); dialog.setOnShowListener(this); Loading Loading @@ -2100,9 +2110,53 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final Runnable mOnRotateCallback; protected final Runnable mOnRotateCallback; private UiEventLogger mUiEventLogger; private UiEventLogger mUiEventLogger; private GlobalActionsInfoProvider mInfoProvider; private GlobalActionsInfoProvider mInfoProvider; private GestureDetector mGestureDetector; private StatusBar mStatusBar; protected ViewGroup mContainer; protected ViewGroup mContainer; @VisibleForTesting protected GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { // All gestures begin with this message, so continue listening return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { // Close without opening shade mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); cancel(); return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (distanceY < 0 && distanceY > distanceX && e1.getY() <= mStatusBar.getStatusBarHeight()) { // Downwards scroll from top openShadeAndDismiss(); return true; } return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (velocityY > 0 && Math.abs(velocityY) > Math.abs(velocityX) && e1.getY() <= mStatusBar.getStatusBarHeight()) { // Downwards fling from top openShadeAndDismiss(); return true; } return false; } }; ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, MyOverflowAdapter overflowAdapter, MyOverflowAdapter overflowAdapter, NotificationShadeDepthController depthController, NotificationShadeDepthController depthController, Loading @@ -2110,7 +2164,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, @Nullable GlobalActionsInfoProvider infoProvider) { @Nullable GlobalActionsInfoProvider infoProvider, StatusBar statusBar) { super(context, themeRes); super(context, themeRes); mContext = context; mContext = context; mAdapter = adapter; mAdapter = adapter; Loading @@ -2125,6 +2179,9 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mKeyguardShowing = keyguardShowing; mKeyguardShowing = keyguardShowing; mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger; mInfoProvider = infoProvider; mInfoProvider = infoProvider; mStatusBar = statusBar; mGestureDetector = new GestureDetector(mContext, mGestureListener); // Window initialization // Window initialization Window window = getWindow(); Window window = getWindow(); Loading @@ -2146,6 +2203,23 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene initializeLayout(); initializeLayout(); } } @Override public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event) || super.onTouchEvent(event); } private void openShadeAndDismiss() { mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); if (mStatusBar.isKeyguardShowing()) { // match existing lockscreen behavior to open QS when swiping from status bar mStatusBar.animateExpandSettingsPanel(null); } else { // otherwise, swiping down should expand notification shade mStatusBar.animateExpandNotificationsPanel(); } dismiss(); } private ListPopupWindow createPowerOverflowPopup() { private ListPopupWindow createPowerOverflowPopup() { GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( new ContextThemeWrapper( new ContextThemeWrapper( Loading Loading @@ -2194,9 +2268,9 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mGlobalActionsLayout.setRotationListener(this::onRotate); mGlobalActionsLayout.setRotationListener(this::onRotate); mGlobalActionsLayout.setAdapter(mAdapter); mGlobalActionsLayout.setAdapter(mAdapter); mContainer = findViewById(com.android.systemui.R.id.global_actions_container); mContainer = findViewById(com.android.systemui.R.id.global_actions_container); mContainer.setOnClickListener(v -> { mContainer.setOnTouchListener((v, event) -> { mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); mGestureDetector.onTouchEvent(event); cancel(); return v.onTouchEvent(event); }); }); View overflowButton = findViewById( View overflowButton = findViewById( Loading packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +58 −5 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,9 @@ import android.os.UserManager; import android.service.dreams.IDreamManager; import android.service.dreams.IDreamManager; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import android.view.GestureDetector; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.View; import android.view.MotionEvent; import android.view.WindowManagerPolicyConstants; import android.view.WindowManagerPolicyConstants; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading @@ -57,6 +58,7 @@ import com.android.systemui.plugins.GlobalActions; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -109,6 +111,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private SysUiState mSysUiState; @Mock private SysUiState mSysUiState; @Mock private Handler mHandler; @Mock private Handler mHandler; @Mock private UserContextProvider mUserContextProvider; @Mock private UserContextProvider mUserContextProvider; @Mock private StatusBar mStatusBar; private TestableLooper mTestableLooper; private TestableLooper mTestableLooper; Loading Loading @@ -150,7 +153,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mInfoProvider, mInfoProvider, mRingerModeTracker, mRingerModeTracker, mSysUiState, mSysUiState, mHandler mHandler, mStatusBar ); ); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); Loading Loading @@ -194,7 +198,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { } } @Test @Test public void testShouldLogOnTapOutside() { public void testSingleTap_logAndDismiss() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); Loading @@ -207,9 +211,58 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { }; }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); View container = dialog.findViewById(com.android.systemui.R.id.global_actions_container); container.callOnClick(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); gestureListener.onSingleTapConfirmed(null); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); } @Test public void testSwipeDownLockscreen_logAndOpenQS() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any()); doReturn(true).when(mStatusBar).isKeyguardShowing(); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); MotionEvent start = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0); gestureListener.onFling(start, end, 0, 1000); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verify(mStatusBar).animateExpandSettingsPanel(null); } @Test public void testSwipeDown_logAndOpenNotificationShade() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any()); doReturn(false).when(mStatusBar).isKeyguardShowing(); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); MotionEvent start = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0); gestureListener.onFling(start, end, 0, 1000); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verify(mStatusBar).animateExpandNotificationsPanel(); } } @Test @Test Loading packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -124,6 +125,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase { @Mock private Handler mHandler; @Mock private Handler mHandler; @Mock private UserTracker mUserTracker; @Mock private UserTracker mUserTracker; @Mock private SecureSettings mSecureSettings; @Mock private SecureSettings mSecureSettings; @Mock private StatusBar mStatusBar; private TestableLooper mTestableLooper; private TestableLooper mTestableLooper; Loading Loading @@ -164,7 +166,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase { mUiEventLogger, mUiEventLogger, mRingerModeTracker, mRingerModeTracker, mSysUiState, mSysUiState, mHandler mHandler, mStatusBar ); ); mGlobalActionsDialog.setZeroDialogPressDelayForTesting(); mGlobalActionsDialog.setZeroDialogPressDelayForTesting(); Loading Loading
packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +10 −5 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -133,7 +134,8 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite IWindowManager iWindowManager, IWindowManager iWindowManager, @Background Executor backgroundExecutor, @Background Executor backgroundExecutor, UiEventLogger uiEventLogger, UiEventLogger uiEventLogger, RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) { RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, StatusBar statusBar) { super(context, windowManagerFuncs, super(context, windowManagerFuncs, audioManager, iDreamManager, audioManager, iDreamManager, Loading @@ -152,7 +154,7 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite backgroundExecutor, backgroundExecutor, uiEventLogger, uiEventLogger, null, null, ringerModeTracker, sysUiState, handler); ringerModeTracker, sysUiState, handler, statusBar); mLockPatternUtils = lockPatternUtils; mLockPatternUtils = lockPatternUtils; mKeyguardStateController = keyguardStateController; mKeyguardStateController = keyguardStateController; Loading Loading @@ -227,7 +229,8 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite ActionsDialog dialog = new ActionsDialog(getContext(), mAdapter, mOverflowAdapter, ActionsDialog dialog = new ActionsDialog(getContext(), mAdapter, mOverflowAdapter, this::getWalletViewController, mDepthController, mSysuiColorExtractor, this::getWalletViewController, mDepthController, mSysuiColorExtractor, mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController, mSysUiState, this::onRotate, isKeyguardShowing(), mPowerAdapter, getEventLogger()); mSysUiState, this::onRotate, isKeyguardShowing(), mPowerAdapter, getEventLogger(), getStatusBar()); if (shouldShowLockMessage(dialog)) { if (shouldShowLockMessage(dialog)) { dialog.showLockMessage(); dialog.showLockMessage(); Loading Loading @@ -295,11 +298,13 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService, NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger) { MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, StatusBar statusBar) { super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions, super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions, adapter, overflowAdapter, depthController, sysuiColorExtractor, adapter, overflowAdapter, depthController, sysuiColorExtractor, statusBarService, notificationShadeWindowController, sysuiState, statusBarService, notificationShadeWindowController, sysuiState, onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger, null); onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger, null, statusBar); mWalletFactory = walletFactory; mWalletFactory = walletFactory; // Update window attributes // Update window attributes Loading
packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +80 −6 Original line number Original line Diff line number Diff line Loading @@ -74,8 +74,10 @@ import android.telephony.TelephonyManager; import android.util.ArraySet; import android.util.ArraySet; import android.util.Log; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper; import android.view.GestureDetector; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup; import android.view.Window; import android.view.Window; Loading Loading @@ -119,6 +121,7 @@ import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -228,6 +231,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms private int mDialogPressDelay = DIALOG_PRESS_DELAY; // ms protected Handler mMainHandler; protected Handler mMainHandler; private int mSmallestScreenWidthDp; private int mSmallestScreenWidthDp; private final StatusBar mStatusBar; @VisibleForTesting @VisibleForTesting public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { Loading Loading @@ -322,7 +326,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene @Background Executor backgroundExecutor, @Background Executor backgroundExecutor, UiEventLogger uiEventLogger, UiEventLogger uiEventLogger, GlobalActionsInfoProvider infoProvider, GlobalActionsInfoProvider infoProvider, RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) { RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler, StatusBar statusBar) { mContext = context; mContext = context; mWindowManagerFuncs = windowManagerFuncs; mWindowManagerFuncs = windowManagerFuncs; mAudioManager = audioManager; mAudioManager = audioManager; Loading Loading @@ -352,6 +357,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mSysUiState = sysUiState; mSysUiState = sysUiState; mMainHandler = handler; mMainHandler = handler; mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp; mSmallestScreenWidthDp = mContext.getResources().getConfiguration().smallestScreenWidthDp; mStatusBar = statusBar; // receive broadcasts // receive broadcasts IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); Loading Loading @@ -392,6 +398,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene return mUiEventLogger; return mUiEventLogger; } } protected StatusBar getStatusBar() { return mStatusBar; } /** /** * Show the global actions dialog (creating if necessary) * Show the global actions dialog (creating if necessary) * * Loading Loading @@ -625,7 +635,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mDepthController, mSysuiColorExtractor, mDepthController, mSysuiColorExtractor, mStatusBarService, mNotificationShadeWindowController, mStatusBarService, mNotificationShadeWindowController, mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger, mInfoProvider); mInfoProvider, mStatusBar); dialog.setOnDismissListener(this); dialog.setOnDismissListener(this); dialog.setOnShowListener(this); dialog.setOnShowListener(this); Loading Loading @@ -2100,9 +2110,53 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene protected final Runnable mOnRotateCallback; protected final Runnable mOnRotateCallback; private UiEventLogger mUiEventLogger; private UiEventLogger mUiEventLogger; private GlobalActionsInfoProvider mInfoProvider; private GlobalActionsInfoProvider mInfoProvider; private GestureDetector mGestureDetector; private StatusBar mStatusBar; protected ViewGroup mContainer; protected ViewGroup mContainer; @VisibleForTesting protected GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { // All gestures begin with this message, so continue listening return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { // Close without opening shade mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); cancel(); return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (distanceY < 0 && distanceY > distanceX && e1.getY() <= mStatusBar.getStatusBarHeight()) { // Downwards scroll from top openShadeAndDismiss(); return true; } return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (velocityY > 0 && Math.abs(velocityY) > Math.abs(velocityX) && e1.getY() <= mStatusBar.getStatusBarHeight()) { // Downwards fling from top openShadeAndDismiss(); return true; } return false; } }; ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, ActionsDialogLite(Context context, int themeRes, MyAdapter adapter, MyOverflowAdapter overflowAdapter, MyOverflowAdapter overflowAdapter, NotificationShadeDepthController depthController, NotificationShadeDepthController depthController, Loading @@ -2110,7 +2164,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene NotificationShadeWindowController notificationShadeWindowController, NotificationShadeWindowController notificationShadeWindowController, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger, @Nullable GlobalActionsInfoProvider infoProvider) { @Nullable GlobalActionsInfoProvider infoProvider, StatusBar statusBar) { super(context, themeRes); super(context, themeRes); mContext = context; mContext = context; mAdapter = adapter; mAdapter = adapter; Loading @@ -2125,6 +2179,9 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mKeyguardShowing = keyguardShowing; mKeyguardShowing = keyguardShowing; mUiEventLogger = uiEventLogger; mUiEventLogger = uiEventLogger; mInfoProvider = infoProvider; mInfoProvider = infoProvider; mStatusBar = statusBar; mGestureDetector = new GestureDetector(mContext, mGestureListener); // Window initialization // Window initialization Window window = getWindow(); Window window = getWindow(); Loading @@ -2146,6 +2203,23 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene initializeLayout(); initializeLayout(); } } @Override public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event) || super.onTouchEvent(event); } private void openShadeAndDismiss() { mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); if (mStatusBar.isKeyguardShowing()) { // match existing lockscreen behavior to open QS when swiping from status bar mStatusBar.animateExpandSettingsPanel(null); } else { // otherwise, swiping down should expand notification shade mStatusBar.animateExpandNotificationsPanel(); } dismiss(); } private ListPopupWindow createPowerOverflowPopup() { private ListPopupWindow createPowerOverflowPopup() { GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( GlobalActionsPopupMenu popup = new GlobalActionsPopupMenu( new ContextThemeWrapper( new ContextThemeWrapper( Loading Loading @@ -2194,9 +2268,9 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mGlobalActionsLayout.setRotationListener(this::onRotate); mGlobalActionsLayout.setRotationListener(this::onRotate); mGlobalActionsLayout.setAdapter(mAdapter); mGlobalActionsLayout.setAdapter(mAdapter); mContainer = findViewById(com.android.systemui.R.id.global_actions_container); mContainer = findViewById(com.android.systemui.R.id.global_actions_container); mContainer.setOnClickListener(v -> { mContainer.setOnTouchListener((v, event) -> { mUiEventLogger.log(GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); mGestureDetector.onTouchEvent(event); cancel(); return v.onTouchEvent(event); }); }); View overflowButton = findViewById( View overflowButton = findViewById( Loading
packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +58 −5 Original line number Original line Diff line number Diff line Loading @@ -38,8 +38,9 @@ import android.os.UserManager; import android.service.dreams.IDreamManager; import android.service.dreams.IDreamManager; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import android.view.GestureDetector; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.View; import android.view.MotionEvent; import android.view.WindowManagerPolicyConstants; import android.view.WindowManagerPolicyConstants; import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest; Loading @@ -57,6 +58,7 @@ import com.android.systemui.plugins.GlobalActions; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -109,6 +111,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private SysUiState mSysUiState; @Mock private SysUiState mSysUiState; @Mock private Handler mHandler; @Mock private Handler mHandler; @Mock private UserContextProvider mUserContextProvider; @Mock private UserContextProvider mUserContextProvider; @Mock private StatusBar mStatusBar; private TestableLooper mTestableLooper; private TestableLooper mTestableLooper; Loading Loading @@ -150,7 +153,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mInfoProvider, mInfoProvider, mRingerModeTracker, mRingerModeTracker, mSysUiState, mSysUiState, mHandler mHandler, mStatusBar ); ); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting(); Loading Loading @@ -194,7 +198,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { } } @Test @Test public void testShouldLogOnTapOutside() { public void testSingleTap_logAndDismiss() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); Loading @@ -207,9 +211,58 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { }; }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); View container = dialog.findViewById(com.android.systemui.R.id.global_actions_container); container.callOnClick(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); gestureListener.onSingleTapConfirmed(null); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); } @Test public void testSwipeDownLockscreen_logAndOpenQS() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any()); doReturn(true).when(mStatusBar).isKeyguardShowing(); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); MotionEvent start = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0); gestureListener.onFling(start, end, 0, 1000); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verify(mStatusBar).animateExpandSettingsPanel(null); } @Test public void testSwipeDown_logAndOpenNotificationShade() { mGlobalActionsDialogLite = spy(mGlobalActionsDialogLite); doReturn(4).when(mGlobalActionsDialogLite).getMaxShownPowerItems(); doReturn(true).when(mGlobalActionsDialogLite).shouldDisplayLockdown(any()); doReturn(true).when(mGlobalActionsDialogLite).shouldShowAction(any()); doReturn(false).when(mStatusBar).isKeyguardShowing(); String[] actions = { GlobalActionsDialog.GLOBAL_ACTION_KEY_EMERGENCY, GlobalActionsDialog.GLOBAL_ACTION_KEY_LOCKDOWN, GlobalActionsDialog.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialog.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions(); GlobalActionsDialogLite.ActionsDialogLite dialog = mGlobalActionsDialogLite.createDialog(); GestureDetector.SimpleOnGestureListener gestureListener = spy(dialog.mGestureListener); MotionEvent start = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); MotionEvent end = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 500, 0); gestureListener.onFling(start, end, 0, 1000); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verifyLogPosted(GlobalActionsDialog.GlobalActionsEvent.GA_CLOSE_TAP_OUTSIDE); verify(mStatusBar).animateExpandNotificationsPanel(); } } @Test @Test Loading
packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogTest.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,7 @@ import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.telephony.TelephonyListenerManager; Loading Loading @@ -124,6 +125,7 @@ public class GlobalActionsDialogTest extends SysuiTestCase { @Mock private Handler mHandler; @Mock private Handler mHandler; @Mock private UserTracker mUserTracker; @Mock private UserTracker mUserTracker; @Mock private SecureSettings mSecureSettings; @Mock private SecureSettings mSecureSettings; @Mock private StatusBar mStatusBar; private TestableLooper mTestableLooper; private TestableLooper mTestableLooper; Loading Loading @@ -164,7 +166,8 @@ public class GlobalActionsDialogTest extends SysuiTestCase { mUiEventLogger, mUiEventLogger, mRingerModeTracker, mRingerModeTracker, mSysUiState, mSysUiState, mHandler mHandler, mStatusBar ); ); mGlobalActionsDialog.setZeroDialogPressDelayForTesting(); mGlobalActionsDialog.setZeroDialogPressDelayForTesting(); Loading