diff options
author | NathanielWaggoner <nwaggoner@cyngn.com> | 2016-05-09 22:52:49 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2016-05-16 13:22:07 -0700 |
commit | 4b717656918860843938a41cf61b6f8a8afe9e42 (patch) | |
tree | e06ac750604dcf25ddc23020a56f5070ca4dbc89 /src | |
parent | b3d9925ce87dc72f4b650d49ba79ca2c83402f86 (diff) | |
download | android_packages_apps_Dialer-4b717656918860843938a41cf61b6f8a8afe9e42.tar.gz android_packages_apps_Dialer-4b717656918860843938a41cf61b6f8a8afe9e42.tar.bz2 android_packages_apps_Dialer-4b717656918860843938a41cf61b6f8a8afe9e42.zip |
Fix for issues with the Note action/icon disappearing from call log.
Issues were present on scroll events, screen rotations and in some
other edge case circumstances. The performance is much improved, and
this removes a good deal of un-needed code.
NOTES-93
Change-Id: If9634fd3fbcb3e8db54e64958e32228f2b7983da
Diffstat (limited to 'src')
6 files changed, 74 insertions, 86 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java index 8fee28875..1b2d3496d 100644 --- a/src/com/android/dialer/calllog/CallLogAdapter.java +++ b/src/com/android/dialer/calllog/CallLogAdapter.java @@ -567,16 +567,7 @@ public class CallLogAdapter extends GroupingListAdapter views.inCallComponentName = null; } views.callTimes = getCallTimes(c, count); - DeepLink dl = mDeepLinkCache.getValue(number, views.callTimes); - if (dl != null && dl != DeepLinkRequest.EMPTY) { - views.mDeepLink = dl; - views.phoneCallDetailsViews.noteIconView.setVisibility(View.VISIBLE); - views.phoneCallDetailsViews.noteIconView.setImageDrawable(dl.getDrawableIcon(mContext)); - } else { - views.mDeepLink = null; - views.phoneCallDetailsViews.noteIconView.setVisibility(View.GONE); - } - + views.mDeepLinkPresenter.setDeepLink(mDeepLinkCache.getValue(number, views.callTimes)); String callMethodName = null; if (views.inCallComponentName != null) { CallMethodInfo cmi = DialerDataSubscription.get(mContext) @@ -592,8 +583,6 @@ public class CallLogAdapter extends GroupingListAdapter views.numberType = label; details.numberLabel = label; - views.mDeepLinkPresenter.prepareUi(number); - // Check if the day group has changed and display a header if necessary. int currentGroup = getDayGroupForCall(views.rowId); int previousGroup = getPreviousDayGroup(c); diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java index b22d618fc..fe813f684 100644 --- a/src/com/android/dialer/calllog/CallLogFragment.java +++ b/src/com/android/dialer/calllog/CallLogFragment.java @@ -171,6 +171,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis public void onResult(DeepLink.BooleanResult result) { boolean value = result.getResults(); if (isDeepLinkApiEnabled != value) { + mAdapter.mDeepLinkCache.clearCache(); refreshData(); } isDeepLinkApiEnabled = value; diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java index d01cb3159..2d8cc68ac 100644 --- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java +++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java @@ -37,6 +37,7 @@ import android.widget.QuickContactBadge; import android.widget.ImageView; import android.widget.TextView; +import com.android.dialer.deeplink.DeepLinkRequest; import com.android.dialer.widget.DialerQuickContact; import com.android.dialer.deeplink.DeepLinkIntegrationManager; @@ -83,7 +84,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public final ImageView primaryActionButtonView; /** DialerQuickContact */ public final DialerQuickContact dialerQuickContact; - public DeepLink mDeepLink; /** The view containing call log item actions. Null until the ViewStub is inflated. */ public View actionsView; @@ -92,6 +92,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder public View callButtonView; public View videoCallButtonView; public View viewNoteButton; + public ImageView viewNoteActionIcon; public View createNewContactButtonView; public View addToExistingContactButtonView; public View sendMessageView; @@ -307,6 +308,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder createNewContactButtonView.setOnClickListener(this); viewNoteButton = actionsView.findViewById(R.id.view_note_action); + viewNoteActionIcon = (ImageView) actionsView.findViewById(R.id.view_note_action_icon); viewNoteButton.setOnClickListener(this); addToExistingContactButtonView = @@ -398,9 +400,9 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder callButtonView.setVisibility(View.GONE); } - if (mDeepLink != null) { + if (mDeepLinkPresenter.mDeepLink != null) { ImageView icon = (ImageView) viewNoteButton.findViewById(R.id.view_note_action_icon); - icon.setImageDrawable(mDeepLink.getDrawableIcon(mContext)); + icon.setImageDrawable(mDeepLinkPresenter.mDeepLink.getDrawableIcon(mContext)); } else { viewNoteButton.setVisibility(View.GONE); } @@ -583,8 +585,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder accountHandle); } else if (view.getId() == R.id.view_note_action) { - sendOpeningExisitingEvent(); - mContext.startActivity(mDeepLink.createViewIntent()); + mDeepLinkPresenter.viewNote(); } else { final String inCallAction = (String) view.getTag(R.id.incall_provider_action_type); if (inCallComponentName != null && !TextUtils.isEmpty(inCallAction)) { @@ -653,10 +654,4 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder return viewHolder; } - - private void sendOpeningExisitingEvent() { - DeepLinkIntegrationManager.getInstance().sendContentSentEvent(mContext, mDeepLink, - new ComponentName(mContext, CallLogListItemViewHolder.class)); - } - } diff --git a/src/com/android/dialer/calllog/DeepLinkPresenter.java b/src/com/android/dialer/calllog/DeepLinkPresenter.java index 7e25d3b20..805fd6391 100644 --- a/src/com/android/dialer/calllog/DeepLinkPresenter.java +++ b/src/com/android/dialer/calllog/DeepLinkPresenter.java @@ -15,10 +15,14 @@ */ package com.android.dialer.calllog; +import android.content.ComponentName; import android.content.Context; import android.net.Uri; import android.view.View; +import android.widget.ImageView; +import com.android.dialer.R; +import com.android.dialer.deeplink.DeepLinkRequest; import com.cyanogen.ambient.common.api.ResultCallback; import com.cyanogen.ambient.deeplink.DeepLink; import com.cyanogen.ambient.deeplink.DeepLink.DeepLinkResultList; @@ -32,64 +36,50 @@ import java.util.ArrayList; public class DeepLinkPresenter { - private CallLogListItemViewHolder mViews; Context mContext; + DeepLink mDeepLink; + private CallLogListItemViewHolder mViews; public DeepLinkPresenter(Context context) { mContext = context; } + public void setCallLogViewHolder(CallLogListItemViewHolder holder) { mViews = holder; } - public void handleDeepLink(List<DeepLink> links) { - if (links != null) { - for (DeepLink link : links) { - if (link != null && link.getApplicationType() == DeepLinkApplicationType.NOTE - && link.getIcon() != DeepLink.DEFAULT_ICON) { - mViews.mDeepLink = link; - updateViews(); - break; - } + private void updateViews() { + if (mDeepLink != null && mDeepLink != DeepLinkRequest.EMPTY) { + if (canUpdateImageIconViews()) { + mViews.viewNoteActionIcon.setImageDrawable(mDeepLink.getDrawableIcon(mContext)); + mViews.viewNoteButton.setVisibility(View.VISIBLE); } - } - } - - public void handleReadyForRequests(String number, - ResultCallback<DeepLinkResultList> deepLinkCallback) { - if (mViews.mDeepLink == null) { - List<Uri> uris = buildCallUris(number); - DeepLinkIntegrationManager.getInstance().getPreferredLinksForList(deepLinkCallback, - DeepLinkContentType.CALL, uris); + mViews.phoneCallDetailsViews.noteIconView.setVisibility(View.VISIBLE); + mViews.phoneCallDetailsViews.noteIconView + .setImageDrawable(mDeepLink.getDrawableIcon(mContext)); } else { - updateViews(); + if (canUpdateImageIconViews()) { + mViews.viewNoteButton.setVisibility(View.GONE); + mViews.viewNoteActionIcon.setImageDrawable(null); + } + mViews.phoneCallDetailsViews.noteIconView.setVisibility(View.GONE); } } - private List<Uri> buildCallUris(String number) { - List<Uri> uris = new ArrayList<Uri>(mViews.callTimes.length); - for (int i = 0; i < mViews.callTimes.length; i++) { - uris.add(DeepLinkIntegrationManager.generateCallUri(number, mViews.callTimes[i])); - } - return uris; + private boolean canUpdateImageIconViews() { + return mViews.viewNoteButton != null && mViews.viewNoteActionIcon != null; } - private void updateViews() { - mViews.phoneCallDetailsViews.noteIconView.setVisibility(View.VISIBLE); - mViews.phoneCallDetailsViews.noteIconView.setImageDrawable( - mViews.mDeepLink.getDrawableIcon(mContext)); + public void setDeepLink(DeepLink deepLink) { + mDeepLink = deepLink; + updateViews(); } - private final ResultCallback<DeepLinkResultList> deepLinkCallback = new - ResultCallback<DeepLinkResultList>() { - @Override - public void onResult(DeepLinkResultList deepLinkResult) { - handleDeepLink(deepLinkResult.getResults()); - } - }; - - public void prepareUi(final String number) { - handleReadyForRequests(number, deepLinkCallback); + public void viewNote() { + if (mDeepLink != null) { + DeepLinkIntegrationManager.getInstance().sendContentSentEvent(mContext, mDeepLink, + new ComponentName(mContext, CallLogListItemViewHolder.class)); + mContext.startActivity(mDeepLink.createViewIntent()); + } } - } diff --git a/src/com/android/dialer/deeplink/DeepLinkCache.java b/src/com/android/dialer/deeplink/DeepLinkCache.java index 068e29c4f..868c6735d 100644 --- a/src/com/android/dialer/deeplink/DeepLinkCache.java +++ b/src/com/android/dialer/deeplink/DeepLinkCache.java @@ -125,18 +125,18 @@ public class DeepLinkCache { if (req != null) { // Process the request. queryDeepLinks(req); + } else if (needRedraw) { + needRedraw = false; + mHandler.sendEmptyMessage(REDRAW); } else { - // only update the UI when there are no more requests - if (needRedraw) { - needRedraw = false; - mHandler.sendEmptyMessage(REDRAW); - } // Wait until another request is available, or until this // thread is no longer needed (as indicated by being // interrupted). try { synchronized (mRequests) { - mRequests.wait(PROCESSING_THREAD_THROTTLE_LIMIT); + if (mRequests.isEmpty()) { + mRequests.wait(PROCESSING_THREAD_THROTTLE_LIMIT); + } } } catch (InterruptedException ie) { // Ignore, and attempt to continue processing requests. @@ -262,21 +262,11 @@ public class DeepLinkCache { stopRequestProcessing(); } - ResultCallback<DeepLink.DeepLinkResultList> mDeepLinkCallback = - new ResultCallback<DeepLink.DeepLinkResultList>() { - @Override - public void onResult(DeepLink.DeepLinkResultList result) { - if (result.getResults() != null) { - handleDeepLinkResults(result.getResults()); - } - } - }; - private void handleDeepLinkResults(List<DeepLink> results) { for (DeepLink link : results) { if (shouldPlaceLinkInCache(link)) { mCache.put(link.getUri().toString(), link); - if (mDeepLinkQueryThread != null && mPendingRequests.size() <= 0) { + if (mDeepLinkQueryThread != null) { mDeepLinkQueryThread.needRedraw = true; } } @@ -289,8 +279,9 @@ public class DeepLinkCache { } private boolean linkExistsInCache(DeepLink link) { - DeepLink oldLink = mCache.getPossiblyExpired(link.getUri().toString()); - return link.equals(oldLink); + ExpirableCache.CachedValue<DeepLink> oldLink = + mCache.getCachedValue(link.getUri().toString()); + return oldLink != null && !oldLink.isExpired() && link.equals(oldLink.getValue()); } /** @@ -299,10 +290,22 @@ public class DeepLinkCache { * @param request - the DeepLinkRequest to query against. */ private void queryDeepLinks(DeepLinkRequest request) { + final Uri uri = request.getUris().get(0); synchronized (mPendingRequests) { - mPendingRequests.put(request.getUris().get(0), + mPendingRequests.put(uri, DeepLinkIntegrationManager.getInstance().getPreferredLinksForList( - mDeepLinkCallback, DeepLinkContentType.CALL, request.getUris())); + new ResultCallback<DeepLink.DeepLinkResultList>() { + @Override + public void onResult(DeepLink.DeepLinkResultList result) { + List<DeepLink> results = result.getResults(); + if (results == null || results.size() == 0) { + return; + } + mPendingRequests.remove(uri); + handleDeepLinkResults(result.getResults()); + } + }, DeepLinkContentType.CALL, request.getUris())); + } } @@ -311,10 +314,14 @@ public class DeepLinkCache { Uri uri = DeepLinkIntegrationManager.generateCallUri(number, calltimes[0]); if (mPendingRequests.containsKey(uri)) { PendingResult<DeepLink.DeepLinkResultList> request = mPendingRequests.remove(uri); - if (request!= null) { + if (request != null) { request.cancel(); } } } } + + public void clearCache() { + mCache.clearCache(); + } } diff --git a/src/com/android/dialer/util/ExpirableCache.java b/src/com/android/dialer/util/ExpirableCache.java index 00ebd1607..4fce9edf8 100644 --- a/src/com/android/dialer/util/ExpirableCache.java +++ b/src/com/android/dialer/util/ExpirableCache.java @@ -230,6 +230,12 @@ public class ExpirableCache<K, V> { } /** + * Clear all items currently in the cache. + */ + public void clearCache() { + mCache.evictAll(); + } + /** * Creates a new {@link CachedValue} instance to be stored in this cache. * <p> * Implementation of {@link LruCache#create(K)} can use this method to create a new entry. |