Loading AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading src/com/android/packageinstaller/permission/ui/ReviewAccessibilityServicesActivity.java +27 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -123,6 +132,8 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity Utils.getAbsoluteTimeString(this, lastAccessTime))); } itemView.setOnClickListener((v) -> startAccessibilityScreen(serviceInfo)); servicesListView.addView(itemView); } } Loading @@ -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( Loading Loading
AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading
src/com/android/packageinstaller/permission/ui/ReviewAccessibilityServicesActivity.java +27 −9 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -123,6 +132,8 @@ public final class ReviewAccessibilityServicesActivity extends FragmentActivity Utils.getAbsoluteTimeString(this, lastAccessTime))); } itemView.setOnClickListener((v) -> startAccessibilityScreen(serviceInfo)); servicesListView.addView(itemView); } } Loading @@ -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( Loading