diff options
author | wangjing <wangjing@codeaurora.org> | 2015-04-14 12:04:44 +0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-04-20 01:24:42 -0700 |
commit | 78e1f922ade488d5f57dd415d4ac914b76713100 (patch) | |
tree | 42066b9a56cda3a77b93ab5b707f771c25421050 /src/com/android/dialer/calllog | |
parent | 0b597cc753a3aeb3eda2f7a121e2972d638bea6d (diff) | |
download | android_packages_apps_Dialer-78e1f922ade488d5f57dd415d4ac914b76713100.tar.gz android_packages_apps_Dialer-78e1f922ade488d5f57dd415d4ac914b76713100.tar.bz2 android_packages_apps_Dialer-78e1f922ade488d5f57dd415d4ac914b76713100.zip |
Dialer: FPS is low when scrolling call logs
ListView used in call log will execute lot of SQL queries and
load lots of data, as a result, getView function will cost lots
of time to load data and draw views. This will reduce the FPS.
When list view is flinging, we try to avoid to load data and bind
views. We will reload the data for visible items in list view when
list view's scroll state is not flinging.
Change-Id: I1149f90d8ecb3723598a60ca66105214b3731b27
CRs-Fixed: 755408
Diffstat (limited to 'src/com/android/dialer/calllog')
-rwxr-xr-x | src/com/android/dialer/calllog/CallLogAdapter.java | 39 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/CallLogAdapterHelper.java | 13 | ||||
-rw-r--r-- | src/com/android/dialer/calllog/CallLogFragment.java | 1 |
3 files changed, 47 insertions, 6 deletions
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java index e501931eb..01b07b68f 100755 --- a/src/com/android/dialer/calllog/CallLogAdapter.java +++ b/src/com/android/dialer/calllog/CallLogAdapter.java @@ -41,6 +41,8 @@ import android.view.ViewGroup; import android.view.ViewStub; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -71,7 +73,8 @@ import java.util.LinkedList; * Adapter class to fill in data for the Call Log. */ public class CallLogAdapter extends GroupingListAdapter - implements CallLogAdapterHelper.Callback, CallLogGroupBuilder.GroupCreator { + implements CallLogAdapterHelper.Callback, CallLogGroupBuilder.GroupCreator, + OnScrollListener { private static final String TAG = CallLogAdapter.class.getSimpleName(); private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10; @@ -470,7 +473,10 @@ public class CallLogAdapter extends GroupingListAdapter Calls.DURATION_TYPE_ACTIVE, subId, operator); } - mCallLogViewsHelper.setPhoneCallDetails(mContext, views, details); + if (!mAdapterHelper.isBusy()) { + // Only update views when ListView's scroll state is not SCROLL_STATE_FLING. + mCallLogViewsHelper.setPhoneCallDetails(mContext, views, details); + } int contactType = ContactPhotoManager.TYPE_DEFAULT; @@ -536,10 +542,8 @@ public class CallLogAdapter extends GroupingListAdapter * @return The day group for the call. */ private int getDayGroupForCall(long callId) { - if (mDayGroups.containsKey(callId)) { - return mDayGroups.get(callId); - } - return CallLogGroupBuilder.DAY_GROUP_NONE; + Integer result = mDayGroups.get(callId); + return result == null ? CallLogGroupBuilder.DAY_GROUP_NONE : result.intValue(); } /** * Determines if a call log row with the given Id is expanded. @@ -1155,4 +1159,27 @@ public class CallLogAdapter extends GroupingListAdapter DialerUtils.startActivityWithErrorToast(mContext, intent, R.string.add_contact_not_available); } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + switch (scrollState) { + case OnScrollListener.SCROLL_STATE_IDLE: + mAdapterHelper.setBusy(false); + dataSetChanged(); + break; + case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: + mAdapterHelper.setBusy(false); + break; + case OnScrollListener.SCROLL_STATE_FLING: + // Do not update views when scroll state is SCROLL_STATE_FLING + mAdapterHelper.setBusy(true); + break; + } + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + // no-op + } } diff --git a/src/com/android/dialer/calllog/CallLogAdapterHelper.java b/src/com/android/dialer/calllog/CallLogAdapterHelper.java index a16935cfe..90b458442 100644 --- a/src/com/android/dialer/calllog/CallLogAdapterHelper.java +++ b/src/com/android/dialer/calllog/CallLogAdapterHelper.java @@ -137,6 +137,9 @@ public class CallLogAdapterHelper implements ViewTreeObserver.OnPreDrawListener // Check if thread is finished, and if so return immediately. if (mDone) return; + // only update contact info when scroll state is not fling. + if (mBusy) continue; + // Obtain next request, if any is available. // Keep synchronized section small. ContactInfoRequest req = null; @@ -201,6 +204,8 @@ public class CallLogAdapterHelper implements ViewTreeObserver.OnPreDrawListener /** Can be set to true by tests to disable processing of requests. */ private volatile boolean mRequestProcessingDisabled = false; + private boolean mBusy; + /** * List of requests to update contact details. * <p> @@ -228,6 +233,14 @@ public class CallLogAdapterHelper implements ViewTreeObserver.OnPreDrawListener } }; + public void setBusy(boolean isBusy) { + mBusy = isBusy; + } + + public boolean isBusy(){ + return mBusy; + } + /** * Enqueues a request to look up the contact details for the given phone number. * <p> diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java index fbde552ad..4dc168556 100644 --- a/src/com/android/dialer/calllog/CallLogFragment.java +++ b/src/com/android/dialer/calllog/CallLogFragment.java @@ -312,6 +312,7 @@ public class CallLogFragment extends AnalyticsListFragment public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getListView().setEmptyView(view.findViewById(R.id.empty_list_view)); + getListView().setOnScrollListener(mAdapter); getListView().setItemsCanFocus(true); maybeAddFooterView(); |