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

Commit 758534ed authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android (Google) Code Review
Browse files

Merge "Ask to enable touch exploration only the first time it enables the feature." into jb-dev

parents 4b55eac4 9a4c5cd1
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2885,6 +2885,15 @@ public final class Settings {
        public static final String ENABLED_ACCESSIBILITY_SERVICES =
            "enabled_accessibility_services";

        /**
         * List of the accessibility services to which the user has graned
         * permission to put the device into touch exploration mode.
         *
         * @hide
         */
        public static final String TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES =
            "touch_exploration_granted_accessibility_services";

        /**
         * Whether to speak passwords while in accessibility mode.
         */
@@ -4292,6 +4301,7 @@ public final class Settings {
            ACCESSIBILITY_SCRIPT_INJECTION,
            BACKUP_AUTO_RESTORE,
            ENABLED_ACCESSIBILITY_SERVICES,
            TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
            TOUCH_EXPLORATION_ENABLED,
            ACCESSIBILITY_ENABLED,
            ACCESSIBILITY_SPEAK_PASSWORD,
+152 −68
Original line number Diff line number Diff line
@@ -104,10 +104,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
    private static final String FUNCTION_REGISTER_UI_TEST_AUTOMATION_SERVICE =
        "registerUiTestAutomationService";

    private static final char COMPONENT_NAME_SEPARATOR = ':';

    private static final int OWN_PROCESS_ID = android.os.Process.myPid();

    private static final int MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG = 1;

    private static final int MSG_TOGGLE_TOUCH_EXPLORATION = 2;

    private static int sIdCounter = 0;

    private static int sNextWindowId;
@@ -127,12 +131,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {

    private final Set<ComponentName> mEnabledServices = new HashSet<ComponentName>();

    private final Set<ComponentName> mTouchExplorationGrantedServices = new HashSet<ComponentName>();

    private final SparseArray<AccessibilityConnectionWrapper> mWindowIdToInteractionConnectionWrapperMap =
        new SparseArray<AccessibilityConnectionWrapper>();

    private final SparseArray<IBinder> mWindowIdToWindowTokenMap = new SparseArray<IBinder>();

    private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(':');
    private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);

    private final Rect mTempRect = new Rect();

@@ -164,6 +170,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {

    private boolean mTouchExplorationGestureStarted;

    private AlertDialog mEnableTouchExplorationDialog;

    /**
     * Creates a new instance.
     *
@@ -208,7 +216,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                        String compPkg = comp.getPackageName();
                        if (compPkg.equals(packageName)) {
                            it.remove();
                            updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
                            // Update the enabled services setting.
                            persistComponentNamesToSettingLocked(
                                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                                    mEnabledServices);
                            // Update the touch exploration granted services setting.
                            mTouchExplorationGrantedServices.remove(comp);
                            persistComponentNamesToSettingLocked(
                                    Settings.Secure.
                                            TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
                                    mEnabledServices);
                            return;
                        }
                    }
@@ -219,7 +236,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
            public boolean onHandleForceStop(Intent intent, String[] packages,
                    int uid, boolean doit) {
                synchronized (mLock) {
                    boolean changed = false;
                    Iterator<ComponentName> it = mEnabledServices.iterator();
                    while (it.hasNext()) {
                        ComponentName comp = it.next();
@@ -230,12 +246,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                                    return true;
                                }
                                it.remove();
                                changed = true;
                            }
                                persistComponentNamesToSettingLocked(
                                        Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                                        mEnabledServices);
                            }
                        }
                    if (changed) {
                        updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
                    }
                    return false;
                }
@@ -248,33 +263,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                        // We will update when the automation service dies.
                        if (mUiAutomationService == null) {
                            populateAccessibilityServiceListLocked();
                            populateEnabledAccessibilityServicesLocked();
                            populateTouchExplorationGrantedAccessibilityServicesLocked();
                            handleAccessibilityEnabledSettingChangedLocked();
                            handleTouchExplorationEnabledSettingChangedLocked();
                            updateInputFilterLocked();
                            sendStateToClientsLocked();
                        }
                    }

                    return;
                }

                super.onReceive(context, intent);
            }

            private void updateEnabledAccessibilitySerivcesSettingLocked(
                    Set<ComponentName> enabledServices) {
                Iterator<ComponentName> it = enabledServices.iterator();
                StringBuilder str = new StringBuilder();
                while (it.hasNext()) {
                    if (str.length() > 0) {
                        str.append(':');
                    }
                    str.append(it.next().flattenToShortString());
                }
                Settings.Secure.putString(mContext.getContentResolver(),
                        Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                        str.toString());
            }
        };

        // package changes
@@ -338,6 +339,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                    synchronized (mLock) {
                        // We will update when the automation service dies.
                        if (mUiAutomationService == null) {
                            populateEnabledAccessibilityServicesLocked();
                            manageServicesLocked();
                        }
                    }
                }
            });

        Uri touchExplorationGrantedServicesUri = Settings.Secure.getUriFor(
                Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
        contentResolver.registerContentObserver(touchExplorationGrantedServicesUri, false,
            new ContentObserver(new Handler()) {
                @Override
                public void onChange(boolean selfChange) {
                    super.onChange(selfChange);
                    synchronized (mLock) {
                        // We will update when the automation service dies.
                        if (mUiAutomationService == null) {
                            populateTouchExplorationGrantedAccessibilityServicesLocked();
                            unbindAllServicesLocked();
                            manageServicesLocked();
                        }
                    }
@@ -647,6 +667,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
        }
    }

    private void populateEnabledAccessibilityServicesLocked() {
        populateComponentNamesFromSettingLocked(
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
                mEnabledServices);
    }

    private void populateTouchExplorationGrantedAccessibilityServicesLocked() {
        populateComponentNamesFromSettingLocked(
                Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
                mTouchExplorationGrantedServices);
    }

    /**
     * Performs {@link AccessibilityService}s delayed notification. The delay is configurable
     * and denotes the period after the last event before notifying the service.
@@ -689,7 +721,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
            mServices.add(service);
            mComponentNameToServiceMap.put(service.mComponentName, service);
            updateInputFilterLocked();
            tryEnableTouchExploration(service);
            tryEnableTouchExplorationLocked(service);
        } catch (RemoteException e) {
            /* do nothing */
        }
@@ -710,7 +742,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
        service.unlinkToOwnDeath();
        service.dispose();
        updateInputFilterLocked();
        tryDisableTouchExploration(service);
        tryDisableTouchExplorationLocked(service);
        return removed;
    }

@@ -762,7 +794,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
     * Manages services by starting enabled ones and stopping disabled ones.
     */
    private void manageServicesLocked() {
        populateEnabledServicesLocked(mEnabledServices);
        final int enabledInstalledServicesCount = updateServicesStateLocked(mInstalledServices,
                mEnabledServices);
        // No enabled installed services => disable accessibility to avoid
@@ -789,20 +820,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
    }

    /**
     * Populates a list with the {@link ComponentName}s of all enabled
     * {@link AccessibilityService}s.
     * Populates a set with the {@link ComponentName}s stored in a colon
     * separated value setting.
     *
     * @param enabledServices The list.
     * @param settingName The setting to parse.
     * @param outComponentNames The output component names.
     */
    private void populateEnabledServicesLocked(Set<ComponentName> enabledServices) {
        enabledServices.clear();
    private void populateComponentNamesFromSettingLocked(String settingName,
            Set<ComponentName> outComponentNames) {
        outComponentNames.clear();

        String servicesValue = Settings.Secure.getString(mContext.getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        String settingValue = Settings.Secure.getString(mContext.getContentResolver(), settingName);

        if (servicesValue != null) {
        if (settingValue != null) {
            TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
            splitter.setString(servicesValue);
            splitter.setString(settingValue);
            while (splitter.hasNext()) {
                String str = splitter.next();
                if (str == null || str.length() <= 0) {
@@ -810,12 +842,31 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                }
                ComponentName enabledService = ComponentName.unflattenFromString(str);
                if (enabledService != null) {
                    enabledServices.add(enabledService);
                    outComponentNames.add(enabledService);
                }
            }
        }
    }

    /**
     * Persists the component names in the specified setting in a
     * colon separated fashion.
     *
     * @param settingName The setting name.
     * @param componentNames The component names.
     */
    private void persistComponentNamesToSettingLocked(String settingName,
            Set<ComponentName> componentNames) {
        StringBuilder builder = new StringBuilder();
        for (ComponentName componentName : componentNames) {
            if (builder.length() > 0) {
                builder.append(COMPONENT_NAME_SEPARATOR);
            }
            builder.append(componentName.flattenToShortString());
        }
        Settings.Secure.putString(mContext.getContentResolver(), settingName, builder.toString());
    }

    /**
     * Updates the state of each service by starting (or keeping running) enabled ones and
     * stopping the rest.
@@ -935,20 +986,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1;
    }

    private void tryEnableTouchExploration(final Service service) {
    private void tryEnableTouchExplorationLocked(final Service service) {
        if (!mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode) {
            if (!service.mIsAutomation) {
            final boolean canToggleTouchExploration = mTouchExplorationGrantedServices.contains(
                    service.mComponentName);
            if (!service.mIsAutomation && !canToggleTouchExploration) {
                mMainHandler.obtainMessage(MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG,
                        service).sendToTarget();
            } else {
                Settings.Secure.putInt(mContext.getContentResolver(),
                        Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
                mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 1, 0).sendToTarget();
            }
        }
    }

    private void tryDisableTouchExploration(Service service) {
        if (mIsTouchExplorationEnabled && service.mReqeustTouchExplorationMode) {
    private void tryDisableTouchExplorationLocked(Service service) {
        if (mIsTouchExplorationEnabled) {
            synchronized (mLock) {
                final int serviceCount = mServices.size();
                for (int i = 0; i < serviceCount; i++) {
@@ -957,8 +1009,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                        return;
                    }
                }
                Settings.Secure.putInt(mContext.getContentResolver(),
                        Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0);
                mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 0, 0).sendToTarget();
            }
        }
    }
@@ -995,15 +1046,35 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
        public void handleMessage(Message msg) {
            final int type = msg.what;
            switch (type) {
                case MSG_TOGGLE_TOUCH_EXPLORATION: {
                    final int value = msg.arg1;
                    Settings.Secure.putInt(mContext.getContentResolver(),
                            Settings.Secure.TOUCH_EXPLORATION_ENABLED, value);
                } break;
                case MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG: {
                    Service service = (Service) msg.obj;
                    final Service service = (Service) msg.obj;
                    String label = service.mResolveInfo.loadLabel(
                            mContext.getPackageManager()).toString();
                    final AlertDialog dialog = new AlertDialog.Builder(mContext)
                    synchronized (mLock) {
                        if (mIsTouchExplorationEnabled) {
                            return;
                        }
                        if (mEnableTouchExplorationDialog != null
                                && mEnableTouchExplorationDialog.isShowing()) {
                            return;
                        }
                        mEnableTouchExplorationDialog = new AlertDialog.Builder(mContext)
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .setPositiveButton(android.R.string.ok, new OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // The user allowed the service to toggle touch exploration.
                                    mTouchExplorationGrantedServices.add(service.mComponentName);
                                    persistComponentNamesToSettingLocked(
                                            Settings.Secure.
                                                   TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
                                            mTouchExplorationGrantedServices);
                                    // Enable touch exploration.
                                    Settings.Secure.putInt(mContext.getContentResolver(),
                                            Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
                                }
@@ -1018,9 +1089,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                            .setMessage(mContext.getString(
                                R.string.enable_explore_by_touch_warning_message, label))
                            .create();
                    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
                    dialog.setCanceledOnTouchOutside(true);
                    dialog.show();
                        mEnableTouchExplorationDialog.getWindow().setType(
                                WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
                        mEnableTouchExplorationDialog.setCanceledOnTouchOutside(true);
                        mEnableTouchExplorationDialog.show();
                    }
                }
            }
        }
@@ -1143,8 +1216,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
            mRequestTouchExplorationMode = (info.flags
                    & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;

            // If this service is up and running we may have to enable touch
            // exploration, otherwise this will happen when the service connects.
            synchronized (mLock) {
                tryAddServiceLocked(this);
                if (isConfigured()) {
                    if (mRequestTouchExplorationMode) {
                        tryEnableTouchExplorationLocked(this);
                    } else {
                        tryDisableTouchExplorationLocked(this);
                    }
                }
            }
        }

@@ -1496,6 +1577,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                if (mIsAutomation) {
                    mUiAutomationService = null;

                    populateEnabledAccessibilityServicesLocked();
                    populateTouchExplorationGrantedAccessibilityServicesLocked();

                    handleAccessibilityEnabledSettingChangedLocked();
                    sendStateToClientsLocked();

+1 −1
Original line number Diff line number Diff line
@@ -1532,7 +1532,7 @@ public class TouchExplorer {
         */
        public ReceivedPointerTracker(Context context) {
            mThresholdActivePointer =
                ViewConfiguration.get(context).getScaledTouchSlop() * COEFFICIENT_ACTIVE_POINTER;
                ViewConfiguration.get(context).getScaledTouchSlop() * COEFFICIENT_ACTIVE_POINTER;//Heie govna
        }

        /**