Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48f37ec8 authored by John Spurlock's avatar John Spurlock
Browse files

Keep quick settings brightness icon/dialog level in sync.

We now listen for brightness changes and update the icon appropriately.
Note there are still only two icon states in QS (auto-on and auto-off).

We also listen for user switches, since the brightness setting is per-user.

The manual brightness level is now kept in sync with level set in Settings.

This change is tightly scoped to brightness only.  Any other
QS bugs should be triaged separately.

Bug:7283805
Change-Id: Ibaf8fe94e98f65cc02efe7fcddf4f38370fdb09f
parent 20de160c
Loading
Loading
Loading
Loading
+47 −20
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.statusbar.phone;
package com.android.systemui.statusbar.phone;


import android.app.ActivityManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
import android.bluetooth.BluetoothAdapter.BluetoothStateChangeCallback;
import android.content.BroadcastReceiver;
import android.content.BroadcastReceiver;
@@ -42,6 +43,7 @@ import com.android.internal.view.RotationPolicy;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.BrightnessController.BrightnessStateChangeCallback;
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.LocationController.LocationGpsStateChangeCallback;
import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
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 */
    /** ContentObserver to determine the next alarm */
    private class NextAlarmObserver extends ContentObserver {
    private class NextAlarmObserver extends ContentObserver {
        public NextAlarmObserver(Handler handler) {
        public NextAlarmObserver(Handler handler) {
@@ -141,10 +133,36 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
                    Settings.Secure.getUriFor(Settings.Secure.BUGREPORT_IN_POWER_MENU), false, this);
                    Settings.Secure.getUriFor(Settings.Secure.BUGREPORT_IN_POWER_MENU), false, this);
        }
        }
    }
    }
    private Context mContext;

    private Handler mHandler;
    /** ContentObserver to watch brightness **/
    private NextAlarmObserver mNextAlarmObserver;
    private class BrightnessObserver extends ContentObserver {
    private BugreportObserver mBugreportObserver;
        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 QuickSettingsTileView mUserTile;
    private RefreshCallback mUserCallback;
    private RefreshCallback mUserCallback;
@@ -209,17 +227,24 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
    public QuickSettingsModel(Context context) {
    public QuickSettingsModel(Context context) {
        mContext = context;
        mContext = context;
        mHandler = new Handler();
        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 = new NextAlarmObserver(mHandler);
        mNextAlarmObserver.startObserving();
        mNextAlarmObserver.startObserving();
        mBugreportObserver = new BugreportObserver(mHandler);
        mBugreportObserver = new BugreportObserver(mHandler);
        mBugreportObserver.startObserving();
        mBugreportObserver.startObserving();
        mBrightnessObserver = new BrightnessObserver(mHandler);
        mBrightnessObserver.startObserving();


        IntentFilter alarmIntentFilter = new IntentFilter();
        IntentFilter alarmIntentFilter = new IntentFilter();
        alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED);
        alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED);
        context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter);
        context.registerReceiver(mAlarmIntentReceiver, alarmIntentFilter);

        IntentFilter userSwitchedFilter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
        context.registerReceiver(mUserSwitchedReceiver, userSwitchedFilter);
    }
    }


    void updateResources() {
    void updateResources() {
@@ -625,9 +650,10 @@ class QuickSettingsModel implements BluetoothStateChangeCallback,
    @Override
    @Override
    public void onBrightnessLevelChanged() {
    public void onBrightnessLevelChanged() {
        Resources r = mContext.getResources();
        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,
                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
                mUserTracker.getCurrentUserId());
        mBrightnessState.autoBrightness =
        mBrightnessState.autoBrightness =
                (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
                (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
        mBrightnessState.iconId = mBrightnessState.autoBrightness
        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
    // User switch: need to update visuals of all tiles known to have per-user state
    void onUserSwitched(Intent intent) {
    void onUserSwitched() {
        mBrightnessObserver.startObserving();
        onRotationLockChanged();
        onRotationLockChanged();
        onBrightnessLevelChanged();
        onBrightnessLevelChanged();
        onNextAlarmChanged();
        onNextAlarmChanged();
+29 −19
Original line number Original line Diff line number Diff line
@@ -39,9 +39,11 @@ public class BrightnessController implements ToggleSlider.Listener {
    private final int mMinimumBacklight;
    private final int mMinimumBacklight;
    private final int mMaximumBacklight;
    private final int mMaximumBacklight;


    private Context mContext;
    private final Context mContext;
    private ToggleSlider mControl;
    private final ToggleSlider mControl;
    private IPowerManager mPower;
    private final boolean mAutomaticAvailable;
    private final IPowerManager mPower;
    private final CurrentUserTracker mUserTracker;


    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
            new ArrayList<BrightnessStateChangeCallback>();
            new ArrayList<BrightnessStateChangeCallback>();
@@ -53,20 +55,31 @@ public class BrightnessController implements ToggleSlider.Listener {
    public BrightnessController(Context context, ToggleSlider control) {
    public BrightnessController(Context context, ToggleSlider control) {
        mContext = context;
        mContext = context;
        mControl = control;
        mControl = control;
        mUserTracker = new CurrentUserTracker(mContext);


        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();


        boolean automaticAvailable = context.getResources().getBoolean(
        mAutomaticAvailable = context.getResources().getBoolean(
                com.android.internal.R.bool.config_automatic_brightness_available);
                com.android.internal.R.bool.config_automatic_brightness_available);
        mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
        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;
            int automatic;
            try {
            try {
                automatic = Settings.System.getInt(mContext.getContentResolver(),
                automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
                        Settings.System.SCREEN_BRIGHTNESS_MODE);
                        Settings.System.SCREEN_BRIGHTNESS_MODE,
                        mUserTracker.getCurrentUserId());
            } catch (SettingNotFoundException snfe) {
            } catch (SettingNotFoundException snfe) {
                automatic = 0;
                automatic = 0;
            }
            }
@@ -78,20 +91,15 @@ public class BrightnessController implements ToggleSlider.Listener {
        
        
        int value;
        int value;
        try {
        try {
            value = Settings.System.getInt(mContext.getContentResolver(), 
            value = Settings.System.getIntForUser(mContext.getContentResolver(),
                    Settings.System.SCREEN_BRIGHTNESS);
                    Settings.System.SCREEN_BRIGHTNESS,
                    mUserTracker.getCurrentUserId());
        } catch (SettingNotFoundException ex) {
        } catch (SettingNotFoundException ex) {
            value = mMaximumBacklight;
            value = mMaximumBacklight;
        }
        }


        control.setMax(mMaximumBacklight - mMinimumBacklight);
        control.setMax(mMaximumBacklight - mMinimumBacklight);
        control.setValue(value - 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) {
    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
@@ -103,8 +111,9 @@ public class BrightnessController implements ToggleSlider.Listener {
            if (!tracking) {
            if (!tracking) {
                AsyncTask.execute(new Runnable() {
                AsyncTask.execute(new Runnable() {
                        public void run() {
                        public void run() {
                            Settings.System.putInt(mContext.getContentResolver(), 
                            Settings.System.putIntForUser(mContext.getContentResolver(),
                                    Settings.System.SCREEN_BRIGHTNESS, val);
                                    Settings.System.SCREEN_BRIGHTNESS, val,
                                    mUserTracker.getCurrentUserId());
                        }
                        }
                    });
                    });
            }
            }
@@ -116,8 +125,9 @@ public class BrightnessController implements ToggleSlider.Listener {
    }
    }


    private void setMode(int mode) {
    private void setMode(int mode) {
        Settings.System.putInt(mContext.getContentResolver(),
        Settings.System.putIntForUser(mContext.getContentResolver(),
                Settings.System.SCREEN_BRIGHTNESS_MODE, mode);
                Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
                mUserTracker.getCurrentUserId());
    }
    }
    
    
    private void setBrightness(int brightness) {
    private void setBrightness(int brightness) {
+29 −0
Original line number Original line Diff line number Diff line
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);
        }
    }
}
+9 −0
Original line number Original line Diff line number Diff line
@@ -36,6 +36,7 @@ public class ToggleSlider extends RelativeLayout
    private static final String TAG = "StatusBar.ToggleSlider";
    private static final String TAG = "StatusBar.ToggleSlider";


    public interface Listener {
    public interface Listener {
        public void onInit(ToggleSlider v);
        public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value);
        public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value);
    }
    }


@@ -75,6 +76,14 @@ public class ToggleSlider extends RelativeLayout
        a.recycle();
        a.recycle();
    }
    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mListener != null) {
            mListener.onInit(this);
        }
    }

    public void onCheckedChanged(CompoundButton toggle, boolean checked) {
    public void onCheckedChanged(CompoundButton toggle, boolean checked) {
        Drawable thumb;
        Drawable thumb;
        Drawable slider;
        Drawable slider;
+6 −2
Original line number Original line Diff line number Diff line
@@ -51,11 +51,15 @@ public class VolumeController implements ToggleSlider.Listener {


        mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
        mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL;
        mVolume = mAudioManager.getStreamVolume(STREAM);
        mVolume = mAudioManager.getStreamVolume(STREAM);

        control.setOnChangedListener(this);
    }

    @Override
    public void onInit(ToggleSlider control) {
        control.setMax(mAudioManager.getStreamMaxVolume(STREAM));
        control.setMax(mAudioManager.getStreamMaxVolume(STREAM));
        control.setValue(mVolume);
        control.setValue(mVolume);
        control.setChecked(mMute);
        control.setChecked(mMute);

        control.setOnChangedListener(this);
    }
    }


    public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) {
    public void onChanged(ToggleSlider view, boolean tracking, boolean mute, int level) {