/*
* Copyright (C) 2007-2008 Esmertec AG.
* Copyright (C) 2007-2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.mms.ui;
import com.android.internal.telephony.ITelephony;
import com.android.mms.MmsApp;
import com.android.mms.MmsConfig;
import com.android.mms.R;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.ContentResolver;
import android.content.AsyncQueryHandler;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.Environment;
import android.os.StatFs;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.provider.SearchRecentSuggestions;
import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.net.Uri;
import com.android.mms.util.Recycler;
import android.widget.Toast;
import com.google.android.mms.pdu.MultimediaMessagePdu;
import com.google.android.mms.pdu.PduPersister;
import android.content.ContentUris;
import com.android.mms.model.SlideshowModel;
import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.Telephony.Mms;
import java.io.File;
import android.telephony.SmsManager;
import android.text.format.Formatter;
import com.google.android.mms.MmsException;
import com.android.internal.telephony.SMSDispatcher;
import android.content.res.Resources;
/**
* With this activity, users can set preferences for MMS and SMS and
* can access and manipulate SMS messages stored on the SIM.
*/
public class MessagingPreferenceActivity extends PreferenceActivity implements
Preference.OnPreferenceChangeListener{
// Symbolic names for the keys used for preference lookup
public static final String MMS_DELIVERY_REPORT_MODE = "pref_key_mms_delivery_reports";
public static final String EXPIRY_TIME = "pref_key_mms_expiry";
public static final String PRIORITY = "pref_key_mms_priority";
public static final String READ_REPORT_MODE = "pref_key_mms_read_reports";
public static final String SMS_DELIVERY_REPORT_MODE = "pref_key_sms_delivery_reports";
public static final String SMS_SAVE_TO_SIMCARD = "pref_key_sms_save_to_sim_card";
public static final String SMS_RETRY_TIMES = "pref_key_sms_retry_times";
public static final String NOTIFICATION_ENABLED = "pref_key_enable_notifications";
public static final String NOTIFICATION_VIBRATE = "pref_key_vibrate";
public static final String NOTIFICATION_VIBRATE_WHEN= "pref_key_vibrateWhen";
public static final String NOTIFICATION_RINGTONE = "pref_key_ringtone";
public static final String AUTO_RETRIEVAL = "pref_key_mms_auto_retrieval";
public static final String RETRIEVAL_DURING_ROAMING = "pref_key_mms_retrieval_during_roaming";
public static final String AUTO_DELETE = "pref_key_auto_delete";
public static final String FORWARDING_NUMBER = "pref_key_forwarding_number";
public static final String SET_SMS_TEXT_SIZE = "pref_key_set_sms_text_size";
// Menu entries
private static final int MENU_RESTORE_DEFAULTS = 1;
private Preference mSmsLimitPref;
private Preference mSmsDeliveryReportPref;
private Preference mMmsLimitPref;
private Preference mMmsDeliveryReportPref;
private Preference mMmsReadReportPref;
private Preference mManageSimPref;
private Preference mSmsRetryTimes;
private Preference mSmscPref;
private Preference mAutoDeletePred;
private Preference mSaveToSimPref;
private Preference mClearHistoryPref;
private ListPreference mVibrateWhenPref;
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 begin ======
private ListPreference mValidityPref;
public static final String SMS_VALIDITY= "pref_key_sms_validity";
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 end ======
private Recycler mSmsRecycler;
private Recycler mMmsRecycler;
private static final int CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG = 3;
private static final String LOG_TAG = "MessagingPreferenceActivity";
private EditText smscEdit;
private String smscStr;
private Context mContext;
private static String mode = "";
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.preferences);
mContext=this;
setMessagePreferences();
}
private void setMessagePreferences() {
mManageSimPref = findPreference("pref_key_manage_sim_messages");
mSmsLimitPref = findPreference("pref_key_sms_delete_limit");
mSmsDeliveryReportPref = findPreference("pref_key_sms_delivery_reports");
mSmsRetryTimes = findPreference("pref_key_sms_retry_times");
mMmsDeliveryReportPref = findPreference("pref_key_mms_delivery_reports");
mMmsReadReportPref = findPreference("pref_key_mms_read_reports");
mMmsLimitPref = findPreference("pref_key_mms_delete_limit");
mClearHistoryPref = findPreference("pref_key_mms_clear_history");
mVibrateWhenPref = (ListPreference) findPreference(NOTIFICATION_VIBRATE_WHEN);
mSmscPref = findPreference("pref_key_sim_smsc");
mAutoDeletePred = findPreference("pref_key_auto_delete");
mSaveToSimPref = findPreference("pref_key_sms_save_to_sim_card");
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 begin ======
mValidityPref = (ListPreference) findPreference(SMS_VALIDITY);
mValidityPref.setOnPreferenceChangeListener(this);
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 end ======
if (!MmsApp.getApplication().hasAnyIccCard()) {
PreferenceCategory smsCategory =
(PreferenceCategory)findPreference("pref_key_sms_settings");
smsCategory.removePreference(mManageSimPref);
smsCategory.removePreference(mSmscPref);
smsCategory.removePreference(mSaveToSimPref);
}
Intent it = getIntent();
Bundle bundle = it.getExtras();
if (bundle != null) {
mode = bundle.getString("mode");
}
PreferenceCategory smsStoreCategory =
(PreferenceCategory)findPreference("pref_key_storage_settings");
if ("folder".equals(mode)) {
smsStoreCategory.removePreference(mAutoDeletePred);
smsStoreCategory.removePreference(mSmsLimitPref);
smsStoreCategory.removePreference(mMmsLimitPref);
smsStoreCategory.setTitle(getString(R.string.display_store_title));
} else {
smsStoreCategory.setTitle(getString(R.string.pref_sms_storage_title));
}
boolean SMSDeliveryReport = Resources.getSystem()
.getBoolean(com.android.internal.R.bool.config_sms_delivery_reports_support);
if (!SMSDeliveryReport) {
PreferenceCategory smsCategory =
(PreferenceCategory)findPreference("pref_key_sms_settings");
smsCategory.removePreference(mSmsDeliveryReportPref);
if (!MmsApp.getApplication().getTelephonyManager().hasIccCard()) {
getPreferenceScreen().removePreference(smsCategory);
}
}
if (!MmsConfig.getMmsEnabled()) {
// No Mms, remove all the mms-related preferences
PreferenceCategory mmsOptions =
(PreferenceCategory)findPreference("pref_key_mms_settings");
getPreferenceScreen().removePreference(mmsOptions);
PreferenceCategory storageOptions =
(PreferenceCategory)findPreference("pref_key_storage_settings");
storageOptions.removePreference(findPreference("pref_key_mms_delete_limit"));
} else {
boolean MMSDeliveryReport = Resources.getSystem()
.getBoolean(com.android.internal.R.bool.config_mms_delivery_reports_support);
boolean MMSReadReport = Resources.getSystem()
.getBoolean(com.android.internal.R.bool.config_mms_read_reports_support);
if (!MMSDeliveryReport) {
PreferenceCategory mmsOptions =
(PreferenceCategory)findPreference("pref_key_mms_settings");
mmsOptions.removePreference(mMmsDeliveryReportPref);
}
if (!MMSReadReport) {
PreferenceCategory mmsOptions =
(PreferenceCategory)findPreference("pref_key_mms_settings");
mmsOptions.removePreference(mMmsReadReportPref);
}
}
// If needed, migrate vibration setting from a previous version
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if (!sharedPreferences.contains(NOTIFICATION_VIBRATE_WHEN) &&
sharedPreferences.contains(NOTIFICATION_VIBRATE)) {
int stringId = sharedPreferences.getBoolean(NOTIFICATION_VIBRATE, false) ?
R.string.prefDefault_vibrate_true :
R.string.prefDefault_vibrate_false;
mVibrateWhenPref.setValue(getString(stringId));
}
if(sharedPreferences.contains(SMS_RETRY_TIMES)){
boolean smsRetryTimes = sharedPreferences.getBoolean(SMS_RETRY_TIMES, true);
((CheckBoxPreference)mSmsRetryTimes).setChecked(smsRetryTimes);
}
mSmsRecycler = Recycler.getSmsRecycler();
mMmsRecycler = Recycler.getMmsRecycler();
// Fix up the recycler's summary with the correct values
setSmsDisplayLimit();
setMmsDisplayLimit();
setMmsMemoryUsage();
}
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 begin ======
protected void onResume() {
super.onResume();
int validity = Settings.System.getInt(getContentResolver(), Settings.System.SMS_VALIDITY , 255);
Log.d(LOG_TAG, "MessageingPreference --> onResume,validity:"+validity);
mValidityPref.setValue(String.valueOf(validity));
}
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 end ======
private void setMmsMemoryUsage(){
Uri mMessageUri;
ContentResolver cr = getContentResolver();
AsyncQueryHandler mQueryHandler;
String projection[]={"_id"};
Uri uri = Uri.parse("content://mms-sms/complete-conversations");
mQueryHandler = new AsyncQueryHandler(cr) {
protected void onQueryComplete(int token, Object cookie, Cursor c) {
showMmsMemoryUsage(c);
}
};
mQueryHandler.startQuery(0, null, uri, projection, null, null, null);
}
private void showMmsMemoryUsage(Cursor cursor) {
CheckMmsMemoryUsageTask showMemoryUsageTask = new CheckMmsMemoryUsageTask(this,cursor);
showMemoryUsageTask.execute();
}
private class CheckMmsMemoryUsageTask extends AsyncTask {
Context mContext;
Cursor c;
public CheckMmsMemoryUsageTask(Context context, Cursor cursor) {
mContext = context;
c = cursor;
}
@Override
protected void onPreExecute() {
findPreference("memory_internal_usage").setSummary(
getString(R.string.mms_memory_usage_progressDialog_title));
}
@Override
protected Object doInBackground(Object... params) {
if (c == null) {
return null;
}
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
long totalBlocks = stat.getBlockCount();
SlideshowModel mSlideshow;
int mMessageSize = 0;
if (c.getCount()>0 && c.moveToFirst()) {
do {
Long mMsgId = c.getLong(c.getColumnIndex("_id"));
try {
PduPersister p = PduPersister.getPduPersister(mContext);
Uri mMessageUri = ContentUris.withAppendedId(Mms.CONTENT_URI, mMsgId);
if (!(p.load(mMessageUri) instanceof com.google.android.mms.pdu.DeliveryInd)) {
MultimediaMessagePdu msg = (MultimediaMessagePdu) p.load(mMessageUri);
mSlideshow = SlideshowModel.createFromPduBody(mContext, msg.getBody(), false);
mMessageSize += mSlideshow.getTotalMessageSize();
}
} catch (Exception e) {
}
} while (c.moveToNext());
}
long availableSize = availableBlocks * blockSize - 500 * 1024;
long finalTotalSize = totalBlocks * blockSize;
if (availableSize < 0) {
availableSize = 0;
}
if (finalTotalSize < 0) {
finalTotalSize = 0;
}
return formatSize(mMessageSize) + " / " + formatSize(availableSize) + " / " + formatSize(finalTotalSize);
}
@Override
protected void onPostExecute(Object result) {
if (result != null) {
findPreference("memory_internal_usage").setSummary(result.toString());
}
if ( c != null ) {
c.close();
}
}
}
private String formatSize(long size) {
return Formatter.formatFileSize(this, size);
}
// modify by zhengshenglan for NEWMS00113028 begin at 16/08/2011
private void setSmsDisplayLimit() {
mSmsLimitPref.setSummary(
//getString(R.string.pref_summary_delete_limit,
getString(R.string.pref_summary_delete_limit_sms,
mSmsRecycler.getMessageLimit(this)));
}
private void setMmsDisplayLimit() {
mMmsLimitPref.setSummary(
// getString(R.string.pref_summary_delete_limit,
getString(R.string.pref_summary_delete_limit_mms,
mMmsRecycler.getMessageLimit(this)));
}
// modify by zhengshenglan for NEWMS00113028 end at 16/08/2011
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.clear();
menu.add(0, MENU_RESTORE_DEFAULTS, 0, R.string.restore_default);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_RESTORE_DEFAULTS:
restoreDefaultPreferences();
return true;
}
return false;
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
if (preference == mSmsLimitPref) {
new NumberPickerDialog(this,
mSmsLimitListener,
mSmsRecycler.getMessageLimit(this),
mSmsRecycler.getMessageMinLimit(),
mSmsRecycler.getMessageMaxLimit(),
R.string.pref_title_sms_delete,
false).show();
} else if (preference == mMmsLimitPref) {
new NumberPickerDialog(this,
mMmsLimitListener,
mMmsRecycler.getMessageLimit(this),
mMmsRecycler.getMessageMinLimit(),
mMmsRecycler.getMessageMaxLimit(),
R.string.pref_title_mms_delete,
true).show();
} else if (preference == mManageSimPref) {
Intent intent=new Intent(this, SimListActivity.class);
intent.putExtra(SimListActivity.Mode.KEY,SimListActivity.Mode.MANAGE_MSG);
startActivity(intent);
} else if (preference == mSmscPref) {
Intent intent=new Intent(this, SimListActivity.class);
intent.putExtra(SimListActivity.Mode.KEY,SimListActivity.Mode.SMSC);
startActivity(intent);
} else if (preference == mClearHistoryPref) {
showDialog(CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG);
return true;
} else if(preference == mSmsRetryTimes){
CheckBoxPreference checkPre = (CheckBoxPreference)preference;
SharedPreferences.Editor editPrefs =PreferenceManager.getDefaultSharedPreferences(this).edit();
if(checkPre.isChecked()){
//Toast.makeText(this, "on", Toast.LENGTH_LONG).show();
SmsManager smsManager = SmsManager.getDefault();
smsManager.setMaxSendRetries(3);
}else{
//Toast.makeText(this, "off", Toast.LENGTH_LONG).show();
SmsManager smsManager = SmsManager.getDefault();
smsManager.setMaxSendRetries(1);
}
editPrefs.putBoolean(SMS_RETRY_TIMES, checkPre.isChecked());
editPrefs.commit();
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
private void restoreDefaultPreferences() {
PreferenceManager.getDefaultSharedPreferences(this)
.edit().clear().apply();
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
setMessagePreferences();
Settings.System.putInt(getContentResolver(), Settings.System.SMS_VALIDITY , 255);
int validity = Settings.System.getInt(getContentResolver(), Settings.System.SMS_VALIDITY , 255);
mValidityPref.setValue(String.valueOf(validity));
}
NumberPickerDialog.OnNumberSetListener mSmsLimitListener =
new NumberPickerDialog.OnNumberSetListener() {
public void onNumberSet(int limit) {
mSmsRecycler.setMessageLimit(MessagingPreferenceActivity.this, limit);
setSmsDisplayLimit();
}
};
NumberPickerDialog.OnNumberSetListener mMmsLimitListener =
new NumberPickerDialog.OnNumberSetListener() {
public void onNumberSet(int limit) {
mMmsRecycler.setMessageLimit(MessagingPreferenceActivity.this, limit);
setMmsDisplayLimit();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case CONFIRM_CLEAR_SEARCH_HISTORY_DIALOG:
return new AlertDialog.Builder(MessagingPreferenceActivity.this)
.setTitle(R.string.confirm_clear_search_title)
.setMessage(R.string.confirm_clear_search_text)
.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
SearchRecentSuggestions recent =
((MmsApp)getApplication()).getRecentSuggestions();
if (recent != null) {
recent.clearHistory();
}
dialog.dismiss();
}
})
.setNegativeButton(android.R.string.cancel, null)
.setIcon(android.R.drawable.ic_dialog_alert)
.create();
}
return super.onCreateDialog(id);
}
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 begin ======
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
mValidityPref.setValue(value);
int validity = Integer.parseInt(value);
Log.d(LOG_TAG, "MessageingPreference --> onPreferenceChange,newValue:"+newValue);
Settings.System.putInt(getContentResolver(), Settings.System.SMS_VALIDITY, validity);
return false;
}
//====== fixed CR<NEWMSOO112910> by luning at 11-08-27 end ======
}