summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChiao Cheng <chiaocheng@google.com>2013-10-08 13:35:20 -0700
committerChiao Cheng <chiaocheng@google.com>2013-10-08 13:35:20 -0700
commit643e78532e5d40ca62e6545855f847e26eaffa4e (patch)
treeabc9dd9ba848906594cce2e26f0a25e00c8b7a35
parent524bc0b58afabd947cfaa4c13c28fa9660f398da (diff)
Check for closed cursor to prevent crash.
No-op if click detected while cursor is closed. Bug: 10937133 Change-Id: I702e30c91a0c76cd36204a4c689155e49b775c1e
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java33
-rw-r--r--src/com/android/dialer/calllog/IntentProvider.java12
2 files changed, 29 insertions, 16 deletions
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);