Merge "Fix the shortcut still turned on after drag to remove the FM in the another user mode."

This commit is contained in:
PETER LIANG
2022-11-15 07:54:05 +00:00
committed by Android (Google) Code Review
2 changed files with 105 additions and 5 deletions

View File

@@ -16,14 +16,19 @@
package com.android.systemui.accessibility.floatingmenu;
import static com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType.INVISIBLE_TOGGLE;
import static com.android.internal.accessibility.util.AccessibilityUtils.getAccessibilityServiceFragmentType;
import static com.android.internal.accessibility.util.AccessibilityUtils.setAccessibilityServiceState;
import static com.android.systemui.accessibility.floatingmenu.MenuMessageView.Index;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.IntDef;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.PluralsMessageFormatter;
import android.view.MotionEvent;
@@ -82,8 +87,22 @@ class MenuViewLayer extends FrameLayout {
final Runnable mDismissMenuAction = new Runnable() {
@Override
public void run() {
Settings.Secure.putString(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, /* value= */ "");
Settings.Secure.putStringForUser(getContext().getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, /* value= */ "",
UserHandle.USER_CURRENT);
// Should disable the corresponding service when the fragment type is
// INVISIBLE_TOGGLE, which will enable service when the shortcut is on.
final List<AccessibilityServiceInfo> serviceInfoList =
mAccessibilityManager.getEnabledAccessibilityServiceList(
AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
serviceInfoList.forEach(info -> {
if (getAccessibilityServiceFragmentType(info) == INVISIBLE_TOGGLE) {
setAccessibilityServiceState(mContext, info.getComponentName(), /* enabled= */
false);
}
});
mFloatingMenu.hide();
}
};

View File

@@ -19,12 +19,22 @@ package com.android.systemui.accessibility.floatingmenu;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME;
import static com.android.systemui.accessibility.floatingmenu.MenuViewLayer.LayerIndex;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.View;
@@ -35,6 +45,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -43,12 +54,23 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.List;
/** Tests for {@link MenuViewLayer}. */
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@SmallTest
public class MenuViewLayerTest extends SysuiTestCase {
private static final String SELECT_TO_SPEAK_PACKAGE_NAME = "com.google.android.marvin.talkback";
private static final String SELECT_TO_SPEAK_SERVICE_NAME =
"com.google.android.accessibility.selecttospeak.SelectToSpeakService";
private static final ComponentName TEST_SELECT_TO_SPEAK_COMPONENT_NAME = new ComponentName(
SELECT_TO_SPEAK_PACKAGE_NAME, SELECT_TO_SPEAK_SERVICE_NAME);
private MenuViewLayer mMenuViewLayer;
private String mLastAccessibilityButtonTargets;
private String mLastEnabledAccessibilityServices;
@Rule
public MockitoRule mockito = MockitoJUnit.rule();
@@ -56,13 +78,31 @@ public class MenuViewLayerTest extends SysuiTestCase {
@Mock
private IAccessibilityFloatingMenu mFloatingMenu;
@Mock
private AccessibilityManager mStubAccessibilityManager;
@Before
public void setUp() throws Exception {
final WindowManager stubWindowManager = mContext.getSystemService(WindowManager.class);
final AccessibilityManager stubAccessibilityManager = mContext.getSystemService(
AccessibilityManager.class);
mMenuViewLayer = new MenuViewLayer(mContext, stubWindowManager, stubAccessibilityManager,
mMenuViewLayer = new MenuViewLayer(mContext, stubWindowManager, mStubAccessibilityManager,
mFloatingMenu);
mLastAccessibilityButtonTargets =
Settings.Secure.getStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, UserHandle.USER_CURRENT);
mLastEnabledAccessibilityServices =
Settings.Secure.getStringForUser(mContext.getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, UserHandle.USER_CURRENT);
}
@After
public void tearDown() throws Exception {
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, mLastAccessibilityButtonTargets,
UserHandle.USER_CURRENT);
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, mLastEnabledAccessibilityServices,
UserHandle.USER_CURRENT);
}
@Test
@@ -87,4 +127,45 @@ public class MenuViewLayerTest extends SysuiTestCase {
verify(mFloatingMenu).hide();
}
@Test
public void tiggerDismissMenuAction_matchA11yButtonTargetsResult() {
Settings.Secure.putStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
MAGNIFICATION_COMPONENT_NAME.flattenToString(), UserHandle.USER_CURRENT);
mMenuViewLayer.mDismissMenuAction.run();
final String value =
Settings.Secure.getStringForUser(mContext.getContentResolver(),
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, UserHandle.USER_CURRENT);
assertThat(value).isEqualTo("");
}
@Test
public void tiggerDismissMenuAction_matchEnabledA11yServicesResult() {
Settings.Secure.putString(mContext.getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString());
final ResolveInfo resolveInfo = new ResolveInfo();
final ServiceInfo serviceInfo = new ServiceInfo();
final ApplicationInfo applicationInfo = new ApplicationInfo();
resolveInfo.serviceInfo = serviceInfo;
serviceInfo.applicationInfo = applicationInfo;
applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
final AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();
accessibilityServiceInfo.setResolveInfo(resolveInfo);
accessibilityServiceInfo.flags = AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
final List<AccessibilityServiceInfo> serviceInfoList = new ArrayList<>();
accessibilityServiceInfo.setComponentName(TEST_SELECT_TO_SPEAK_COMPONENT_NAME);
serviceInfoList.add(accessibilityServiceInfo);
when(mStubAccessibilityManager.getEnabledAccessibilityServiceList(
AccessibilityServiceInfo.FEEDBACK_ALL_MASK)).thenReturn(serviceInfoList);
mMenuViewLayer.mDismissMenuAction.run();
final String value = Settings.Secure.getString(mContext.getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
assertThat(value).isEqualTo("");
}
}