Home | History | Annotate | Download | only in ui
      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