14a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock/*
24a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Copyright (C) 2014 The Android Open Source Project
34a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock *
44a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
54a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * you may not use this file except in compliance with the License.
64a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * You may obtain a copy of the License at
74a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock *
84a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
94a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock *
104a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * Unless required by applicable law or agreed to in writing, software
114a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
124a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * See the License for the specific language governing permissions and
144a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock * limitations under the License.
154a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock */
164a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
174a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockpackage com.android.settings.notification;
184a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
198c0a4238655990094fe444ac8f7b182963497030Julia Reynoldsimport android.app.Activity;
20fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.app.NotificationManager;
21fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.content.BroadcastReceiver;
22fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.content.ComponentName;
234a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.content.ContentResolver;
244a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.content.Context;
25fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.content.Intent;
26fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.content.IntentFilter;
274a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.content.pm.PackageManager;
28fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport android.content.pm.ServiceInfo;
294a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.database.ContentObserver;
304e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.database.Cursor;
314e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.database.sqlite.SQLiteException;
3281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlockimport android.media.AudioManager;
334a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.media.RingtoneManager;
3481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlockimport android.net.Uri;
3581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlockimport android.os.AsyncTask;
364a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.os.Bundle;
374a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.os.Handler;
3881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlockimport android.os.Looper;
394a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.os.Message;
40682a916836f5e108289a70579f671f9d4a880993Sudheer Shankaimport android.os.UserHandle;
4172965ad53b4c935e115e49fe12189781954a4077Jason Monkimport android.os.UserManager;
42cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandlerimport android.os.Vibrator;
4381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlockimport android.preference.SeekBarVolumizer;
444e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlockimport android.provider.MediaStore;
458aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandlerimport android.provider.OpenableColumns;
4657c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport android.provider.SearchIndexableResource;
474a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport android.provider.Settings;
4839b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
4939b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceChangeListener;
5039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.TwoStatePreference;
51c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynoldsimport android.text.TextUtils;
5207f7efba67a5f261fca31890a1b60f23021325f5John Spurlockimport android.util.Log;
53c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds
543e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.internal.logging.MetricsProto.MetricsEvent;
554a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.R;
5639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settings.RingtonePreference;
574a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlockimport com.android.settings.SettingsPreferenceFragment;
5857c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport com.android.settings.Utils;
598c0a4238655990094fe444ac8f7b182963497030Julia Reynoldsimport com.android.settings.dashboard.SummaryLoader;
6057c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport com.android.settings.search.BaseSearchIndexProvider;
6157c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport com.android.settings.search.Indexable;
62682a916836f5e108289a70579f671f9d4a880993Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
63682a916836f5e108289a70579f671f9d4a880993Sudheer Shankaimport com.android.settingslib.RestrictedPreference;
644a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
658c0a4238655990094fe444ac8f7b182963497030Julia Reynoldsimport java.text.NumberFormat;
6657c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport java.util.ArrayList;
6757c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport java.util.Arrays;
6857c713d1d92f64a558115e5aff212ebc54a19151John Spurlockimport java.util.List;
69fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlockimport java.util.Objects;
7057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock
71682a916836f5e108289a70579f671f9d4a880993Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
72682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka
738c0a4238655990094fe444ac8f7b182963497030Julia Reynoldspublic class SoundSettings extends SettingsPreferenceFragment implements Indexable {
748c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    private static final String TAG = "SoundSettings";
754a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
7681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_MEDIA_VOLUME = "media_volume";
7781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_ALARM_VOLUME = "alarm_volume";
7881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_RING_VOLUME = "ring_volume";
7957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock    private static final String KEY_NOTIFICATION_VOLUME = "notification_volume";
8081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_PHONE_RINGTONE = "ringtone";
8181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_NOTIFICATION_RINGTONE = "notification_ringtone";
82193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds    private static final String KEY_ALARM_RINGTONE = "alarm_ringtone";
8381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final String KEY_VIBRATE_WHEN_RINGING = "vibrate_when_ringing";
84cfe4aedc47c513be8b1a9168f5dcfc9017e52a97John Spurlock    private static final String KEY_WIFI_DISPLAY = "wifi_display";
8572965ad53b4c935e115e49fe12189781954a4077Jason Monk    private static final String KEY_ZEN_MODE = "zen_mode";
863b7936fb43f881de248458f720920399458408eeJulia Reynolds    private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
8772965ad53b4c935e115e49fe12189781954a4077Jason Monk
88c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds    private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
89c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds    private static final int REQUEST_CODE = 200;
90c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds
9172965ad53b4c935e115e49fe12189781954a4077Jason Monk    private static final String[] RESTRICTED_KEYS = {
9272965ad53b4c935e115e49fe12189781954a4077Jason Monk        KEY_MEDIA_VOLUME,
9372965ad53b4c935e115e49fe12189781954a4077Jason Monk        KEY_ALARM_VOLUME,
9472965ad53b4c935e115e49fe12189781954a4077Jason Monk        KEY_RING_VOLUME,
9526cc9fcf66a448a546043970fb16333f0a8112ecJason Monk        KEY_NOTIFICATION_VOLUME,
9672965ad53b4c935e115e49fe12189781954a4077Jason Monk        KEY_ZEN_MODE,
9772965ad53b4c935e115e49fe12189781954a4077Jason Monk    };
984a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
9981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private static final int SAMPLE_CUTOFF = 2000;  // manually cap sample playback at 2 seconds
1004a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
10181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final VolumePreferenceCallback mVolumeCallback = new VolumePreferenceCallback();
10281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final H mHandler = new H();
10381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final SettingsObserver mSettingsObserver = new SettingsObserver();
104fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    private final Receiver mReceiver = new Receiver();
10504b2e7957d17098d6fb4e338bc039a4bc022aa0aJohn Spurlock    private final ArrayList<VolumeSeekBarPreference> mVolumePrefs = new ArrayList<>();
1064a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
1074a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    private Context mContext;
10857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock    private boolean mVoiceCapable;
109cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler    private Vibrator mVibrator;
110c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    private AudioManager mAudioManager;
111cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler    private VolumeSeekBarPreference mRingOrNotificationPreference;
1124a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
11381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private Preference mPhoneRingtonePreference;
11481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private Preference mNotificationRingtonePreference;
115193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds    private Preference mAlarmRingtonePreference;
11681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private TwoStatePreference mVibrateWhenRinging;
117fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    private ComponentName mSuppressor;
118c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    private int mRingerMode = -1;
1194a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
1203b7936fb43f881de248458f720920399458408eeJulia Reynolds    private PackageManager mPm;
12172965ad53b4c935e115e49fe12189781954a4077Jason Monk    private UserManager mUserManager;
12239b467482d1bf256a111c757e9b7621c6f523271Jason Monk    private RingtonePreference mRequestPreference;
12372965ad53b4c935e115e49fe12189781954a4077Jason Monk
1244a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    @Override
1258a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
1263e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk        return MetricsEvent.SOUND;
1278a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
1288a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
1298a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
1304a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    public void onCreate(Bundle savedInstanceState) {
1314a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock        super.onCreate(savedInstanceState);
1324a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock        mContext = getActivity();
1333b7936fb43f881de248458f720920399458408eeJulia Reynolds        mPm = getPackageManager();
13472965ad53b4c935e115e49fe12189781954a4077Jason Monk        mUserManager = UserManager.get(getContext());
13557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        mVoiceCapable = Utils.isVoiceCapable(mContext);
136cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler
137c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
138cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        mVibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
139cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        if (mVibrator != null && !mVibrator.hasVibrator()) {
140cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler            mVibrator = null;
141cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        }
142cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler
1438c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        addPreferencesFromResource(R.xml.sound_settings);
1444a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
145c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        initVolumePreference(KEY_MEDIA_VOLUME, AudioManager.STREAM_MUSIC,
1468be177bffd8d651e9cb02ef4e786ee4e2f3fa55aJohn Spurlock                com.android.internal.R.drawable.ic_audio_media_mute);
147c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        initVolumePreference(KEY_ALARM_VOLUME, AudioManager.STREAM_ALARM,
148c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                com.android.internal.R.drawable.ic_audio_alarm_mute);
14957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        if (mVoiceCapable) {
150cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler            mRingOrNotificationPreference =
151c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                    initVolumePreference(KEY_RING_VOLUME, AudioManager.STREAM_RING,
152c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                            com.android.internal.R.drawable.ic_audio_ring_notif_mute);
1538c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            removePreference(KEY_NOTIFICATION_VOLUME);
15457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        } else {
155cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler            mRingOrNotificationPreference =
156c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                    initVolumePreference(KEY_NOTIFICATION_VOLUME, AudioManager.STREAM_NOTIFICATION,
157c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                            com.android.internal.R.drawable.ic_audio_ring_notif_mute);
1588c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            removePreference(KEY_RING_VOLUME);
15957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        }
1603b7936fb43f881de248458f720920399458408eeJulia Reynolds
1613b7936fb43f881de248458f720920399458408eeJulia Reynolds        // Enable link to CMAS app settings depending on the value in config.xml.
1623b7936fb43f881de248458f720920399458408eeJulia Reynolds        boolean isCellBroadcastAppLinkEnabled = this.getResources().getBoolean(
1633b7936fb43f881de248458f720920399458408eeJulia Reynolds                com.android.internal.R.bool.config_cellBroadcastAppLinks);
1643b7936fb43f881de248458f720920399458408eeJulia Reynolds        try {
1653b7936fb43f881de248458f720920399458408eeJulia Reynolds            if (isCellBroadcastAppLinkEnabled) {
1663b7936fb43f881de248458f720920399458408eeJulia Reynolds                if (mPm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver")
1673b7936fb43f881de248458f720920399458408eeJulia Reynolds                        == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
1683b7936fb43f881de248458f720920399458408eeJulia Reynolds                    isCellBroadcastAppLinkEnabled = false;  // CMAS app disabled
1693b7936fb43f881de248458f720920399458408eeJulia Reynolds                }
1703b7936fb43f881de248458f720920399458408eeJulia Reynolds            }
1713b7936fb43f881de248458f720920399458408eeJulia Reynolds        } catch (IllegalArgumentException ignored) {
1723b7936fb43f881de248458f720920399458408eeJulia Reynolds            isCellBroadcastAppLinkEnabled = false;  // CMAS app not installed
1733b7936fb43f881de248458f720920399458408eeJulia Reynolds        }
17429737ad9109895152e8600349a426260b6f94b3aSudheer Shanka        if (!mUserManager.isAdminUser() || !isCellBroadcastAppLinkEnabled ||
17529737ad9109895152e8600349a426260b6f94b3aSudheer Shanka                RestrictedLockUtils.hasBaseUserRestriction(mContext,
17629737ad9109895152e8600349a426260b6f94b3aSudheer Shanka                        UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, UserHandle.myUserId())) {
1773b7936fb43f881de248458f720920399458408eeJulia Reynolds            removePreference(KEY_CELL_BROADCAST_SETTINGS);
1783b7936fb43f881de248458f720920399458408eeJulia Reynolds        }
1798c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        initRingtones();
1808c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        initVibrateWhenRinging();
181c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        updateRingerMode();
182fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        updateEffectsSuppressor();
183c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds
184c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds        if (savedInstanceState != null) {
185c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds            String selectedPreference = savedInstanceState.getString(SELECTED_PREFERENCE_KEY, null);
186c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds            if (!TextUtils.isEmpty(selectedPreference)) {
187c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds                mRequestPreference = (RingtonePreference) findPreference(selectedPreference);
188c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds            }
189c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds        }
1904a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
1914a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
1924a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    @Override
1934a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    public void onResume() {
1944a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock        super.onResume();
1954a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock        lookupRingtoneNames();
19681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mSettingsObserver.register(true);
197fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        mReceiver.register(true);
198c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        updateRingOrNotificationPreference();
199fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        updateEffectsSuppressor();
20004b2e7957d17098d6fb4e338bc039a4bc022aa0aJohn Spurlock        for (VolumeSeekBarPreference volumePref : mVolumePrefs) {
20104b2e7957d17098d6fb4e338bc039a4bc022aa0aJohn Spurlock            volumePref.onActivityResume();
20204b2e7957d17098d6fb4e338bc039a4bc022aa0aJohn Spurlock        }
203682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka
204682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka        final EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(mContext,
205682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka                UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId());
20629737ad9109895152e8600349a426260b6f94b3aSudheer Shanka        final boolean hasBaseRestriction = RestrictedLockUtils.hasBaseUserRestriction(mContext,
20729737ad9109895152e8600349a426260b6f94b3aSudheer Shanka                UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId());
20872965ad53b4c935e115e49fe12189781954a4077Jason Monk        for (String key : RESTRICTED_KEYS) {
20972965ad53b4c935e115e49fe12189781954a4077Jason Monk            Preference pref = findPreference(key);
21029737ad9109895152e8600349a426260b6f94b3aSudheer Shanka            if (pref != null) {
21129737ad9109895152e8600349a426260b6f94b3aSudheer Shanka                pref.setEnabled(!hasBaseRestriction);
21229737ad9109895152e8600349a426260b6f94b3aSudheer Shanka            }
21329737ad9109895152e8600349a426260b6f94b3aSudheer Shanka            if (pref instanceof RestrictedPreference && !hasBaseRestriction) {
214682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka                ((RestrictedPreference) pref).setDisabledByAdmin(admin);
21572965ad53b4c935e115e49fe12189781954a4077Jason Monk            }
21672965ad53b4c935e115e49fe12189781954a4077Jason Monk        }
217682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka        RestrictedPreference broadcastSettingsPref = (RestrictedPreference) findPreference(
218682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka                KEY_CELL_BROADCAST_SETTINGS);
219682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka        if (broadcastSettingsPref != null) {
220682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka            broadcastSettingsPref.checkRestrictionAndSetDisabled(
221682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka                    UserManager.DISALLOW_CONFIG_CELL_BROADCASTS);
222682a916836f5e108289a70579f671f9d4a880993Sudheer Shanka        }
2234a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
2244a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
2254a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    @Override
22681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    public void onPause() {
22781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        super.onPause();
22839b467482d1bf256a111c757e9b7621c6f523271Jason Monk        for (VolumeSeekBarPreference volumePref : mVolumePrefs) {
22939b467482d1bf256a111c757e9b7621c6f523271Jason Monk            volumePref.onActivityPause();
23039b467482d1bf256a111c757e9b7621c6f523271Jason Monk        }
23181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mVolumeCallback.stopSample();
23281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mSettingsObserver.register(false);
233fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        mReceiver.register(false);
23481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    }
23581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
23639b467482d1bf256a111c757e9b7621c6f523271Jason Monk    @Override
23739b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public boolean onPreferenceTreeClick(Preference preference) {
23839b467482d1bf256a111c757e9b7621c6f523271Jason Monk        if (preference instanceof RingtonePreference) {
23939b467482d1bf256a111c757e9b7621c6f523271Jason Monk            mRequestPreference = (RingtonePreference) preference;
24039b467482d1bf256a111c757e9b7621c6f523271Jason Monk            mRequestPreference.onPrepareRingtonePickerIntent(mRequestPreference.getIntent());
241c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds            startActivityForResult(preference.getIntent(), REQUEST_CODE);
24239b467482d1bf256a111c757e9b7621c6f523271Jason Monk            return true;
24339b467482d1bf256a111c757e9b7621c6f523271Jason Monk        }
24439b467482d1bf256a111c757e9b7621c6f523271Jason Monk        return super.onPreferenceTreeClick(preference);
24539b467482d1bf256a111c757e9b7621c6f523271Jason Monk    }
24639b467482d1bf256a111c757e9b7621c6f523271Jason Monk
24739b467482d1bf256a111c757e9b7621c6f523271Jason Monk    @Override
24839b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public void onActivityResult(int requestCode, int resultCode, Intent data) {
24939b467482d1bf256a111c757e9b7621c6f523271Jason Monk        if (mRequestPreference != null) {
25039b467482d1bf256a111c757e9b7621c6f523271Jason Monk            mRequestPreference.onActivityResult(requestCode, resultCode, data);
25139b467482d1bf256a111c757e9b7621c6f523271Jason Monk            mRequestPreference = null;
25239b467482d1bf256a111c757e9b7621c6f523271Jason Monk        }
25339b467482d1bf256a111c757e9b7621c6f523271Jason Monk    }
25439b467482d1bf256a111c757e9b7621c6f523271Jason Monk
255c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds    @Override
256c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds    public void onSaveInstanceState(Bundle outState) {
257c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds        super.onSaveInstanceState(outState);
258c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds        if (mRequestPreference != null) {
259c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds            outState.putString(SELECTED_PREFERENCE_KEY, mRequestPreference.getKey());
260c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds        }
261c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds    }
262c736efcb61efca979f0c78d6dd67cde843eb7733Julia Reynolds
26381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    // === Volumes ===
264c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock
265c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    private VolumeSeekBarPreference initVolumePreference(String key, int stream, int muteIcon) {
26681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        final VolumeSeekBarPreference volumePref = (VolumeSeekBarPreference) findPreference(key);
26781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        volumePref.setCallback(mVolumeCallback);
268cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        volumePref.setStream(stream);
26904b2e7957d17098d6fb4e338bc039a4bc022aa0aJohn Spurlock        mVolumePrefs.add(volumePref);
270c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        volumePref.setMuteIcon(muteIcon);
271cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        return volumePref;
272cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler    }
273cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler
274c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    private void updateRingOrNotificationPreference() {
275fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        mRingOrNotificationPreference.showIcon(mSuppressor != null
276fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                ? com.android.internal.R.drawable.ic_audio_ring_notif_mute
277f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock                : mRingerMode == AudioManager.RINGER_MODE_VIBRATE || wasRingerModeVibrate()
278c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                ? com.android.internal.R.drawable.ic_audio_ring_notif_vibrate
279c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                : com.android.internal.R.drawable.ic_audio_ring_notif);
280c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    }
281c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock
282f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock    private boolean wasRingerModeVibrate() {
283f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock        return mVibrator != null && mRingerMode == AudioManager.RINGER_MODE_SILENT
284f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock                && mAudioManager.getLastAudibleStreamVolume(AudioManager.STREAM_RING) == 0;
285f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock    }
286f82154de8c5274d41c6ae1cbd0170f9e20462a45John Spurlock
287c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock    private void updateRingerMode() {
288c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        final int ringerMode = mAudioManager.getRingerModeInternal();
289c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        if (mRingerMode == ringerMode) return;
290c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        mRingerMode = ringerMode;
291c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        updateRingOrNotificationPreference();
292fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    }
293fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock
294fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    private void updateEffectsSuppressor() {
295fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        final ComponentName suppressor = NotificationManager.from(mContext).getEffectsSuppressor();
296fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        if (Objects.equals(suppressor, mSuppressor)) return;
297fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        mSuppressor = suppressor;
298fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        if (mRingOrNotificationPreference != null) {
299fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            final String text = suppressor != null ?
300fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                    mContext.getString(com.android.internal.R.string.muted_by,
301fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                            getSuppressorCaption(suppressor)) : null;
302fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            mRingOrNotificationPreference.setSuppressionText(text);
303fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        }
304c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        updateRingOrNotificationPreference();
305fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    }
306fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock
307fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    private String getSuppressorCaption(ComponentName suppressor) {
308fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        final PackageManager pm = mContext.getPackageManager();
309fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        try {
310fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            final ServiceInfo info = pm.getServiceInfo(suppressor, 0);
311fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            if (info != null) {
312fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                final CharSequence seq = info.loadLabel(pm);
313fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                if (seq != null) {
314fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                    final String str = seq.toString().trim();
315fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                    if (str.length() > 0) {
316fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                        return str;
317fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                    }
318fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                }
319fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            }
320fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        } catch (Throwable e) {
321fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            Log.w(TAG, "Error loading suppressor caption", e);
322fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        }
323fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        return suppressor.getPackageName();
3244a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
3254a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
32681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final class VolumePreferenceCallback implements VolumeSeekBarPreference.Callback {
32781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private SeekBarVolumizer mCurrent;
32881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
32981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        @Override
33081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void onSampleStarting(SeekBarVolumizer sbv) {
33181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (mCurrent != null && mCurrent != sbv) {
33281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                mCurrent.stopSample();
33381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
33481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            mCurrent = sbv;
33581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (mCurrent != null) {
33681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                mHandler.removeMessages(H.STOP_SAMPLE);
33781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                mHandler.sendEmptyMessageDelayed(H.STOP_SAMPLE, SAMPLE_CUTOFF);
33881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
33981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
34081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
341cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        @Override
342cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        public void onStreamValueChanged(int stream, int progress) {
343c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock            // noop
344cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler        }
345cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler
34681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void stopSample() {
34781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (mCurrent != null) {
34881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                mCurrent.stopSample();
34981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
35081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
35181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    };
35281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
3534a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
35481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    // === Phone & notification ringtone ===
3554a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
3568c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    private void initRingtones() {
3578c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        mPhoneRingtonePreference = getPreferenceScreen().findPreference(KEY_PHONE_RINGTONE);
35857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        if (mPhoneRingtonePreference != null && !mVoiceCapable) {
3598c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            getPreferenceScreen().removePreference(mPhoneRingtonePreference);
36057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            mPhoneRingtonePreference = null;
36157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        }
3628c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        mNotificationRingtonePreference =
3638c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                getPreferenceScreen().findPreference(KEY_NOTIFICATION_RINGTONE);
364193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds        mAlarmRingtonePreference = getPreferenceScreen().findPreference(KEY_ALARM_RINGTONE);
3654a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
3664a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
36781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private void lookupRingtoneNames() {
36881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        AsyncTask.execute(mLookupRingtoneNames);
3694a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
3704a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
37181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final Runnable mLookupRingtoneNames = new Runnable() {
37281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        @Override
37381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void run() {
37481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (mPhoneRingtonePreference != null) {
3754e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                final CharSequence summary = updateRingtoneName(
37681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                        mContext, RingtoneManager.TYPE_RINGTONE);
37781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                if (summary != null) {
37881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    mHandler.obtainMessage(H.UPDATE_PHONE_RINGTONE, summary).sendToTarget();
37981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                }
38081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
38181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (mNotificationRingtonePreference != null) {
3824e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                final CharSequence summary = updateRingtoneName(
38381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                        mContext, RingtoneManager.TYPE_NOTIFICATION);
38481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                if (summary != null) {
38581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    mHandler.obtainMessage(H.UPDATE_NOTIFICATION_RINGTONE, summary).sendToTarget();
38681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                }
38781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
388193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds            if (mAlarmRingtonePreference != null) {
389193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                final CharSequence summary =
390193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                        updateRingtoneName(mContext, RingtoneManager.TYPE_ALARM);
391193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                if (summary != null) {
392193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                    mHandler.obtainMessage(H.UPDATE_ALARM_RINGTONE, summary).sendToTarget();
393193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                }
394193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds            }
39581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
39681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    };
3974a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
3984e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock    private static CharSequence updateRingtoneName(Context context, int type) {
39907f7efba67a5f261fca31890a1b60f23021325f5John Spurlock        if (context == null) {
40007f7efba67a5f261fca31890a1b60f23021325f5John Spurlock            Log.e(TAG, "Unable to update ringtone name, no context provided");
40107f7efba67a5f261fca31890a1b60f23021325f5John Spurlock            return null;
40207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock        }
4034e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
4044e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
4054e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        // Is it a silent ringtone?
4064e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        if (ringtoneUri == null) {
4074e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            summary = context.getString(com.android.internal.R.string.ringtone_silent);
4084e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        } else {
4094e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            Cursor cursor = null;
4104e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            try {
4118aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                if (MediaStore.AUTHORITY.equals(ringtoneUri.getAuthority())) {
4128aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                    // Fetch the ringtone title from the media provider
4138aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                    cursor = context.getContentResolver().query(ringtoneUri,
4148aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                            new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
4158aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                } else if (ContentResolver.SCHEME_CONTENT.equals(ringtoneUri.getScheme())) {
4168aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                    cursor = context.getContentResolver().query(ringtoneUri,
4178aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                            new String[] { OpenableColumns.DISPLAY_NAME }, null, null, null);
4188aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                }
4194e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                if (cursor != null) {
4204e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                    if (cursor.moveToFirst()) {
4214e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                        summary = cursor.getString(0);
4224e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                    }
4234e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                }
4244e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            } catch (SQLiteException sqle) {
4254e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                // Unknown title for the ringtone
4268aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler            } catch (IllegalArgumentException iae) {
4278aed3e3f9e0bbb690866110581bde5c94e1fb490Dan Sandler                // Some other error retrieving the column from the provider
4284e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            } finally {
4294e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                if (cursor != null) {
4304e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                    cursor.close();
4314e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock                }
4324e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock            }
4334e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        }
4344e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock        return summary;
4354e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock    }
4364e4cdeffdb6087c953f44808f14f18554a749bdaJohn Spurlock
43781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    // === Vibrate when ringing ===
43881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
4398c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    private void initVibrateWhenRinging() {
4408c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        mVibrateWhenRinging =
4418c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                (TwoStatePreference) getPreferenceScreen().findPreference(KEY_VIBRATE_WHEN_RINGING);
44207f7efba67a5f261fca31890a1b60f23021325f5John Spurlock        if (mVibrateWhenRinging == null) {
44307f7efba67a5f261fca31890a1b60f23021325f5John Spurlock            Log.i(TAG, "Preference not found: " + KEY_VIBRATE_WHEN_RINGING);
44407f7efba67a5f261fca31890a1b60f23021325f5John Spurlock            return;
44507f7efba67a5f261fca31890a1b60f23021325f5John Spurlock        }
44657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        if (!mVoiceCapable) {
4478c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            getPreferenceScreen().removePreference(mVibrateWhenRinging);
44857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            mVibrateWhenRinging = null;
44957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            return;
45057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        }
45181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mVibrateWhenRinging.setPersistent(false);
45281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        updateVibrateWhenRinging();
45381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mVibrateWhenRinging.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
45481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            @Override
45581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            public boolean onPreferenceChange(Preference preference, Object newValue) {
45681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                final boolean val = (Boolean) newValue;
45781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                return Settings.System.putInt(getContentResolver(),
45881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                        Settings.System.VIBRATE_WHEN_RINGING,
45981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                        val ? 1 : 0);
46081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
46181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        });
4624a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
4634a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
46481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private void updateVibrateWhenRinging() {
46581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        if (mVibrateWhenRinging == null) return;
46681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        mVibrateWhenRinging.setChecked(Settings.System.getInt(getContentResolver(),
46781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                Settings.System.VIBRATE_WHEN_RINGING, 0) != 0);
4684a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
4694a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock
47081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    // === Callbacks ===
47181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
47281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final class SettingsObserver extends ContentObserver {
47381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private final Uri VIBRATE_WHEN_RINGING_URI =
47481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING);
47581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
47681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public SettingsObserver() {
47781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            super(mHandler);
47881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
47981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
48081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void register(boolean register) {
48181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            final ContentResolver cr = getContentResolver();
48281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (register) {
48381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                cr.registerContentObserver(VIBRATE_WHEN_RINGING_URI, false, this);
48481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            } else {
48581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                cr.unregisterContentObserver(this);
48681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
48781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
48881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
48981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        @Override
49081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void onChange(boolean selfChange, Uri uri) {
49181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            super.onChange(selfChange, uri);
49281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            if (VIBRATE_WHEN_RINGING_URI.equals(uri)) {
49381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                updateVibrateWhenRinging();
49481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
49581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
49681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    }
49781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
49881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock    private final class H extends Handler {
49981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private static final int UPDATE_PHONE_RINGTONE = 1;
50081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private static final int UPDATE_NOTIFICATION_RINGTONE = 2;
50181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private static final int STOP_SAMPLE = 3;
502c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        private static final int UPDATE_EFFECTS_SUPPRESSOR = 4;
503c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock        private static final int UPDATE_RINGER_MODE = 5;
504f892e21696fd884e2cd78fc0e7703ebe4ddda59cAndy Hung        private static final int UPDATE_ALARM_RINGTONE = 6;
50581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
50681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        private H() {
50781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            super(Looper.getMainLooper());
50881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
50981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock
51081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        @Override
51181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        public void handleMessage(Message msg) {
51281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            switch (msg.what) {
51381bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                case UPDATE_PHONE_RINGTONE:
51481bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    mPhoneRingtonePreference.setSummary((CharSequence) msg.obj);
51581bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    break;
51681bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                case UPDATE_NOTIFICATION_RINGTONE:
51781bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    mNotificationRingtonePreference.setSummary((CharSequence) msg.obj);
51881bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    break;
51981bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                case STOP_SAMPLE:
52081bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    mVolumeCallback.stopSample();
52181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock                    break;
522fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                case UPDATE_EFFECTS_SUPPRESSOR:
523fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                    updateEffectsSuppressor();
524cb9f35171d14bec1af4bb313aac2e79ac2290facDan Sandler                    break;
525c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                case UPDATE_RINGER_MODE:
526c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                    updateRingerMode();
527c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                    break;
528193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                case UPDATE_ALARM_RINGTONE:
529193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                    mAlarmRingtonePreference.setSummary((CharSequence) msg.obj);
530193e7b044d87be0c6a300e798512c122e29c9c7eJulia Reynolds                    break;
53181bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock            }
53281bef1d74568d623b9db3c5409740dc21c0bbc08John Spurlock        }
5334a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock    }
53457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock
535fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    private class Receiver extends BroadcastReceiver {
536fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        private boolean mRegistered;
537fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock
538fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        public void register(boolean register) {
539fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            if (mRegistered == register) return;
540fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            if (register) {
541c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                final IntentFilter filter = new IntentFilter();
542c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
543c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
544c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                mContext.registerReceiver(this, filter);
545fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            } else {
546fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock                mContext.unregisterReceiver(this);
547fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            }
548fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock            mRegistered = register;
549fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        }
550fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock
551fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        @Override
552fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        public void onReceive(Context context, Intent intent) {
553c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock            final String action = intent.getAction();
554c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock            if (NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED.equals(action)) {
555c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                mHandler.sendEmptyMessage(H.UPDATE_EFFECTS_SUPPRESSOR);
556c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock            } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
557c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock                mHandler.sendEmptyMessage(H.UPDATE_RINGER_MODE);
558c868f7035a6d05332b3d8afcde2ae27ad0413e79John Spurlock            }
559fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock        }
560fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock    }
561fdebfc35c43c445afcd39077f5cbcf72902b1d6eJohn Spurlock
5628c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    // === Summary ===
5638c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
5648c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    private static class SummaryProvider extends BroadcastReceiver
5658c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            implements SummaryLoader.SummaryProvider {
5668c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
5678c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        private final Context mContext;
5688c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        private final AudioManager mAudioManager;
5698c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        private final SummaryLoader mSummaryLoader;
5708c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        private final int maxVolume;
5718c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
5728c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
5738c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            mContext = context;
5748c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            mSummaryLoader = summaryLoader;
5758c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
5768c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING);
5778c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        }
5788c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
5798c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        @Override
5808c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        public void setListening(boolean listening) {
5818c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            if (listening) {
5828c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                IntentFilter filter = new IntentFilter();
5838c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(AudioManager.VOLUME_CHANGED_ACTION);
5848c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(AudioManager.STREAM_DEVICES_CHANGED_ACTION);
5858c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
5868c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
5878c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION);
5888c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
5898c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                mContext.registerReceiver(this, filter);
5908c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            } else {
5918c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                mContext.unregisterReceiver(this);
5928c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            }
5938c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        }
5948c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
5958c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        @Override
5968c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        public void onReceive(Context context, Intent intent) {
5978c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            String percent =  NumberFormat.getPercentInstance().format(
5988c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                    (double) mAudioManager.getStreamVolume(AudioManager.STREAM_RING) / maxVolume);
5998c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            mSummaryLoader.setSummary(this,
6008c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                    mContext.getString(R.string.sound_settings_summary, percent));
6018c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        }
6028c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    }
6038c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
6048c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
6058c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            = new SummaryLoader.SummaryProviderFactory() {
6068c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        @Override
6078c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
6088c0a4238655990094fe444ac8f7b182963497030Julia Reynolds                SummaryLoader summaryLoader) {
6098c0a4238655990094fe444ac8f7b182963497030Julia Reynolds            return new SummaryProvider(activity, summaryLoader);
6108c0a4238655990094fe444ac8f7b182963497030Julia Reynolds        }
6118c0a4238655990094fe444ac8f7b182963497030Julia Reynolds    };
6128c0a4238655990094fe444ac8f7b182963497030Julia Reynolds
61357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock    // === Indexing ===
61457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock
61557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
61657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            new BaseSearchIndexProvider() {
61757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock
61857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        public List<SearchIndexableResource> getXmlResourcesToIndex(
61957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock                Context context, boolean enabled) {
62057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            final SearchIndexableResource sir = new SearchIndexableResource(context);
6213b7936fb43f881de248458f720920399458408eeJulia Reynolds            sir.xmlResId = R.xml.sound_settings;
62257c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            return Arrays.asList(sir);
62357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        }
62457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock
62557c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        public List<String> getNonIndexableKeys(Context context) {
62657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            final ArrayList<String> rt = new ArrayList<String>();
62757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            if (Utils.isVoiceCapable(context)) {
62857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock                rt.add(KEY_NOTIFICATION_VOLUME);
62957c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            } else {
63057c713d1d92f64a558115e5aff212ebc54a19151John Spurlock                rt.add(KEY_RING_VOLUME);
63157c713d1d92f64a558115e5aff212ebc54a19151John Spurlock                rt.add(KEY_PHONE_RINGTONE);
632cfe4aedc47c513be8b1a9168f5dcfc9017e52a97John Spurlock                rt.add(KEY_WIFI_DISPLAY);
63357c713d1d92f64a558115e5aff212ebc54a19151John Spurlock                rt.add(KEY_VIBRATE_WHEN_RINGING);
63457c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            }
6353b7936fb43f881de248458f720920399458408eeJulia Reynolds
6363b7936fb43f881de248458f720920399458408eeJulia Reynolds            final PackageManager pm = context.getPackageManager();
6373b7936fb43f881de248458f720920399458408eeJulia Reynolds            final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
6383b7936fb43f881de248458f720920399458408eeJulia Reynolds
6393b7936fb43f881de248458f720920399458408eeJulia Reynolds            // Enable link to CMAS app settings depending on the value in config.xml.
6403b7936fb43f881de248458f720920399458408eeJulia Reynolds            boolean isCellBroadcastAppLinkEnabled = context.getResources().getBoolean(
6413b7936fb43f881de248458f720920399458408eeJulia Reynolds                    com.android.internal.R.bool.config_cellBroadcastAppLinks);
6423b7936fb43f881de248458f720920399458408eeJulia Reynolds            try {
6433b7936fb43f881de248458f720920399458408eeJulia Reynolds                if (isCellBroadcastAppLinkEnabled) {
6443b7936fb43f881de248458f720920399458408eeJulia Reynolds                    if (pm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver")
6453b7936fb43f881de248458f720920399458408eeJulia Reynolds                            == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
6463b7936fb43f881de248458f720920399458408eeJulia Reynolds                        isCellBroadcastAppLinkEnabled = false;  // CMAS app disabled
6473b7936fb43f881de248458f720920399458408eeJulia Reynolds                    }
6483b7936fb43f881de248458f720920399458408eeJulia Reynolds                }
6493b7936fb43f881de248458f720920399458408eeJulia Reynolds            } catch (IllegalArgumentException ignored) {
6503b7936fb43f881de248458f720920399458408eeJulia Reynolds                isCellBroadcastAppLinkEnabled = false;  // CMAS app not installed
6513b7936fb43f881de248458f720920399458408eeJulia Reynolds            }
6523b7936fb43f881de248458f720920399458408eeJulia Reynolds            if (!um.isAdminUser() || !isCellBroadcastAppLinkEnabled) {
6533b7936fb43f881de248458f720920399458408eeJulia Reynolds                rt.add(KEY_CELL_BROADCAST_SETTINGS);
6543b7936fb43f881de248458f720920399458408eeJulia Reynolds            }
6553b7936fb43f881de248458f720920399458408eeJulia Reynolds
65657c713d1d92f64a558115e5aff212ebc54a19151John Spurlock            return rt;
65757c713d1d92f64a558115e5aff212ebc54a19151John Spurlock        }
65857c713d1d92f64a558115e5aff212ebc54a19151John Spurlock    };
6594a35051565b0ce6d29313c3e4ffe19e1dde78db0John Spurlock}
660