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

Commit 191e7c5a authored by Svetoslav Ganov's avatar Svetoslav Ganov Committed by Android Git Automerger
Browse files

am 758534ed: Merge "Ask to enable touch exploration only the first time it...

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

* commit '758534ed':
  Ask to enable touch exploration only the first time it enables the feature.
parents ce7ce8b6 758534ed
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
        }

        /**