summaryrefslogtreecommitdiffstats
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
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
-rwxr-xr-xsrc/com/android/dialer/calllog/CallLogAdapter.java39
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapterHelper.java13
-rw-r--r--src/com/android/dialer/calllog/CallLogFragment.java1
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();