summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/calllog')
-rw-r--r--java/com/android/dialer/calllog/CallLogFramework.java34
-rw-r--r--java/com/android/dialer/calllog/CallLogState.java9
-rw-r--r--java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java4
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)) {