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;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.app.Application;
21bb8edcae15a50b3651261db70791afc668aae294Tom Taylorimport android.content.Context;
22087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chenimport android.content.Intent;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.content.res.Configuration;
240ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylorimport android.drm.DrmManagerClient;
254759133e3c935e751815bf4f997d029caa64d889Bai Taoimport android.location.Country;
264759133e3c935e751815bf4f997d029caa64d889Bai Taoimport android.location.CountryDetector;
274759133e3c935e751815bf4f997d029caa64d889Bai Taoimport android.location.CountryListener;
28c7797433b1641be0cb77e02541b8bfed94c48835Tom Taylorimport android.os.StrictMode;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport android.preference.PreferenceManager;
308447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylorimport android.provider.SearchRecentSuggestions;
31bb8edcae15a50b3651261db70791afc668aae294Tom Taylorimport android.telephony.TelephonyManager;
322fddde28ed2ccb3c156d596160e3a504c83ce444Tom Taylorimport android.util.Log;
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.data.Contact;
3551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.data.Conversation;
3651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.layout.LayoutManager;
3751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.transaction.MessagingNotification;
38087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chenimport com.android.mms.transaction.MmsSystemEventReceiver;
39087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chenimport com.android.mms.transaction.SmsReceiver;
40087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chenimport com.android.mms.transaction.SmsReceiverService;
4151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.DownloadManager;
4251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.DraftCache;
4351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.PduLoaderManager;
4451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.RateController;
4551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylorimport com.android.mms.util.ThumbnailManager;
4651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class MmsApp extends Application {
485d2d0046ada7b53205e537d8675d32a8785e8d1dThe Android Open Source Project    public static final String LOG_TAG = "Mms";
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
508447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor    private SearchRecentSuggestions mRecentSuggestions;
51bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    private TelephonyManager mTelephonyManager;
524759133e3c935e751815bf4f997d029caa64d889Bai Tao    private CountryDetector mCountryDetector;
534759133e3c935e751815bf4f997d029caa64d889Bai Tao    private CountryListener mCountryListener;
544759133e3c935e751815bf4f997d029caa64d889Bai Tao    private String mCountryIso;
55bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    private static MmsApp sMmsApp = null;
5651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    private PduLoaderManager mPduLoaderManager;
5751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    private ThumbnailManager mThumbnailManager;
580ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    private DrmManagerClient mDrmManagerClient;
598447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onCreate() {
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super.onCreate();
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6408712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor        if (Log.isLoggable(LogTag.STRICT_MODE_TAG, Log.DEBUG)) {
6508712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor            // Log tag for enabling/disabling StrictMode violation log. This will dump a stack
6608712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor            // in the log that shows the StrictMode violator.
6708712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor            // To enable: adb shell setprop log.tag.Mms:strictmode DEBUG
6808712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor            StrictMode.setThreadPolicy(
6908712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor                    new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
7008712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor        }
7108712ce9d30d4f28476436b218f2b76c7bdfb89cTom Taylor
72bb8edcae15a50b3651261db70791afc668aae294Tom Taylor        sMmsApp = this;
73bb8edcae15a50b3651261db70791afc668aae294Tom Taylor
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Load the default preference values
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
770e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        // Figure out the country *before* loading contacts and formatting numbers
780e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        mCountryDetector = (CountryDetector) getSystemService(Context.COUNTRY_DETECTOR);
790e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        mCountryListener = new CountryListener() {
800e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor            @Override
810e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor            public synchronized void onCountryDetected(Country country) {
820e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor                mCountryIso = country.getCountryIso();
830e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor            }
840e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        };
850e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        mCountryDetector.addCountryListener(mCountryListener, getMainLooper());
860e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor
8751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        Context context = getApplicationContext();
8851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mPduLoaderManager = new PduLoaderManager(context);
8951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mThumbnailManager = new ThumbnailManager(context);
9051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
9186a1cf79bf92dbb2b9d09431379bff6de83c2581Tom Taylor        MmsConfig.init(this);
921d98ae0b203e01034ddead4214d1520ce863a23bFicus Kirkpatrick        Contact.init(this);
9307e7775d5a792334b89436bf5479bfd5abeeb8c4Ficus Kirkpatrick        DraftCache.init(this);
9470c73e05a792832aa28da751cdaf3fa83a7b8113Ficus Kirkpatrick        Conversation.init(this);
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        DownloadManager.init(this);
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        RateController.init(this);
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutManager.init(this);
9870f5af8fd89d66ae246a805d10a50540746319aaWei Huang        MessagingNotification.init(this);
99087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen
100087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen        activePendingMessages();
101087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen    }
102087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen
103087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen    /**
104087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen     * Try to process all pending messages(which were interrupted by user, OOM, Mms crashing,
105087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen     * etc...) when Mms app is (re)launched.
106087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen     */
107087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen    private void activePendingMessages() {
108087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen        // For Mms: try to process all pending transactions if possible
109087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen        MmsSystemEventReceiver.wakeUpService(this);
110087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen
111087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen        // For Sms: retry to send smses in outbox and queued box
112087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen        sendBroadcast(new Intent(SmsReceiverService.ACTION_SEND_INACTIVE_MESSAGE,
113087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen                null,
114087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen                this,
115087ef9de80082cd001e75c15e1f93cc65d50ed27Roger Chen                SmsReceiver.class));
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
118bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    synchronized public static MmsApp getApplication() {
119bb8edcae15a50b3651261db70791afc668aae294Tom Taylor        return sMmsApp;
120bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    }
121bb8edcae15a50b3651261db70791afc668aae294Tom Taylor
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onTerminate() {
1244759133e3c935e751815bf4f997d029caa64d889Bai Tao        mCountryDetector.removeCountryListener(mCountryListener);
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
12851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public void onLowMemory() {
12951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        super.onLowMemory();
13051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
13151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mPduLoaderManager.onLowMemory();
13251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        mThumbnailManager.onLowMemory();
13351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
13451e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
13551e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public PduLoaderManager getPduLoaderManager() {
13651e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        return mPduLoaderManager;
13751e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
13851e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
13951e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    public ThumbnailManager getThumbnailManager() {
14051e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor        return mThumbnailManager;
14151e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    }
14251e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor
14351e4621fa12400b1e79cc18b7bb0f9a83af6b622Tom Taylor    @Override
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void onConfigurationChanged(Configuration newConfig) {
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        LayoutManager.getInstance().onConfigurationChanged(newConfig);
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
1478447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor
1488447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor    /**
149bb8edcae15a50b3651261db70791afc668aae294Tom Taylor     * @return Returns the TelephonyManager.
150bb8edcae15a50b3651261db70791afc668aae294Tom Taylor     */
151bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    public TelephonyManager getTelephonyManager() {
152bb8edcae15a50b3651261db70791afc668aae294Tom Taylor        if (mTelephonyManager == null) {
153bb8edcae15a50b3651261db70791afc668aae294Tom Taylor            mTelephonyManager = (TelephonyManager)getApplicationContext()
154bb8edcae15a50b3651261db70791afc668aae294Tom Taylor                    .getSystemService(Context.TELEPHONY_SERVICE);
155bb8edcae15a50b3651261db70791afc668aae294Tom Taylor        }
156bb8edcae15a50b3651261db70791afc668aae294Tom Taylor        return mTelephonyManager;
157bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    }
158bb8edcae15a50b3651261db70791afc668aae294Tom Taylor
159bb8edcae15a50b3651261db70791afc668aae294Tom Taylor    /**
1608447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor     * Returns the content provider wrapper that allows access to recent searches.
1618447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor     * @return Returns the content provider wrapper that allows access to recent searches.
1628447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor     */
1638447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor    public SearchRecentSuggestions getRecentSuggestions() {
164f114492537753bc68640d4a0d403861387296bcbMark Wagner        /*
1658447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor        if (mRecentSuggestions == null) {
1668447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor            mRecentSuggestions = new SearchRecentSuggestions(this,
1678447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor                    SuggestionsProvider.AUTHORITY, SuggestionsProvider.MODE);
1688447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor        }
169f114492537753bc68640d4a0d403861387296bcbMark Wagner        */
1708447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor        return mRecentSuggestions;
1718447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor    }
1728447aa1d84a469e8938b53a60b0763633b08ae98Tom Taylor
17363b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor    // This function CAN return null.
1744759133e3c935e751815bf4f997d029caa64d889Bai Tao    public String getCurrentCountryIso() {
17563b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor        if (mCountryIso == null) {
17663b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor            Country country = mCountryDetector.detectCountry();
17763b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor            if (country != null) {
17863b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor                mCountryIso = country.getCountryIso();
17963b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor            }
18063b5440a97cfccc17b3ad24bb89e34c01d893676Tom Taylor        }
1810e49d13dfd2bbd949a5cb2e66d99a004e5427088Tom Taylor        return mCountryIso;
1824759133e3c935e751815bf4f997d029caa64d889Bai Tao    }
1830ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor
1840ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    public DrmManagerClient getDrmManagerClient() {
1850ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        if (mDrmManagerClient == null) {
1860ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor            mDrmManagerClient = new DrmManagerClient(getApplicationContext());
1870ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        }
1880ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor        return mDrmManagerClient;
1890ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor    }
1900ecc26df09777835cfa8dbfd3c48ca7b7fa7f011Tom Taylor
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
192