diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/android/phone/CallerInfoCache.java | 309 | ||||
| -rw-r--r-- | src/com/android/phone/CarrierConfigLoader.java | 8 | ||||
| -rw-r--r-- | src/com/android/phone/EditPhoneNumberPreference.java | 2 | ||||
| -rw-r--r-- | src/com/android/phone/PhoneGlobals.java | 7 |
4 files changed, 5 insertions, 321 deletions
diff --git a/src/com/android/phone/CallerInfoCache.java b/src/com/android/phone/CallerInfoCache.java deleted file mode 100644 index 2707c7cc8..000000000 --- a/src/com/android/phone/CallerInfoCache.java +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) 2012 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.phone; - -import android.content.Context; -import android.database.Cursor; -import android.os.AsyncTask; -import android.os.PowerManager; -import android.os.SystemProperties; -import android.provider.ContactsContract.CommonDataKinds.Callable; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.Data; -import android.telephony.PhoneNumberUtils; -import android.util.Log; - -import java.util.HashMap; -import java.util.Map.Entry; - -/** - * Holds "custom ringtone" and "send to voicemail" information for each contact as a fallback of - * contacts database. The cached information is refreshed periodically and used when database - * lookup (via ContentResolver) takes longer time than expected. - * - * The data inside this class shouldn't be treated as "primary"; they may not reflect the - * latest information stored in the original database. - */ -public class CallerInfoCache { - private static final String LOG_TAG = CallerInfoCache.class.getSimpleName(); - private static final boolean DBG = - (PhoneGlobals.DBG_LEVEL >= 1) && (SystemProperties.getInt("ro.debuggable", 0) == 1); - - /** This must not be set to true when submitting changes. */ - private static final boolean VDBG = false; - - public static final int MESSAGE_UPDATE_CACHE = 0; - - // Assuming DATA.DATA1 corresponds to Phone.NUMBER and SipAddress.ADDRESS, we just use - // Data columns as much as we can. One exception: because normalized numbers won't be used in - // SIP cases, Phone.NORMALIZED_NUMBER is used as is instead of using Data. - private static final String[] PROJECTION = new String[] { - Data.DATA1, // 0 - Phone.NORMALIZED_NUMBER, // 1 - Data.CUSTOM_RINGTONE, // 2 - Data.SEND_TO_VOICEMAIL // 3 - }; - - private static final int INDEX_NUMBER = 0; - private static final int INDEX_NORMALIZED_NUMBER = 1; - private static final int INDEX_CUSTOM_RINGTONE = 2; - private static final int INDEX_SEND_TO_VOICEMAIL = 3; - - private static final String SELECTION = "(" - + "(" + Data.CUSTOM_RINGTONE + " IS NOT NULL OR " + Data.SEND_TO_VOICEMAIL + "=1)" - + " AND " + Data.DATA1 + " IS NOT NULL)"; - - public static class CacheEntry { - public final String customRingtone; - public final boolean sendToVoicemail; - public CacheEntry(String customRingtone, boolean shouldSendToVoicemail) { - this.customRingtone = customRingtone; - this.sendToVoicemail = shouldSendToVoicemail; - } - - @Override - public String toString() { - return "ringtone: " + customRingtone + ", " + sendToVoicemail; - } - } - - private class CacheAsyncTask extends AsyncTask<Void, Void, Void> { - - private PowerManager.WakeLock mWakeLock; - - /** - * Call {@link PowerManager.WakeLock#acquire} and call {@link AsyncTask#execute(Object...)}, - * guaranteeing the lock is held during the asynchronous task. - */ - public void acquireWakeLockAndExecute() { - // Prepare a separate partial WakeLock than what PhoneApp has so to avoid - // unnecessary conflict. - PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); - mWakeLock.acquire(); - execute(); - } - - @Override - protected Void doInBackground(Void... params) { - if (DBG) log("Start refreshing cache."); - refreshCacheEntry(); - return null; - } - - @Override - protected void onPostExecute(Void result) { - if (VDBG) log("CacheAsyncTask#onPostExecute()"); - super.onPostExecute(result); - releaseWakeLock(); - } - - @Override - protected void onCancelled(Void result) { - if (VDBG) log("CacheAsyncTask#onCanceled()"); - super.onCancelled(result); - releaseWakeLock(); - } - - private void releaseWakeLock() { - if (mWakeLock != null && mWakeLock.isHeld()) { - mWakeLock.release(); - } - } - } - - private final Context mContext; - - /** - * The mapping from number to CacheEntry. - * - * The number will be: - * - last 7 digits of each "normalized phone number when it is for PSTN phone call, or - * - a full SIP address for SIP call - * - * When cache is being refreshed, this whole object will be replaced with a newer object, - * instead of updating elements inside the object. "volatile" is used to make - * {@link #getCacheEntry(String)} access to the newer one every time when the object is - * being replaced. - */ - private volatile HashMap<String, CacheEntry> mNumberToEntry; - - /** - * Used to remember if the previous task is finished or not. Should be set to null when done. - */ - private CacheAsyncTask mCacheAsyncTask; - - public static CallerInfoCache init(Context context) { - if (DBG) log("init()"); - CallerInfoCache cache = new CallerInfoCache(context); - // The first cache should be available ASAP. - cache.startAsyncCache(); - return cache; - } - - private CallerInfoCache(Context context) { - mContext = context; - mNumberToEntry = new HashMap<String, CacheEntry>(); - } - - /* package */ void startAsyncCache() { - if (DBG) log("startAsyncCache"); - - if (mCacheAsyncTask != null) { - Log.w(LOG_TAG, "Previous cache task is remaining."); - mCacheAsyncTask.cancel(true); - } - mCacheAsyncTask = new CacheAsyncTask(); - mCacheAsyncTask.acquireWakeLockAndExecute(); - } - - private void refreshCacheEntry() { - if (VDBG) log("refreshCacheEntry() started"); - - // There's no way to know which part of the database was updated. Also we don't want - // to block incoming calls asking for the cache. So this method just does full query - // and replaces the older cache with newer one. To refrain from blocking incoming calls, - // it keeps older one as much as it can, and replaces it with newer one inside a very small - // synchronized block. - - Cursor cursor = null; - try { - cursor = mContext.getContentResolver().query(Callable.CONTENT_URI, - PROJECTION, SELECTION, null, null); - if (cursor != null) { - // We don't want to block real in-coming call, so prepare a completely fresh - // cache here again, and replace it with older one. - final HashMap<String, CacheEntry> newNumberToEntry = - new HashMap<String, CacheEntry>(cursor.getCount()); - - while (cursor.moveToNext()) { - final String number = cursor.getString(INDEX_NUMBER); - String normalizedNumber = cursor.getString(INDEX_NORMALIZED_NUMBER); - if (normalizedNumber == null) { - // There's no guarantee normalized numbers are available every time and - // it may become null sometimes. Try formatting the original number. - normalizedNumber = PhoneNumberUtils.normalizeNumber(number); - } - final String customRingtone = cursor.getString(INDEX_CUSTOM_RINGTONE); - final boolean sendToVoicemail = cursor.getInt(INDEX_SEND_TO_VOICEMAIL) == 1; - - if (PhoneNumberUtils.isUriNumber(number)) { - // SIP address case - putNewEntryWhenAppropriate( - newNumberToEntry, number, customRingtone, sendToVoicemail); - } else { - // PSTN number case - // Each normalized number may or may not have full content of the number. - // Contacts database may contain +15001234567 while a dialed number may be - // just 5001234567. Also we may have inappropriate country - // code in some cases (e.g. when the location of the device is inconsistent - // with the device's place). So to avoid confusion we just rely on the last - // 7 digits here. It may cause some kind of wrong behavior, which is - // unavoidable anyway in very rare cases.. - final int length = normalizedNumber.length(); - final String key = length > 7 - ? normalizedNumber.substring(length - 7, length) - : normalizedNumber; - putNewEntryWhenAppropriate( - newNumberToEntry, key, customRingtone, sendToVoicemail); - } - } - - if (VDBG) { - Log.d(LOG_TAG, "New cache size: " + newNumberToEntry.size()); - for (Entry<String, CacheEntry> entry : newNumberToEntry.entrySet()) { - Log.d(LOG_TAG, "Number: " + entry.getKey() + " -> " + entry.getValue()); - } - } - - mNumberToEntry = newNumberToEntry; - - if (DBG) { - log("Caching entries are done. Total: " + newNumberToEntry.size()); - } - } else { - // Let's just wait for the next refresh.. - // - // If the cursor became null at that exact moment, probably we don't want to - // drop old cache. Also the case is fairly rare in usual cases unless acore being - // killed, so we don't take care much of this case. - Log.w(LOG_TAG, "cursor is null"); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - - if (VDBG) log("refreshCacheEntry() ended"); - } - - private void putNewEntryWhenAppropriate(HashMap<String, CacheEntry> newNumberToEntry, - String numberOrSipAddress, String customRingtone, boolean sendToVoicemail) { - if (newNumberToEntry.containsKey(numberOrSipAddress)) { - // There may be duplicate entries here and we should prioritize - // "send-to-voicemail" flag in any case. - final CacheEntry entry = newNumberToEntry.get(numberOrSipAddress); - if (!entry.sendToVoicemail && sendToVoicemail) { - newNumberToEntry.put(numberOrSipAddress, - new CacheEntry(customRingtone, sendToVoicemail)); - } - } else { - newNumberToEntry.put(numberOrSipAddress, - new CacheEntry(customRingtone, sendToVoicemail)); - } - } - - /** - * Returns CacheEntry for the given number (PSTN number or SIP address). - * - * @param number OK to be unformatted. - * @return CacheEntry to be used. Maybe null if there's no cache here. Note that this may - * return null when the cache itself is not ready. BE CAREFUL. (or might be better to throw - * an exception) - */ - public CacheEntry getCacheEntry(String number) { - if (mNumberToEntry == null) { - // Very unusual state. This implies the cache isn't ready during the request, while - // it should be prepared on the boot time (i.e. a way before even the first request). - Log.w(LOG_TAG, "Fallback cache isn't ready."); - return null; - } - - CacheEntry entry; - if (PhoneNumberUtils.isUriNumber(number)) { - if (VDBG) log("Trying to lookup " + number); - - entry = mNumberToEntry.get(number); - } else { - final String normalizedNumber = PhoneNumberUtils.normalizeNumber(number); - final int length = normalizedNumber.length(); - final String key = - (length > 7 ? normalizedNumber.substring(length - 7, length) - : normalizedNumber); - if (VDBG) log("Trying to lookup " + key); - - entry = mNumberToEntry.get(key); - } - if (VDBG) log("Obtained " + entry); - return entry; - } - - private static void log(String msg) { - Log.d(LOG_TAG, msg); - } -} diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java index a463243f1..41d418895 100644 --- a/src/com/android/phone/CarrierConfigLoader.java +++ b/src/com/android/phone/CarrierConfigLoader.java @@ -538,16 +538,16 @@ public class CarrierConfigLoader extends ICarrierConfigLoader.Stub { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); final String lastFingerprint = sharedPrefs.getString(KEY_FINGERPRINT, null); - if (!Build.FINGERPRINT.equals(lastFingerprint)) { + if (!Build.VERSION.INCREMENTAL.equals(lastFingerprint)) { logd( - "Build fingerprint changed. old: " + "Build incremental version changed. old: " + lastFingerprint + " new: " - + Build.FINGERPRINT); + + Build.VERSION.INCREMENTAL); clearCachedConfigForPackage(null); sharedPrefs .edit() - .putString(KEY_FINGERPRINT, Build.FINGERPRINT) + .putString(KEY_FINGERPRINT, Build.VERSION.INCREMENTAL) .apply(); } break; diff --git a/src/com/android/phone/EditPhoneNumberPreference.java b/src/com/android/phone/EditPhoneNumberPreference.java index 505c28497..16af9bf8d 100644 --- a/src/com/android/phone/EditPhoneNumberPreference.java +++ b/src/com/android/phone/EditPhoneNumberPreference.java @@ -277,7 +277,7 @@ public class EditPhoneNumberPreference extends EditTextPreference { } } // set the call icon on the title. - builder.setIcon(R.mipmap.ic_launcher_phone); + builder.setIcon(R.mipmap.ic_launcher); } diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java index 253536584..096326527 100644 --- a/src/com/android/phone/PhoneGlobals.java +++ b/src/com/android/phone/PhoneGlobals.java @@ -155,7 +155,6 @@ public class PhoneGlobals extends ContextWrapper { CallManager mCM; CallNotifier notifier; - CallerInfoCache callerInfoCache; NotificationMgr notificationMgr; TelephonyRcsService mTelephonyRcsService; public PhoneInterfaceManager phoneMgr; @@ -458,12 +457,6 @@ public class PhoneGlobals extends ContextWrapper { mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); - // Create the CallerInfoCache singleton, which remembers custom ring tone and - // send-to-voicemail settings. - // - // The asynchronous caching will start just after this call. - callerInfoCache = CallerInfoCache.init(this); - phoneMgr = PhoneInterfaceManager.init(this); imsRcsController = ImsRcsController.init(this); |
