From 1e28f4110f4005a38a1c55836b87df706e8e3229 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Wed, 1 Dec 2010 09:33:36 -0800 Subject: [PATCH] Brightness and volume controls in the quick settings panel. Change-Id: I2d2394c84a2783772f16dbeb88664381917e0ead --- .../scrubber_control_disabled_holo.png | Bin 0 -> 1471 bytes .../status_bar_settings_view.xml | 12 ++ .../res/layout/status_bar_toggle_slider.xml | 52 +++++++ .../policy/BrightnessController.java | 97 ++++++++++++ .../statusbar/policy/ToggleSlider.java | 144 ++++++++++++++++++ .../statusbar/policy/VolumeController.java | 68 +++++++++ .../statusbar/tablet/SettingsView.java | 9 ++ 7 files changed, 382 insertions(+) create mode 100644 packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png create mode 100644 packages/SystemUI/res/layout/status_bar_toggle_slider.xml create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java diff --git a/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png b/packages/SystemUI/res/drawable-mdpi/scrubber_control_disabled_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8adc97a4c33df9ae8e3aed6536ea4032bf97a76 GIT binary patch literal 1471 zcmZ{kYdq5n7{~v%r7?5K$gSE?OUO1B&812bLmA}g=oS~zpn_`V(B0#B3ToU^mo7s-CR|;1a z^9IvwA*f>ZRzZC>@=qd&(zTh~Uong~znORA!q{SF(yfIXX=Be6qGEf&W5!UhEc776{7p%d{dha~u6_J*v-+!g+D=vM=nfYtMG@Ih%2Jd*!xq8$S(N z%!1vCl{HQ@xJWH{d_g!Yo~vIdt3k)NHHCLZSf|QdTPBMMd7+%X4_ruVbob?dTz9Os zf_{vp%T1oITvKCy5>C4K?wg1cZJuI`=iw2yC4TZ1>);U!w zHIj~qHb^7u`q3>|0>=`U=WSs_T7P}>>wB76{{eB>q9EIFXkbn2{zkgwaOAr0UWd9?4Xr6J^r-tgiPf z=&A%~7jcSCdXdirAXRm0!c06EO=}LCg;@<|T;U^#)mdXUS!eZbq&|OTe^x)yRzo@` zO73kkJDtbV;5zVm?7^p(Ni55R7QN#+z<$G3l)P;KGM$9PmU8-wYS&^T?Zf%FIe||D zeA2%9ea>#(444^Q7#mx+NeNzuzlU*0X1t<=Ah9W&{_VMmJMJ3Gj8;Fk&`Obi(e#t< zwv?kuw$ZJrM~L{Aqq)F->?nS!RYT}t;FrWj?yCs>7LAP^n+1BRLME!F?ZM1ckatOr|MvizajwU$ITW%tA4|xS;B1-0@4KQ>SrFHnh{V#F~Z+1C4LqFT6^<7%#y+kr{cY|l{AmEpoGF8~$BwTWx25g^3K02O(}crmcE!i7Oc ze<^bB?=iJQ;_ONgQ#RA6Wlvyht~=GiK^`IAcS}o;=;2GAIEY~XQB`k!H9BA0Vx%0W z5O)BI=`|qUpQ>Fj;PqW|#5ZR~7f&qj2DpKQQ@wO_$6&}*%yW>O%>f~j=9K|s3`yy$ z9MR-!5!XhzmY)mNK=-%D&r=bvZ-+}0puMoYuBqcQK0eYPnuDQ-QEyf#%Bt&qign%1 zDeZ91JLRzR{;=F!){+4IUfuG6?9GMtM7*f;U2|TyugSzZrtC?4Z1z{iy$$hgWT(!v zl-uQjteX?AEbN8V?`uK&;E$2^+X^mKet|H1A;G@$!r}L?l@)FosVvef$__nr?rgR` zl9fwHQtkB#ei|FwVsmuCbLkj&7*me%Xz&qcZPy<-Bvue5Q4I!sRWD}qug@@fM+G@1 zgWj5lU-&*)i!#W1IVUgqZ#yIGjz!S?Bj|(^VRQ)q90rRq#9|GNF|Jq~0c%RY8yjNG z2pEh}!qUipgfpSElYue+FZhg;10{m`uL~}rff3REVRXQn78*cDQqK4X(Vgl3w3u`4 RbPLH6K(V8e?%Vh!{0nH)e + @@ -114,6 +120,12 @@ style="@style/StatusBarPanelSettingsIcon" android:src="@drawable/ic_sysbar_sound_on" /> + diff --git a/packages/SystemUI/res/layout/status_bar_toggle_slider.xml b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml new file mode 100644 index 0000000000000..c5ad047c6e9ac --- /dev/null +++ b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml @@ -0,0 +1,52 @@ + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java new file mode 100644 index 0000000000000..c11d04e3468a3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.ContentResolver; +import android.content.Context; +import android.os.IPowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.provider.Settings; +import android.provider.Settings.SettingNotFoundException; +import android.util.Slog; +import android.view.IWindowManager; +import android.widget.CompoundButton; + +public class BrightnessController implements ToggleSlider.Listener { + private static final String TAG = "StatusBar.BrightnessController"; + + // Backlight range is from 0 - 255. Need to make sure that user + // doesn't set the backlight to 0 and get stuck + private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM + 10; + private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON; + + private Context mContext; + private ToggleSlider mControl; + private IPowerManager mPower; + + public BrightnessController(Context context, ToggleSlider control) { + mContext = context; + mControl = control; + + boolean automaticAvailable = context.getResources().getBoolean( + com.android.internal.R.bool.config_automatic_brightness_available); + mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); + + if (automaticAvailable) { + int automatic; + try { + automatic = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_MODE); + } catch (SettingNotFoundException snfe) { + automatic = 0; + } + control.setChecked(automatic != 0); + } else { + control.setChecked(false); + //control.hideToggle(); + } + + int value; + try { + value = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS); + } catch (SettingNotFoundException ex) { + value = MAXIMUM_BACKLIGHT; + } + + control.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT); + control.setValue(value - MINIMUM_BACKLIGHT); + + control.setOnChangedListener(this); + } + + public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, int value) { + setMode(automatic ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC + : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + if (!automatic) { + setBrightness(value + MINIMUM_BACKLIGHT); + } + } + + private void setMode(int mode) { + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_MODE, mode); + } + + private void setBrightness(int brightness) { + try { + mPower.setBacklightBrightness(brightness); + } catch (RemoteException ex) { + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java new file mode 100644 index 0000000000000..f4994d51e166d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ToggleSlider.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Slog; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.RelativeLayout; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.ToggleButton; + +import com.android.systemui.R; + +public class ToggleSlider extends RelativeLayout + implements CompoundButton.OnCheckedChangeListener, SeekBar.OnSeekBarChangeListener { + private static final String TAG = "StatusBar.ToggleSlider"; + + public interface Listener { + public void onChanged(ToggleSlider v, boolean tracking, boolean checked, int value); + } + + public static class Slider extends SeekBar { + public Slider(Context context) { + this(context, null); + } + + public Slider(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public Slider(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + } + + private Listener mListener; + private boolean mTracking; + + private ToggleButton mToggle; + private SeekBar mSlider; + private TextView mLabel; + + public ToggleSlider(Context context) { + this(context, null); + } + + public ToggleSlider(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ToggleSlider(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + View.inflate(context, R.layout.status_bar_toggle_slider, this); + + mToggle = (ToggleButton)findViewById(R.id.toggle); + mToggle.setOnCheckedChangeListener(this); + mToggle.setTextOn("hi"); + mToggle.setTextOff("hi"); + + mSlider = (SeekBar)findViewById(R.id.slider); + mSlider.setOnSeekBarChangeListener(this); + + /* + mLabel = (TextView)findViewById(R.id.label); + mLabel.setText("yo"); + */ + } + + public void onCheckedChanged(CompoundButton toggle, boolean checked) { + Drawable thumb; + final Resources res = getContext().getResources(); + if (checked) { + thumb = res.getDrawable(R.drawable.scrubber_control_disabled_holo); + } else { + thumb = res.getDrawable(com.android.internal.R.drawable.scrubber_control_holo); + } + mSlider.setThumb(thumb); + + if (mListener != null) { + mListener.onChanged(this, mTracking, checked, mSlider.getProgress()); + } + } + + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (mListener != null) { + mListener.onChanged(this, mTracking, mToggle.isChecked(), progress); + } + } + + public void onStartTrackingTouch(SeekBar seekBar) { + mTracking = true; + if (mListener != null) { + mListener.onChanged(this, mTracking, mToggle.isChecked(), mSlider.getProgress()); + } + mToggle.setChecked(false); + } + + public void onStopTrackingTouch(SeekBar seekBar) { + mTracking = false; + if (mListener != null) { + mListener.onChanged(this, mTracking, mToggle.isChecked(), mSlider.getProgress()); + } + } + + public void setOnChangedListener(Listener l) { + mListener = l; + } + + public void setChecked(boolean checked) { + mToggle.setChecked(checked); + } + + public boolean isChecked() { + return mToggle.isChecked(); + } + + public void setMax(int max) { + mSlider.setMax(max); + } + + public void setValue(int value) { + mSlider.setProgress(value); + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java new file mode 100644 index 0000000000000..c9da01aa73d28 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/VolumeController.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.ContentResolver; +import android.content.Context; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.media.AudioManager; +import android.provider.Settings; +import android.util.Slog; +import android.view.IWindowManager; +import android.widget.CompoundButton; + +public class VolumeController implements ToggleSlider.Listener { + private static final String TAG = "StatusBar.VolumeController"; + private static final int STREAM = AudioManager.STREAM_NOTIFICATION; + + private Context mContext; + private ToggleSlider mControl; + private AudioManager mAudioManager; + + private boolean mMute; + private int mVolume; + + public VolumeController(Context context, ToggleSlider control) { + mContext = context; + mControl = control; + mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); + + mMute = mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_NORMAL; + mVolume = mAudioManager.getStreamVolume(STREAM); + 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) { + if (!tracking) { + if (mute) { + boolean vibeInSilent = (1 == Settings.System.getInt(mContext.getContentResolver(), + Settings.System.VIBRATE_IN_SILENT, 1)); + mAudioManager.setRingerMode( + vibeInSilent ? AudioManager.RINGER_MODE_VIBRATE + : AudioManager.RINGER_MODE_SILENT); + } else { + mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); + mAudioManager.setStreamVolume(STREAM, level, AudioManager.FLAG_PLAY_SOUND); + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java index d1f8dd0b39c7a..0491baa681464 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/SettingsView.java @@ -31,13 +31,18 @@ import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.statusbar.policy.AirplaneModeController; import com.android.systemui.statusbar.policy.AutoRotateController; +import com.android.systemui.statusbar.policy.BrightnessController; import com.android.systemui.statusbar.policy.DoNotDisturbController; +import com.android.systemui.statusbar.policy.ToggleSlider; +import com.android.systemui.statusbar.policy.VolumeController; public class SettingsView extends LinearLayout implements View.OnClickListener { static final String TAG = "SettingsView"; AirplaneModeController mAirplane; AutoRotateController mRotate; + VolumeController mVolume; + BrightnessController mBrightness; DoNotDisturbController mDoNotDisturb; public SettingsView(Context context, AttributeSet attrs) { @@ -59,6 +64,10 @@ public class SettingsView extends LinearLayout implements View.OnClickListener { findViewById(R.id.network).setOnClickListener(this); mRotate = new AutoRotateController(context, (CompoundButton)findViewById(R.id.rotate_checkbox)); + mVolume = new VolumeController(context, + (ToggleSlider)findViewById(R.id.volume)); + mBrightness = new BrightnessController(context, + (ToggleSlider)findViewById(R.id.brightness)); mDoNotDisturb = new DoNotDisturbController(context, (CompoundButton)findViewById(R.id.do_not_disturb_checkbox)); findViewById(R.id.settings).setOnClickListener(this);