OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / packages / apps / Settings / src / com / android / settings / BrightnessPreference.java
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.settings;
18
19 import android.content.Context;
20 import android.os.RemoteException;
21 import android.os.IPowerManager;
22 import android.os.ServiceManager;
23 import android.preference.SeekBarPreference;
24 import android.provider.Settings;
25 import android.provider.Settings.SettingNotFoundException;
26 import android.util.AttributeSet;
27 import android.util.Log;
28 import android.view.View;
29 import android.widget.CheckBox;
30 import android.widget.CompoundButton;
31 import android.widget.SeekBar;
32
33 import java.util.Map;
34
35 public class BrightnessPreference extends SeekBarPreference implements
36         SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {
37
38     private SeekBar mSeekBar;
39     private CheckBox mCheckBox;
40     
41     private int mOldBrightness;
42     private int mOldAutomatic;
43
44     private boolean mAutomaticAvailable;
45     
46     // Backlight range is from 0 - 255. Need to make sure that user
47     // doesn't set the backlight to 0 and get stuck
48     private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10;
49     private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
50
51     public BrightnessPreference(Context context, AttributeSet attrs) {
52         super(context, attrs);
53
54         mAutomaticAvailable = context.getResources().getBoolean(
55                 com.android.internal.R.bool.config_automatic_brightness_available);
56
57         setDialogLayoutResource(R.layout.preference_dialog_brightness);
58         setDialogIcon(R.drawable.ic_settings_display);
59     }
60
61     @Override
62     protected void onBindDialogView(View view) {
63         super.onBindDialogView(view);
64
65         mSeekBar = getSeekBar(view);
66         mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);
67         try {
68             mOldBrightness = Settings.System.getInt(getContext().getContentResolver(), 
69                 Settings.System.SCREEN_BRIGHTNESS);
70         } catch (SettingNotFoundException snfe) {
71             mOldBrightness = MAXIMUM_BACKLIGHT;
72         }
73         mSeekBar.setProgress(mOldBrightness - MINIMUM_BACKLIGHT);
74
75         mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);
76         if (mAutomaticAvailable) {
77             mCheckBox.setOnCheckedChangeListener(this);
78             try {
79                 mOldAutomatic = Settings.System.getInt(getContext().getContentResolver(),
80                         Settings.System.SCREEN_BRIGHTNESS_MODE);
81             } catch (SettingNotFoundException snfe) {
82                 mOldAutomatic = 0;
83             }
84             mCheckBox.setChecked(mOldAutomatic != 0);
85         } else {
86             mCheckBox.setVisibility(View.GONE);
87         }
88         mSeekBar.setOnSeekBarChangeListener(this);
89     }
90
91     public void onProgressChanged(SeekBar seekBar, int progress,
92             boolean fromTouch) {
93         setBrightness(progress + MINIMUM_BACKLIGHT);
94     }
95
96     public void onStartTrackingTouch(SeekBar seekBar) {
97         // NA
98     }
99
100     public void onStopTrackingTouch(SeekBar seekBar) {
101         // NA
102     }
103
104     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
105         setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
106                 : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
107         if (!isChecked) {
108             setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
109         }
110     }
111
112     @Override
113     protected void onDialogClosed(boolean positiveResult) {
114         super.onDialogClosed(positiveResult);
115         
116         if (positiveResult) {
117             Settings.System.putInt(getContext().getContentResolver(), 
118                     Settings.System.SCREEN_BRIGHTNESS,
119                     mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
120         } else {
121             if (mAutomaticAvailable) {
122                 setMode(mOldAutomatic);
123             }
124             if (!mAutomaticAvailable || mOldAutomatic == 0) {
125                 setBrightness(mOldBrightness);
126             }
127         }
128     }
129     
130     private void setBrightness(int brightness) {
131         try {
132             IPowerManager power = IPowerManager.Stub.asInterface(
133                     ServiceManager.getService("power"));
134             if (power != null) {
135                 power.setBacklightBrightness(brightness);
136             }
137         } catch (RemoteException doe) {
138             
139         }        
140     }
141
142     private void setMode(int mode) {
143         if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
144             mSeekBar.setVisibility(View.GONE);
145         } else {
146             mSeekBar.setVisibility(View.VISIBLE);
147         }
148         Settings.System.putInt(getContext().getContentResolver(),
149                 Settings.System.SCREEN_BRIGHTNESS_MODE, mode);
150     }
151 }
152