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

Commit 0b2c26e4 authored by PETER LIANG's avatar PETER LIANG Committed by Android (Google) Code Review
Browse files

Merge "Implement and add the bounce fragment type into shortcut menu."

parents 7948993c 72048e32
Loading
Loading
Loading
Loading
+46 −2
Original line number Diff line number Diff line
@@ -30,10 +30,12 @@ import static com.android.internal.app.AccessibilityButtonChooserActivity.WhiteL
import static com.android.internal.util.Preconditions.checkArgument;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityShortcutInfo;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
@@ -265,6 +267,7 @@ public class AccessibilityButtonChooserActivity extends Activity {
            @ShortcutType int shortcutType) {
        final List<AccessibilityButtonTarget> targets = new ArrayList<>();
        targets.addAll(getAccessibilityServiceTargets(context));
        targets.addAll(getAccessibilityActivityTargets(context));
        targets.addAll(getWhiteListingServiceTargets(context));

        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
@@ -291,6 +294,24 @@ public class AccessibilityButtonChooserActivity extends Activity {
        return targets;
    }

    private static List<AccessibilityButtonTarget> getAccessibilityActivityTargets(
            @NonNull Context context) {
        final AccessibilityManager ams = context.getSystemService(AccessibilityManager.class);
        final List<AccessibilityShortcutInfo> installedServices =
                ams.getInstalledAccessibilityShortcutListAsUser(context,
                        ActivityManager.getCurrentUser());
        if (installedServices == null) {
            return Collections.emptyList();
        }

        final List<AccessibilityButtonTarget> targets = new ArrayList<>(installedServices.size());
        for (AccessibilityShortcutInfo info : installedServices) {
            targets.add(new AccessibilityButtonTarget(context, info));
        }

        return targets;
    }

    private static List<AccessibilityButtonTarget> getWhiteListingServiceTargets(
            @NonNull Context context) {
        final List<AccessibilityButtonTarget> targets = new ArrayList<>();
@@ -540,6 +561,14 @@ public class AccessibilityButtonChooserActivity extends Activity {
            this.mFragmentType = getAccessibilityServiceFragmentType(serviceInfo);
        }

        AccessibilityButtonTarget(@NonNull Context context,
                @NonNull AccessibilityShortcutInfo shortcutInfo) {
            this.mId = shortcutInfo.getComponentName().flattenToString();
            this.mLabel = shortcutInfo.getActivityInfo().loadLabel(context.getPackageManager());
            this.mDrawable = shortcutInfo.getActivityInfo().loadIcon(context.getPackageManager());
            this.mFragmentType = AccessibilityServiceFragmentType.BOUNCE;
        }

        AccessibilityButtonTarget(Context context, @NonNull String id, int labelResId,
                int iconRes, @AccessibilityServiceFragmentType int fragmentType) {
            this.mId = id;
@@ -594,7 +623,7 @@ public class AccessibilityButtonChooserActivity extends Activity {
                onIntuitiveTargetSelected(target);
                break;
            case AccessibilityServiceFragmentType.BOUNCE:
                // Do nothing
                onBounceTargetSelected(target);
                break;
            default:
                throw new IllegalStateException("Unexpected fragment type");
@@ -625,6 +654,15 @@ public class AccessibilityButtonChooserActivity extends Activity {
        switchServiceState(target);
    }

    private void onBounceTargetSelected(AccessibilityButtonTarget target) {
        final AccessibilityManager ams = getSystemService(AccessibilityManager.class);
        if (mShortcutType == ACCESSIBILITY_BUTTON) {
            ams.notifyAccessibilityButtonClicked(getDisplayId(), target.getId());
        } else if (mShortcutType == ACCESSIBILITY_SHORTCUT_KEY) {
            ams.performAccessibilityShortcut(target.getId());
        }
    }

    private void switchServiceState(AccessibilityButtonTarget target) {
        final ComponentName componentName =
                ComponentName.unflattenFromString(target.getId());
@@ -656,7 +694,7 @@ public class AccessibilityButtonChooserActivity extends Activity {
                onIntuitiveTargetDeleted(position, componentId);
                break;
            case AccessibilityServiceFragmentType.BOUNCE:
                // Do nothing
                onBounceTargetDeleted(position, componentId);
                break;
            default:
                throw new IllegalStateException("Unexpected fragment type");
@@ -694,6 +732,12 @@ public class AccessibilityButtonChooserActivity extends Activity {
        mTargetAdapter.notifyDataSetChanged();
    }

    private void onBounceTargetDeleted(int position, String componentId) {
        optOutValueFromSettings(this, mShortcutUserType, componentId);
        mTargets.remove(position);
        mTargetAdapter.notifyDataSetChanged();
    }

    private void onCancelButtonClicked() {
        mTargetAdapter.setShortcutMenuMode(ShortcutMenuMode.LAUNCH);
        mTargetAdapter.notifyDataSetChanged();