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:
Svetoslav Ganov
2012-10-10 13:50:36 -07:00
parent 553074f0fc
commit 849d64bc1d

View File

@@ -23,6 +23,7 @@ import android.app.ActivityManagerNative;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog; import android.app.Dialog;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; 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_DISABLE_WARNING_MESSAGE = "disable_warning_message";
private static final String EXTRA_SETTINGS_TITLE = "settings_title"; 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_SETTINGS_COMPONENT_NAME = "settings_component_name";
private static final String EXTRA_SERVICE_COMPONENT_NAME = "service_component_name";
// Dialog IDs. // Dialog IDs.
private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1; private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1;
@@ -152,7 +154,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}; };
private final SettingsContentObserver mSettingsContentObserver = 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 = private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
new RotationPolicy.RotationPolicyListener() { new RotationPolicy.RotationPolicyListener() {
@@ -194,7 +202,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
offerInstallAccessibilitySerivceOnce(); offerInstallAccessibilitySerivceOnce();
mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false); mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
mSettingsContentObserver.register(); mSettingsContentObserver.register(getContentResolver());
RotationPolicy.registerRotationPolicyListener(getActivity(), RotationPolicy.registerRotationPolicyListener(getActivity(),
mRotationPolicyListener); mRotationPolicyListener);
} }
@@ -204,7 +212,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mSettingsPackageMonitor.unregister(); mSettingsPackageMonitor.unregister();
RotationPolicy.unregisterRotationPolicyListener(getActivity(), RotationPolicy.unregisterRotationPolicyListener(getActivity(),
mRotationPolicyListener); mRotationPolicyListener);
mSettingsContentObserver.unregister(); mSettingsContentObserver.unregister(getContentResolver());
super.onPause(); super.onPause();
} }
@@ -431,6 +439,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
settingsClassName).flattenToString()); settingsClassName).flattenToString());
} }
extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString());
mServicesCategory.addPreference(preference); 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_ENABLE_WARNING = 1;
private static final int DIALOG_ID_DISABLE_WARNING = 2; 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 mEnableWarningTitle;
private CharSequence mEnableWarningMessage; private CharSequence mEnableWarningMessage;
private CharSequence mDisableWarningTitle; private CharSequence mDisableWarningTitle;
private CharSequence mDisableWarningMessage; private CharSequence mDisableWarningMessage;
private String mComponentName;
private int mShownDialogId; private int mShownDialogId;
@Override
public void onResume() {
mSettingsContentObserver.register(getContentResolver());
super.onResume();
}
@Override
public void onPause() {
mSettingsContentObserver.unregister(getContentResolver());
super.onPause();
}
@Override @Override
public void onPreferenceToggled(String preferenceKey, boolean enabled) { public void onPreferenceToggled(String preferenceKey, boolean enabled) {
// Parse the enabled services. // Parse the enabled services.
@@ -851,6 +886,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
// Disable warning message. // Disable warning message.
mDisableWarningMessage = arguments.getString( mDisableWarningMessage = arguments.getString(
AccessibilitySettings.EXTRA_DISABLE_WARNING_MESSAGE); 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) { public SettingsContentObserver(Handler handler) {
super(handler); super(handler);
} }
public void register() { public void register(ContentResolver contentResolver) {
getContentResolver().registerContentObserver(Settings.Secure.getUriFor( contentResolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_ENABLED), false, this); Settings.Secure.ACCESSIBILITY_ENABLED), false, this);
getContentResolver().registerContentObserver(Settings.Secure.getUriFor( contentResolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES), false, this); Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES), false, this);
} }
public void unregister() { public void unregister(ContentResolver contentResolver) {
getContentResolver().unregisterContentObserver(this); contentResolver.unregisterContentObserver(this);
} }
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public abstract void onChange(boolean selfChange, Uri uri);
loadInstalledServices();
updateServicesPreferences();
}
} }
} }