Loading packages/SystemUI/res/values/strings.xml +6 −0 Original line number Diff line number Diff line Loading @@ -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. --> Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +135 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; } } } packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +207 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); } Loading @@ -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); Loading Loading @@ -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; Loading Loading
packages/SystemUI/res/values/strings.xml +6 −0 Original line number Diff line number Diff line Loading @@ -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. --> Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +135 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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; } } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +207 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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(); } Loading @@ -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); Loading Loading @@ -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; Loading