10087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright/*
20087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Copyright (C) 2013 The Android Open Source Project
30087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
40087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Licensed under the Apache License, Version 2.0 (the "License");
50087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * you may not use this file except in compliance with the License.
60087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * You may obtain a copy of the License at
70087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
80087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *      http://www.apache.org/licenses/LICENSE-2.0
90087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright *
100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * Unless required by applicable law or agreed to in writing, software
110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * distributed under the License is distributed on an "AS IS" BASIS,
120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * See the License for the specific language governing permissions and
140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright * limitations under the License.
150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright */
160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpackage com.android.systemui.settings;
180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
190087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.ContentResolver;
200087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.content.Context;
210087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.database.ContentObserver;
220087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.net.Uri;
230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.AsyncTask;
240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.Handler;
250087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.IPowerManager;
260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.PowerManager;
270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.RemoteException;
280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.ServiceManager;
290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.os.UserHandle;
300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.provider.Settings;
310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport android.widget.ImageView;
320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightimport java.util.ArrayList;
340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wrightpublic class BrightnessController implements ToggleSlider.Listener {
360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private static final String TAG = "StatusBar.BrightnessController";
376d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock    private static final boolean SHOW_AUTOMATIC_ICON = false;
380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
39daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    /**
40daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     * {@link android.provider.Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ} uses the range [-1, 1].
41daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     * Using this factor, it is converted to [0, BRIGHTNESS_ADJ_RESOLUTION] for the SeekBar.
42daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos     */
43daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    private static final float BRIGHTNESS_ADJ_RESOLUTION = 100;
44daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMinimumBacklight;
460087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final int mMaximumBacklight;
470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final Context mContext;
490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ImageView mIcon;
500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final ToggleSlider mControl;
510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final boolean mAutomaticAvailable;
520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final IPowerManager mPower;
530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final CurrentUserTracker mUserTracker;
540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final Handler mHandler;
550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private final BrightnessObserver mBrightnessObserver;
560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            new ArrayList<BrightnessStateChangeCallback>();
590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
60daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    private boolean mAutomatic;
613f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi    private boolean mListening;
62b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos    private boolean mExternalChange;
63daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public interface BrightnessStateChangeCallback {
650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onBrightnessLevelChanged();
660087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
680087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** ContentObserver to watch brightness **/
690087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private class BrightnessObserver extends ContentObserver {
700087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_MODE_URI =
720087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE);
730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        private final Uri BRIGHTNESS_URI =
740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);
75daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        private final Uri BRIGHTNESS_ADJ_URI =
76daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ);
770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public BrightnessObserver(Handler handler) {
790087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            super(handler);
800087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
810087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
820087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
830087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange) {
840087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            onChange(selfChange, null);
850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        @Override
880087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void onChange(boolean selfChange, Uri uri) {
890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            if (selfChange) return;
90b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos            try {
91b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                mExternalChange = true;
92b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                if (BRIGHTNESS_MODE_URI.equals(uri)) {
93b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateMode();
94b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateSlider();
95b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) {
96b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateSlider();
97b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                } else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) {
98b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateSlider();
99b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                } else {
100b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateMode();
101b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    updateSlider();
102b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                }
103b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
104b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                    cb.onBrightnessLevelChanged();
105b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                }
106b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos            } finally {
107b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos                mExternalChange = false;
1080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
1090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void startObserving() {
1120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1140087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1150087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_MODE_URI,
1160087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
1170087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.registerContentObserver(
1180087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    BRIGHTNESS_URI,
1190087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    false, this, UserHandle.USER_ALL);
120daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            cr.registerContentObserver(
121daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    BRIGHTNESS_ADJ_URI,
122daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    false, this, UserHandle.USER_ALL);
1230087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1240087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1250087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        public void stopObserving() {
1260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final ContentResolver cr = mContext.getContentResolver();
1270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cr.unregisterContentObserver(this);
1280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
1290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
1330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mContext = context;
1340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mIcon = icon;
1350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mControl = control;
1360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mHandler = new Handler();
1370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mUserTracker = new CurrentUserTracker(mContext) {
1380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            @Override
1390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            public void onUserSwitched(int newUserId) {
1400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                updateMode();
1410087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                updateSlider();
1420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
1430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        };
1440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mBrightnessObserver = new BrightnessObserver(mHandler);
1450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1460087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
1470087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
1480087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
1490087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1500087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mAutomaticAvailable = context.getResources().getBoolean(
1510087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                com.android.internal.R.bool.config_automatic_brightness_available);
1520087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
1530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1550087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
1560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mChangeCallbacks.add(cb);
1570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
1600087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        return mChangeCallbacks.remove(cb);
1610087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1620087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1630087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    @Override
1640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void onInit(ToggleSlider control) {
1650087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        // Do nothing
1660087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1670087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
168f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    public void registerCallbacks() {
1693f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (mListening) {
1703f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
1713f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
1725a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
173f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        mBrightnessObserver.startObserving();
174f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        mUserTracker.startTracking();
175f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi
1765a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        // Update the slider and mode before attaching the listener so we don't
1775a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        // receive the onChanged notifications for the initial values.
178f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        updateMode();
179f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        updateSlider();
180f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi
181f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        mControl.setOnChangedListener(this);
1825a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = true;
183f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi    }
184f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi
1850087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** Unregister all call backs, both to and from the controller */
1860087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void unregisterCallbacks() {
1873f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        if (!mListening) {
1883f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi            return;
1893f48f46d7e9073edbc4d8613a6dd4d68a37a11b6Jorim Jaggi        }
1905a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette
1910087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mBrightnessObserver.stopObserving();
1920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        mUserTracker.stopTracking();
193f056e35a34a8846a1d7c7a3fd55b9d69b559a590Jorim Jaggi        mControl.setOnChangedListener(null);
1945a399490c2185ebfd458b1a1d9394f3a68c5fde2Alan Viverette        mListening = false;
1950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
1960087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
1975fd872e8ea44ffcd4fce1d1196736dca4f270508Adrian Roos    @Override
1980087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
199daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        updateIcon(mAutomatic);
200b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos        if (mExternalChange) return;
201b7ebbded5f1512c5747acc0f06a42399d7710728Adrian Roos
202daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        if (!mAutomatic) {
2030087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            final int val = value + mMinimumBacklight;
2040087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            setBrightness(val);
2050087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            if (!tracking) {
2060087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                AsyncTask.execute(new Runnable() {
2070087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                        public void run() {
2080087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                            Settings.System.putIntForUser(mContext.getContentResolver(),
2090087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                                    Settings.System.SCREEN_BRIGHTNESS, val,
2100087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                                    UserHandle.USER_CURRENT);
2110087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                        }
2120087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    });
2130087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            }
214daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        } else {
215daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            final float adj = value / (BRIGHTNESS_ADJ_RESOLUTION / 2f) - 1;
2166e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos            setBrightnessAdj(adj);
217daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            if (!tracking) {
218daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                AsyncTask.execute(new Runnable() {
219daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    public void run() {
220daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                        Settings.System.putFloatForUser(mContext.getContentResolver(),
221daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                                Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, adj,
222daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                                UserHandle.USER_CURRENT);
223daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    }
224daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                });
225daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            }
2260087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2270087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2280087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
2290087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            cb.onBrightnessLevelChanged();
2300087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2310087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2320087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2330087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setMode(int mode) {
2340087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        Settings.System.putIntForUser(mContext.getContentResolver(),
2350087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
2360087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                mUserTracker.getCurrentUserId());
2370087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2380087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2390087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void setBrightness(int brightness) {
2400087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        try {
2410087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
2420087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        } catch (RemoteException ex) {
2430087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2440087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2450087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2466e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos    private void setBrightnessAdj(float adj) {
247daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        try {
248daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mPower.setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(adj);
249daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        } catch (RemoteException ex) {
250daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        }
251daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos    }
252daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos
2530087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void updateIcon(boolean automatic) {
2540087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        if (mIcon != null) {
2556d20526adfd18f7347674d61fe784d456b1b7b61John Spurlock            mIcon.setImageResource(automatic && SHOW_AUTOMATIC_ICON ?
2560087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
2570087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
2580087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2590087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2600087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2610087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** Fetch the brightness mode from the system settings and update the icon */
2620087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void updateMode() {
2630087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        if (mAutomaticAvailable) {
2640087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            int automatic;
265daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
266daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    Settings.System.SCREEN_BRIGHTNESS_MODE,
267daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
268daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    UserHandle.USER_CURRENT);
2696e2d465b9c8fdf66957264a07c16729ff22fda22Adrian Roos            mAutomatic = automatic != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL;
270daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            updateIcon(mAutomatic);
2710087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        } else {
2720087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            mControl.setChecked(false);
2730087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            updateIcon(false /*automatic*/);
2740087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2750087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2760087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2770087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    /** Fetch the brightness from the system settings and update the slider */
2780087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    private void updateSlider() {
279daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        if (mAutomatic) {
280daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            float value = Settings.System.getFloatForUser(mContext.getContentResolver(),
281daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0,
282daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    UserHandle.USER_CURRENT);
283daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mControl.setMax((int) BRIGHTNESS_ADJ_RESOLUTION);
284daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mControl.setValue((int) ((value + 1) * BRIGHTNESS_ADJ_RESOLUTION / 2f));
285daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos        } else {
286daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            int value;
2870087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright            value = Settings.System.getIntForUser(mContext.getContentResolver(),
288daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos                    Settings.System.SCREEN_BRIGHTNESS, mMaximumBacklight,
2890087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright                    UserHandle.USER_CURRENT);
290daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mControl.setMax(mMaximumBacklight - mMinimumBacklight);
291daf7d410fc97647f2b3ab4254f73c09c923018deAdrian Roos            mControl.setValue(value - mMinimumBacklight);
2920087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright        }
2930087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright    }
2940087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright
2950087a14d4b4bcfe57c6f6e36c70eec966088d7bbMichael Wright}
296