summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog
diff options
context:
space:
mode:
authorzachh <zachh@google.com>2018-05-14 11:47:48 -0700
committerCopybara-Service <copybara-piper@google.com>2018-05-15 11:11:59 -0700
commit61640759ebc72fb646a1edb77bd8748584e756d6 (patch)
treeb7ce753b4b4a41a748d9db4213e941fddca392f3 /java/com/android/dialer/calllog
parent0ae50bdaaa095aa18eeb897f96778de64f3e6cd3 (diff)
Register system call log content observer if user enables Phone permission.
Previously, we only attempted to create the content observer in Application#onCreate and if the user didn't have the permission enabled, it wouldn't get added and would remain off for the duration of the application's life. Now we check if the observer is registered when refreshing the call log and enable it if necessary. TEST=unit Bug: 72461366 Test: unit PiperOrigin-RevId: 196543060 Change-Id: I1d58efd21fb63e0745b43ac8ff11d87562126a2f
Diffstat (limited to 'java/com/android/dialer/calllog')
-rw-r--r--java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java15
1 files changed, 13 insertions, 2 deletions
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index a08b50eb8..1b66f5099 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -62,11 +62,13 @@ import java.util.Arrays;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
+import javax.inject.Singleton;
/**
* Responsible for defining the rows in the annotated call log and maintaining the columns in it
* which are derived from the system call log.
*/
+@Singleton
@SuppressWarnings("MissingPermission")
public class SystemCallLogDataSource implements CallLogDataSource {
@@ -81,6 +83,7 @@ public class SystemCallLogDataSource implements CallLogDataSource {
private final Duo duo;
@Nullable private Long lastTimestampProcessed;
+ private boolean isCallLogContentObserverRegistered = false;
@Inject
SystemCallLogDataSource(
@@ -106,7 +109,6 @@ public class SystemCallLogDataSource implements CallLogDataSource {
LogUtil.i("SystemCallLogDataSource.registerContentObservers", "no call log permissions");
return;
}
- // TODO(zachh): Need to somehow register observers if user enables permission after launch?
// The system call log has a last updated timestamp, but deletes are physical (the "deleted"
// column is unused). This means that we can't detect deletes without scanning the entire table,
@@ -115,6 +117,7 @@ public class SystemCallLogDataSource implements CallLogDataSource {
appContext
.getContentResolver()
.registerContentObserver(CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL, true, markDirtyObserver);
+ isCallLogContentObserverRegistered = true;
if (!PermissionsUtil.hasAddVoicemailPermissions(appContext)) {
LogUtil.i("SystemCallLogDataSource.registerContentObservers", "no add voicemail permissions");
@@ -129,6 +132,7 @@ public class SystemCallLogDataSource implements CallLogDataSource {
@Override
public void unregisterContentObservers() {
appContext.getContentResolver().unregisterContentObserver(markDirtyObserver);
+ isCallLogContentObserverRegistered = false;
}
@Override
@@ -140,7 +144,6 @@ public class SystemCallLogDataSource implements CallLogDataSource {
return null;
});
- // TODO(zachh): Test re-enabling after deleting database like this.
return Futures.transform(
Futures.allAsList(deleteSharedPref, annotatedCallLogDatabaseHelper.delete()),
unused -> null,
@@ -154,6 +157,14 @@ public class SystemCallLogDataSource implements CallLogDataSource {
@Override
public ListenableFuture<Boolean> isDirty() {
+ // This can happen if the call log permission is enabled after the application is started.
+ if (!isCallLogContentObserverRegistered
+ && PermissionsUtil.hasCallLogReadPermissions(appContext)) {
+ registerContentObservers();
+ // Consider the data source dirty because calls could have been missed while the content
+ // observer wasn't registered.
+ return Futures.immediateFuture(true);
+ }
return backgroundExecutorService.submit(this::isDirtyInternal);
}