172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/* 272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 Esmertec AG. 372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License. 772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at 872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * 1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and 1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License. 1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */ 1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.util; 1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.R; 2133a87f96f8c625aa10131a77a3968c97c4ec5a62Ficus Kirkpatrickimport com.android.mms.data.Contact; 2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.ui.MessagingPreferenceActivity; 23f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.MmsException; 24f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.EncodedStringValue; 25f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.NotificationInd; 26f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.google.android.mms.pdu.PduPersister; 27fd644551e8506266aad2b76463b51b44154ed62fTom Taylorimport android.database.sqlite.SqliteWrapper; 28f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.android.internal.telephony.TelephonyIntents; 29f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport com.android.internal.telephony.TelephonyProperties; 3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.BroadcastReceiver; 3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.ContentValues; 3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Context; 3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.Intent; 3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.IntentFilter; 3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.SharedPreferences; 3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.SharedPreferences.OnSharedPreferenceChangeListener; 3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.database.Cursor; 3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.net.Uri; 4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.os.Handler; 4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.preference.PreferenceManager; 42f7e8281a223af6228e6399055a6197a1edd9bc3aTom Taylorimport android.provider.Telephony.Mms; 4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.telephony.ServiceState; 4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.util.Log; 4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.widget.Toast; 4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 476be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylorimport android.os.SystemProperties; 486be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor 4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class DownloadManager { 5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final String TAG = "DownloadManager"; 5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static final boolean DEBUG = false; 52150c4179995cc0a75f934ef194372f9295957ca2Joe Onorato private static final boolean LOCAL_LOGV = false; 5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 54ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor public static final int DEFERRED_MASK = 0x04; 5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 565c113729220385c970b9e941b93a162054285209Tom Taylor public static final int STATE_UNKNOWN = 0x00; 5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final int STATE_UNSTARTED = 0x80; 5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final int STATE_DOWNLOADING = 0x81; 5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final int STATE_TRANSIENT_FAILURE = 0x82; 6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static final int STATE_PERMANENT_FAILURE = 0x87; 6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final Context mContext; 6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final Handler mHandler; 6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final SharedPreferences mPreferences; 6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private boolean mAutoDownload; 6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final OnSharedPreferenceChangeListener mPreferencesChangeListener = 6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new OnSharedPreferenceChangeListener() { 6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (MessagingPreferenceActivity.AUTO_RETRIEVAL.equals(key) 7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project || MessagingPreferenceActivity.RETRIEVAL_DURING_ROAMING.equals(key)) { 7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "Preferences updated."); 7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project synchronized (sInstance) { 7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mAutoDownload = getAutoDownloadState(prefs); 7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "mAutoDownload ------> " + mAutoDownload); 8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private final BroadcastReceiver mRoamingStateListener = 8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new BroadcastReceiver() { 8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project @Override 8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (TelephonyIntents.ACTION_SERVICE_STATE_CHANGED.equals(intent.getAction())) { 9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "Service state changed: " + intent.getExtras()); 9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ServiceState state = ServiceState.newFromBundle(intent.getExtras()); 9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean isRoaming = state.getRoaming(); 9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "roaming ------> " + isRoaming); 9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project synchronized (sInstance) { 10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mAutoDownload = getAutoDownloadState(mPreferences, isRoaming); 10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "mAutoDownload ------> " + mAutoDownload); 10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }; 10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private static DownloadManager sInstance; 11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private DownloadManager(Context context) { 11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mContext = context; 11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mHandler = new Handler(); 11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mPreferences = PreferenceManager.getDefaultSharedPreferences(context); 11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mPreferences.registerOnSharedPreferenceChangeListener(mPreferencesChangeListener); 11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project context.registerReceiver( 11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mRoamingStateListener, 12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project new IntentFilter(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)); 12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mAutoDownload = getAutoDownloadState(mPreferences); 12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "mAutoDownload ------> " + mAutoDownload); 12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public boolean isAuto() { 12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mAutoDownload; 13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static void init(Context context) { 13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "DownloadManager.init()"); 13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (sInstance != null) { 13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.w(TAG, "Already initialized."); 13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project sInstance = new DownloadManager(context); 14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public static DownloadManager getInstance() { 14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (sInstance == null) { 14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project throw new IllegalStateException("Uninitialized."); 14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return sInstance; 14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static boolean getAutoDownloadState(SharedPreferences prefs) { 15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return getAutoDownloadState(prefs, isRoaming()); 15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static boolean getAutoDownloadState(SharedPreferences prefs, boolean roaming) { 15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean autoDownload = prefs.getBoolean( 15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessagingPreferenceActivity.AUTO_RETRIEVAL, true); 15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "auto download without roaming -> " + autoDownload); 16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (autoDownload) { 16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project boolean alwaysAuto = prefs.getBoolean( 16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project MessagingPreferenceActivity.RETRIEVAL_DURING_ROAMING, false); 16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "auto download during roaming -> " + alwaysAuto); 16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (!roaming || alwaysAuto) { 17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return true; 17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return false; 17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project static boolean isRoaming() { 1786be18bedb5b87dbbcdb54f37d5a0945bd0f71377Tom Taylor // TODO: fix and put in Telephony layer 17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String roaming = SystemProperties.get( 18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, null); 18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (LOCAL_LOGV) { 18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.v(TAG, "roaming ------> " + roaming); 18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return "true".equals(roaming); 18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void markState(final Uri uri, int state) { 188ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom // Notify user if the message has expired. 189ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom try { 190ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom NotificationInd nInd = (NotificationInd) PduPersister.getPduPersister(mContext) 191ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom .load(uri); 192ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom if ((nInd.getExpiry() < System.currentTimeMillis()/1000L) 193ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom && (state == STATE_DOWNLOADING)) { 194ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom mHandler.post(new Runnable() { 195ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom public void run() { 196406292d188e17345c4d9373ce9c2e96fd1e6b017Tom Taylor Toast.makeText(mContext, R.string.service_message_not_found, 197ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom Toast.LENGTH_LONG).show(); 198ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom } 199ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom }); 200ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom SqliteWrapper.delete(mContext, mContext.getContentResolver(), uri, null, null); 201ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom return; 202ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom } 203ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom } catch(MmsException e) { 204ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom Log.e(TAG, e.getMessage(), e); 205ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom return; 206ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom } 207ff6f8c7a9fb292996311ad24e4a5ab79fa5e557eSatish Roddom 20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Notify user if downloading permanently failed. 20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (state == STATE_PERMANENT_FAILURE) { 21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project mHandler.post(new Runnable() { 21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public void run() { 21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Toast.makeText(mContext, getMessage(uri), 21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Toast.LENGTH_LONG).show(); 21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } catch (MmsException e) { 21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Log.e(TAG, e.getMessage(), e); 21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project }); 22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } else if (!mAutoDownload) { 22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project state |= DEFERRED_MASK; 22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // Use the STATUS field to store the state of downloading process 22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project // because it's useless for M-Notification.ind. 22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project ContentValues values = new ContentValues(1); 22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project values.put(Mms.STATUS, state); 22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project SqliteWrapper.update(mContext, mContext.getContentResolver(), 22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project uri, values, null, null); 23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 2320d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom public void showErrorCodeToast(int errorStr) { 2330d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom final int errStr = errorStr; 2340d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom mHandler.post(new Runnable() { 2350d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom public void run() { 2360d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom try { 2370d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom Toast.makeText(mContext, errStr, Toast.LENGTH_LONG).show(); 2380d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom } catch (Exception e) { 2390d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom Log.e(TAG,"Caught an exception in showErrorCodeToast"); 2400d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom } 2410d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom } 2420d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom }); 2430d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom } 2440d35c9dd276d09d00169f5b01a3dff81794928ddSatish Roddom 24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project private String getMessage(Uri uri) throws MmsException { 24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project NotificationInd ind = (NotificationInd) PduPersister 24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project .getPduPersister(mContext).load(uri); 24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project EncodedStringValue v = ind.getSubject(); 25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String subject = (v != null) ? v.getString() 25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project : mContext.getString(R.string.no_subject); 25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project v = ind.getFrom(); 25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project String from = (v != null) 255715e32f97bd9d8ce4b5ba650b97ba4b137150456Tom Taylor ? Contact.get(v.getString(), false).getName() 25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project : mContext.getString(R.string.unknown_sender); 25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return mContext.getString(R.string.dl_failure_notification, subject, from); 25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project public int getState(Uri uri) { 26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project Cursor cursor = SqliteWrapper.query(mContext, mContext.getContentResolver(), 26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project uri, new String[] {Mms.STATUS}, null, null, null); 26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project 26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor != null) { 26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project try { 26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project if (cursor.moveToFirst()) { 268ac2f043e7ded55ce835d474e578155ecc0c79668Tom Taylor return cursor.getInt(0) & ~DEFERRED_MASK; 26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } finally { 27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project cursor.close(); 27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project return STATE_UNSTARTED; 27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project } 27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project} 277