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