diff options
Diffstat (limited to 'java/com/android/dialer/calllog')
3 files changed, 41 insertions, 6 deletions
diff --git a/java/com/android/dialer/calllog/CallLogFramework.java b/java/com/android/dialer/calllog/CallLogFramework.java index 53ff43057..b86bfbc10 100644 --- a/java/com/android/dialer/calllog/CallLogFramework.java +++ b/java/com/android/dialer/calllog/CallLogFramework.java @@ -16,11 +16,17 @@ package com.android.dialer.calllog; +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; import com.android.dialer.calllog.datasources.CallLogDataSource; import com.android.dialer.calllog.datasources.DataSources; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.Annotations.Ui; +import com.android.dialer.inject.ApplicationContext; 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 java.util.ArrayList; import java.util.List; @@ -35,13 +41,24 @@ import javax.inject.Singleton; @Singleton public final class CallLogFramework { + private final Context appContext; private final DataSources dataSources; private final AnnotatedCallLogMigrator annotatedCallLogMigrator; + private final ListeningExecutorService uiExecutor; + private final CallLogState callLogState; @Inject - CallLogFramework(DataSources dataSources, AnnotatedCallLogMigrator annotatedCallLogMigrator) { + CallLogFramework( + @ApplicationContext Context appContext, + DataSources dataSources, + AnnotatedCallLogMigrator annotatedCallLogMigrator, + @Ui ListeningExecutorService uiExecutor, + CallLogState callLogState) { + this.appContext = appContext; this.dataSources = dataSources; this.annotatedCallLogMigrator = annotatedCallLogMigrator; + this.uiExecutor = uiExecutor; + this.callLogState = callLogState; } /** Registers the content observers for all data sources. */ @@ -73,12 +90,25 @@ public final class CallLogFramework { dataSource.unregisterContentObservers(); } + callLogState.clearData(); + // Clear data only after all content observers have been disabled. List<ListenableFuture<Void>> allFutures = new ArrayList<>(); for (CallLogDataSource dataSource : dataSources.getDataSourcesIncludingSystemCallLog()) { allFutures.add(dataSource.clearData()); } + return Futures.transform( - Futures.allAsList(allFutures), unused -> null, MoreExecutors.directExecutor()); + Futures.allAsList(allFutures), + unused -> { + // Send a broadcast to the OldMainActivityPeer to remove the NewCallLogFragment if it is + // currently attached. If this is not done, user interaction with the fragment could cause + // call log framework state to be unexpectedly written. For example scrolling could cause + // the AnnotatedCallLog to be read (which would trigger database creation). + LocalBroadcastManager.getInstance(appContext) + .sendBroadcastSync(new Intent("disableNewCallLogFragment")); + return null; + }, + uiExecutor); } } diff --git a/java/com/android/dialer/calllog/CallLogState.java b/java/com/android/dialer/calllog/CallLogState.java index bdb30a769..6d2ec1e5e 100644 --- a/java/com/android/dialer/calllog/CallLogState.java +++ b/java/com/android/dialer/calllog/CallLogState.java @@ -54,6 +54,15 @@ public final class CallLogState { } /** + * Clear the call log state. This is useful for example if the annotated call log needs to be + * disabled because there was a problem. + */ + @AnyThread + public void clearData() { + sharedPreferences.edit().remove(ANNOTATED_CALL_LOG_BUILT_PREF).apply(); + } + + /** * Returns true if the annotated call log has been built at least once. * * <p>It may not yet have been built if the user was just upgraded to the new call log, or they diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java index 9332acdb1..8362a81ac 100644 --- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java @@ -30,7 +30,6 @@ import android.provider.CallLog.Calls; import android.provider.VoicemailContract; import android.provider.VoicemailContract.Voicemails; import android.support.annotation.ColorInt; -import android.support.annotation.MainThread; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.annotation.VisibleForTesting; @@ -102,11 +101,8 @@ public class SystemCallLogDataSource implements CallLogDataSource { this.annotatedCallLogDatabaseHelper = annotatedCallLogDatabaseHelper; } - @MainThread @Override public void registerContentObservers() { - Assert.isMainThread(); - LogUtil.enterBlock("SystemCallLogDataSource.registerContentObservers"); if (!PermissionsUtil.hasCallLogReadPermissions(appContext)) { |