summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/calllog/notifier
diff options
context:
space:
mode:
authorlinyuh <linyuh@google.com>2018-02-20 12:46:54 -0800
committerEric Erfanian <erfanian@google.com>2018-02-22 21:08:26 +0000
commit43c978b616363bcd364693dde24209384b264319 (patch)
tree937f001e840973720fa567970b013fff03af2291 /java/com/android/dialer/calllog/notifier
parente2bf3e9d45aa8c1a6dbf39212f7ba32cbbd53185 (diff)
Use a broadcast receiver to refresh the annotated call log.
Bug: 73347270 Test: Existing tests + RefreshAnnotatedCallLogNotifierTest PiperOrigin-RevId: 186347066 Change-Id: I5a530416bdaa9edc7131a0d5ced44f1b5ee1692b
Diffstat (limited to 'java/com/android/dialer/calllog/notifier')
-rw-r--r--java/com/android/dialer/calllog/notifier/RefreshAnnotatedCallLogNotifier.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/java/com/android/dialer/calllog/notifier/RefreshAnnotatedCallLogNotifier.java b/java/com/android/dialer/calllog/notifier/RefreshAnnotatedCallLogNotifier.java
new file mode 100644
index 000000000..5b73ad778
--- /dev/null
+++ b/java/com/android/dialer/calllog/notifier/RefreshAnnotatedCallLogNotifier.java
@@ -0,0 +1,99 @@
+/*
+ * 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.notifier;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.support.v4.content.LocalBroadcastManager;
+import com.android.dialer.calllog.constants.IntentNames;
+import com.android.dialer.calllog.constants.SharedPrefKeys;
+import com.android.dialer.common.LogUtil;
+import com.android.dialer.inject.ApplicationContext;
+import com.android.dialer.storage.Unencrypted;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Notifies that a refresh of the annotated call log needs to be started/cancelled.
+ *
+ * <p>Methods in this class are usually invoked when the underlying data backing the annotated call
+ * log change.
+ *
+ * <p>For example, a {@link android.database.ContentObserver} for the system call log can use {@link
+ * #markDirtyAndNotify()} to force the annotated call log to be rebuilt.
+ */
+@Singleton
+public class RefreshAnnotatedCallLogNotifier {
+
+ private final Context appContext;
+ private final SharedPreferences sharedPreferences;
+
+ @Inject
+ RefreshAnnotatedCallLogNotifier(
+ @ApplicationContext Context appContext, @Unencrypted SharedPreferences sharedPreferences) {
+ this.appContext = appContext;
+ this.sharedPreferences = sharedPreferences;
+ }
+
+ /**
+ * Mark the annotated call log as "dirty" and notify that it needs to be refreshed.
+ *
+ * <p>This will force a rebuild by skip checking whether the annotated call log is "dirty".
+ */
+ public void markDirtyAndNotify() {
+ LogUtil.enterBlock("RefreshAnnotatedCallLogNotifier.markDirtyAndNotify");
+
+ sharedPreferences.edit().putBoolean(SharedPrefKeys.FORCE_REBUILD, true).apply();
+ notify(/* checkDirty = */ false);
+ }
+
+ /**
+ * Notifies that the annotated call log needs to be refreshed.
+ *
+ * <p>Note that the notification is sent as a broadcast, which means the annotated call log might
+ * not be refreshed if there is no corresponding receiver registered.
+ *
+ * @param checkDirty Whether to check if the annotated call log is "dirty" before proceeding to
+ * rebuild it.
+ */
+ public void notify(boolean checkDirty) {
+ LogUtil.i("RefreshAnnotatedCallLogNotifier.notify", "checkDirty = %s", checkDirty);
+
+ Intent intent = new Intent();
+ intent.setAction(IntentNames.ACTION_REFRESH_ANNOTATED_CALL_LOG);
+ intent.putExtra(IntentNames.EXTRA_CHECK_DIRTY, checkDirty);
+
+ LocalBroadcastManager.getInstance(appContext).sendBroadcast(intent);
+ }
+
+ /**
+ * Notifies to cancel refreshing the annotated call log.
+ *
+ * <p>Note that this method does not guarantee the job to be cancelled. As the notification is
+ * sent as a broadcast, please see the corresponding receiver for details about cancelling the
+ * job.
+ */
+ public void cancel() {
+ LogUtil.enterBlock("RefreshAnnotatedCallLogNotifier.cancel");
+
+ Intent intent = new Intent();
+ intent.setAction(IntentNames.ACTION_CANCEL_REFRESHING_ANNOTATED_CALL_LOG);
+
+ LocalBroadcastManager.getInstance(appContext).sendBroadcast(intent);
+ }
+}