summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/app/ResolverComparator.java35
-rw-r--r--proto/src/metrics_constants.proto16
2 files changed, 49 insertions, 2 deletions
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index a0f58a99f625..eda63b3da5b7 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.SharedPreferences;
import android.content.ServiceConnection;
+import android.metrics.LogMaker;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
@@ -46,6 +47,8 @@ import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.app.ResolverActivity.ResolvedComponentInfo;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.io.File;
import java.lang.InterruptedException;
@@ -99,6 +102,8 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
private String mContentType;
private String[] mAnnotations;
private String mAction;
+ private ComponentName mResolvedRankerName;
+ private ComponentName mRankerServiceName;
private IResolverRankerService mRanker;
private ResolverRankerServiceConnection mConnection;
private AfterCompute mAfterCompute;
@@ -119,9 +124,17 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
if (receivedTargets != null && mTargets != null
&& receivedTargets.size() == mTargets.size()) {
final int size = mTargets.size();
+ boolean isUpdated = false;
for (int i = 0; i < size; ++i) {
- mTargets.get(i).setSelectProbability(
- receivedTargets.get(i).getSelectProbability());
+ final float predictedProb =
+ receivedTargets.get(i).getSelectProbability();
+ if (predictedProb != mTargets.get(i).getSelectProbability()) {
+ mTargets.get(i).setSelectProbability(predictedProb);
+ isUpdated = true;
+ }
+ }
+ if (isUpdated) {
+ mRankerServiceName = mResolvedRankerName;
}
} else {
Log.e(TAG, "Sizes of sent and received ResolverTargets diff.");
@@ -170,6 +183,7 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
mContentType = intent.getType();
getContentAnnotations(intent);
mAction = intent.getAction();
+ mRankerServiceName = new ComponentName(mContext, this.getClass());
}
// get annotations of content from intent.
@@ -361,6 +375,7 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
try {
int selectedPos = new ArrayList<ComponentName>(mTargetsDict.keySet())
.indexOf(componentName);
+ logMetrics(selectedPos);
if (selectedPos > 0) {
mRanker.train(mTargets, selectedPos);
} else {
@@ -392,6 +407,19 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
}
}
+ // records metrics for evaluation.
+ private void logMetrics(int selectedPos) {
+ if (mRankerServiceName != null) {
+ MetricsLogger metricsLogger = new MetricsLogger();
+ LogMaker log = new LogMaker(MetricsEvent.ACTION_TARGET_SELECTED);
+ log.setComponentName(mRankerServiceName);
+ int isCategoryUsed = (mAnnotations == null) ? 0 : 1;
+ log.addTaggedData(MetricsEvent.FIELD_IS_CATEGORY_USED, isCategoryUsed);
+ log.addTaggedData(MetricsEvent.FIELD_RANKED_POSITION, selectedPos);
+ metricsLogger.write(log);
+ }
+ }
+
// connect to a ranking service.
private void initRanker(Context context) {
synchronized (mLock) {
@@ -454,6 +482,7 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
if (DEBUG) {
Log.d(TAG, "Succeeded to retrieve a ranker: " + componentName);
}
+ mResolvedRankerName = componentName;
intent.setComponent(componentName);
return intent;
}
@@ -523,6 +552,8 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
private void reset() {
mTargetsDict.clear();
mTargets = null;
+ mRankerServiceName = new ComponentName(mContext, this.getClass());
+ mResolvedRankerName = null;
startWatchDog(WATCHDOG_TIMEOUT_MILLIS);
initRanker(mContext);
}
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 87ac46b9bfda..829217868f84 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -4218,6 +4218,22 @@ message MetricsEvent {
// OS: O MR
ACTION_SETTINGS_SMS_MIRRORING = 1084;
+ // ACTION: Chooser picked a ranked target.
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ ACTION_TARGET_SELECTED = 1085;
+
+ // FIELD - is category used in Chooser: 1.
+ // Type: int encoded boolean
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ FIELD_IS_CATEGORY_USED = 1086;
+
+ // FIELD - ranked position of selected target for Chooser.
+ // CATEGORY: GLOBAL_SYSTEM_UI
+ // OS: O MR
+ FIELD_RANKED_POSITION = 1087;
+
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
}