diff options
7 files changed, 231 insertions, 97 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SecureSettingsContentObserver.java b/packages/SystemUI/src/com/android/systemui/accessibility/SecureSettingsContentObserver.java index 4f8d8666a24a..c941d662dfd9 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SecureSettingsContentObserver.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SecureSettingsContentObserver.java @@ -21,6 +21,7 @@ import android.content.Context; import android.database.ContentObserver; import android.os.Handler; import android.os.Looper; +import android.os.UserHandle; import android.provider.Settings; import androidx.annotation.NonNull; @@ -75,7 +76,7 @@ public abstract class SecureSettingsContentObserver<T> { if (mListeners.size() == 1) { mContentResolver.registerContentObserver( Settings.Secure.getUriFor(mKey), /* notifyForDescendants= */ - false, mContentObserver); + false, mContentObserver, UserHandle.USER_ALL); } } @@ -100,7 +101,7 @@ public abstract class SecureSettingsContentObserver<T> { * See {@link Settings.Secure}. */ public final String getSettingsValue() { - return Settings.Secure.getString(mContentResolver, mKey); + return Settings.Secure.getStringForUser(mContentResolver, mKey, UserHandle.USER_CURRENT); } private void updateValueChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java index 112e9cae0a21..7cd43eff8e2a 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuController.java @@ -20,11 +20,12 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATIN import android.content.Context; import android.text.TextUtils; -import android.view.accessibility.AccessibilityManager; import androidx.annotation.MainThread; import com.android.internal.annotations.VisibleForTesting; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonModeObserver.AccessibilityButtonMode; import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; @@ -37,41 +38,65 @@ import javax.inject.Inject; @SysUISingleton public class AccessibilityFloatingMenuController implements AccessibilityButtonModeObserver.ModeChangedListener, - AccessibilityButtonTargetsObserver.TargetsChangedListener, - AccessibilityManager.AccessibilityStateChangeListener { + AccessibilityButtonTargetsObserver.TargetsChangedListener { private final Context mContext; - private final AccessibilityManager mAccessibilityManager; private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver; private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver; + private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @VisibleForTesting IAccessibilityFloatingMenu mFloatingMenu; private int mBtnMode; private String mBtnTargets; + private boolean mIsKeyguardVisible; + private boolean mIsAccessibilityManagerServiceReady; + + @VisibleForTesting + final KeyguardUpdateMonitorCallback mKeyguardCallback = new KeyguardUpdateMonitorCallback() { + // Accessibility floating menu needs to retrieve information from + // AccessibilityManagerService, and it would be ready before onUserUnlocked(). + @Override + public void onUserUnlocked() { + mIsAccessibilityManagerServiceReady = true; + handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets); + } + + // Keyguard state would be changed before AccessibilityManagerService is ready to retrieve, + // need to wait until receive onUserUnlocked(). + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + mIsKeyguardVisible = showing; + if (mIsAccessibilityManagerServiceReady) { + handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets); + } + } + + @Override + public void onUserSwitching(int userId) { + destroyFloatingMenu(); + } + + @Override + public void onUserSwitchComplete(int userId) { + mBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); + mBtnTargets = + mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets(); + handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets); + } + }; @Inject public AccessibilityFloatingMenuController(Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, - AccessibilityButtonModeObserver accessibilityButtonModeObserver) { + AccessibilityButtonModeObserver accessibilityButtonModeObserver, + KeyguardUpdateMonitor keyguardUpdateMonitor) { mContext = context; mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver; mAccessibilityButtonModeObserver = accessibilityButtonModeObserver; - mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); - - mAccessibilityButtonModeObserver.addListener(this); - mAccessibilityButtonTargetsObserver.addListener(this); - mBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); - mBtnTargets = mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets(); + mKeyguardUpdateMonitor = keyguardUpdateMonitor; - // Accessibility floating menu widget needs accessibility service to work, but system - // accessibility might be unavailable during the phone get booted, hence it needs to wait - // for accessibility manager callback to work. - mAccessibilityManager.addAccessibilityStateChangeListener(this); - if (mAccessibilityManager.isEnabled()) { - handleFloatingMenuVisibility(mBtnMode, mBtnTargets); - mAccessibilityManager.removeAccessibilityStateChangeListener(this); - } + init(); } /** @@ -82,7 +107,7 @@ public class AccessibilityFloatingMenuController implements @Override public void onAccessibilityButtonModeChanged(@AccessibilityButtonMode int mode) { mBtnMode = mode; - handleFloatingMenuVisibility(mBtnMode, mBtnTargets); + handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets); } /** @@ -94,27 +119,39 @@ public class AccessibilityFloatingMenuController implements @Override public void onAccessibilityButtonTargetsChanged(String targets) { mBtnTargets = targets; - handleFloatingMenuVisibility(mBtnMode, mBtnTargets); + handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets); + } + + private void init() { + mIsKeyguardVisible = false; + mIsAccessibilityManagerServiceReady = false; + mBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); + mBtnTargets = mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets(); + registerContentObservers(); + } + + private void registerContentObservers() { + mAccessibilityButtonModeObserver.addListener(this); + mAccessibilityButtonTargetsObserver.addListener(this); + mKeyguardUpdateMonitor.registerCallback(mKeyguardCallback); } /** - * Handles visibility of the accessibility floating menu when system accessibility state - * changes. - * If system accessibility become available onAccessibilityStateChanged(true), then we don't - * need to listen to this listener anymore. + * Handles the accessibility floating menu visibility with the given values. * - * @param enabled Whether accessibility is enabled. + * @param keyguardVisible the keyguard visibility status. Not show the + * {@link AccessibilityFloatingMenu} when keyguard appears. + * @param mode accessibility button mode {@link AccessibilityButtonMode} + * @param targets accessibility button list; it should comes from + * {@link android.provider.Settings.Secure#ACCESSIBILITY_BUTTON_TARGETS}. */ - @Override - public void onAccessibilityStateChanged(boolean enabled) { - if (enabled) { - handleFloatingMenuVisibility(mBtnMode, mBtnTargets); + private void handleFloatingMenuVisibility(boolean keyguardVisible, + @AccessibilityButtonMode int mode, String targets) { + if (keyguardVisible) { + destroyFloatingMenu(); + return; } - mAccessibilityManager.removeAccessibilityStateChangeListener(this); - } - - private void handleFloatingMenuVisibility(@AccessibilityButtonMode int mode, String targets) { if (shouldShowFloatingMenu(mode, targets)) { showFloatingMenu(); } else { diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 187caf9c2b2e..746621dfda27 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -41,6 +41,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.util.NotificationMessagingUtil; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.ViewMediatorCallback; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.Prefs; @@ -263,9 +264,10 @@ public class DependencyProvider { @SysUISingleton public AccessibilityFloatingMenuController provideAccessibilityFloatingMenuController( Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, - AccessibilityButtonModeObserver accessibilityButtonModeObserver) { + AccessibilityButtonModeObserver accessibilityButtonModeObserver, + KeyguardUpdateMonitor keyguardUpdateMonitor) { return new AccessibilityFloatingMenuController(context, accessibilityButtonTargetsObserver, - accessibilityButtonModeObserver); + accessibilityButtonModeObserver, keyguardUpdateMonitor); } /** */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonModeObserverTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonModeObserverTest.java index 01b7adefbacf..7aa47632965f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonModeObserverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonModeObserverTest.java @@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -55,17 +56,18 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase { @Before public void setUp() { - Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); + Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); mAccessibilityButtonModeObserver = new AccessibilityButtonModeObserver(mContext); } @Test public void onChange_haveListener_invokeCallback() { mAccessibilityButtonModeObserver.addListener(mListener); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE, + UserHandle.USER_CURRENT); mAccessibilityButtonModeObserver.mContentObserver.onChange(false); @@ -76,8 +78,9 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase { public void onChange_noListener_noInvokeCallback() { mAccessibilityButtonModeObserver.addListener(mListener); mAccessibilityButtonModeObserver.removeListener(mListener); - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE, + UserHandle.USER_CURRENT); mAccessibilityButtonModeObserver.mContentObserver.onChange(false); @@ -86,8 +89,9 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase { @Test public void getCurrentAccessibilityButtonMode_expectedValue() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE, + UserHandle.USER_CURRENT); final int actualValue = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonTargetsObserverTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonTargetsObserverTest.java index 1e49fc998ea4..4145437a71b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonTargetsObserverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/AccessibilityButtonTargetsObserverTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -60,8 +61,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase { @Test public void onChange_haveListener_invokeCallback() { mAccessibilityButtonTargetsObserver.addListener(mListener); - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false); @@ -72,8 +74,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase { public void onChange_listenerRemoved_noInvokeCallback() { mAccessibilityButtonTargetsObserver.addListener(mListener); mAccessibilityButtonTargetsObserver.removeListener(mListener); - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false); @@ -82,8 +85,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase { @Test public void getCurrentAccessibilityButtonTargets_expectedValue() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); final String actualValue = mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/SecureSettingsContentObserverTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/SecureSettingsContentObserverTest.java index 5b1c441a71a1..41fd2b3a40e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/SecureSettingsContentObserverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/SecureSettingsContentObserverTest.java @@ -19,6 +19,7 @@ package com.android.systemui.accessibility; import static com.google.common.truth.Truth.assertThat; import android.content.Context; +import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -55,8 +56,8 @@ public class SecureSettingsContentObserverTest extends SysuiTestCase { @Test public void checkValue() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, 1); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, 1, UserHandle.USER_CURRENT); assertThat(mTestObserver.getSettingsValue()).isEqualTo("1"); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java index a83f0382ba7b..5b50e897e254 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java @@ -24,15 +24,16 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.accessibility.AccessibilityManager; import androidx.test.filters.SmallTest; +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.AccessibilityButtonModeObserver; @@ -41,7 +42,8 @@ import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -56,11 +58,13 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private AccessibilityFloatingMenuController mController; private AccessibilityButtonTargetsObserver mTargetsObserver; private AccessibilityButtonModeObserver mModeObserver; - @Mock - private AccessibilityManager mMockA11yManager; + @Captor + private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardCallbackCaptor; + private KeyguardUpdateMonitorCallback mKeyguardCallback; @Test public void initController_registerListeners() { @@ -70,43 +74,107 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { any(AccessibilityButtonTargetsObserver.TargetsChangedListener.class)); verify(mModeObserver).addListener( any(AccessibilityButtonModeObserver.ModeChangedListener.class)); - verify(mMockA11yManager).addAccessibilityStateChangeListener(any( - AccessibilityManager.AccessibilityStateChangeListener.class)); + verify(mKeyguardUpdateMonitor).registerCallback(any(KeyguardUpdateMonitorCallback.class)); } @Test - public void initController_accessibilityManagerEnabled_showWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); - when(mMockA11yManager.isEnabled()).thenReturn(true); + public void onUserUnlocked_keyguardNotShow_showWidget() { + enableAccessibilityFloatingMenuConfig(); + mController = setUpController(); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onKeyguardVisibilityChanged(false); + + mKeyguardCallback.onUserUnlocked(); + + assertThat(mController.mFloatingMenu).isNotNull(); + } + + @Test + public void onUserUnlocked_keyguardShowing_destroyWidget() { + enableAccessibilityFloatingMenuConfig(); + mController = setUpController(); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onKeyguardVisibilityChanged(true); + + mKeyguardCallback.onUserUnlocked(); + + assertThat(mController.mFloatingMenu).isNull(); + } + + @Test + public void onKeyguardVisibilityChanged_showing_destroyWidget() { + enableAccessibilityFloatingMenuConfig(); + mController = setUpController(); + mController.mFloatingMenu = new AccessibilityFloatingMenu(mContext); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onUserUnlocked(); + mKeyguardCallback.onKeyguardVisibilityChanged(true); + + assertThat(mController.mFloatingMenu).isNull(); + } + + @Test + public void onKeyguardVisibilityChanged_notShow_showWidget() { + enableAccessibilityFloatingMenuConfig(); mController = setUpController(); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onUserUnlocked(); + + mKeyguardCallback.onKeyguardVisibilityChanged(false); assertThat(mController.mFloatingMenu).isNotNull(); - verify(mMockA11yManager).removeAccessibilityStateChangeListener(mController); } @Test - public void initController_accessibilityManagerDisabledThenCallbackToEnabled_showWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); - when(mMockA11yManager.isEnabled()).thenReturn(false); + public void onUserSwitching_destroyWidget() { + final int fakeUserId = 1; + enableAccessibilityFloatingMenuConfig(); + mController = setUpController(); + mController.mFloatingMenu = new AccessibilityFloatingMenu(mContext); + captureKeyguardUpdateMonitorCallback(); + + mKeyguardCallback.onUserSwitching(fakeUserId); + + assertThat(mController.mFloatingMenu).isNull(); + } + @Test + public void onUserSwitch_onKeyguardVisibilityChangedToTrue_destroyWidget() { + final int fakeUserId = 1; + enableAccessibilityFloatingMenuConfig(); mController = setUpController(); - mController.onAccessibilityStateChanged(true); + mController.mFloatingMenu = new AccessibilityFloatingMenu(mContext); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onUserUnlocked(); + mKeyguardCallback.onKeyguardVisibilityChanged(true); + + mKeyguardCallback.onUserSwitching(fakeUserId); + mKeyguardCallback.onUserSwitchComplete(fakeUserId); + + assertThat(mController.mFloatingMenu).isNull(); + } + + @Test + public void onUserSwitch_onKeyguardVisibilityChangedToFalse_showWidget() { + final int fakeUserId = 1; + enableAccessibilityFloatingMenuConfig(); + mController = setUpController(); + captureKeyguardUpdateMonitorCallback(); + mKeyguardCallback.onUserUnlocked(); + mKeyguardCallback.onKeyguardVisibilityChanged(false); + + mKeyguardCallback.onUserSwitching(fakeUserId); + mKeyguardCallback.onUserSwitchComplete(fakeUserId); assertThat(mController.mFloatingMenu).isNotNull(); - verify(mMockA11yManager).removeAccessibilityStateChangeListener(mController); } @Test public void onAccessibilityButtonModeChanged_floatingModeAndHasButtonTargets_showWidget() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); @@ -116,8 +184,8 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Test public void onAccessibilityButtonModeChanged_floatingModeAndNoButtonTargets_destroyWidget() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, ""); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, "", UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); @@ -126,9 +194,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { } @Test - public void onAccessibilityButtonModeChanged_navBarModeAndHasButtonTargets_showWidget() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); + public void onAccessibilityButtonModeChanged_navBarModeAndHasButtonTargets_destroyWidget() { + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); @@ -138,8 +207,8 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Test public void onAccessibilityButtonModeChanged_navBarModeAndNoButtonTargets_destroyWidget() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, ""); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, "", UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); @@ -149,8 +218,9 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Test public void onAccessibilityButtonTargetsChanged_floatingModeAndHasButtonTargets_showWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU, + UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS); @@ -160,8 +230,9 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { @Test public void onAccessibilityButtonTargetsChanged_floatingModeAndNoButtonTargets_destroyWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU, + UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonTargetsChanged(""); @@ -170,10 +241,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { } @Test - public void onAccessibilityButtonTargetsChanged_navBarModeAndHasButtonTargets_showWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), + public void onAccessibilityButtonTargetsChanged_navBarModeAndHasButtonTargets_destroyWidget() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS); @@ -182,10 +253,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { } @Test - public void onAccessibilityButtonTargetsChanged_buttonModeAndNoButtonTargets_destroyWidget() { - Settings.Secure.putInt(mContext.getContentResolver(), + public void onAccessibilityButtonTargetsChanged_navBarModeAndNoButtonTargets_destroyWidget() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_BUTTON_MODE, - ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); + ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT); mController = setUpController(); mController.onAccessibilityButtonTargetsChanged(""); @@ -196,9 +267,23 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase { private AccessibilityFloatingMenuController setUpController() { mTargetsObserver = spy(Dependency.get(AccessibilityButtonTargetsObserver.class)); mModeObserver = spy(Dependency.get(AccessibilityButtonModeObserver.class)); - mContext.addMockSystemService(AccessibilityManager.class, mMockA11yManager); + mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class); return new AccessibilityFloatingMenuController(mContext, mTargetsObserver, - mModeObserver); + mModeObserver, mKeyguardUpdateMonitor); + } + + private void enableAccessibilityFloatingMenuConfig() { + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU, + UserHandle.USER_CURRENT); + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS, + UserHandle.USER_CURRENT); + } + + private void captureKeyguardUpdateMonitorCallback() { + verify(mKeyguardUpdateMonitor).registerCallback(mKeyguardCallbackCaptor.capture()); + mKeyguardCallback = mKeyguardCallbackCaptor.getValue(); } } |