1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN; 2078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 2178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport com.android.internal.telephony.TelephonyIntents; 2278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 23e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasaniimport android.app.Dialog; 2478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.content.BroadcastReceiver; 25424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasaniimport android.content.ContentResolver; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 2778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.content.Intent; 2878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.content.IntentFilter; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.media.AudioManager; 30f63942e6863125ec24360aff3752e39c73372233Amith Yamasaniimport android.media.AudioSystem; 31424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasaniimport android.net.Uri; 3278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.os.Handler; 3378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.os.Looper; 3478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.os.Message; 35e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasaniimport android.os.Parcel; 36e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasaniimport android.os.Parcelable; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.VolumePreference; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 39f63942e6863125ec24360aff3752e39c73372233Amith Yamasaniimport android.provider.Settings.System; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.AttributeSet; 4178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.util.Log; 42424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasaniimport android.view.KeyEvent; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 4478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.view.View.OnClickListener; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.CheckBox; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.CompoundButton; 4778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Millerimport android.widget.ImageView; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SeekBar; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Special preference type that allows configuration of both the ring volume and 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * notification volume. 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 55dfb654367d4b65fb45089cd8d7d0905e3cd68ae3Amith Yamasanipublic class RingerVolumePreference extends VolumePreference { 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG = "RingerVolumePreference"; 5778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private static final int MSG_RINGER_MODE_CHANGED = 101; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 59992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani private SeekBarVolumizer [] mSeekBarVolumizer; 6078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 6178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller // These arrays must all match in length and order 62992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani private static final int[] SEEKBAR_ID = new int[] { 63992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani R.id.media_volume_seekbar, 64823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani R.id.ringer_volume_seekbar, 65823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani R.id.notification_volume_seekbar, 66992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani R.id.alarm_volume_seekbar 67992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani }; 6860133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani 69992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani private static final int[] SEEKBAR_TYPE = new int[] { 70992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani AudioManager.STREAM_MUSIC, 71823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani AudioManager.STREAM_RING, 72823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani AudioManager.STREAM_NOTIFICATION, 73992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani AudioManager.STREAM_ALARM 74992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani }; 7578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 7678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private static final int[] CHECKBOX_VIEW_ID = new int[] { 77823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani R.id.media_mute_button, 78823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani R.id.ringer_mute_button, 7978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller R.id.notification_mute_button, 8078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller R.id.alarm_mute_button 8178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller }; 8278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 8331a0a340b3280704a064d744c16472790cc76ecbJaewan Kim private static final int[] SEEKBAR_SECTION_ID = new int[] { 8431a0a340b3280704a064d744c16472790cc76ecbJaewan Kim R.id.media_section, 8531a0a340b3280704a064d744c16472790cc76ecbJaewan Kim R.id.ringer_section, 8631a0a340b3280704a064d744c16472790cc76ecbJaewan Kim R.id.notification_section, 8731a0a340b3280704a064d744c16472790cc76ecbJaewan Kim R.id.alarm_section 8831a0a340b3280704a064d744c16472790cc76ecbJaewan Kim }; 8931a0a340b3280704a064d744c16472790cc76ecbJaewan Kim 9078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private static final int[] SEEKBAR_MUTED_RES_ID = new int[] { 9178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller com.android.internal.R.drawable.ic_audio_vol_mute, 92823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani com.android.internal.R.drawable.ic_audio_ring_notif_mute, 93823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani com.android.internal.R.drawable.ic_audio_notification_mute, 9478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller com.android.internal.R.drawable.ic_audio_alarm_mute 9578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller }; 9678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 9778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private static final int[] SEEKBAR_UNMUTED_RES_ID = new int[] { 9878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller com.android.internal.R.drawable.ic_audio_vol, 99823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani com.android.internal.R.drawable.ic_audio_ring_notif, 100823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani com.android.internal.R.drawable.ic_audio_notification, 10178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller com.android.internal.R.drawable.ic_audio_alarm 10278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller }; 10378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 10478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private ImageView[] mCheckBoxes = new ImageView[SEEKBAR_MUTED_RES_ID.length]; 10578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private SeekBar[] mSeekBars = new SeekBar[SEEKBAR_ID.length]; 10678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 10778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private Handler mHandler = new Handler() { 10878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller public void handleMessage(Message msg) { 10978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller updateSlidersAndMutedStates(); 11078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 11178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller }; 11278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 11378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller @Override 11478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller public void createActionButtons() { 11578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller setPositiveButtonText(android.R.string.ok); 11678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller setNegativeButtonText(null); 11778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 11878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 11978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private void updateSlidersAndMutedStates() { 12078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller for (int i = 0; i < SEEKBAR_TYPE.length; i++) { 12178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller int streamType = SEEKBAR_TYPE[i]; 12278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller boolean muted = mAudioManager.isStreamMute(streamType); 12378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 12478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller if (mCheckBoxes[i] != null) { 1252c2bf97dd4ec9bbf2f7d6da985c9ee87868169e3Eric Laurent if (((streamType == AudioManager.STREAM_RING) || 1262c2bf97dd4ec9bbf2f7d6da985c9ee87868169e3Eric Laurent (streamType == AudioManager.STREAM_NOTIFICATION)) && 1279d078e984e5b73c499050dff3443622a4b595524Eric Laurent (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) { 128ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani mCheckBoxes[i].setImageResource( 129ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani com.android.internal.R.drawable.ic_audio_ring_notif_vibrate); 130ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani } else { 131ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani mCheckBoxes[i].setImageResource( 132ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani muted ? SEEKBAR_MUTED_RES_ID[i] : SEEKBAR_UNMUTED_RES_ID[i]); 133ca7205842aa2e0c6c3df027c32acce63dcc35e3bAmith Yamasani } 13478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 13578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller if (mSeekBars[i] != null) { 1369d078e984e5b73c499050dff3443622a4b595524Eric Laurent final int volume = mAudioManager.getStreamVolume(streamType); 13778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mSeekBars[i].setProgress(volume); 1389d078e984e5b73c499050dff3443622a4b595524Eric Laurent if (streamType != mAudioManager.getMasterStreamType() && muted) { 1399d078e984e5b73c499050dff3443622a4b595524Eric Laurent mSeekBars[i].setEnabled(false); 1409d078e984e5b73c499050dff3443622a4b595524Eric Laurent } else { 1419d078e984e5b73c499050dff3443622a4b595524Eric Laurent mSeekBars[i].setEnabled(true); 1429d078e984e5b73c499050dff3443622a4b595524Eric Laurent } 14378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 14478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 14578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 14678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 14778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private BroadcastReceiver mRingModeChangedReceiver; 14878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller private AudioManager mAudioManager; 14978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 150992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani //private SeekBarVolumizer mNotificationSeekBarVolumizer; 15178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller //private TextView mNotificationVolumeTitle; 152992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public RingerVolumePreference(Context context, AttributeSet attrs) { 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super(context, attrs); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // The always visible seekbar is for ring volume 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setStreamType(AudioManager.STREAM_RING); 158992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setDialogLayoutResource(R.layout.preference_dialog_ringervolume); 16078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller //setDialogIcon(R.drawable.ic_settings_sound); 161dcea680f2a0b6bc17b0ba332a29cb3a40cf389caAmith Yamasani 162992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mSeekBarVolumizer = new SeekBarVolumizer[SEEKBAR_ID.length]; 16378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 16478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onBindDialogView(View view) { 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onBindDialogView(view); 170431fa27d646a471189f39f4457f3b042665ae9d4Amith Yamasani 171992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 172992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani SeekBar seekBar = (SeekBar) view.findViewById(SEEKBAR_ID[i]); 17378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mSeekBars[i] = seekBar; 174424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani if (SEEKBAR_TYPE[i] == AudioManager.STREAM_MUSIC) { 175424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani mSeekBarVolumizer[i] = new SeekBarVolumizer(getContext(), seekBar, 176424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani SEEKBAR_TYPE[i], getMediaVolumeUri(getContext())); 177424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani } else { 178424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani mSeekBarVolumizer[i] = new SeekBarVolumizer(getContext(), seekBar, 179424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani SEEKBAR_TYPE[i]); 180424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani } 181992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 182992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani 18378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller // Register callbacks for mute/unmute buttons 18478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller for (int i = 0; i < mCheckBoxes.length; i++) { 18578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller ImageView checkbox = (ImageView) view.findViewById(CHECKBOX_VIEW_ID[i]); 18678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mCheckBoxes[i] = checkbox; 18778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 18878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 18978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller // Load initial states from AudioManager 19078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller updateSlidersAndMutedStates(); 19178713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller 19278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller // Listen for updates from AudioManager 19378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller if (mRingModeChangedReceiver == null) { 19478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller final IntentFilter filter = new IntentFilter(); 19578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); 19678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mRingModeChangedReceiver = new BroadcastReceiver() { 19778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller public void onReceive(Context context, Intent intent) { 19878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller final String action = intent.getAction(); 19978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { 2007f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani mHandler.sendMessage(mHandler.obtainMessage(MSG_RINGER_MODE_CHANGED, intent 2017f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani .getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1), 0)); 20278713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 20378713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 20478713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller }; 20578713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller getContext().registerReceiver(mRingModeChangedReceiver, filter); 20678713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 207823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani 20831a0a340b3280704a064d744c16472790cc76ecbJaewan Kim boolean useMasterVolume = getContext().getResources(). 20931a0a340b3280704a064d744c16472790cc76ecbJaewan Kim getBoolean(com.android.internal.R.bool.config_useMasterVolume); 21031a0a340b3280704a064d744c16472790cc76ecbJaewan Kim if (useMasterVolume) { 21131a0a340b3280704a064d744c16472790cc76ecbJaewan Kim // If config_useMasterVolume is true, all streams are treated as STREAM_MASTER. 21231a0a340b3280704a064d744c16472790cc76ecbJaewan Kim // So hide all except a stream. 21331a0a340b3280704a064d744c16472790cc76ecbJaewan Kim int id; 21431a0a340b3280704a064d744c16472790cc76ecbJaewan Kim if (Utils.isVoiceCapable(getContext())) { 21531a0a340b3280704a064d744c16472790cc76ecbJaewan Kim id = R.id.ringer_section; 21631a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } else { 21731a0a340b3280704a064d744c16472790cc76ecbJaewan Kim id = R.id.media_section; 21831a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } 21931a0a340b3280704a064d744c16472790cc76ecbJaewan Kim for (int i = 0; i < SEEKBAR_SECTION_ID.length; i++) { 22031a0a340b3280704a064d744c16472790cc76ecbJaewan Kim if (SEEKBAR_SECTION_ID[i] != id) { 22131a0a340b3280704a064d744c16472790cc76ecbJaewan Kim view.findViewById(SEEKBAR_SECTION_ID[i]).setVisibility(View.GONE); 22231a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } 22331a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } 224823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } else { 22531a0a340b3280704a064d744c16472790cc76ecbJaewan Kim // Disable either ringer+notifications or notifications 22631a0a340b3280704a064d744c16472790cc76ecbJaewan Kim int id; 22731a0a340b3280704a064d744c16472790cc76ecbJaewan Kim if (!Utils.isVoiceCapable(getContext())) { 22831a0a340b3280704a064d744c16472790cc76ecbJaewan Kim id = R.id.ringer_section; 22931a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } else { 23031a0a340b3280704a064d744c16472790cc76ecbJaewan Kim id = R.id.notification_section; 23131a0a340b3280704a064d744c16472790cc76ecbJaewan Kim } 23231a0a340b3280704a064d744c16472790cc76ecbJaewan Kim View hideSection = view.findViewById(id); 23331a0a340b3280704a064d744c16472790cc76ecbJaewan Kim hideSection.setVisibility(View.GONE); 234823bf0c155fb481476cc3f755bdc12943ed5d4b8Amith Yamasani } 23560133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani } 23660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani 237424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani private Uri getMediaVolumeUri(Context context) { 238424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" 239424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani + context.getPackageName() 240424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani + "/" + R.raw.media_volume); 241424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani } 242424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onDialogClosed(boolean positiveResult) { 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onDialogClosed(positiveResult); 24660133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani 247992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (!positiveResult) { 248992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (SeekBarVolumizer vol : mSeekBarVolumizer) { 249992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (vol != null) vol.revertVolume(); 250992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 25160133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani } 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project cleanup(); 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onActivityStop() { 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onActivityStop(); 2587f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani 2597f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani for (SeekBarVolumizer vol : mSeekBarVolumizer) { 2607f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani if (vol != null) vol.stopSample(); 2617f0d760ea5350ae87c3db8cc94d6a25ce64aaebbAmith Yamasani } 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 26360133dd03657354e06fa3aa7e6041862f8ce20a8Amith Yamasani 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 265424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani public boolean onKey(View v, int keyCode, KeyEvent event) { 266424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani boolean isdown = (event.getAction() == KeyEvent.ACTION_DOWN); 267424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani switch (keyCode) { 268424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani case KeyEvent.KEYCODE_VOLUME_DOWN: 269424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani case KeyEvent.KEYCODE_VOLUME_UP: 270424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani case KeyEvent.KEYCODE_VOLUME_MUTE: 271697d9384f1028daa0a357f43b88f4e305b9fc601Amith Yamasani return true; 272424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani default: 273424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani return false; 274424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani } 275424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani } 276424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani 277424953d55b1cf790aa9ace5774469ead3d49181eAmith Yamasani @Override 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onSampleStarting(SeekBarVolumizer volumizer) { 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onSampleStarting(volumizer); 280992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (SeekBarVolumizer vol : mSeekBarVolumizer) { 28188ea1164afb52327b4ae2d5c695700b12fff1134Amith Yamasani if (vol != null && vol != volumizer) vol.stopSample(); 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void cleanup() { 286992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 287992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (mSeekBarVolumizer[i] != null) { 288992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani Dialog dialog = getDialog(); 289992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (dialog != null && dialog.isShowing()) { 290992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani // Stopped while dialog was showing, revert changes 291992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mSeekBarVolumizer[i].revertVolume(); 292992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 293992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mSeekBarVolumizer[i].stop(); 294992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mSeekBarVolumizer[i] = null; 295e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 29778713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller if (mRingModeChangedReceiver != null) { 29878713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller getContext().unregisterReceiver(mRingModeChangedReceiver); 29978713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller mRingModeChangedReceiver = null; 30078713aed9e23fbf2f89edae87b2ba9e1387104ffJim Miller } 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 302e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 303e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani @Override 304e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani protected Parcelable onSaveInstanceState() { 305e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani final Parcelable superState = super.onSaveInstanceState(); 306e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani if (isPersistent()) { 307e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani // No need to save instance state since it's persistent 308e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return superState; 309e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 310e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 311e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani final SavedState myState = new SavedState(superState); 312992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani VolumeStore[] volumeStore = myState.getVolumeStore(SEEKBAR_ID.length); 313992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 314992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani SeekBarVolumizer vol = mSeekBarVolumizer[i]; 315992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (vol != null) { 316992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani vol.onSaveInstanceState(volumeStore[i]); 317992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 318e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 319e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return myState; 320e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 321e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 322e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani @Override 323e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani protected void onRestoreInstanceState(Parcelable state) { 324e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani if (state == null || !state.getClass().equals(SavedState.class)) { 325e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani // Didn't save state for us in onSaveInstanceState 326e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani super.onRestoreInstanceState(state); 327e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return; 328e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 329e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 330e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani SavedState myState = (SavedState) state; 331e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani super.onRestoreInstanceState(myState.getSuperState()); 332992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani VolumeStore[] volumeStore = myState.getVolumeStore(SEEKBAR_ID.length); 333992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 334992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani SeekBarVolumizer vol = mSeekBarVolumizer[i]; 335992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (vol != null) { 336992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani vol.onRestoreInstanceState(volumeStore[i]); 337992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 338e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 339e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 340e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 341e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani private static class SavedState extends BaseSavedState { 342992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani VolumeStore [] mVolumeStore; 343e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 344e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public SavedState(Parcel source) { 345e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani super(source); 346992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore = new VolumeStore[SEEKBAR_ID.length]; 347992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 348992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore[i] = new VolumeStore(); 349992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore[i].volume = source.readInt(); 350992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore[i].originalVolume = source.readInt(); 351992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 352e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 353e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 354e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani @Override 355e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public void writeToParcel(Parcel dest, int flags) { 356e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani super.writeToParcel(dest, flags); 357992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < SEEKBAR_ID.length; i++) { 358992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani dest.writeInt(mVolumeStore[i].volume); 359992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani dest.writeInt(mVolumeStore[i].originalVolume); 360992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 361e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 362e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 363992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani VolumeStore[] getVolumeStore(int count) { 364992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani if (mVolumeStore == null || mVolumeStore.length != count) { 365992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore = new VolumeStore[count]; 366992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani for (int i = 0; i < count; i++) { 367992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani mVolumeStore[i] = new VolumeStore(); 368992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 369992f10240d0bfd78bb99855fe23ec7a1b61a2551Amith Yamasani } 370e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return mVolumeStore; 371e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 372e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 373e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public SavedState(Parcelable superState) { 374e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani super(superState); 375e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 376e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 377e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public static final Parcelable.Creator<SavedState> CREATOR = 378e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani new Parcelable.Creator<SavedState>() { 379e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public SavedState createFromParcel(Parcel in) { 380e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return new SavedState(in); 381e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 382e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani 383e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani public SavedState[] newArray(int size) { 384e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani return new SavedState[size]; 385e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 386e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani }; 387e13209ab423932a739b66eac7d8bd4abd6e52287Amith Yamasani } 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 389