Accessibility enabled by gesture not reflected in settings screen.
1. We have added a global gesture to enable accessibility which is long press on power followed by a long press with two fingers. If this gesture is performed when the settings for an accessibility service are on the screen, accessibility and the screen-reader are enabled while the UI does not reflect that and the user may try to enable the already enabled screen-reader which will show two irrelevant warning dialogs - one for enabling the screen-reader and one for enabling explore by touch (assuming the screen-reader requests it). This change adds a simple content observer for the relevant accessibility settings which upon a change calls the functions to refresh the settings UI. bug:7309127 Change-Id: I214c64877086eeb1fe156bcc195aa4e2931d6bdb
This commit is contained in:
@@ -23,6 +23,7 @@ import android.app.ActivityManagerNative;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
@@ -125,6 +126,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
private static final String EXTRA_DISABLE_WARNING_MESSAGE = "disable_warning_message";
|
||||
private static final String EXTRA_SETTINGS_TITLE = "settings_title";
|
||||
private static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name";
|
||||
private static final String EXTRA_SERVICE_COMPONENT_NAME = "service_component_name";
|
||||
|
||||
// Dialog IDs.
|
||||
private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1;
|
||||
@@ -152,7 +154,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
};
|
||||
|
||||
private final SettingsContentObserver mSettingsContentObserver =
|
||||
new SettingsContentObserver(mHandler);
|
||||
new SettingsContentObserver(mHandler) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
loadInstalledServices();
|
||||
updateServicesPreferences();
|
||||
}
|
||||
};
|
||||
|
||||
private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
|
||||
new RotationPolicy.RotationPolicyListener() {
|
||||
@@ -194,7 +202,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
offerInstallAccessibilitySerivceOnce();
|
||||
|
||||
mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
|
||||
mSettingsContentObserver.register();
|
||||
mSettingsContentObserver.register(getContentResolver());
|
||||
RotationPolicy.registerRotationPolicyListener(getActivity(),
|
||||
mRotationPolicyListener);
|
||||
}
|
||||
@@ -204,7 +212,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
mSettingsPackageMonitor.unregister();
|
||||
RotationPolicy.unregisterRotationPolicyListener(getActivity(),
|
||||
mRotationPolicyListener);
|
||||
mSettingsContentObserver.unregister();
|
||||
mSettingsContentObserver.unregister(getContentResolver());
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@@ -431,6 +439,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
settingsClassName).flattenToString());
|
||||
}
|
||||
|
||||
extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString());
|
||||
|
||||
mServicesCategory.addPreference(preference);
|
||||
}
|
||||
|
||||
@@ -689,13 +699,38 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
private static final int DIALOG_ID_ENABLE_WARNING = 1;
|
||||
private static final int DIALOG_ID_DISABLE_WARNING = 2;
|
||||
|
||||
private final SettingsContentObserver mSettingsContentObserver =
|
||||
new SettingsContentObserver(new Handler()) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
String settingValue = Settings.Secure.getString(getContentResolver(),
|
||||
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
|
||||
final boolean enabled = settingValue.contains(mComponentName);
|
||||
mToggleSwitch.setCheckedInternal(enabled);
|
||||
}
|
||||
};
|
||||
|
||||
private CharSequence mEnableWarningTitle;
|
||||
private CharSequence mEnableWarningMessage;
|
||||
private CharSequence mDisableWarningTitle;
|
||||
private CharSequence mDisableWarningMessage;
|
||||
|
||||
private String mComponentName;
|
||||
|
||||
private int mShownDialogId;
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
mSettingsContentObserver.register(getContentResolver());
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
mSettingsContentObserver.unregister(getContentResolver());
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPreferenceToggled(String preferenceKey, boolean enabled) {
|
||||
// Parse the enabled services.
|
||||
@@ -851,6 +886,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
// Disable warning message.
|
||||
mDisableWarningMessage = arguments.getString(
|
||||
AccessibilitySettings.EXTRA_DISABLE_WARNING_MESSAGE);
|
||||
// Component name.
|
||||
mComponentName = arguments.getString(EXTRA_SERVICE_COMPONENT_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1016,27 +1053,24 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
||||
}
|
||||
}
|
||||
|
||||
private final class SettingsContentObserver extends ContentObserver {
|
||||
private static abstract class SettingsContentObserver extends ContentObserver {
|
||||
|
||||
public SettingsContentObserver(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
|
||||
public void register() {
|
||||
getContentResolver().registerContentObserver(Settings.Secure.getUriFor(
|
||||
public void register(ContentResolver contentResolver) {
|
||||
contentResolver.registerContentObserver(Settings.Secure.getUriFor(
|
||||
Settings.Secure.ACCESSIBILITY_ENABLED), false, this);
|
||||
getContentResolver().registerContentObserver(Settings.Secure.getUriFor(
|
||||
contentResolver.registerContentObserver(Settings.Secure.getUriFor(
|
||||
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES), false, this);
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
getContentResolver().unregisterContentObserver(this);
|
||||
public void unregister(ContentResolver contentResolver) {
|
||||
contentResolver.unregisterContentObserver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
loadInstalledServices();
|
||||
updateServicesPreferences();
|
||||
}
|
||||
public abstract void onChange(boolean selfChange, Uri uri);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user