1 /* 2 * Copyright (C) 2007-2008 Esmertec AG. 3 * Copyright (C) 2007-2008 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.android.mms.ui; 19 20 import com.android.mms.MmsApp; 21 import com.android.mms.MmsConfig; 22 import com.android.mms.R; 23 24 import android.app.ActionBar; 25 import android.app.AlertDialog; 26 import android.app.Dialog; 27 import android.content.Context; 28 import android.content.DialogInterface; 29 import android.content.Intent; 30 import android.content.SharedPreferences; 31 import android.os.Bundle; 32 import android.preference.CheckBoxPreference; 33 import android.preference.ListPreference; 34 import android.preference.Preference; 35 import android.preference.PreferenceActivity; 36 import android.preference.PreferenceCategory; 37 import android.preference.PreferenceManager; 38 import android.preference.PreferenceScreen; 39 import android.preference.Preference.OnPreferenceChangeListener; 40 import android.provider.SearchRecentSuggestions; 41 import android.view.Menu; 42 import android.view.MenuItem; 43 44 import com.android.mms.util.Recycler; 45 46 /** 47 * With this activity, users can set preferences for MMS and SMS and 48 * can access and manipulate SMS messages stored on the SIM. 49 */ 50 public class MessagingPreferenceActivity extends PreferenceActivity 51 implements OnPreferenceChangeListener { 52 // Symbolic names for the keys used for preference lookup 53 public static final String MMS_DELIVERY_REPORT_MODE = "pref_key_mms_delivery_reports"; 54 public static final String EXPIRY_TIME = "pref_key_mms_expiry"; 55 public static final String PRIORITY = "pref_key_mms_priority"; 56 public static final String READ_REPORT_MODE = "pref_key_mms_read_reports"; 57 public static final String SMS_DELIVERY_REPORT_MODE = "pref_key_sms_delivery_reports"; 58 public static final String NOTIFICATION_ENABLED = "pref_key_enable_notifications"; 59 public static final String NOTIFICATION_VIBRATE = "pref_key_vibrate"; 60 public static final String NOTIFICATION_VIBRATE_WHEN= "pref_key_vibrateWhen"; 61 public static final String NOTIFICATION_RINGTONE = "pref_key_ringtone"; 62 public static final String AUTO_RETRIEVAL = "pref_key_mms_auto_retrieval"; 63 public static final String RETRIEVAL_DURING_ROAMING = "pref_key_mms_retrieval_during_roaming"; 64 public static final String AUTO_DELETE = "pref_key_auto_delete"; 65 66 // Menu entries 67 private static final int MENU_RESTORE_DEFAULTS = 1; 68 69 private Preference mSmsLimitPref; 70 private Preference mSmsDeliveryReportPref; 71 private Preference mMmsLimitPref; 72 private Preference mMmsDeliveryReportPref; 73 private Preference mMmsReadReportPref; 74 private Preference mManageSimPref; 75 private Preference mClearHistoryPref; 76 private ListPreference mVibrateWhenPref; 77 private CheckBoxPreference mEnableNotificationsPref; 78 private Recycler mSmsRecycler; 79 private Recycler mMmsRecycler; 80 private static final int CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG = 3; 81 private CharSequence[] mVibrateEntries; 82 private CharSequence[] mVibrateValues; 83 84 @Override 85 protected void onCreate(Bundle icicle) { 86 super.onCreate(icicle); 87 addPreferencesFromResource(R.xml.preferences); 88 89 mManageSimPref = findPreference("pref_key_manage_sim_messages"); 90 mSmsLimitPref = findPreference("pref_key_sms_delete_limit"); 91 mSmsDeliveryReportPref = findPreference("pref_key_sms_delivery_reports"); 92 mMmsDeliveryReportPref = findPreference("pref_key_mms_delivery_reports"); 93 mMmsReadReportPref = findPreference("pref_key_mms_read_reports"); 94 mMmsLimitPref = findPreference("pref_key_mms_delete_limit"); 95 mClearHistoryPref = findPreference("pref_key_mms_clear_history"); 96 mEnableNotificationsPref = (CheckBoxPreference) findPreference(NOTIFICATION_ENABLED); 97 mVibrateWhenPref = (ListPreference) findPreference(NOTIFICATION_VIBRATE_WHEN); 98 99 mVibrateEntries = getResources().getTextArray(R.array.prefEntries_vibrateWhen); 100 mVibrateValues = getResources().getTextArray(R.array.prefValues_vibrateWhen); 101 102 ActionBar actionBar = getActionBar(); 103 actionBar.setDisplayHomeAsUpEnabled(true); 104 setMessagePreferences(); 105 } 106 107 @Override 108 protected void onResume() { 109 super.onResume(); 110 111 // Since the enabled notifications pref can be changed outside of this activity, 112 // we have to reload it whenever we resume. 113 setEnabledNotificationsPref(); 114 registerListeners(); 115 } 116 117 private void setMessagePreferences() { 118 if (!MmsApp.getApplication().getTelephonyManager().hasIccCard()) { 119 // No SIM card, remove the SIM-related prefs 120 PreferenceCategory smsCategory = 121 (PreferenceCategory)findPreference("pref_key_sms_settings"); 122 smsCategory.removePreference(mManageSimPref); 123 } 124 125 if (!MmsConfig.getSMSDeliveryReportsEnabled()) { 126 PreferenceCategory smsCategory = 127 (PreferenceCategory)findPreference("pref_key_sms_settings"); 128 smsCategory.removePreference(mSmsDeliveryReportPref); 129 if (!MmsApp.getApplication().getTelephonyManager().hasIccCard()) { 130 getPreferenceScreen().removePreference(smsCategory); 131 } 132 } 133 134 if (!MmsConfig.getMmsEnabled()) { 135 // No Mms, remove all the mms-related preferences 136 PreferenceCategory mmsOptions = 137 (PreferenceCategory)findPreference("pref_key_mms_settings"); 138 getPreferenceScreen().removePreference(mmsOptions); 139 140 PreferenceCategory storageOptions = 141 (PreferenceCategory)findPreference("pref_key_storage_settings"); 142 storageOptions.removePreference(findPreference("pref_key_mms_delete_limit")); 143 } else { 144 if (!MmsConfig.getMMSDeliveryReportsEnabled()) { 145 PreferenceCategory mmsOptions = 146 (PreferenceCategory)findPreference("pref_key_mms_settings"); 147 mmsOptions.removePreference(mMmsDeliveryReportPref); 148 } 149 if (!MmsConfig.getMMSReadReportsEnabled()) { 150 PreferenceCategory mmsOptions = 151 (PreferenceCategory)findPreference("pref_key_mms_settings"); 152 mmsOptions.removePreference(mMmsReadReportPref); 153 } 154 } 155 156 setEnabledNotificationsPref(); 157 158 // If needed, migrate vibration setting from a previous version 159 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 160 if (!sharedPreferences.contains(NOTIFICATION_VIBRATE_WHEN) && 161 sharedPreferences.contains(NOTIFICATION_VIBRATE)) { 162 int stringId = sharedPreferences.getBoolean(NOTIFICATION_VIBRATE, false) ? 163 R.string.prefDefault_vibrate_true : 164 R.string.prefDefault_vibrate_false; 165 mVibrateWhenPref.setValue(getString(stringId)); 166 } 167 168 mSmsRecycler = Recycler.getSmsRecycler(); 169 mMmsRecycler = Recycler.getMmsRecycler(); 170 171 // Fix up the recycler's summary with the correct values 172 setSmsDisplayLimit(); 173 setMmsDisplayLimit(); 174 175 adjustVibrateSummary(mVibrateWhenPref.getValue()); 176 } 177 178 private void setEnabledNotificationsPref() { 179 // The "enable notifications" setting is really stored in our own prefs. Read the 180 // current value and set the checkbox to match. 181 mEnableNotificationsPref.setChecked(getNotificationEnabled(this)); 182 } 183 184 private void setSmsDisplayLimit() { 185 mSmsLimitPref.setSummary( 186 getString(R.string.pref_summary_delete_limit, 187 mSmsRecycler.getMessageLimit(this))); 188 } 189 190 private void setMmsDisplayLimit() { 191 mMmsLimitPref.setSummary( 192 getString(R.string.pref_summary_delete_limit, 193 mMmsRecycler.getMessageLimit(this))); 194 } 195 196 public boolean onCreateOptionsMenu(Menu menu) { 197 super.onCreateOptionsMenu(menu); 198 menu.clear(); 199 menu.add(0, MENU_RESTORE_DEFAULTS, 0, R.string.restore_default); 200 return true; 201 } 202 203 @Override 204 public boolean onOptionsItemSelected(MenuItem item) { 205 switch (item.getItemId()) { 206 case MENU_RESTORE_DEFAULTS: 207 restoreDefaultPreferences(); 208 return true; 209 210 case android.R.id.home: 211 // The user clicked on the Messaging icon in the action bar. Take them back from 212 // wherever they came from 213 finish(); 214 return true; 215 } 216 return false; 217 } 218 219 @Override 220 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 221 Preference preference) { 222 if (preference == mSmsLimitPref) { 223 new NumberPickerDialog(this, 224 mSmsLimitListener, 225 mSmsRecycler.getMessageLimit(this), 226 mSmsRecycler.getMessageMinLimit(), 227 mSmsRecycler.getMessageMaxLimit(), 228 R.string.pref_title_sms_delete).show(); 229 } else if (preference == mMmsLimitPref) { 230 new NumberPickerDialog(this, 231 mMmsLimitListener, 232 mMmsRecycler.getMessageLimit(this), 233 mMmsRecycler.getMessageMinLimit(), 234 mMmsRecycler.getMessageMaxLimit(), 235 R.string.pref_title_mms_delete).show(); 236 } else if (preference == mManageSimPref) { 237 startActivity(new Intent(this, ManageSimMessages.class)); 238 } else if (preference == mClearHistoryPref) { 239 showDialog(CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG); 240 return true; 241 } else if (preference == mEnableNotificationsPref) { 242 // Update the actual "enable notifications" value that is stored in secure settings. 243 enableNotifications(mEnableNotificationsPref.isChecked(), this); 244 } 245 246 return super.onPreferenceTreeClick(preferenceScreen, preference); 247 } 248 249 250 private void restoreDefaultPreferences() { 251 PreferenceManager.getDefaultSharedPreferences(this) 252 .edit().clear().apply(); 253 setPreferenceScreen(null); 254 addPreferencesFromResource(R.xml.preferences); 255 setMessagePreferences(); 256 } 257 258 NumberPickerDialog.OnNumberSetListener mSmsLimitListener = 259 new NumberPickerDialog.OnNumberSetListener() { 260 public void onNumberSet(int limit) { 261 mSmsRecycler.setMessageLimit(MessagingPreferenceActivity.this, limit); 262 setSmsDisplayLimit(); 263 } 264 }; 265 266 NumberPickerDialog.OnNumberSetListener mMmsLimitListener = 267 new NumberPickerDialog.OnNumberSetListener() { 268 public void onNumberSet(int limit) { 269 mMmsRecycler.setMessageLimit(MessagingPreferenceActivity.this, limit); 270 setMmsDisplayLimit(); 271 } 272 }; 273 274 @Override 275 protected Dialog onCreateDialog(int id) { 276 switch (id) { 277 case CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG: 278 return new AlertDialog.Builder(MessagingPreferenceActivity.this) 279 .setTitle(R.string.confirm_clear_search_title) 280 .setMessage(R.string.confirm_clear_search_text) 281 .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 282 public void onClick(DialogInterface dialog, int which) { 283 SearchRecentSuggestions recent = 284 ((MmsApp)getApplication()).getRecentSuggestions(); 285 if (recent != null) { 286 recent.clearHistory(); 287 } 288 dialog.dismiss(); 289 } 290 }) 291 .setNegativeButton(android.R.string.cancel, null) 292 .setIcon(android.R.drawable.ic_dialog_alert) 293 .create(); 294 } 295 return super.onCreateDialog(id); 296 } 297 298 public static boolean getNotificationEnabled(Context context) { 299 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 300 boolean notificationsEnabled = 301 prefs.getBoolean(MessagingPreferenceActivity.NOTIFICATION_ENABLED, true); 302 return notificationsEnabled; 303 } 304 305 public static void enableNotifications(boolean enabled, Context context) { 306 // Store the value of notifications in SharedPreferences 307 SharedPreferences.Editor editor = 308 PreferenceManager.getDefaultSharedPreferences(context).edit(); 309 310 editor.putBoolean(MessagingPreferenceActivity.NOTIFICATION_ENABLED, enabled); 311 312 editor.apply(); 313 } 314 315 private void registerListeners() { 316 mVibrateWhenPref.setOnPreferenceChangeListener(this); 317 } 318 319 public boolean onPreferenceChange(Preference preference, Object newValue) { 320 boolean result = false; 321 if (preference == mVibrateWhenPref) { 322 adjustVibrateSummary((String)newValue); 323 result = true; 324 } 325 return result; 326 } 327 328 private void adjustVibrateSummary(String value) { 329 int len = mVibrateValues.length; 330 for (int i = 0; i < len; i++) { 331 if (mVibrateValues[i].equals(value)) { 332 mVibrateWhenPref.setSummary(mVibrateEntries[i]); 333 return; 334 } 335 } 336 mVibrateWhenPref.setSummary(null); 337 } 338 } 339