From 5b83320cf9cc718a8665ef7c3bc1fc0026560608 Mon Sep 17 00:00:00 2001 From: zachh Date: Tue, 25 Jul 2017 11:17:23 -0700 Subject: Fixed bug where app could crash when clearing call history. Bug: 63686780 Test: ClearCallLogDialogTest PiperOrigin-RevId: 163096437 Change-Id: Ifc416b8c0ff1baa6ddbef11c26b548af2eb3fc64 --- .../dialer/app/calllog/CallLogActivity.java | 15 +-- .../dialer/app/calllog/ClearCallLogDialog.java | 132 +++++++++++++-------- 2 files changed, 82 insertions(+), 65 deletions(-) (limited to 'java/com/android/dialer/app') diff --git a/java/com/android/dialer/app/calllog/CallLogActivity.java b/java/com/android/dialer/app/calllog/CallLogActivity.java index 35e05bc39..c9e655d17 100644 --- a/java/com/android/dialer/app/calllog/CallLogActivity.java +++ b/java/com/android/dialer/app/calllog/CallLogActivity.java @@ -32,10 +32,8 @@ import android.view.ViewGroup; import com.android.contacts.common.list.ViewPagerTabs; import com.android.dialer.app.DialtactsActivity; import com.android.dialer.app.R; -import com.android.dialer.app.calllog.ClearCallLogDialog.Listener; import com.android.dialer.calldetails.CallDetailsActivity; import com.android.dialer.database.CallLogQueryHandler; -import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.logging.Logger; import com.android.dialer.logging.ScreenEvent; import com.android.dialer.logging.UiAction; @@ -46,7 +44,7 @@ import com.android.dialer.util.ViewUtil; /** Activity for viewing call history. */ public class CallLogActivity extends TransactionSafeActivity - implements ViewPager.OnPageChangeListener, Listener { + implements ViewPager.OnPageChangeListener { private static final int TAB_INDEX_ALL = 0; private static final int TAB_INDEX_MISSED = 1; @@ -148,7 +146,7 @@ public class CallLogActivity extends TransactionSafeActivity startActivity(intent); return true; } else if (item.getItemId() == R.id.delete_all) { - ClearCallLogDialog.show(getFragmentManager(), this); + ClearCallLogDialog.show(getFragmentManager()); return true; } return super.onOptionsItemSelected(item); @@ -183,15 +181,6 @@ public class CallLogActivity extends TransactionSafeActivity return position; } - @Override - public void callHistoryDeleted() { - if (EnrichedCallComponent.get(this).getEnrichedCallManager().hasStoredData()) { - Snackbar.make( - findViewById(R.id.calllog_frame), getString(R.string.multiple_ec_data_deleted), 5_000) - .show(); - } - } - @Override public void onBackPressed() { PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON); diff --git a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java index 5c3d4d9fa..b16eb1beb 100644 --- a/java/com/android/dialer/app/calllog/ClearCallLogDialog.java +++ b/java/com/android/dialer/app/calllog/ClearCallLogDialog.java @@ -22,76 +22,63 @@ import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.app.ProgressDialog; -import android.content.ContentResolver; import android.content.Context; -import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; -import android.os.AsyncTask; import android.os.Bundle; import android.provider.CallLog.Calls; -import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import com.android.dialer.app.R; import com.android.dialer.common.Assert; +import com.android.dialer.common.concurrent.DialerExecutor; +import com.android.dialer.common.concurrent.DialerExecutor.Worker; +import com.android.dialer.common.concurrent.DialerExecutorComponent; +import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.phonenumbercache.CachedNumberLookupService; import com.android.dialer.phonenumbercache.PhoneNumberCache; /** Dialog that clears the call log after confirming with the user */ public class ClearCallLogDialog extends DialogFragment { - private Listener listener; + private DialerExecutor clearCallLogTask; + private ProgressDialog progressDialog; /** Preferred way to show this dialog */ - public static void show(FragmentManager fragmentManager, @NonNull Listener listener) { + public static void show(FragmentManager fragmentManager) { ClearCallLogDialog dialog = new ClearCallLogDialog(); - dialog.listener = Assert.isNotNull(listener); dialog.show(fragmentManager, "deleteCallLog"); } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + clearCallLogTask = + DialerExecutorComponent.get(getContext()) + .dialerExecutorFactory() + .createUiTaskBuilder( + getFragmentManager(), + "clearCallLogTask", + new ClearCallLogWorker(getActivity().getApplicationContext())) + .onSuccess(this::onSuccess) + .build(); + } + @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final ContentResolver resolver = getActivity().getContentResolver(); - final Context context = getActivity().getApplicationContext(); - final OnClickListener okListener = - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final ProgressDialog progressDialog = - ProgressDialog.show( - getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false); - progressDialog.setOwnerActivity(getActivity()); - CallLogNotificationsService.cancelAllMissedCalls(getContext()); - final AsyncTask task = - new AsyncTask() { - @Override - protected Void doInBackground(Void... params) { - resolver.delete(Calls.CONTENT_URI, null, null); - CachedNumberLookupService cachedNumberLookupService = - PhoneNumberCache.get(context).getCachedNumberLookupService(); - if (cachedNumberLookupService != null) { - cachedNumberLookupService.clearAllCacheEntries(context); - } - return null; - } - - @Override - protected void onPostExecute(Void result) { - final Activity activity = progressDialog.getOwnerActivity(); - - if (activity == null || activity.isDestroyed() || activity.isFinishing()) { - return; - } - - listener.callHistoryDeleted(); - if (progressDialog != null && progressDialog.isShowing()) { - progressDialog.dismiss(); - } - } - }; - // TODO: Once we have the API, we should configure this ProgressDialog - // to only show up after a certain time (e.g. 150ms) - progressDialog.show(); - task.execute(); - } + OnClickListener okListener = + (dialog, which) -> { + progressDialog = + ProgressDialog.show( + getActivity(), getString(R.string.clearCallLogProgress_title), "", true, false); + progressDialog.setOwnerActivity(getActivity()); + CallLogNotificationsService.cancelAllMissedCalls(getContext()); + + // TODO: Once we have the API, we should configure this ProgressDialog + // to only show up after a certain time (e.g. 150ms) + progressDialog.show(); + + clearCallLogTask.executeSerial(null); }; return new AlertDialog.Builder(getActivity()) .setTitle(R.string.clearCallLogConfirmation_title) @@ -103,7 +90,48 @@ public class ClearCallLogDialog extends DialogFragment { .create(); } - interface Listener { - void callHistoryDeleted(); + private static class ClearCallLogWorker implements Worker { + private final Context appContext; + + private ClearCallLogWorker(Context appContext) { + this.appContext = appContext; + } + + @Nullable + @Override + public Void doInBackground(@Nullable Void unused) throws Throwable { + appContext.getContentResolver().delete(Calls.CONTENT_URI, null, null); + CachedNumberLookupService cachedNumberLookupService = + PhoneNumberCache.get(appContext).getCachedNumberLookupService(); + if (cachedNumberLookupService != null) { + cachedNumberLookupService.clearAllCacheEntries(appContext); + } + return null; + } + } + + private void onSuccess(Void unused) { + Assert.isNotNull(progressDialog); + Activity activity = progressDialog.getOwnerActivity(); + + if (activity == null || activity.isDestroyed() || activity.isFinishing()) { + return; + } + + maybeShowEnrichedCallSnackbar(activity); + + if (progressDialog != null && progressDialog.isShowing()) { + progressDialog.dismiss(); + } + } + + private void maybeShowEnrichedCallSnackbar(Activity activity) { + if (EnrichedCallComponent.get(activity).getEnrichedCallManager().hasStoredData()) { + Snackbar.make( + activity.findViewById(R.id.calllog_frame), + getString(R.string.multiple_ec_data_deleted), + 5_000) + .show(); + } } } -- cgit v1.2.3