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

Commit 601eadd8 authored by Yorke Lee's avatar Yorke Lee
Browse files

Remove onPreDrawListener logic

A bug in the PreDrawListener code was causing it to not be removed
from the ViewTreeObserver. This means that everytime a view was
rebound, another onPreDraw listener callback would be added but
never removed.

Compounding the problem is that in each callback, a costly
permission check via IPC is done, causing each frame to slow down
increasingly as more views are bound.

In practice, these PreDrawListeners are no longer needed as they were
only used to prime the Contact info query thread, which happens via
other code paths anyway.

Bug: 22759147
Change-Id: Ica2a31c0849c2eb34ac6f77d49cf23cbe32c6941
parent 3f468007
Loading
Loading
Loading
Loading
+1 −32
Original line number Diff line number Diff line
@@ -65,8 +65,7 @@ import java.util.HashMap;
 * Adapter class to fill in data for the Call Log.
 */
public class CallLogAdapter extends GroupingListAdapter
        implements ViewTreeObserver.OnPreDrawListener,
                CallLogGroupBuilder.GroupCreator,
        implements CallLogGroupBuilder.GroupCreator,
                VoicemailPlaybackPresenter.OnVoicemailDeletedListener {

    /** Interface used to initiate a refresh of the content. */
@@ -96,7 +95,6 @@ public class CallLogAdapter extends GroupingListAdapter
    private final ContactInfoHelper mContactInfoHelper;
    private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
    private final CallFetcher mCallFetcher;
    private ViewTreeObserver mViewTreeObserver = null;

    protected ContactInfoCache mContactInfoCache;

@@ -294,16 +292,6 @@ public class CallLogAdapter extends GroupingListAdapter
                }
            };

    @Override
    public boolean onPreDraw() {
        // We only wanted to listen for the first draw (and this is it).
        unregisterPreDrawListener();
        if (PermissionsUtil.hasContactsPermissions(mContext)) {
            mContactInfoCache.start();
        }
        return true;
    }

    public CallLogAdapter(
            Context context,
            CallFetcher callFetcher,
@@ -375,21 +363,8 @@ public class CallLogAdapter extends GroupingListAdapter
        }
    }

    /**
     * Stop receiving onPreDraw() notifications.
     */
    private void unregisterPreDrawListener() {
        if (mViewTreeObserver != null && mViewTreeObserver.isAlive()) {
            mViewTreeObserver.removeOnPreDrawListener(this);
        }
        mViewTreeObserver = null;
    }

    public void invalidateCache() {
        mContactInfoCache.invalidate();

        // Restart the request-processing thread after the next draw.
        unregisterPreDrawListener();
    }

    public void pauseCache() {
@@ -585,12 +560,6 @@ public class CallLogAdapter extends GroupingListAdapter
                isVoicemailNumber, mContactInfoHelper.isBusiness(info.sourceType));

        mCallLogListItemHelper.setPhoneCallDetails(views, details);

        // Listen for the first draw
        if (mViewTreeObserver == null) {
            mViewTreeObserver = views.rootView.getViewTreeObserver();
            mViewTreeObserver.addOnPreDrawListener(this);
        }
    }

    @Override