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

Commit fa7cdc11 authored by Joel Galenson's avatar Joel Galenson
Browse files

Link from accessibility usage dialog to individual service.

Fixes: 123693167
Test: Click on individual icons and see their setting.
Test: Click on "Settings" with only one service and see its setting.
Change-Id: I47e58a4a0028209535644f2d848c67693faf2776
parent 4cb0b5b3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
    <uses-permission android:name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL" />
    <uses-permission android:name="android.permission.APPROVE_INCIDENT_REPORTS" />
    <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
    <uses-permission android:name="android.permission.OPEN_ACCESSIBILITY_DETAILS_SETTINGS" />

    <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28" />

+27 −9
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@ package com.android.packageinstaller.permission.ui;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.provider.Settings;
import android.text.TextUtils;
@@ -54,20 +56,26 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity
            return;
        }

        AccessibilityManager accessibilityManager = getSystemService(
                AccessibilityManager.class);
        List<AccessibilityServiceInfo> services = accessibilityManager
                .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);

        new AlertDialog.Builder(this)
                .setView(createDialogView())
                .setView(createDialogView(services))
                .setPositiveButton(R.string.ok, null)
                .setNeutralButton(R.string.settings, (dialog, which) ->
                        startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)))
                .setNeutralButton(R.string.settings, (dialog, which) -> {
                    if (services.size() == 1) {
                        startAccessibilityScreen(services.get(0).getResolveInfo().serviceInfo);
                    } else {
                        startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
                    }
                })
                .setOnDismissListener((dialog) -> finish())
                .show();
    }

    private @NonNull View createDialogView() {
        AccessibilityManager accessibilityManager = getSystemService(
                AccessibilityManager.class);
        List<AccessibilityServiceInfo> services = accessibilityManager
                .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
    private @NonNull View createDialogView(List<AccessibilityServiceInfo> services) {
        AppOpsManager appOpsManager = getSystemService(AppOpsManager.class);

        LayoutInflater layoutInflater = LayoutInflater.from(this);
@@ -76,7 +84,8 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity
        int numServices = services.size();
        for (int i = 0; i < numServices; i++) {
            ResolveInfo resolveInfo = services.get(i).getResolveInfo();
            ApplicationInfo appInfo = resolveInfo.serviceInfo.applicationInfo;
            ServiceInfo serviceInfo = resolveInfo.serviceInfo;
            ApplicationInfo appInfo = serviceInfo.applicationInfo;
            CharSequence label = getLabel(resolveInfo);
            long lastAccessTime = getLastAccessTime(appInfo, appOpsManager);

@@ -123,6 +132,8 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity
                                    Utils.getAbsoluteTimeString(this, lastAccessTime)));
                }

                itemView.setOnClickListener((v) -> startAccessibilityScreen(serviceInfo));

                servicesListView.addView(itemView);
            }
        }
@@ -130,6 +141,13 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity
        return view;
    }

    private void startAccessibilityScreen(ServiceInfo serviceInfo) {
        Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_DETAILS_SETTINGS);
        intent.putExtra(Intent.EXTRA_COMPONENT_NAME,
                new ComponentName(serviceInfo.packageName, serviceInfo.name).flattenToString());
        startActivity(intent);
    }

    private @NonNull CharSequence getLabel(@NonNull ResolveInfo resolveInfo) {
        return BidiFormatter.getInstance().unicodeWrap(
                TextUtils.makeSafeForPresentation(