From 67d3e7007e05ba68816b165c81eb9b16962db46b Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Mon, 8 Feb 2016 18:55:27 +0000 Subject: Make work badge in call log consistent with InCall Update cache only when the result is returned to InCall UI. Now both call log and InCallUI take the callerinfo which are first returned from provider. When both personal and work profile directory lookup returns a caller info, InCallUI takes the personal one, while cache takes the work one. So it might result in the name being inconsistent between 2 UIs. However, it's extremely rare as it's unlikely to happen unless 2 corporate accounts under the same domain are registered in personal and work respectively. BUG=26819634 Change-Id: I87c4533635c0e2f88a639ca1c23611b2a22f6b07 --- .../com/android/incallui/CallerInfoAsyncQuery.java | 42 +++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'InCallUI') diff --git a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java index 8d45efb97..4714af492 100644 --- a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java +++ b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java @@ -471,15 +471,15 @@ public class CallerInfoAsyncQuery { private static final class DirectoryQueryCompleteListenerFactory { // Make sure listener to be called once and only once - int mCount; - boolean mIsListenerCalled; - OnQueryCompleteListener mListener; - Context mContext; - CachedNumberLookupService mCachedNumberLookupService = + private int mCount; + private boolean mIsListenerCalled; + private final OnQueryCompleteListener mListener; + private final Context mContext; + private final CachedNumberLookupService mCachedNumberLookupService = ObjectFactory.newCachedNumberLookupService(); private class DirectoryQueryCompleteListener implements OnQueryCompleteListener { - long mDirectoryId; + private final long mDirectoryId; DirectoryQueryCompleteListener(long directoryId) { mDirectoryId = directoryId; @@ -487,26 +487,20 @@ public class CallerInfoAsyncQuery { @Override public void onQueryComplete(int token, Object cookie, CallerInfo ci) { - if (ci.contactExists && mCachedNumberLookupService != null) { - CachedContactInfo cachedContactInfo = - CallerInfoUtils.buildCachedContactInfo(mCachedNumberLookupService, ci); - String directoryLabel = mContext.getString(R.string.directory_search_label); - cachedContactInfo.setDirectorySource(directoryLabel, mDirectoryId); - mCachedNumberLookupService.addContact(mContext, cachedContactInfo); - } - - callListenerIfNecessary(token, cookie, ci); + onDirectoryQueryComplete(token, cookie, ci, mDirectoryId); } } - DirectoryQueryCompleteListenerFactory(Context context, int size, OnQueryCompleteListener listener) { + DirectoryQueryCompleteListenerFactory(Context context, int size, + OnQueryCompleteListener listener) { mCount = size; mListener = listener; mIsListenerCalled = false; mContext = context; } - private void callListenerIfNecessary(int token, Object cookie, CallerInfo ci) { + private void onDirectoryQueryComplete(int token, Object cookie, CallerInfo ci, + long directoryId) { boolean shouldCallListener = false; synchronized (this) { mCount = mCount - 1; @@ -515,11 +509,25 @@ public class CallerInfoAsyncQuery { shouldCallListener = true; } } + + // Don't call callback in synchronized block because mListener.onQueryComplete may + // take long time to complete if (shouldCallListener && mListener != null) { + addCallerInfoIntoCache(ci, directoryId); mListener.onQueryComplete(token, cookie, ci); } } + private void addCallerInfoIntoCache(CallerInfo ci, long directoryId) { + if (ci.contactExists && mCachedNumberLookupService != null) { + CachedContactInfo cachedContactInfo = CallerInfoUtils + .buildCachedContactInfo(mCachedNumberLookupService, ci); + String directoryLabel = mContext.getString(R.string.directory_search_label); + cachedContactInfo.setDirectorySource(directoryLabel, directoryId); + mCachedNumberLookupService.addContact(mContext, cachedContactInfo); + } + } + public OnQueryCompleteListener newListener(long directoryId) { return new DirectoryQueryCompleteListener(directoryId); } -- cgit v1.2.3