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/RefreshAnnotatedCallLogReceiver.java36
-rw-r--r--java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java23
-rw-r--r--java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java4
3 files changed, 55 insertions, 8 deletions
diff --git a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogReceiver.java b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogReceiver.java
index e0bfcd8a3..3019f5e3a 100644
--- a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogReceiver.java
+++ b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogReceiver.java
@@ -21,10 +21,15 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.annotation.Nullable;
+import com.android.dialer.calllog.RefreshAnnotatedCallLogWorker.RefreshResult;
import com.android.dialer.calllog.constants.IntentNames;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DefaultFutureCallback;
import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.metrics.FutureTimer;
+import com.android.dialer.metrics.Metrics;
+import com.android.dialer.metrics.MetricsComponent;
+import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
@@ -43,6 +48,7 @@ public final class RefreshAnnotatedCallLogReceiver extends BroadcastReceiver {
private static final long REFRESH_ANNOTATED_CALL_LOG_WAIT_MILLIS = 100L;
private final RefreshAnnotatedCallLogWorker refreshAnnotatedCallLogWorker;
+ private final FutureTimer futureTimer;
@Nullable private Runnable refreshAnnotatedCallLogRunnable;
@@ -57,6 +63,7 @@ public final class RefreshAnnotatedCallLogReceiver extends BroadcastReceiver {
public RefreshAnnotatedCallLogReceiver(Context context) {
refreshAnnotatedCallLogWorker =
CallLogComponent.get(context).getRefreshAnnotatedCallLogWorker();
+ futureTimer = MetricsComponent.get(context).futureTimer();
}
@Override
@@ -97,12 +104,14 @@ public final class RefreshAnnotatedCallLogReceiver extends BroadcastReceiver {
refreshAnnotatedCallLogRunnable =
() -> {
- ListenableFuture<Void> future =
+ ListenableFuture<RefreshResult> future =
checkDirty
? refreshAnnotatedCallLogWorker.refreshWithDirtyCheck()
: refreshAnnotatedCallLogWorker.refreshWithoutDirtyCheck();
Futures.addCallback(
future, new DefaultFutureCallback<>(), MoreExecutors.directExecutor());
+ futureTimer.applyTiming(future, new EventNameFromResultFunction(checkDirty));
+ // TODO(zachh): Should also log impression counts of RefreshResults.
};
ThreadUtil.getUiThreadHandler()
@@ -118,4 +127,29 @@ public final class RefreshAnnotatedCallLogReceiver extends BroadcastReceiver {
ThreadUtil.getUiThreadHandler().removeCallbacks(refreshAnnotatedCallLogRunnable);
}
+
+ private static class EventNameFromResultFunction implements Function<RefreshResult, String> {
+
+ private final boolean checkDirty;
+
+ private EventNameFromResultFunction(boolean checkDirty) {
+ this.checkDirty = checkDirty;
+ }
+
+ @Override
+ public String apply(RefreshResult refreshResult) {
+ switch (refreshResult) {
+ case NOT_DIRTY:
+ return Metrics.REFRESH_NOT_DIRTY; // NOT_DIRTY implies forceRefresh is false
+ case REBUILT_BUT_NO_CHANGES_NEEDED:
+ return checkDirty
+ ? Metrics.REFRESH_NO_CHANGES_NEEDED
+ : Metrics.FORCE_REFRESH_NO_CHANGES_NEEDED;
+ case REBUILT_AND_CHANGES_NEEDED:
+ return checkDirty ? Metrics.REFRESH_CHANGES_NEEDED : Metrics.FORCE_REFRESH_CHANGES_NEEDED;
+ default:
+ throw new IllegalStateException("Unsupported result: " + refreshResult);
+ }
+ }
+ }
}
diff --git a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
index e05b77268..c399b05ea 100644
--- a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
+++ b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
@@ -79,23 +79,30 @@ public class RefreshAnnotatedCallLogWorker {
this.lightweightExecutorService = lightweightExecutorService;
}
+ /** Result of refreshing the annotated call log. */
+ public enum RefreshResult {
+ NOT_DIRTY,
+ REBUILT_BUT_NO_CHANGES_NEEDED,
+ REBUILT_AND_CHANGES_NEEDED
+ }
+
/** Checks if the annotated call log is dirty and refreshes it if necessary. */
- ListenableFuture<Void> refreshWithDirtyCheck() {
+ ListenableFuture<RefreshResult> refreshWithDirtyCheck() {
return refresh(true);
}
/** Refreshes the annotated call log, bypassing dirty checks. */
- ListenableFuture<Void> refreshWithoutDirtyCheck() {
+ ListenableFuture<RefreshResult> refreshWithoutDirtyCheck() {
return refresh(false);
}
- private ListenableFuture<Void> refresh(boolean checkDirty) {
+ private ListenableFuture<RefreshResult> refresh(boolean checkDirty) {
LogUtil.i("RefreshAnnotatedCallLogWorker.refresh", "submitting serialized refresh request");
return dialerFutureSerializer.submitAsync(
() -> checkDirtyAndRebuildIfNecessary(checkDirty), lightweightExecutorService);
}
- private ListenableFuture<Void> checkDirtyAndRebuildIfNecessary(boolean checkDirty) {
+ private ListenableFuture<RefreshResult> checkDirtyAndRebuildIfNecessary(boolean checkDirty) {
ListenableFuture<Boolean> forceRebuildFuture =
backgroundExecutorService.submit(
() -> {
@@ -139,7 +146,7 @@ public class RefreshAnnotatedCallLogWorker {
return Futures.transformAsync(
callLogState.isBuilt(), this::rebuild, MoreExecutors.directExecutor());
}
- return Futures.immediateFuture(null);
+ return Futures.immediateFuture(RefreshResult.NOT_DIRTY);
},
lightweightExecutorService);
}
@@ -160,7 +167,7 @@ public class RefreshAnnotatedCallLogWorker {
return isDirtyFuture;
}
- private ListenableFuture<Void> rebuild(boolean isBuilt) {
+ private ListenableFuture<RefreshResult> rebuild(boolean isBuilt) {
CallLogMutations mutations = new CallLogMutations();
// Start by filling the data sources--the system call log data source must go first!
@@ -225,7 +232,9 @@ public class RefreshAnnotatedCallLogWorker {
unused -> {
sharedPreferences.edit().putBoolean(SharedPrefKeys.FORCE_REBUILD, false).apply();
callLogState.markBuilt();
- return null;
+ return mutations.isEmpty()
+ ? RefreshResult.REBUILT_BUT_NO_CHANGES_NEEDED
+ : RefreshResult.REBUILT_AND_CHANGES_NEEDED;
},
backgroundExecutorService);
}
diff --git a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
index 77de62ea4..69722731e 100644
--- a/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
+++ b/java/com/android/dialer/calllog/database/AnnotatedCallLogContentProvider.java
@@ -37,6 +37,8 @@ import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.Ann
import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.CoalescedAnnotatedCallLog;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.metrics.Metrics;
+import com.android.dialer.metrics.MetricsComponent;
import java.util.ArrayList;
import java.util.Arrays;
@@ -153,6 +155,7 @@ public class AnnotatedCallLogContentProvider extends ContentProvider {
Assert.checkArgument(
selectionArgs == null, "selection args not supported for coalesced call log");
Assert.checkArgument(sortOrder == null, "sort order not supported for coalesced call log");
+ MetricsComponent.get(getContext()).metrics().startTimer(Metrics.NEW_CALL_LOG_COALESCE);
try (Cursor allAnnotatedCallLogRows =
queryBuilder.query(
db,
@@ -168,6 +171,7 @@ public class AnnotatedCallLogContentProvider extends ContentProvider {
.coalesce(allAnnotatedCallLogRows);
coalescedRows.setNotificationUri(
getContext().getContentResolver(), CoalescedAnnotatedCallLog.CONTENT_URI);
+ MetricsComponent.get(getContext()).metrics().stopTimer(Metrics.NEW_CALL_LOG_COALESCE);
return coalescedRows;
}
default: