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