Loading packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } }; Loading packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +85 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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 Loading @@ -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(""); } } Loading
packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } }; Loading
packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +85 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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 Loading @@ -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(""); } }