Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a58b1be authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Simplifies serviceSupportsAccessibilityButton by checking service info."

parents 599a3b11 05924bf3
Loading
Loading
Loading
Loading
+6 −19
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
@@ -283,22 +282,10 @@ public class ToggleAccessibilityServicePreferenceFragment extends
        mPackageRemovedReceiver = null;
    }

    private boolean isServiceSupportAccessibilityButton() {
        final AccessibilityManager ams = getPrefContext().getSystemService(
                AccessibilityManager.class);
        final List<AccessibilityServiceInfo> services = ams.getInstalledAccessibilityServiceList();

        for (AccessibilityServiceInfo info : services) {
            if ((info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0) {
                ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
                if (serviceInfo != null && TextUtils.equals(serviceInfo.name,
                        getAccessibilityServiceInfo().getResolveInfo().serviceInfo.name)) {
                    return true;
                }
            }
        }

        return false;
    boolean serviceSupportsAccessibilityButton() {
        final AccessibilityServiceInfo info = getAccessibilityServiceInfo();
        return info != null
                && (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
    }

    private void handleConfirmServiceEnabled(boolean confirmed) {
@@ -449,7 +436,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends

    private void onAllowButtonFromEnableToggleClicked() {
        handleConfirmServiceEnabled(/* confirmed= */ true);
        if (isServiceSupportAccessibilityButton()) {
        if (serviceSupportsAccessibilityButton()) {
            mIsDialogShown.set(false);
            showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
        }
@@ -524,7 +511,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends
                showPopupDialog(DialogEnums.ENABLE_WARNING_FROM_TOGGLE);
            } else {
                handleConfirmServiceEnabled(/* confirmed= */ true);
                if (isServiceSupportAccessibilityButton()) {
                if (serviceSupportsAccessibilityButton()) {
                    showPopupDialog(DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL);
                }
            }
+81 −0
Original line number Diff line number Diff line
@@ -22,13 +22,17 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.NonNull;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.service.quicksettings.TileService;
import android.view.accessibility.AccessibilityManager;

import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
@@ -45,13 +49,20 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.Shadows;
import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowAccessibilityManager;
import org.robolectric.shadows.ShadowPackageManager;

import java.util.List;

/** Tests for {@link ToggleAccessibilityServicePreferenceFragment} */
@RunWith(RobolectricTestRunner.class)
public class ToggleAccessibilityServicePreferenceFragmentTest {

    private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
    private static final String PLACEHOLDER_PACKAGE_NAME2 = "com.placeholder.example2";
    private static final String PLACEHOLDER_SERVICE_CLASS_NAME = "a11yservice1";
    private static final String PLACEHOLDER_SERVICE_CLASS_NAME2 = "a11yservice2";
    private static final String PLACEHOLDER_TILE_CLASS_NAME =
            PLACEHOLDER_PACKAGE_NAME + "tile.placeholder";
    private static final String PLACEHOLDER_TILE_CLASS_NAME2 =
@@ -67,6 +78,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
    private PreferenceScreen mScreen;
    private Context mContext = ApplicationProvider.getApplicationContext();

    private ShadowAccessibilityManager mShadowAccessibilityManager;
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private PreferenceManager mPreferenceManager;

@@ -81,6 +93,7 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
        mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
        when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
        doReturn(mScreen).when(mFragment).getPreferenceScreen();
        mShadowAccessibilityManager = Shadow.extract(AccessibilityManager.getInstance(mContext));
    }

    @Test
@@ -149,6 +162,57 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
                        R.string.accessibility_service_auto_added_qs_tooltip_content, tileName));
    }

    @Test
    public void getAccessibilityServiceInfo() throws Throwable {
        final AccessibilityServiceInfo info1 = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME,
                PLACEHOLDER_SERVICE_CLASS_NAME);
        final AccessibilityServiceInfo info2 = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME,
                PLACEHOLDER_SERVICE_CLASS_NAME2);
        final AccessibilityServiceInfo info3 = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME2,
                PLACEHOLDER_SERVICE_CLASS_NAME);
        final AccessibilityServiceInfo info4 = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME2,
                PLACEHOLDER_SERVICE_CLASS_NAME2);
        mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
                List.of(info1, info2, info3, info4));

        mFragment.mComponentName = info3.getComponentName();

        assertThat(mFragment.getAccessibilityServiceInfo()).isEqualTo(info3);
    }

    @Test
    public void getAccessibilityServiceInfo_notFound() throws Throwable {
        mShadowAccessibilityManager.setInstalledAccessibilityServiceList(List.of());

        mFragment.mComponentName = getFakeAccessibilityServiceInfo(PLACEHOLDER_PACKAGE_NAME,
                PLACEHOLDER_SERVICE_CLASS_NAME).getComponentName();

        assertThat(mFragment.getAccessibilityServiceInfo()).isNull();
    }

    @Test
    public void serviceSupportsAccessibilityButton() throws Throwable {
        final AccessibilityServiceInfo infoWithA11yButton = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME,
                PLACEHOLDER_SERVICE_CLASS_NAME);
        infoWithA11yButton.flags = AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
        final AccessibilityServiceInfo infoWithoutA11yButton = getFakeAccessibilityServiceInfo(
                PLACEHOLDER_PACKAGE_NAME2,
                PLACEHOLDER_SERVICE_CLASS_NAME2);
        infoWithoutA11yButton.flags = 0;
        mShadowAccessibilityManager.setInstalledAccessibilityServiceList(
                List.of(infoWithA11yButton, infoWithoutA11yButton));

        mFragment.mComponentName = infoWithA11yButton.getComponentName();
        assertThat(mFragment.serviceSupportsAccessibilityButton()).isTrue();
        mFragment.mComponentName = infoWithoutA11yButton.getComponentName();
        assertThat(mFragment.serviceSupportsAccessibilityButton()).isFalse();
    }

    private void setupTileService(String packageName, String name, String tileName) {
        final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE);
        final ResolveInfo info = new ResolveInfo();
@@ -172,6 +236,23 @@ public class ToggleAccessibilityServicePreferenceFragmentTest {
        }
    }

    @NonNull
    private AccessibilityServiceInfo getFakeAccessibilityServiceInfo(String packageName,
            String className) throws Throwable {
        final ApplicationInfo applicationInfo = new ApplicationInfo();
        final ServiceInfo serviceInfo = new ServiceInfo();
        applicationInfo.packageName = packageName;
        serviceInfo.packageName = packageName;
        serviceInfo.name = className;
        serviceInfo.applicationInfo = applicationInfo;
        final ResolveInfo resolveInfo = new ResolveInfo();
        resolveInfo.serviceInfo = serviceInfo;
        final AccessibilityServiceInfo info = new AccessibilityServiceInfo(resolveInfo, mContext);
        ComponentName componentName = ComponentName.createRelative(packageName, className);
        info.setComponentName(componentName);
        return info;
    }

    private static class TestToggleAccessibilityServicePreferenceFragment
            extends ToggleAccessibilityServicePreferenceFragment {