From 643e78532e5d40ca62e6545855f847e26eaffa4e Mon Sep 17 00:00:00 2001 From: Chiao Cheng Date: Tue, 8 Oct 2013 13:35:20 -0700 Subject: Check for closed cursor to prevent crash. No-op if click detected while cursor is closed. Bug: 10937133 Change-Id: I702e30c91a0c76cd36204a4c689155e49b775c1e --- src/com/android/dialer/calllog/CallLogAdapter.java | 33 +++++++++++----------- src/com/android/dialer/calllog/IntentProvider.java | 12 ++++++++ 2 files changed, 29 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java index b2e520632..9392410d1 100644 --- a/src/com/android/dialer/calllog/CallLogAdapter.java +++ b/src/com/android/dialer/calllog/CallLogAdapter.java @@ -195,26 +195,27 @@ public class CallLogAdapter extends GroupingListAdapter private ImageView mBadgeImageView; private TextView mBadgeText; - /** Listener for the primary action in the list, opens the call details. */ - private final View.OnClickListener mPrimaryActionListener = new View.OnClickListener() { + /** Listener for the primary or secondary actions in the list. + * Primary opens the call details. + * Secondary calls or plays. + **/ + private final View.OnClickListener mActionListener = new View.OnClickListener() { @Override public void onClick(View view) { - IntentProvider intentProvider = (IntentProvider) view.getTag(); - if (intentProvider != null) { - mContext.startActivity(intentProvider.getIntent(mContext)); - } + startActivityForAction(view); } }; - /** Listener for the secondary action in the list, either call or play. */ - private final View.OnClickListener mSecondaryActionListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - IntentProvider intentProvider = (IntentProvider) view.getTag(); - if (intentProvider != null) { - mContext.startActivity(intentProvider.getIntent(mContext)); + + private void startActivityForAction(View view) { + final IntentProvider intentProvider = (IntentProvider) view.getTag(); + if (intentProvider != null) { + final Intent intent = intentProvider.getIntent(mContext); + // See IntentProvider.getCallDetailIntentProvider() for why this may be null. + if (intent != null) { + mContext.startActivity(intent); } } - }; + } @Override public boolean onPreDraw() { @@ -497,8 +498,8 @@ public class CallLogAdapter extends GroupingListAdapter private void findAndCacheViews(View view) { // Get the views to bind to. CallLogListItemViews views = CallLogListItemViews.fromView(view); - views.primaryActionView.setOnClickListener(mPrimaryActionListener); - views.secondaryActionView.setOnClickListener(mSecondaryActionListener); + views.primaryActionView.setOnClickListener(mActionListener); + views.secondaryActionView.setOnClickListener(mActionListener); view.setTag(views); } diff --git a/src/com/android/dialer/calllog/IntentProvider.java b/src/com/android/dialer/calllog/IntentProvider.java index 01ebf2f3e..da0c69de5 100644 --- a/src/com/android/dialer/calllog/IntentProvider.java +++ b/src/com/android/dialer/calllog/IntentProvider.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.CallLog.Calls; +import android.util.Log; import com.android.contacts.common.CallUtil; import com.android.dialer.CallDetailActivity; @@ -32,6 +33,9 @@ import com.android.dialer.CallDetailActivity; * The intent is constructed lazily with the given information. */ public abstract class IntentProvider { + + private static final String TAG = IntentProvider.class.getSimpleName(); + public abstract Intent getIntent(Context context); public static IntentProvider getReturnCallIntentProvider(final String number) { @@ -66,6 +70,14 @@ public abstract class IntentProvider { return new IntentProvider() { @Override public Intent getIntent(Context context) { + if (cursor.isClosed()) { + // There are reported instances where the cursor is already closed. + // b/10937133 + // When causes a crash when it's accessed here. + Log.e(TAG, "getCallDetailIntentProvider() cursor is already closed."); + return null; + } + cursor.moveToPosition(position); Intent intent = new Intent(context, CallDetailActivity.class); -- cgit v1.2.3