Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b717656 authored by NathanielWaggoner's avatar NathanielWaggoner Committed by Gerrit Code Review
Browse files

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
parent b3d9925c
Loading
Loading
Loading
Loading
+1 −12
Original line number Original line Diff line number Diff line
@@ -567,16 +567,7 @@ public class CallLogAdapter extends GroupingListAdapter
            views.inCallComponentName = null;
            views.inCallComponentName = null;
        }
        }
        views.callTimes = getCallTimes(c, count);
        views.callTimes = getCallTimes(c, count);
        DeepLink dl = mDeepLinkCache.getValue(number, views.callTimes);
        views.mDeepLinkPresenter.setDeepLink(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);
        }

        String callMethodName = null;
        String callMethodName = null;
        if (views.inCallComponentName != null) {
        if (views.inCallComponentName != null) {
            CallMethodInfo cmi = DialerDataSubscription.get(mContext)
            CallMethodInfo cmi = DialerDataSubscription.get(mContext)
@@ -592,8 +583,6 @@ public class CallLogAdapter extends GroupingListAdapter
        views.numberType = label;
        views.numberType = label;
        details.numberLabel = label;
        details.numberLabel = label;


        views.mDeepLinkPresenter.prepareUi(number);

        // Check if the day group has changed and display a header if necessary.
        // Check if the day group has changed and display a header if necessary.
        int currentGroup = getDayGroupForCall(views.rowId);
        int currentGroup = getDayGroupForCall(views.rowId);
        int previousGroup = getPreviousDayGroup(c);
        int previousGroup = getPreviousDayGroup(c);
+1 −0
Original line number Original line Diff line number Diff line
@@ -171,6 +171,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
                public void onResult(DeepLink.BooleanResult result) {
                public void onResult(DeepLink.BooleanResult result) {
                    boolean value = result.getResults();
                    boolean value = result.getResults();
                    if (isDeepLinkApiEnabled != value) {
                    if (isDeepLinkApiEnabled != value) {
                        mAdapter.mDeepLinkCache.clearCache();
                        refreshData();
                        refreshData();
                    }
                    }
                    isDeepLinkApiEnabled = value;
                    isDeepLinkApiEnabled = value;
+6 −11
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ import android.widget.QuickContactBadge;
import android.widget.ImageView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView;


import com.android.dialer.deeplink.DeepLinkRequest;
import com.android.dialer.widget.DialerQuickContact;
import com.android.dialer.widget.DialerQuickContact;
import com.android.dialer.deeplink.DeepLinkIntegrationManager;
import com.android.dialer.deeplink.DeepLinkIntegrationManager;


@@ -83,7 +84,6 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
    public final ImageView primaryActionButtonView;
    public final ImageView primaryActionButtonView;
    /** DialerQuickContact */
    /** DialerQuickContact */
    public final DialerQuickContact dialerQuickContact;
    public final DialerQuickContact dialerQuickContact;
    public DeepLink mDeepLink;


    /** The view containing call log item actions.  Null until the ViewStub is inflated. */
    /** The view containing call log item actions.  Null until the ViewStub is inflated. */
    public View actionsView;
    public View actionsView;
@@ -92,6 +92,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
    public View callButtonView;
    public View callButtonView;
    public View videoCallButtonView;
    public View videoCallButtonView;
    public View viewNoteButton;
    public View viewNoteButton;
    public ImageView viewNoteActionIcon;
    public View createNewContactButtonView;
    public View createNewContactButtonView;
    public View addToExistingContactButtonView;
    public View addToExistingContactButtonView;
    public View sendMessageView;
    public View sendMessageView;
@@ -307,6 +308,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
            createNewContactButtonView.setOnClickListener(this);
            createNewContactButtonView.setOnClickListener(this);


            viewNoteButton = actionsView.findViewById(R.id.view_note_action);
            viewNoteButton = actionsView.findViewById(R.id.view_note_action);
            viewNoteActionIcon = (ImageView) actionsView.findViewById(R.id.view_note_action_icon);
            viewNoteButton.setOnClickListener(this);
            viewNoteButton.setOnClickListener(this);


            addToExistingContactButtonView =
            addToExistingContactButtonView =
@@ -398,9 +400,9 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
            callButtonView.setVisibility(View.GONE);
            callButtonView.setVisibility(View.GONE);
        }
        }


        if (mDeepLink != null) {
        if (mDeepLinkPresenter.mDeepLink != null) {
            ImageView icon = (ImageView) viewNoteButton.findViewById(R.id.view_note_action_icon);
            ImageView icon = (ImageView) viewNoteButton.findViewById(R.id.view_note_action_icon);
            icon.setImageDrawable(mDeepLink.getDrawableIcon(mContext));
            icon.setImageDrawable(mDeepLinkPresenter.mDeepLink.getDrawableIcon(mContext));
        } else {
        } else {
            viewNoteButton.setVisibility(View.GONE);
            viewNoteButton.setVisibility(View.GONE);
        }
        }
@@ -583,8 +585,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
                    accountHandle);
                    accountHandle);


        } else if (view.getId() == R.id.view_note_action) {
        } else if (view.getId() == R.id.view_note_action) {
            sendOpeningExisitingEvent();
            mDeepLinkPresenter.viewNote();
            mContext.startActivity(mDeepLink.createViewIntent());
        } else {
        } else {
            final String inCallAction = (String) view.getTag(R.id.incall_provider_action_type);
            final String inCallAction = (String) view.getTag(R.id.incall_provider_action_type);
            if (inCallComponentName != null && !TextUtils.isEmpty(inCallAction)) {
            if (inCallComponentName != null && !TextUtils.isEmpty(inCallAction)) {
@@ -653,10 +654,4 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder


        return viewHolder;
        return viewHolder;
    }
    }

    private void sendOpeningExisitingEvent() {
        DeepLinkIntegrationManager.getInstance().sendContentSentEvent(mContext, mDeepLink,
                new ComponentName(mContext, CallLogListItemViewHolder.class));
    }

}
}
+31 −41
Original line number Original line Diff line number Diff line
@@ -15,10 +15,14 @@
 */
 */
package com.android.dialer.calllog;
package com.android.dialer.calllog;


import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.net.Uri;
import android.net.Uri;
import android.view.View;
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.common.api.ResultCallback;
import com.cyanogen.ambient.deeplink.DeepLink;
import com.cyanogen.ambient.deeplink.DeepLink;
import com.cyanogen.ambient.deeplink.DeepLink.DeepLinkResultList;
import com.cyanogen.ambient.deeplink.DeepLink.DeepLinkResultList;
@@ -32,64 +36,50 @@ import java.util.ArrayList;


public class DeepLinkPresenter {
public class DeepLinkPresenter {


    private CallLogListItemViewHolder mViews;
    Context mContext;
    Context mContext;
    DeepLink mDeepLink;
    private CallLogListItemViewHolder mViews;


    public DeepLinkPresenter(Context context) {
    public DeepLinkPresenter(Context context) {
        mContext = context;
        mContext = context;
    }
    }

    public void setCallLogViewHolder(CallLogListItemViewHolder holder) {
    public void setCallLogViewHolder(CallLogListItemViewHolder holder) {
        mViews = holder;
        mViews = holder;
    }
    }


    public void handleDeepLink(List<DeepLink> links) {
    private void updateViews() {
        if (links != null) {
        if (mDeepLink != null && mDeepLink != DeepLinkRequest.EMPTY) {
            for (DeepLink link : links) {
            if (canUpdateImageIconViews()) {
                if (link != null && link.getApplicationType() == DeepLinkApplicationType.NOTE
                mViews.viewNoteActionIcon.setImageDrawable(mDeepLink.getDrawableIcon(mContext));
                        && link.getIcon() != DeepLink.DEFAULT_ICON) {
                mViews.viewNoteButton.setVisibility(View.VISIBLE);
                    mViews.mDeepLink = link;
                    updateViews();
                    break;
                }
            }
        }
            }
            }

            mViews.phoneCallDetailsViews.noteIconView.setVisibility(View.VISIBLE);
    public void handleReadyForRequests(String number,
            mViews.phoneCallDetailsViews.noteIconView
            ResultCallback<DeepLinkResultList> deepLinkCallback) {
                    .setImageDrawable(mDeepLink.getDrawableIcon(mContext));
        if (mViews.mDeepLink == null) {
            List<Uri> uris = buildCallUris(number);
            DeepLinkIntegrationManager.getInstance().getPreferredLinksForList(deepLinkCallback,
                    DeepLinkContentType.CALL, uris);
        } else {
        } 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 void updateViews() {
    private boolean canUpdateImageIconViews() {
        mViews.phoneCallDetailsViews.noteIconView.setVisibility(View.VISIBLE);
        return mViews.viewNoteButton != null  && mViews.viewNoteActionIcon != null;
        mViews.phoneCallDetailsViews.noteIconView.setImageDrawable(
                mViews.mDeepLink.getDrawableIcon(mContext));
    }
    }


    private final ResultCallback<DeepLinkResultList> deepLinkCallback = new
    public void setDeepLink(DeepLink deepLink) {
            ResultCallback<DeepLinkResultList>() {
        mDeepLink = deepLink;
                @Override
        updateViews();
                public void onResult(DeepLinkResultList deepLinkResult) {
                    handleDeepLink(deepLinkResult.getResults());
    }
    }
            };


    public void prepareUi(final String number) {
    public void viewNote() {
        handleReadyForRequests(number, deepLinkCallback);
        if (mDeepLink != null) {
            DeepLinkIntegrationManager.getInstance().sendContentSentEvent(mContext, mDeepLink,
                    new ComponentName(mContext, CallLogListItemViewHolder.class));
            mContext.startActivity(mDeepLink.createViewIntent());
        }
    }
    }

}
}
+29 −22
Original line number Original line Diff line number Diff line
@@ -125,19 +125,19 @@ public class DeepLinkCache {
                if (req != null) {
                if (req != null) {
                    // Process the request.
                    // Process the request.
                    queryDeepLinks(req);
                    queryDeepLinks(req);
                } else {
                } else if (needRedraw) {
                    // only update the UI when there are no more requests
                    if (needRedraw) {
                    needRedraw = false;
                    needRedraw = false;
                    mHandler.sendEmptyMessage(REDRAW);
                    mHandler.sendEmptyMessage(REDRAW);
                    }
                } else {
                    // Wait until another request is available, or until this
                    // Wait until another request is available, or until this
                    // thread is no longer needed (as indicated by being
                    // thread is no longer needed (as indicated by being
                    // interrupted).
                    // interrupted).
                    try {
                    try {
                        synchronized (mRequests) {
                        synchronized (mRequests) {
                            if (mRequests.isEmpty()) {
                                mRequests.wait(PROCESSING_THREAD_THROTTLE_LIMIT);
                                mRequests.wait(PROCESSING_THREAD_THROTTLE_LIMIT);
                            }
                            }
                        }
                    } catch (InterruptedException ie) {
                    } catch (InterruptedException ie) {
                        // Ignore, and attempt to continue processing requests.
                        // Ignore, and attempt to continue processing requests.
                    }
                    }
@@ -262,21 +262,11 @@ public class DeepLinkCache {
        stopRequestProcessing();
        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) {
    private void handleDeepLinkResults(List<DeepLink> results) {
        for (DeepLink link : results) {
        for (DeepLink link : results) {
            if (shouldPlaceLinkInCache(link)) {
            if (shouldPlaceLinkInCache(link)) {
                mCache.put(link.getUri().toString(), link);
                mCache.put(link.getUri().toString(), link);
                if (mDeepLinkQueryThread != null && mPendingRequests.size() <= 0) {
                if (mDeepLinkQueryThread != null) {
                    mDeepLinkQueryThread.needRedraw = true;
                    mDeepLinkQueryThread.needRedraw = true;
                }
                }
            }
            }
@@ -289,8 +279,9 @@ public class DeepLinkCache {
    }
    }


    private boolean linkExistsInCache(DeepLink link) {
    private boolean linkExistsInCache(DeepLink link) {
        DeepLink oldLink = mCache.getPossiblyExpired(link.getUri().toString());
        ExpirableCache.CachedValue<DeepLink> oldLink =
        return link.equals(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.
     * @param request - the DeepLinkRequest to query against.
     */
     */
    private void queryDeepLinks(DeepLinkRequest request) {
    private void queryDeepLinks(DeepLinkRequest request) {
        final Uri uri = request.getUris().get(0);
        synchronized (mPendingRequests) {
        synchronized (mPendingRequests) {
            mPendingRequests.put(request.getUris().get(0),
            mPendingRequests.put(uri,
                    DeepLinkIntegrationManager.getInstance().getPreferredLinksForList(
                    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()));

        }
        }
    }
    }


@@ -317,4 +320,8 @@ public class DeepLinkCache {
            }
            }
        }
        }
    }
    }

    public void clearCache() {
        mCache.clearCache();
    }
}
}
Loading