diff options
Diffstat (limited to 'java/com/android/dialer/calllog/datasources')
4 files changed, 65 insertions, 16 deletions
diff --git a/java/com/android/dialer/calllog/datasources/CallLogDataSource.java b/java/com/android/dialer/calllog/datasources/CallLogDataSource.java index 03a571675..fa3b6a9df 100644 --- a/java/com/android/dialer/calllog/datasources/CallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/CallLogDataSource.java @@ -108,4 +108,11 @@ public interface CallLogDataSource { @MainThread void unregisterContentObservers(Context appContext); + + /** + * Clear any data written by this data source. This is called when the new call log framework has + * been disabled (because for example there was a problem with it). + */ + @MainThread + ListenableFuture<Void> clearData(); } diff --git a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java index 40b0090b9..615a457e3 100644 --- a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java +++ b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java @@ -40,6 +40,7 @@ import com.android.dialer.common.concurrent.Annotations.LightweightExecutor; import com.android.dialer.phonelookup.PhoneLookup; import com.android.dialer.phonelookup.PhoneLookupInfo; import com.android.dialer.phonelookup.composite.CompositePhoneLookup; +import com.android.dialer.phonelookup.database.PhoneLookupHistoryDatabaseHelper; import com.android.dialer.phonelookup.database.contract.PhoneLookupHistoryContract; import com.android.dialer.phonelookup.database.contract.PhoneLookupHistoryContract.PhoneLookupHistory; import com.google.common.collect.ImmutableMap; @@ -48,6 +49,7 @@ import com.google.common.collect.Maps; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import com.google.protobuf.InvalidProtocolBufferException; import java.util.ArrayList; import java.util.Arrays; @@ -85,14 +87,18 @@ public final class PhoneLookupDataSource implements CallLogDataSource { */ private final Set<String> phoneLookupHistoryRowsToDelete = new ArraySet<>(); + private final PhoneLookupHistoryDatabaseHelper phoneLookupHistoryDatabaseHelper; + @Inject PhoneLookupDataSource( CompositePhoneLookup compositePhoneLookup, @BackgroundExecutor ListeningExecutorService backgroundExecutorService, - @LightweightExecutor ListeningExecutorService lightweightExecutorService) { + @LightweightExecutor ListeningExecutorService lightweightExecutorService, + PhoneLookupHistoryDatabaseHelper phoneLookupHistoryDatabaseHelper) { this.compositePhoneLookup = compositePhoneLookup; this.backgroundExecutorService = backgroundExecutorService; this.lightweightExecutorService = lightweightExecutorService; + this.phoneLookupHistoryDatabaseHelper = phoneLookupHistoryDatabaseHelper; } @Override @@ -299,6 +305,17 @@ public final class PhoneLookupDataSource implements CallLogDataSource { compositePhoneLookup.unregisterContentObservers(appContext); } + @Override + public ListenableFuture<Void> clearData() { + ListenableFuture<Void> clearDataFuture = compositePhoneLookup.clearData(); + ListenableFuture<Void> deleteDatabaseFuture = phoneLookupHistoryDatabaseHelper.delete(); + + return Futures.transform( + Futures.allAsList(clearDataFuture, deleteDatabaseFuture), + unused -> null, + MoreExecutors.directExecutor()); + } + private static ImmutableSet<DialerPhoneNumber> queryDistinctDialerPhoneNumbersFromAnnotatedCallLog(Context appContext) { ImmutableSet.Builder<DialerPhoneNumber> numbers = ImmutableSet.builder(); diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java index 3c34fa6a5..e07996177 100644 --- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java @@ -20,6 +20,7 @@ import android.Manifest.permission; import android.annotation.TargetApi; import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.os.Build; import android.os.Build.VERSION; @@ -40,6 +41,7 @@ import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import android.util.ArraySet; import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.calllog.database.AnnotatedCallLogDatabaseHelper; import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog; import com.android.dialer.calllog.datasources.CallLogDataSource; import com.android.dialer.calllog.datasources.CallLogMutations; @@ -51,13 +53,15 @@ import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; -import com.android.dialer.storage.StorageComponent; +import com.android.dialer.storage.Unencrypted; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.theme.R; import com.android.dialer.util.PermissionsUtil; import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import com.google.i18n.phonenumbers.PhoneNumberUtil; import java.util.ArrayList; import java.util.Arrays; @@ -77,15 +81,21 @@ public class SystemCallLogDataSource implements CallLogDataSource { private final ListeningExecutorService backgroundExecutorService; private final MarkDirtyObserver markDirtyObserver; + private final SharedPreferences sharedPreferences; + private final AnnotatedCallLogDatabaseHelper annotatedCallLogDatabaseHelper; @Nullable private Long lastTimestampProcessed; @Inject SystemCallLogDataSource( @BackgroundExecutor ListeningExecutorService backgroundExecutorService, - MarkDirtyObserver markDirtyObserver) { + MarkDirtyObserver markDirtyObserver, + @Unencrypted SharedPreferences sharedPreferences, + AnnotatedCallLogDatabaseHelper annotatedCallLogDatabaseHelper) { this.backgroundExecutorService = backgroundExecutorService; this.markDirtyObserver = markDirtyObserver; + this.sharedPreferences = sharedPreferences; + this.annotatedCallLogDatabaseHelper = annotatedCallLogDatabaseHelper; } @MainThread @@ -125,8 +135,24 @@ public class SystemCallLogDataSource implements CallLogDataSource { } @Override + public ListenableFuture<Void> clearData() { + ListenableFuture<Void> deleteSharedPref = + backgroundExecutorService.submit( + () -> { + sharedPreferences.edit().remove(PREF_LAST_TIMESTAMP_PROCESSED).apply(); + return null; + }); + + // TODO(zachh): Test re-enabling after deleting database like this. + return Futures.transform( + Futures.allAsList(deleteSharedPref, annotatedCallLogDatabaseHelper.delete()), + unused -> null, + MoreExecutors.directExecutor()); + } + + @Override public ListenableFuture<Boolean> isDirty(Context appContext) { - return backgroundExecutorService.submit(() -> isDirtyInternal(appContext)); + return backgroundExecutorService.submit(this::isDirtyInternal); } @Override @@ -136,11 +162,11 @@ public class SystemCallLogDataSource implements CallLogDataSource { @Override public ListenableFuture<Void> onSuccessfulFill(Context appContext) { - return backgroundExecutorService.submit(() -> onSuccessfulFillInternal(appContext)); + return backgroundExecutorService.submit(this::onSuccessfulFillInternal); } @WorkerThread - private boolean isDirtyInternal(Context appContext) { + private boolean isDirtyInternal() { Assert.isWorkerThread(); /* @@ -151,9 +177,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { * * Just return false unless the table has never been written to. */ - return !StorageComponent.get(appContext) - .unencryptedSharedPrefs() - .contains(PREF_LAST_TIMESTAMP_PROCESSED); + return !sharedPreferences.contains(PREF_LAST_TIMESTAMP_PROCESSED); } @WorkerThread @@ -183,11 +207,10 @@ public class SystemCallLogDataSource implements CallLogDataSource { } @WorkerThread - private Void onSuccessfulFillInternal(Context appContext) { + private Void onSuccessfulFillInternal() { // If a fill operation was a no-op, lastTimestampProcessed could still be null. if (lastTimestampProcessed != null) { - StorageComponent.get(appContext) - .unencryptedSharedPrefs() + sharedPreferences .edit() .putLong(PREF_LAST_TIMESTAMP_PROCESSED, lastTimestampProcessed) .apply(); @@ -232,10 +255,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { @TargetApi(Build.VERSION_CODES.M) // Uses try-with-resources private void handleInsertsAndUpdates( Context appContext, CallLogMutations mutations, Set<Long> existingAnnotatedCallLogIds) { - long previousTimestampProcessed = - StorageComponent.get(appContext) - .unencryptedSharedPrefs() - .getLong(PREF_LAST_TIMESTAMP_PROCESSED, 0L); + long previousTimestampProcessed = sharedPreferences.getLong(PREF_LAST_TIMESTAMP_PROCESSED, 0L); DialerPhoneNumberUtil dialerPhoneNumberUtil = new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance()); diff --git a/java/com/android/dialer/calllog/datasources/voicemail/VoicemailDataSource.java b/java/com/android/dialer/calllog/datasources/voicemail/VoicemailDataSource.java index 86f3d47ce..75c05139d 100644 --- a/java/com/android/dialer/calllog/datasources/voicemail/VoicemailDataSource.java +++ b/java/com/android/dialer/calllog/datasources/voicemail/VoicemailDataSource.java @@ -111,4 +111,9 @@ public class VoicemailDataSource implements CallLogDataSource { @Override public void unregisterContentObservers(Context appContext) {} + + @Override + public ListenableFuture<Void> clearData() { + return Futures.immediateFuture(null); + } } |