summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog
diff options
context:
space:
mode:
authorlinyuh <linyuh@google.com>2018-02-21 09:53:13 -0800
committerEric Erfanian <erfanian@google.com>2018-02-22 21:11:32 +0000
commit9e3a39d9427525684d9c106587a5fa077b110812 (patch)
treedd2e72e4f8b94d53014a538492467cf6f0eb753a /java/com/android/dialer/calllog
parentf94391034e9d591c18d04c0b796d944938201f6a (diff)
Make MarkDirtyObserver available to all call log data sources & PhoneLookups.
Bug: 73347270 Test: Existing tests PiperOrigin-RevId: 186475562 Change-Id: I622b52f4d74b26fd084b6588da6321c46458aa9d
Diffstat (limited to 'java/com/android/dialer/calllog')
-rw-r--r--java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java54
-rw-r--r--java/com/android/dialer/calllog/observer/MarkDirtyObserver.java53
2 files changed, 63 insertions, 44 deletions
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index e9f7c00bf..6daa5e757 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -20,13 +20,10 @@ import android.Manifest.permission;
import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
-import android.database.ContentObserver;
import android.database.Cursor;
-import android.net.Uri;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
-import android.os.Handler;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.VoicemailContract;
@@ -47,12 +44,11 @@ import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.Ann
import com.android.dialer.calllog.datasources.CallLogDataSource;
import com.android.dialer.calllog.datasources.CallLogMutations;
import com.android.dialer.calllog.datasources.util.RowCombiner;
-import com.android.dialer.calllog.notifier.RefreshAnnotatedCallLogNotifier;
+import com.android.dialer.calllog.observer.MarkDirtyObserver;
import com.android.dialer.calllogutils.PhoneAccountUtils;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
-import com.android.dialer.common.concurrent.ThreadUtil;
import com.android.dialer.compat.android.provider.VoicemailCompat;
import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.storage.StorageComponent;
@@ -80,16 +76,16 @@ public class SystemCallLogDataSource implements CallLogDataSource {
static final String PREF_LAST_TIMESTAMP_PROCESSED = "systemCallLogLastTimestampProcessed";
private final ListeningExecutorService backgroundExecutorService;
- private final RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier;
+ private final MarkDirtyObserver markDirtyObserver;
@Nullable private Long lastTimestampProcessed;
@Inject
SystemCallLogDataSource(
@BackgroundExecutor ListeningExecutorService backgroundExecutorService,
- RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier) {
+ MarkDirtyObserver markDirtyObserver) {
this.backgroundExecutorService = backgroundExecutorService;
- this.refreshAnnotatedCallLogNotifier = refreshAnnotatedCallLogNotifier;
+ this.markDirtyObserver = markDirtyObserver;
}
@MainThread
@@ -105,12 +101,13 @@ public class SystemCallLogDataSource implements CallLogDataSource {
}
// TODO(zachh): Need to somehow register observers if user enables permission after launch?
- CallLogObserver callLogObserver =
- new CallLogObserver(ThreadUtil.getUiThreadHandler(), refreshAnnotatedCallLogNotifier);
-
+ // 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,
+ // which would be too slow. So, we just rely on content observers to trigger rebuilds when any
+ // change is made to the system call log.
appContext
.getContentResolver()
- .registerContentObserver(CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL, true, callLogObserver);
+ .registerContentObserver(CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL, true, markDirtyObserver);
if (!PermissionsUtil.hasAddVoicemailPermissions(appContext)) {
LogUtil.i("SystemCallLogDataSource.registerContentObservers", "no add voicemail permissions");
@@ -119,7 +116,7 @@ public class SystemCallLogDataSource implements CallLogDataSource {
// TODO(uabdullah): Need to somehow register observers if user enables permission after launch?
appContext
.getContentResolver()
- .registerContentObserver(VoicemailContract.Status.CONTENT_URI, true, callLogObserver);
+ .registerContentObserver(VoicemailContract.Status.CONTENT_URI, true, markDirtyObserver);
}
@Override
@@ -527,35 +524,4 @@ public class SystemCallLogDataSource implements CallLogDataSource {
}
return ids;
}
-
- // TODO(a bug): Consider replacing it with MarkDirtyObserver.
- private static class CallLogObserver extends ContentObserver {
- private final RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier;
-
- CallLogObserver(
- Handler handler, RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier) {
- super(handler);
- this.refreshAnnotatedCallLogNotifier = refreshAnnotatedCallLogNotifier;
- }
-
- @MainThread
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- Assert.isMainThread();
- LogUtil.i(
- "SystemCallLogDataSource.CallLogObserver.onChange",
- "Uri:%s, SelfChange:%b",
- String.valueOf(uri),
- selfChange);
- super.onChange(selfChange, uri);
-
- /*
- * 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, which would be too slow. So, we just rely on content observers to trigger rebuilds
- * when any change is made to the system call log.
- */
- refreshAnnotatedCallLogNotifier.markDirtyAndNotify();
- }
- }
}
diff --git a/java/com/android/dialer/calllog/observer/MarkDirtyObserver.java b/java/com/android/dialer/calllog/observer/MarkDirtyObserver.java
new file mode 100644
index 000000000..8ab1974bc
--- /dev/null
+++ b/java/com/android/dialer/calllog/observer/MarkDirtyObserver.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.calllog.observer;
+
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.support.annotation.MainThread;
+import android.support.annotation.VisibleForTesting;
+import com.android.dialer.calllog.notifier.RefreshAnnotatedCallLogNotifier;
+import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.ThreadUtil;
+import javax.inject.Inject;
+
+/**
+ * Mark the annotated call log as dirty and notify that a refresh is in order when the content
+ * changes.
+ */
+public final class MarkDirtyObserver extends ContentObserver {
+
+ private final RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier;
+
+ @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+ @Inject
+ public MarkDirtyObserver(RefreshAnnotatedCallLogNotifier refreshAnnotatedCallLogNotifier) {
+ super(ThreadUtil.getUiThreadHandler());
+ this.refreshAnnotatedCallLogNotifier = refreshAnnotatedCallLogNotifier;
+ }
+
+ @MainThread
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ Assert.isMainThread();
+ LogUtil.i(
+ "MarkDirtyObserver.onChange", "Uri:%s, SelfChange:%b", String.valueOf(uri), selfChange);
+
+ refreshAnnotatedCallLogNotifier.markDirtyAndNotify();
+ }
+}