Merge changes Iad3b9eb3,I052a5729 into sc-dev am: c2c8144656

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14683434

Change-Id: I3bf63bca2e37a55d8b58fdf9710096909eafc97f
This commit is contained in:
Jason Hsu
2021-06-03 07:38:08 +00:00
committed by Automerger Merge Worker
7 changed files with 233 additions and 99 deletions

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -75,7 +76,7 @@ public abstract class SecureSettingsContentObserver<T> {
if (mListeners.size() == 1) { if (mListeners.size() == 1) {
mContentResolver.registerContentObserver( mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(mKey), /* notifyForDescendants= */ 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}. * See {@link Settings.Secure}.
*/ */
public final String getSettingsValue() { public final String getSettingsValue() {
return Settings.Secure.getString(mContentResolver, mKey); return Settings.Secure.getStringForUser(mContentResolver, mKey, UserHandle.USER_CURRENT);
} }
private void updateValueChanged() { private void updateValueChanged() {

View File

@@ -20,11 +20,12 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATIN
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.MainThread; import androidx.annotation.MainThread;
import com.android.internal.annotations.VisibleForTesting; 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;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver.AccessibilityButtonMode; import com.android.systemui.accessibility.AccessibilityButtonModeObserver.AccessibilityButtonMode;
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
@@ -37,41 +38,65 @@ import javax.inject.Inject;
@SysUISingleton @SysUISingleton
public class AccessibilityFloatingMenuController implements public class AccessibilityFloatingMenuController implements
AccessibilityButtonModeObserver.ModeChangedListener, AccessibilityButtonModeObserver.ModeChangedListener,
AccessibilityButtonTargetsObserver.TargetsChangedListener, AccessibilityButtonTargetsObserver.TargetsChangedListener {
AccessibilityManager.AccessibilityStateChangeListener {
private final Context mContext; private final Context mContext;
private final AccessibilityManager mAccessibilityManager;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver; private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver; private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@VisibleForTesting @VisibleForTesting
IAccessibilityFloatingMenu mFloatingMenu; IAccessibilityFloatingMenu mFloatingMenu;
private int mBtnMode; private int mBtnMode;
private String mBtnTargets; 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 @Inject
public AccessibilityFloatingMenuController(Context context, public AccessibilityFloatingMenuController(Context context,
AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver,
AccessibilityButtonModeObserver accessibilityButtonModeObserver) { AccessibilityButtonModeObserver accessibilityButtonModeObserver,
KeyguardUpdateMonitor keyguardUpdateMonitor) {
mContext = context; mContext = context;
mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver; mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver;
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver; mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mAccessibilityButtonModeObserver.addListener(this); init();
mAccessibilityButtonTargetsObserver.addListener(this);
mBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode();
mBtnTargets = mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets();
// 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);
}
} }
/** /**
@@ -82,7 +107,7 @@ public class AccessibilityFloatingMenuController implements
@Override @Override
public void onAccessibilityButtonModeChanged(@AccessibilityButtonMode int mode) { public void onAccessibilityButtonModeChanged(@AccessibilityButtonMode int mode) {
mBtnMode = mode; mBtnMode = mode;
handleFloatingMenuVisibility(mBtnMode, mBtnTargets); handleFloatingMenuVisibility(mIsKeyguardVisible, mBtnMode, mBtnTargets);
} }
/** /**
@@ -94,27 +119,39 @@ public class AccessibilityFloatingMenuController implements
@Override @Override
public void onAccessibilityButtonTargetsChanged(String targets) { public void onAccessibilityButtonTargetsChanged(String targets) {
mBtnTargets = 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 * Handles the accessibility floating menu visibility with the given values.
* changes.
* If system accessibility become available onAccessibilityStateChanged(true), then we don't
* need to listen to this listener anymore.
* *
* @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 private void handleFloatingMenuVisibility(boolean keyguardVisible,
public void onAccessibilityStateChanged(boolean enabled) { @AccessibilityButtonMode int mode, String targets) {
if (enabled) { if (keyguardVisible) {
handleFloatingMenuVisibility(mBtnMode, mBtnTargets); destroyFloatingMenu();
return;
} }
mAccessibilityManager.removeAccessibilityStateChangeListener(this);
}
private void handleFloatingMenuVisibility(@AccessibilityButtonMode int mode, String targets) {
if (shouldShowFloatingMenu(mode, targets)) { if (shouldShowFloatingMenu(mode, targets)) {
showFloatingMenu(); showFloatingMenu();
} else { } else {

View File

@@ -41,6 +41,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.NotificationMessagingUtil; import com.android.internal.util.NotificationMessagingUtil;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback; import com.android.keyguard.ViewMediatorCallback;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.Prefs; import com.android.systemui.Prefs;
@@ -263,9 +264,10 @@ public class DependencyProvider {
@SysUISingleton @SysUISingleton
public AccessibilityFloatingMenuController provideAccessibilityFloatingMenuController( public AccessibilityFloatingMenuController provideAccessibilityFloatingMenuController(
Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver,
AccessibilityButtonModeObserver accessibilityButtonModeObserver) { AccessibilityButtonModeObserver accessibilityButtonModeObserver,
KeyguardUpdateMonitor keyguardUpdateMonitor) {
return new AccessibilityFloatingMenuController(context, accessibilityButtonTargetsObserver, return new AccessibilityFloatingMenuController(context, accessibilityButtonTargetsObserver,
accessibilityButtonModeObserver); accessibilityButtonModeObserver, keyguardUpdateMonitor);
} }
/** */ /** */

View File

@@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
@@ -55,17 +56,18 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase {
@Before @Before
public void setUp() { public void setUp() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, 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); mAccessibilityButtonModeObserver = new AccessibilityButtonModeObserver(mContext);
} }
@Test @Test
public void onChange_haveListener_invokeCallback() { public void onChange_haveListener_invokeCallback() {
mAccessibilityButtonModeObserver.addListener(mListener); mAccessibilityButtonModeObserver.addListener(mListener);
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE,
UserHandle.USER_CURRENT);
mAccessibilityButtonModeObserver.mContentObserver.onChange(false); mAccessibilityButtonModeObserver.mContentObserver.onChange(false);
@@ -76,8 +78,9 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase {
public void onChange_noListener_noInvokeCallback() { public void onChange_noListener_noInvokeCallback() {
mAccessibilityButtonModeObserver.addListener(mListener); mAccessibilityButtonModeObserver.addListener(mListener);
mAccessibilityButtonModeObserver.removeListener(mListener); mAccessibilityButtonModeObserver.removeListener(mListener);
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE,
UserHandle.USER_CURRENT);
mAccessibilityButtonModeObserver.mContentObserver.onChange(false); mAccessibilityButtonModeObserver.mContentObserver.onChange(false);
@@ -86,8 +89,9 @@ public class AccessibilityButtonModeObserverTest extends SysuiTestCase {
@Test @Test
public void getCurrentAccessibilityButtonMode_expectedValue() { public void getCurrentAccessibilityButtonMode_expectedValue() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, TEST_A11Y_BTN_MODE_VALUE,
UserHandle.USER_CURRENT);
final int actualValue = final int actualValue =
mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode(); mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode();

View File

@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
@@ -60,8 +61,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase {
@Test @Test
public void onChange_haveListener_invokeCallback() { public void onChange_haveListener_invokeCallback() {
mAccessibilityButtonTargetsObserver.addListener(mListener); mAccessibilityButtonTargetsObserver.addListener(mListener);
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS,
UserHandle.USER_CURRENT);
mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false); mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false);
@@ -72,8 +74,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase {
public void onChange_listenerRemoved_noInvokeCallback() { public void onChange_listenerRemoved_noInvokeCallback() {
mAccessibilityButtonTargetsObserver.addListener(mListener); mAccessibilityButtonTargetsObserver.addListener(mListener);
mAccessibilityButtonTargetsObserver.removeListener(mListener); mAccessibilityButtonTargetsObserver.removeListener(mListener);
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS,
UserHandle.USER_CURRENT);
mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false); mAccessibilityButtonTargetsObserver.mContentObserver.onChange(false);
@@ -82,8 +85,9 @@ public class AccessibilityButtonTargetsObserverTest extends SysuiTestCase {
@Test @Test
public void getCurrentAccessibilityButtonTargets_expectedValue() { public void getCurrentAccessibilityButtonTargets_expectedValue() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS,
UserHandle.USER_CURRENT);
final String actualValue = final String actualValue =
mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets(); mAccessibilityButtonTargetsObserver.getCurrentAccessibilityButtonTargets();

View File

@@ -19,6 +19,7 @@ package com.android.systemui.accessibility;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.content.Context; import android.content.Context;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
@@ -55,8 +56,8 @@ public class SecureSettingsContentObserverTest extends SysuiTestCase {
@Test @Test
public void checkValue() { public void checkValue() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, 1); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, 1, UserHandle.USER_CURRENT);
assertThat(mTestObserver.getSettingsValue()).isEqualTo("1"); assertThat(mTestObserver.getSettingsValue()).isEqualTo("1");
} }

View File

@@ -24,15 +24,16 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
@@ -41,7 +42,8 @@ import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; 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.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
@@ -56,11 +58,13 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
@Rule @Rule
public MockitoRule mockito = MockitoJUnit.rule(); public MockitoRule mockito = MockitoJUnit.rule();
private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private AccessibilityFloatingMenuController mController; private AccessibilityFloatingMenuController mController;
private AccessibilityButtonTargetsObserver mTargetsObserver; private AccessibilityButtonTargetsObserver mTargetsObserver;
private AccessibilityButtonModeObserver mModeObserver; private AccessibilityButtonModeObserver mModeObserver;
@Mock @Captor
private AccessibilityManager mMockA11yManager; private ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardCallbackCaptor;
private KeyguardUpdateMonitorCallback mKeyguardCallback;
@Test @Test
public void initController_registerListeners() { public void initController_registerListeners() {
@@ -70,43 +74,107 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
any(AccessibilityButtonTargetsObserver.TargetsChangedListener.class)); any(AccessibilityButtonTargetsObserver.TargetsChangedListener.class));
verify(mModeObserver).addListener( verify(mModeObserver).addListener(
any(AccessibilityButtonModeObserver.ModeChangedListener.class)); any(AccessibilityButtonModeObserver.ModeChangedListener.class));
verify(mMockA11yManager).addAccessibilityStateChangeListener(any( verify(mKeyguardUpdateMonitor).registerCallback(any(KeyguardUpdateMonitorCallback.class));
AccessibilityManager.AccessibilityStateChangeListener.class));
} }
@Test @Test
public void initController_accessibilityManagerEnabled_showWidget() { public void onUserUnlocked_keyguardNotShow_showWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), enableAccessibilityFloatingMenuConfig();
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);
mController = setUpController(); mController = setUpController();
captureKeyguardUpdateMonitorCallback();
mKeyguardCallback.onKeyguardVisibilityChanged(false);
mKeyguardCallback.onUserUnlocked();
assertThat(mController.mFloatingMenu).isNotNull(); assertThat(mController.mFloatingMenu).isNotNull();
verify(mMockA11yManager).removeAccessibilityStateChangeListener(mController);
} }
@Test @Test
public void initController_accessibilityManagerDisabledThenCallbackToEnabled_showWidget() { public void onUserUnlocked_keyguardShowing_destroyWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), enableAccessibilityFloatingMenuConfig();
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);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityStateChanged(true); 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();
}
@Test
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.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(); assertThat(mController.mFloatingMenu).isNotNull();
verify(mMockA11yManager).removeAccessibilityStateChangeListener(mController);
} }
@Test @Test
public void onAccessibilityButtonModeChanged_floatingModeAndHasButtonTargets_showWidget() { public void onAccessibilityButtonModeChanged_floatingModeAndHasButtonTargets_showWidget() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS,
UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
@@ -116,8 +184,8 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
@Test @Test
public void onAccessibilityButtonModeChanged_floatingModeAndNoButtonTargets_destroyWidget() { public void onAccessibilityButtonModeChanged_floatingModeAndNoButtonTargets_destroyWidget() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, ""); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, "", UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
@@ -126,9 +194,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onAccessibilityButtonModeChanged_navBarModeAndHasButtonTargets_showWidget() { public void onAccessibilityButtonModeChanged_navBarModeAndHasButtonTargets_destroyWidget() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, TEST_A11Y_BTN_TARGETS,
UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
@@ -138,8 +207,8 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
@Test @Test
public void onAccessibilityButtonModeChanged_navBarModeAndNoButtonTargets_destroyWidget() { public void onAccessibilityButtonModeChanged_navBarModeAndNoButtonTargets_destroyWidget() {
Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, ""); Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, "", UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); mController.onAccessibilityButtonModeChanged(ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
@@ -149,8 +218,9 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
@Test @Test
public void onAccessibilityButtonTargetsChanged_floatingModeAndHasButtonTargets_showWidget() { public void onAccessibilityButtonTargetsChanged_floatingModeAndHasButtonTargets_showWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU,
UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS); mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS);
@@ -160,8 +230,9 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
@Test @Test
public void onAccessibilityButtonTargetsChanged_floatingModeAndNoButtonTargets_destroyWidget() { public void onAccessibilityButtonTargetsChanged_floatingModeAndNoButtonTargets_destroyWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU); Settings.Secure.ACCESSIBILITY_BUTTON_MODE, ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU,
UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonTargetsChanged(""); mController.onAccessibilityButtonTargetsChanged("");
@@ -170,10 +241,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onAccessibilityButtonTargetsChanged_navBarModeAndHasButtonTargets_showWidget() { public void onAccessibilityButtonTargetsChanged_navBarModeAndHasButtonTargets_destroyWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, Settings.Secure.ACCESSIBILITY_BUTTON_MODE,
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS); mController.onAccessibilityButtonTargetsChanged(TEST_A11Y_BTN_TARGETS);
@@ -182,10 +253,10 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
} }
@Test @Test
public void onAccessibilityButtonTargetsChanged_buttonModeAndNoButtonTargets_destroyWidget() { public void onAccessibilityButtonTargetsChanged_navBarModeAndNoButtonTargets_destroyWidget() {
Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.putIntForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_MODE, Settings.Secure.ACCESSIBILITY_BUTTON_MODE,
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR); ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR, UserHandle.USER_CURRENT);
mController = setUpController(); mController = setUpController();
mController.onAccessibilityButtonTargetsChanged(""); mController.onAccessibilityButtonTargetsChanged("");
@@ -196,9 +267,23 @@ public class AccessibilityFloatingMenuControllerTest extends SysuiTestCase {
private AccessibilityFloatingMenuController setUpController() { private AccessibilityFloatingMenuController setUpController() {
mTargetsObserver = spy(Dependency.get(AccessibilityButtonTargetsObserver.class)); mTargetsObserver = spy(Dependency.get(AccessibilityButtonTargetsObserver.class));
mModeObserver = spy(Dependency.get(AccessibilityButtonModeObserver.class)); mModeObserver = spy(Dependency.get(AccessibilityButtonModeObserver.class));
mContext.addMockSystemService(AccessibilityManager.class, mMockA11yManager); mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
return new AccessibilityFloatingMenuController(mContext, mTargetsObserver, 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();
} }
} }