Merge "Add accessibility display adjustments to Quick Settings"

This commit is contained in:
Alan Viverette
2013-10-04 22:38:18 +00:00
committed by Android (Google) Code Review
3 changed files with 348 additions and 0 deletions

View File

@@ -496,6 +496,12 @@
<string name="quick_settings_brightness_dialog_title">Brightness</string>
<!-- QuickSettings: Brightness dialog auto brightness button [CHAR LIMIT=NONE] -->
<string name="quick_settings_brightness_dialog_auto_brightness_label">AUTO</string>
<!-- QuickSettings: Color inversion mode [CHAR LIMIT=NONE] -->
<string name="quick_settings_inversion_label">Color inversion mode</string>
<!-- QuickSettings: Enhanced contrast mode [CHAR LIMIT=NONE] -->
<string name="quick_settings_contrast_label">Enhanced contrast mode</string>
<!-- QuickSettings: Color correction mode [CHAR LIMIT=NONE] -->
<string name="quick_settings_color_space_label">Color correction mode</string>
<!-- Glyph to be overlaid atop the battery when the level is extremely low. Do not translate. -->

View File

@@ -25,6 +25,7 @@ import android.app.admin.DevicePolicyManager;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
@@ -84,6 +85,7 @@ class QuickSettings {
static final boolean DEBUG_GONE_TILES = false;
private static final String TAG = "QuickSettings";
public static final boolean SHOW_IME_TILE = false;
public static final boolean SHOW_ACCESSIBILITY_TILES = true;
public static final boolean LONG_PRESS_TOGGLES = true;
@@ -399,6 +401,35 @@ class QuickSettings {
new QuickSettingsModel.BasicRefreshCallback(settingsTile));
parent.addView(settingsTile);
mDynamicSpannedTiles.add(settingsTile);
if (SHOW_ACCESSIBILITY_TILES) {
// Color inversion tile
final SystemSettingTile inversionTile = new SystemSettingTile(mContext);
inversionTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
SystemSettingTile.TYPE_SECURE);
inversionTile.setFragment("Settings$AccessibilityInversionSettingsActivity");
mModel.addInversionTile(inversionTile, inversionTile.getRefreshCallback());
parent.addView(inversionTile);
mDynamicSpannedTiles.add(inversionTile);
// Contrast enhancement tile
final SystemSettingTile contrastTile = new SystemSettingTile(mContext);
contrastTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED,
SystemSettingTile.TYPE_SECURE);
contrastTile.setFragment("Settings$AccessibilityContrastSettingsActivity");
mModel.addContrastTile(contrastTile, contrastTile.getRefreshCallback());
parent.addView(contrastTile);
mDynamicSpannedTiles.add(contrastTile);
// Color space adjustment tile
final SystemSettingTile colorSpaceTile = new SystemSettingTile(mContext);
colorSpaceTile.setUri(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
SystemSettingTile.TYPE_SECURE);
colorSpaceTile.setFragment("Settings$AccessibilityDaltonizerSettingsActivity");
mModel.addColorSpaceTile(colorSpaceTile, colorSpaceTile.getRefreshCallback());
parent.addView(colorSpaceTile);
mDynamicSpannedTiles.add(colorSpaceTile);
}
}
private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
@@ -933,4 +964,108 @@ class QuickSettings {
}
}
}
/**
* Quick Setting tile that represents a secure setting. This type of tile
* can toggle a URI within Settings.Secure on click and launch a Settings
* fragment on long-click.
*/
public class SystemSettingTile extends QuickSettingsBasicTile {
private static final int TYPE_GLOBAL = 0;
private static final int TYPE_SECURE = 1;
private static final int TYPE_SYSTEM = 2;
private final QuickSettingsModel.BasicRefreshCallback mRefreshCallback;
private String mFragment;
private String mName;
private int mType;
public SystemSettingTile(Context context) {
super(context);
mRefreshCallback = new QuickSettingsModel.BasicRefreshCallback(this);
mRefreshCallback.setShowWhenEnabled(true);
}
@Override
public boolean performLongClick() {
if (mFragment != null) {
collapsePanels();
final Intent intent = new Intent();
intent.setComponent(new ComponentName(
"com.android.settings", "com.android.settings." + mFragment));
startSettingsActivity(intent);
return true;
}
return false;
}
@Override
public boolean performClick() {
if (mName != null) {
collapsePanels();
final ContentResolver cr = mContext.getContentResolver();
switch (mType) {
case TYPE_GLOBAL: {
final boolean enable = Settings.Global.getInt(cr, mName, 0) == 0;
Settings.Global.putInt(cr, mName, enable ? 1 : 0);
} break;
case TYPE_SECURE: {
final boolean enable = Settings.Secure.getIntForUser(
cr, mName, 0, UserHandle.USER_CURRENT) == 0;
Settings.Secure.putIntForUser(
cr, mName, enable ? 1 : 0, UserHandle.USER_CURRENT);
} break;
case TYPE_SYSTEM: {
final boolean enable = Settings.System.getIntForUser(
cr, mName, 0, UserHandle.USER_CURRENT) == 0;
Settings.System.putIntForUser(
cr, mName, enable ? 1 : 0, UserHandle.USER_CURRENT);
} break;
}
return true;
}
return false;
}
/**
* Specifies the fragment within the com.android.settings package to
* launch when this tile is long-clicked.
*
* @param fragment a fragment name within the com.android.settings
* package
*/
public void setFragment(String fragment) {
mFragment = fragment;
setLongClickable(fragment != null);
}
/**
* Specifies the setting name and type to toggle when this tile is
* clicked.
*
* @param name a setting name
* @param type the type of setting, one of:
* <ul>
* <li>{@link #TYPE_GLOBAL}
* <li>{@link #TYPE_SECURE}
* <li>{@link #TYPE_SYSTEM}
* </ul>
*/
public void setUri(String name, int type) {
mName = name;
mType = type;
setClickable(mName != null);
}
/**
* @return the refresh callback for this tile
*/
public QuickSettingsModel.BasicRefreshCallback getRefreshCallback() {
return mRefreshCallback;
}
}
}

View File

@@ -29,6 +29,7 @@ import android.database.ContentObserver;
import android.graphics.drawable.Drawable;
import android.hardware.display.WifiDisplayStatus;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings;
@@ -90,6 +91,19 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
static class BrightnessState extends State {
boolean autoBrightness;
}
static class InversionState extends State {
boolean toggled;
int type;
}
static class ContrastState extends State {
boolean toggled;
float contrast;
float brightness;
}
static class ColorSpaceState extends State {
boolean toggled;
int type;
}
public static class BluetoothState extends State {
boolean connected = false;
String stateContentDescription;
@@ -198,12 +212,96 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
}
}
/** ContentObserver to watch display inversion */
private class DisplayInversionObserver extends ContentObserver {
public DisplayInversionObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
onInversionChanged();
}
public void startObserving() {
final ContentResolver cr = mContext.getContentResolver();
cr.unregisterContentObserver(this);
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_QUICK_SETTING_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION),
false, this, mUserTracker.getCurrentUserId());
}
}
/** ContentObserver to watch display contrast */
private class DisplayContrastObserver extends ContentObserver {
public DisplayContrastObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
onContrastChanged();
}
public void startObserving() {
final ContentResolver cr = mContext.getContentResolver();
cr.unregisterContentObserver(this);
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_QUICK_SETTING_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS),
false, this, mUserTracker.getCurrentUserId());
}
}
/** ContentObserver to watch display color space adjustment */
private class DisplayColorSpaceObserver extends ContentObserver {
public DisplayColorSpaceObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
onColorSpaceChanged();
}
public void startObserving() {
final ContentResolver cr = mContext.getContentResolver();
cr.unregisterContentObserver(this);
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_QUICK_SETTING_ENABLED),
false, this, mUserTracker.getCurrentUserId());
cr.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER),
false, this, mUserTracker.getCurrentUserId());
}
}
private final Context mContext;
private final Handler mHandler;
private final CurrentUserTracker mUserTracker;
private final NextAlarmObserver mNextAlarmObserver;
private final BugreportObserver mBugreportObserver;
private final BrightnessObserver mBrightnessObserver;
private final DisplayInversionObserver mInversionObserver;
private final DisplayContrastObserver mContrastObserver;
private final DisplayColorSpaceObserver mColorSpaceObserver;
private final boolean mHasMobileData;
@@ -259,6 +357,18 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
private RefreshCallback mBrightnessCallback;
private BrightnessState mBrightnessState = new BrightnessState();
private QuickSettingsTileView mInversionTile;
private RefreshCallback mInversionCallback;
private InversionState mInversionState = new InversionState();
private QuickSettingsTileView mContrastTile;
private RefreshCallback mContrastCallback;
private ContrastState mContrastState = new ContrastState();
private QuickSettingsTileView mColorSpaceTile;
private RefreshCallback mColorSpaceCallback;
private ColorSpaceState mColorSpaceState = new ColorSpaceState();
private QuickSettingsTileView mBugreportTile;
private RefreshCallback mBugreportCallback;
private State mBugreportState = new State();
@@ -277,10 +387,17 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mContext = context;
mHandler = new Handler();
mUserTracker = new CurrentUserTracker(mContext) {
@Override
public void onUserSwitched(int newUserId) {
mBrightnessObserver.startObserving();
mInversionObserver.startObserving();
mContrastObserver.startObserving();
mColorSpaceObserver.startObserving();
onRotationLockChanged();
onBrightnessLevelChanged();
onInversionChanged();
onContrastChanged();
onColorSpaceChanged();
onNextAlarmChanged();
onBugreportChanged();
}
@@ -292,6 +409,12 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
mBugreportObserver.startObserving();
mBrightnessObserver = new BrightnessObserver(mHandler);
mBrightnessObserver.startObserving();
mInversionObserver = new DisplayInversionObserver(mHandler);
mInversionObserver.startObserving();
mContrastObserver = new DisplayContrastObserver(mHandler);
mContrastObserver.startObserving();
mColorSpaceObserver = new DisplayColorSpaceObserver(mHandler);
mColorSpaceObserver.startObserving();
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -762,6 +885,90 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
onBrightnessLevelChanged();
}
// Color inversion
void addInversionTile(QuickSettingsTileView view, RefreshCallback cb) {
mInversionTile = view;
mInversionCallback = cb;
onInversionChanged();
}
public void onInversionChanged() {
final Resources res = mContext.getResources();
final ContentResolver cr = mContext.getContentResolver();
final int currentUserId = mUserTracker.getCurrentUserId();
final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_QUICK_SETTING_ENABLED, 0,
currentUserId) == 1;
final boolean enabled = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, currentUserId) == 1;
final int type = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION, 0, currentUserId);
mInversionState.enabled = quickSettingEnabled;
mInversionState.toggled = enabled;
mInversionState.type = type;
// TODO: Add real icon assets.
mInversionState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
: R.drawable.ic_qs_bluetooth_off;
mInversionState.label = res.getString(R.string.quick_settings_inversion_label);
mInversionCallback.refreshView(mInversionTile, mInversionState);
}
// Contrast enhancement
void addContrastTile(QuickSettingsTileView view, RefreshCallback cb) {
mContrastTile = view;
mContrastCallback = cb;
onContrastChanged();
}
public void onContrastChanged() {
final Resources res = mContext.getResources();
final ContentResolver cr = mContext.getContentResolver();
final int currentUserId = mUserTracker.getCurrentUserId();
final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_QUICK_SETTING_ENABLED, 0,
currentUserId) == 1;
final boolean enabled = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST_ENABLED, 0, currentUserId) == 1;
final float contrast = Settings.Secure.getFloatForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_CONTRAST, 1, currentUserId);
final float brightness = Settings.Secure.getFloatForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_BRIGHTNESS, 0, currentUserId);
mContrastState.enabled = quickSettingEnabled;
mContrastState.toggled = enabled;
mContrastState.contrast = contrast;
mContrastState.brightness = brightness;
// TODO: Add real icon assets.
mContrastState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
: R.drawable.ic_qs_bluetooth_off;
mContrastState.label = res.getString(R.string.quick_settings_contrast_label);
mContrastCallback.refreshView(mContrastTile, mContrastState);
}
// Color space adjustment
void addColorSpaceTile(QuickSettingsTileView view, RefreshCallback cb) {
mColorSpaceTile = view;
mColorSpaceCallback = cb;
onColorSpaceChanged();
}
public void onColorSpaceChanged() {
final Resources res = mContext.getResources();
final ContentResolver cr = mContext.getContentResolver();
final int currentUserId = mUserTracker.getCurrentUserId();
final boolean quickSettingEnabled = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_QUICK_SETTING_ENABLED, 0,
currentUserId) == 1;
final boolean enabled = Settings.Secure.getIntForUser(cr,
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, currentUserId) == 1;
final int type = Settings.Secure.getIntForUser(
cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 0, currentUserId);
mColorSpaceState.enabled = quickSettingEnabled;
mColorSpaceState.toggled = enabled;
mColorSpaceState.type = type;
// TODO: Add real icon assets.
mColorSpaceState.iconId = enabled ? R.drawable.ic_qs_bluetooth_on
: R.drawable.ic_qs_bluetooth_off;
mColorSpaceState.label = res.getString(R.string.quick_settings_color_space_label);
mColorSpaceCallback.refreshView(mColorSpaceTile, mColorSpaceState);
}
// SSL CA Cert warning.
public void addSslCaCertWarningTile(QuickSettingsTileView view, RefreshCallback cb) {
mSslCaCertWarningTile = view;