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:
@@ -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() {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user