Loading packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +37 −25 Original line number Diff line number Diff line Loading @@ -147,14 +147,14 @@ import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import dagger.Lazy; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; import javax.inject.Inject; import dagger.Lazy; /** * Helper to show the global actions dialog. Each item is an {@link Action} that may show depending * on whether the keyguard is showing, and whether the device is provisioned. Loading Loading @@ -270,6 +270,16 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private final UserLogoutInteractor mLogoutInteractor; private final GlobalActionsInteractor mInteractor; private final Lazy<DisplayWindowPropertiesRepository> mDisplayWindowPropertiesRepositoryLazy; private final Handler mHandler; private final UserTracker.Callback mOnUserSwitched = new UserTracker.Callback() { @Override public void onBeforeUserSwitching(int newUser) { // Dismiss the dialog as soon as we start switching. This will schedule a message // in a handler so it will be pretty quick. dismissDialog(); } }; @VisibleForTesting public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { Loading Loading @@ -425,6 +435,29 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mInteractor = interactor; mDisplayWindowPropertiesRepositoryLazy = displayWindowPropertiesRepository; mHandler = new Handler(mMainHandler.getLooper()) { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_DISMISS: if (mDialog != null) { if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) { // Hide instantly. mDialog.hide(); mDialog.dismiss(); } else { mDialog.dismiss(); } mDialog = null; } break; case MESSAGE_REFRESH: refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; } } }; // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); Loading Loading @@ -537,6 +570,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene expandable != null ? expandable.dialogTransitionController( new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG)) : null; mUserTracker.addCallback(mOnUserSwitched, mBackgroundExecutor); if (controller != null) { mDialogTransitionAnimator.show(mDialog, controller); } else { Loading Loading @@ -1404,6 +1438,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mWindowManagerFuncs.onGlobalActionsHidden(); mLifecycle.setCurrentState(Lifecycle.State.CREATED); mInteractor.onDismissed(); mUserTracker.removeCallback(mOnUserSwitched); } /** Loading Loading @@ -2228,29 +2263,6 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mDialogPressDelay = 0; // ms } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_DISMISS: if (mDialog != null) { if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) { // Hide instantly. mDialog.hide(); mDialog.dismiss(); } else { mDialog.dismiss(); } mDialog = null; } break; case MESSAGE_REFRESH: refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; } } }; private void onAirplaneModeChanged() { // Let the service state callbacks handle the state. if (mHasTelephony || mAirplaneModeOn == null) return; Loading packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,6 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private RingerModeTracker mRingerModeTracker; @Mock private RingerModeLiveData mRingerModeLiveData; @Mock private PackageManager mPackageManager; @Mock private Handler mHandler; @Mock private UserContextProvider mUserContextProvider; @Mock private VibratorHelper mVibratorHelper; @Mock private ShadeController mShadeController; Loading @@ -148,6 +147,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { private TestableLooper mTestableLooper; private KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this); private GlobalActionsInteractor mInteractor; private Handler mHandler; @Before public void setUp() throws Exception { Loading @@ -166,6 +166,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mGlobalSettings = new FakeGlobalSettings(); mSecureSettings = new FakeSettings(); mInteractor = mKosmos.getGlobalActionsInteractor(); mHandler = new Handler(mTestableLooper.getLooper()); mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext, mWindowManagerFuncs, Loading Loading @@ -771,6 +772,31 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mGlobalActionsDialogLite.showOrHideDialog(false, false, null, Display.DEFAULT_DISPLAY); } @Test public void userSwitching_dismissDialog() { String[] actions = { GlobalActionsDialogLite.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialogLite.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mResources) .getStringArray(com.android.internal.R.array.config_globalActionsList); mGlobalActionsDialogLite.showOrHideDialog(false, true, null, Display.DEFAULT_DISPLAY); mTestableLooper.processAllMessages(); assertThat(mGlobalActionsDialogLite.mDialog.isShowing()).isTrue(); ArgumentCaptor<UserTracker.Callback> captor = ArgumentCaptor.forClass(UserTracker.Callback.class); verify(mUserTracker).addCallback(captor.capture(), any()); captor.getValue().onBeforeUserSwitching(100); mTestableLooper.processAllMessages(); assertThat(mGlobalActionsDialogLite.mDialog).isNull(); } private UserInfo mockCurrentUser(int flags) { return new UserInfo(10, "A User", flags); Loading Loading
packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +37 −25 Original line number Diff line number Diff line Loading @@ -147,14 +147,14 @@ import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import dagger.Lazy; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executor; import javax.inject.Inject; import dagger.Lazy; /** * Helper to show the global actions dialog. Each item is an {@link Action} that may show depending * on whether the keyguard is showing, and whether the device is provisioned. Loading Loading @@ -270,6 +270,16 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene private final UserLogoutInteractor mLogoutInteractor; private final GlobalActionsInteractor mInteractor; private final Lazy<DisplayWindowPropertiesRepository> mDisplayWindowPropertiesRepositoryLazy; private final Handler mHandler; private final UserTracker.Callback mOnUserSwitched = new UserTracker.Callback() { @Override public void onBeforeUserSwitching(int newUser) { // Dismiss the dialog as soon as we start switching. This will schedule a message // in a handler so it will be pretty quick. dismissDialog(); } }; @VisibleForTesting public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum { Loading Loading @@ -425,6 +435,29 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mInteractor = interactor; mDisplayWindowPropertiesRepositoryLazy = displayWindowPropertiesRepository; mHandler = new Handler(mMainHandler.getLooper()) { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_DISMISS: if (mDialog != null) { if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) { // Hide instantly. mDialog.hide(); mDialog.dismiss(); } else { mDialog.dismiss(); } mDialog = null; } break; case MESSAGE_REFRESH: refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; } } }; // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); Loading Loading @@ -537,6 +570,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene expandable != null ? expandable.dialogTransitionController( new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG)) : null; mUserTracker.addCallback(mOnUserSwitched, mBackgroundExecutor); if (controller != null) { mDialogTransitionAnimator.show(mDialog, controller); } else { Loading Loading @@ -1404,6 +1438,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mWindowManagerFuncs.onGlobalActionsHidden(); mLifecycle.setCurrentState(Lifecycle.State.CREATED); mInteractor.onDismissed(); mUserTracker.removeCallback(mOnUserSwitched); } /** Loading Loading @@ -2228,29 +2263,6 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mDialogPressDelay = 0; // ms } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_DISMISS: if (mDialog != null) { if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) { // Hide instantly. mDialog.hide(); mDialog.dismiss(); } else { mDialog.dismiss(); } mDialog = null; } break; case MESSAGE_REFRESH: refreshSilentMode(); mAdapter.notifyDataSetChanged(); break; } } }; private void onAirplaneModeChanged() { // Let the service state callbacks handle the state. if (mHasTelephony || mAirplaneModeOn == null) return; Loading
packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +27 −1 Original line number Diff line number Diff line Loading @@ -134,7 +134,6 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private RingerModeTracker mRingerModeTracker; @Mock private RingerModeLiveData mRingerModeLiveData; @Mock private PackageManager mPackageManager; @Mock private Handler mHandler; @Mock private UserContextProvider mUserContextProvider; @Mock private VibratorHelper mVibratorHelper; @Mock private ShadeController mShadeController; Loading @@ -148,6 +147,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { private TestableLooper mTestableLooper; private KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this); private GlobalActionsInteractor mInteractor; private Handler mHandler; @Before public void setUp() throws Exception { Loading @@ -166,6 +166,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mGlobalSettings = new FakeGlobalSettings(); mSecureSettings = new FakeSettings(); mInteractor = mKosmos.getGlobalActionsInteractor(); mHandler = new Handler(mTestableLooper.getLooper()); mGlobalActionsDialogLite = new GlobalActionsDialogLite(mContext, mWindowManagerFuncs, Loading Loading @@ -771,6 +772,31 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mGlobalActionsDialogLite.showOrHideDialog(false, false, null, Display.DEFAULT_DISPLAY); } @Test public void userSwitching_dismissDialog() { String[] actions = { GlobalActionsDialogLite.GLOBAL_ACTION_KEY_POWER, GlobalActionsDialogLite.GLOBAL_ACTION_KEY_RESTART, }; doReturn(actions).when(mResources) .getStringArray(com.android.internal.R.array.config_globalActionsList); mGlobalActionsDialogLite.showOrHideDialog(false, true, null, Display.DEFAULT_DISPLAY); mTestableLooper.processAllMessages(); assertThat(mGlobalActionsDialogLite.mDialog.isShowing()).isTrue(); ArgumentCaptor<UserTracker.Callback> captor = ArgumentCaptor.forClass(UserTracker.Callback.class); verify(mUserTracker).addCallback(captor.capture(), any()); captor.getValue().onBeforeUserSwitching(100); mTestableLooper.processAllMessages(); assertThat(mGlobalActionsDialogLite.mDialog).isNull(); } private UserInfo mockCurrentUser(int flags) { return new UserInfo(10, "A User", flags); Loading