diff options
5 files changed, 120 insertions, 41 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index 0e5361735b37..8e891f611536 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.app.ActivityManager; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback; import android.content.BroadcastReceiver; @@ -42,6 +43,7 @@ import com.android.internal.view.RotationPolicy; import com.android.systemui.R; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import com.android.systemui.statusbar.policy.BrightnessController.BrightnessStateChangeCallback; +import com.android.systemui.statusbar.policy.CurrentUserTracker; import com.android.systemui.statusbar.policy.LocationController.LocationGpsStateChangeCallback; import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; @@ -98,16 +100,6 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, } }; - /** Broadcast receiver to act on user switches to update visuals of per-user state */ - private BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { - onUserSwitched(intent); - } - } - }; - /** ContentObserver to determine the next alarm */ private class NextAlarmObserver extends ContentObserver { public NextAlarmObserver(Handler handler) { @@ -141,10 +133,36 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, Settings.Secure.getUriFor(Settings.Secure.BUGREPORT_IN_POWER_MENU), false, this); } } - private Context mContext; - private Handler mHandler; - private NextAlarmObserver mNextAlarmObserver; - private BugreportObserver mBugreportObserver; + + /** ContentObserver to watch brightness **/ + private class BrightnessObserver extends ContentObserver { + public BrightnessObserver(Handler handler) { + super(handler); + } + + @Override + public void onChange(boolean selfChange) { + onBrightnessLevelChanged(); + } + + public void startObserving() { + final ContentResolver cr = mContext.getContentResolver(); + cr.unregisterContentObserver(this); + cr.registerContentObserver( + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), + false, this, mUserTracker.getCurrentUserId()); + cr.registerContentObserver( + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS), + 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 QuickSettingsTileView mUserTile; private RefreshCallback mUserCallback; @@ -209,17 +227,24 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, public QuickSettingsModel(Context context) { mContext = context; mHandler = new Handler(); + mUserTracker = new CurrentUserTracker(mContext) { + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + onUserSwitched(); + } + }; + mNextAlarmObserver = new NextAlarmObserver(mHandler); mNextAlarmObserver.startObserving(); mBugreportObserver = new BugreportObserver(mHandler); mBugreportObserver.startObserving(); + mBrightnessObserver = new BrightnessObserver(mHandler); + mBrightnessObserver.startObserving(); IntentFilter alarmIntentFilter = new IntentFilter(); alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED); context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter); - - IntentFilter userSwitchedFilter = new IntentFilter(Intent.ACTION_USER_SWITCHED); - context.registerReceiver(mUserSwitchedReceiver, userSwitchedFilter); } void updateResources() { @@ -625,9 +650,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, @Override public void onBrightnessLevelChanged() { Resources r = mContext.getResources(); - int mode = Settings.System.getInt(mContext.getContentResolver(), + int mode = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, - Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, + mUserTracker.getCurrentUserId()); mBrightnessState.autoBrightness = (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); mBrightnessState.iconId = mBrightnessState.autoBrightness @@ -641,7 +667,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, } // User switch: need to update visuals of all tiles known to have per-user state - void onUserSwitched(Intent intent) { + void onUserSwitched() { + mBrightnessObserver.startObserving(); onRotationLockChanged(); onBrightnessLevelChanged(); onNextAlarmChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java index bb59420641db..00095037145b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java @@ -39,9 +39,11 @@ public class BrightnessController implements ToggleSlider.Listener { private final int mMinimumBacklight; private final int mMaximumBacklight; - private Context mContext; - private ToggleSlider mControl; - private IPowerManager mPower; + private final Context mContext; + private final ToggleSlider mControl; + private final boolean mAutomaticAvailable; + private final IPowerManager mPower; + private final CurrentUserTracker mUserTracker; private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks = new ArrayList<BrightnessStateChangeCallback>(); @@ -53,20 +55,31 @@ public class BrightnessController implements ToggleSlider.Listener { public BrightnessController(Context context, ToggleSlider control) { mContext = context; mControl = control; + mUserTracker = new CurrentUserTracker(mContext); PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mMinimumBacklight = pm.getMinimumScreenBrightnessSetting(); mMaximumBacklight = pm.getMaximumScreenBrightnessSetting(); - boolean automaticAvailable = context.getResources().getBoolean( + mAutomaticAvailable = context.getResources().getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); - if (automaticAvailable) { + control.setOnChangedListener(this); + } + + public void addStateChangedCallback(BrightnessStateChangeCallback cb) { + mChangeCallbacks.add(cb); + } + + @Override + public void onInit(ToggleSlider control) { + if (mAutomaticAvailable) { int automatic; try { - automatic = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS_MODE); + automatic = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_MODE, + mUserTracker.getCurrentUserId()); } catch (SettingNotFoundException snfe) { automatic = 0; } @@ -78,20 +91,15 @@ public class BrightnessController implements ToggleSlider.Listener { int value; try { - value = Settings.System.getInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS); + value = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, + mUserTracker.getCurrentUserId()); } catch (SettingNotFoundException ex) { value = mMaximumBacklight; } control.setMax(mMaximumBacklight - mMinimumBacklight); control.setValue(value - mMinimumBacklight); - - control.setOnChangedListener(this); - } - - public void addStateChangedCallback(BrightnessStateChangeCallback cb) { - mChangeCallbacks.add(cb); } public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { @@ -103,8 +111,9 @@ public class BrightnessController implements ToggleSlider.Listener { if (!tracking) { AsyncTask.execute(new Runnable() { public void run() { - Settings.System.putInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS, val); + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, val, + mUserTracker.getCurrentUserId()); } }); } @@ -116,8 +125,9 @@ public class BrightnessController implements ToggleSlider.Listener { } private void setMode(int mode) { - Settings.System.putInt(mContext.getContentResolver(), - Settings.System.SCREEN_BRIGHTNESS_MODE, mode); + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_MODE, mode, + mUserTracker.getCurrentUserId()); } private void setBrightness(int brightness) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java new file mode 100644 index 000000000000..7a2f25a8d818 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CurrentUserTracker.java @@ -0,0 +1,29 @@ +package com.android.systemui.statusbar.policy; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + +public class CurrentUserTracker extends BroadcastReceiver { + + private int mCurrentUserId; + + public CurrentUserTracker(Context context) { + IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED); + context.registerReceiver(this, filter); + mCurrentUserId = ActivityManager.getCurrentUser(); + } + + public int getCurrentUserId() { + return mCurrentUserId; + } + + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { + mCurrentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java index fe2ec69bcaf3..39f8fccab1f2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java @@ -36,6 +36,7 @@ public class ToggleSlider extends RelativeLayout private static final String TAG = "StatusBar.ToggleSlider"; public interface Listener { + public void onInit(ToggleSlider v); public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value); } @@ -75,6 +76,14 @@ public class ToggleSlider extends RelativeLayout a.recycle(); } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mListener != null) { + mListener.onInit(this); + } + } + public void onCheckedChanged(CompoundButton toggle, boolean checked) { Drawable thumb; Drawable slider; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java index 43cb85ea3a56..6fee4323dc05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java @@ -51,11 +51,15 @@ public class VolumeController implements ToggleSlider.Listener { mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; mVolume = mAudioManager.getStreamVolume(STREAM); + + control.setOnChangedListener(this); + } + + @Override + public void onInit(ToggleSlider control) { control.setMax(mAudioManager.getStreamMaxVolume(STREAM)); control.setValue(mVolume); control.setChecked(mMute); - - control.setOnChangedListener(this); } public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) { |