summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNathanielWaggoner <nwaggoner@cyngn.com>2016-05-09 22:52:49 -0700
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-05-16 13:22:07 -0700
commit4b717656918860843938a41cf61b6f8a8afe9e42 (patch)
treee06ac750604dcf25ddc23020a56f5070ca4dbc89 /src
parentb3d9925ce87dc72f4b650d49ba79ca2c83402f86 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java13
-rw-r--r--src/com/android/dialer/calllog/CallLogFragment.java1
-rw-r--r--src/com/android/dialer/calllog/CallLogListItemViewHolder.java17
-rw-r--r--src/com/android/dialer/calllog/DeepLinkPresenter.java72
-rw-r--r--src/com/android/dialer/deeplink/DeepLinkCache.java51
-rw-r--r--src/com/android/dialer/util/ExpirableCache.java6
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.