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