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

Commit 72048e32 authored by Peter_Liang's avatar Peter_Liang
Browse files

Implement and add the bounce fragment type into shortcut menu.

Implementation for the bounce fragment.

Bug: 149268000
Test: manual test
Change-Id: Ic8365e0b8e1a860e73a7105e30ea39d78800a9f2
parent eb1ae5b6
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();