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