11e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato/*
21e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Copyright (C) 2010 The Android Open Source Project
31e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
41e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * you may not use this file except in compliance with the License.
61e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * You may obtain a copy of the License at
71e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
81e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato *
101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * Unless required by applicable law or agreed to in writing, software
111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * See the License for the specific language governing permissions and
141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato * limitations under the License.
151e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato */
161e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
171e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopackage com.android.systemui.statusbar.policy;
181e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
191e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.ContentResolver;
201e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.content.Context;
21c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onoratoimport android.os.AsyncTask;
221e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.IPowerManager;
239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brownimport android.os.PowerManager;
241e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.RemoteException;
251e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.os.ServiceManager;
261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.provider.Settings;
271e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.provider.Settings.SettingNotFoundException;
281e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.util.Slog;
291e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.view.IWindowManager;
301e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratoimport android.widget.CompoundButton;
31f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlockimport android.widget.ImageView;
321e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
335f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chungimport com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
345f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
355f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chungimport java.util.ArrayList;
365f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onoratopublic class BrightnessController implements ToggleSlider.Listener {
381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private static final String TAG = "StatusBar.BrightnessController";
391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
409630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final int mMinimumBacklight;
419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown    private final int mMaximumBacklight;
421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
4348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    private final Context mContext;
44f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock    private final ImageView mIcon;
4548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    private final ToggleSlider mControl;
4648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    private final boolean mAutomaticAvailable;
4748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    private final IPowerManager mPower;
4848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    private final CurrentUserTracker mUserTracker;
491e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
505f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
515f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung            new ArrayList<BrightnessStateChangeCallback>();
525f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
535f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung    public interface BrightnessStateChangeCallback {
545f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung        public void onBrightnessLevelChanged();
555f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung    }
565f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
57f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock    public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
581e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mContext = context;
59f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock        mIcon = icon;
601e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mControl = control;
6148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        mUserTracker = new CurrentUserTracker(mContext);
621e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
639630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
649630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
659630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
669630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown
6748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        mAutomaticAvailable = context.getResources().getBoolean(
681e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                com.android.internal.R.bool.config_automatic_brightness_available);
691e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));
701e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
7148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        control.setOnChangedListener(this);
7248f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    }
7348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock
7448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
7548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        mChangeCallbacks.add(cb);
7648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    }
7748f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock
7848f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    @Override
7948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock    public void onInit(ToggleSlider control) {
8048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        if (mAutomaticAvailable) {
811e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            int automatic;
821e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            try {
8348f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                automatic = Settings.System.getIntForUser(mContext.getContentResolver(),
8448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                        Settings.System.SCREEN_BRIGHTNESS_MODE,
8548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                        mUserTracker.getCurrentUserId());
861e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            } catch (SettingNotFoundException snfe) {
871e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                automatic = 0;
881e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            }
891e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            control.setChecked(automatic != 0);
90f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock            updateIcon(automatic != 0);
911e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        } else {
921e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            control.setChecked(false);
93f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock            updateIcon(false /*automatic*/);
941e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato            //control.hideToggle();
951e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        }
961e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
971e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        int value;
981e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        try {
9948f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock            value = Settings.System.getIntForUser(mContext.getContentResolver(),
10048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                    Settings.System.SCREEN_BRIGHTNESS,
10148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                    mUserTracker.getCurrentUserId());
1021e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        } catch (SettingNotFoundException ex) {
1039630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            value = mMaximumBacklight;
1041e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        }
1051e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1069630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        control.setMax(mMaximumBacklight - mMinimumBacklight);
1079630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown        control.setValue(value - mMinimumBacklight);
1085f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung    }
1095f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
1101e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) {
1111e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
1121e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato                : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
113f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock        updateIcon(automatic);
1141e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        if (!automatic) {
1159630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            final int val = value + mMinimumBacklight;
116c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato            setBrightness(val);
117772f5600ef720945b98054246982fd3b711830a9Joe Onorato            if (!tracking) {
118c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                AsyncTask.execute(new Runnable() {
119c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                        public void run() {
12048f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                            Settings.System.putIntForUser(mContext.getContentResolver(),
12148f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                                    Settings.System.SCREEN_BRIGHTNESS, val,
12248f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                                    mUserTracker.getCurrentUserId());
123c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                        }
124c07d7c139bafab41024d6abc2e39ded880c23e6dJoe Onorato                    });
125772f5600ef720945b98054246982fd3b711830a9Joe Onorato            }
1261e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        }
1275f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung
1285f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
1295f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung            cb.onBrightnessLevelChanged();
1305f623011db42fc7bd6fb8e57becd7a8eeb23a915Winson Chung        }
1311e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1321e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1331e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private void setMode(int mode) {
13448f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock        Settings.System.putIntForUser(mContext.getContentResolver(),
13548f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                Settings.System.SCREEN_BRIGHTNESS_MODE, mode,
13648f37ec8c98a6281dbf067d1740a3bc4953ed26fJohn Spurlock                mUserTracker.getCurrentUserId());
1371e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
1381e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato
1391e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    private void setBrightness(int brightness) {
1401e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        try {
1419630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown            mPower.setTemporaryScreenBrightnessSettingOverride(brightness);
1421e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        } catch (RemoteException ex) {
1431e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato        }
1441e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato    }
145f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock
146f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock    private void updateIcon(boolean automatic) {
147f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock        if (mIcon != null) {
148f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock            mIcon.setImageResource(automatic ?
149f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock                    com.android.systemui.R.drawable.ic_qs_brightness_auto_on :
150f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock                    com.android.systemui.R.drawable.ic_qs_brightness_auto_off);
151f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock        }
152f5bc42dbf881403820e6fcebbb2aa428849547dcJohn Spurlock    }
1531e28f4110f4005a38a1c55836b87df706e8e3229Joe Onorato}
154