summaryrefslogtreecommitdiffstats
path: root/src/com/android/dialer/calllog/CallLogAdapter.java
diff options
context:
space:
mode:
authorwangjing <wangjing@codeaurora.org>2015-04-14 12:04:44 +0800
committerGerrit - the friendly Code Review server <code-review@localhost>2015-04-20 01:24:42 -0700
commit78e1f922ade488d5f57dd415d4ac914b76713100 (patch)
tree42066b9a56cda3a77b93ab5b707f771c25421050 /src/com/android/dialer/calllog/CallLogAdapter.java
parent0b597cc753a3aeb3eda2f7a121e2972d638bea6d (diff)
downloadandroid_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/CallLogAdapter.java')
-rwxr-xr-xsrc/com/android/dialer/calllog/CallLogAdapter.java39
1 files changed, 33 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
+ }
}