summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorKang Li <kanlig@google.com>2017-06-23 12:54:38 -0700
committerKang Li <kanlig@google.com>2017-06-28 21:11:14 +0000
commit6afa4f2901f113ec2ad47a7564654b9cc5d2fc17 (patch)
tree7feac2aaf9810779a841b191a751568d8e9b08f0 /core/java
parent58d47a6f04a0bbfe2654854c294e065ab46cbbc3 (diff)
Dedupes ranked apps in sharing windows, and reuses computed scores
in sorting for ResolverActivity. bug: 63109049 Test: tested on a Pixel XL and a 6P to verify that it worked as expected. Change-Id: I04ff45c3e15cbffb015568772b9b804e08f11aa4
Diffstat (limited to 'core/java')
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java9
-rw-r--r--core/java/com/android/internal/app/ResolverComparator.java4
-rw-r--r--core/java/com/android/internal/app/ResolverListController.java74
3 files changed, 59 insertions, 28 deletions
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 9c6f1d0536e1..5c1bafdbca3f 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -1681,7 +1681,14 @@ public class ResolverActivity extends Activity {
// We assume that at this point we've already filtered out the only intent for a different
// targetUserId which we're going to use.
private void addResolveInfo(DisplayResolveInfo dri) {
- if (dri.mResolveInfo.targetUserId == UserHandle.USER_CURRENT) {
+ if (dri != null && dri.mResolveInfo != null
+ && dri.mResolveInfo.targetUserId == UserHandle.USER_CURRENT) {
+ // Checks if this info is already listed in display.
+ for (DisplayResolveInfo existingInfo : mDisplayList) {
+ if (resolveInfoMatch(dri.mResolveInfo, existingInfo.mResolveInfo)) {
+ return;
+ }
+ }
mDisplayList.add(dri);
}
}
diff --git a/core/java/com/android/internal/app/ResolverComparator.java b/core/java/com/android/internal/app/ResolverComparator.java
index 54b9cd869f2d..a0f58a99f625 100644
--- a/core/java/com/android/internal/app/ResolverComparator.java
+++ b/core/java/com/android/internal/app/ResolverComparator.java
@@ -553,7 +553,9 @@ class ResolverComparator implements Comparator<ResolvedComponentInfo> {
Log.e(TAG, "Error in Predict: " + e);
}
}
- mAfterCompute.afterCompute();
+ if (mAfterCompute != null) {
+ mAfterCompute.afterCompute();
+ }
}
// adds select prob as the default values, according to a pre-trained Logistic Regression model.
diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java
index 5ab17e449ba6..2ab2d20ed20d 100644
--- a/core/java/com/android/internal/app/ResolverListController.java
+++ b/core/java/com/android/internal/app/ResolverListController.java
@@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.RemoteException;
import android.util.Log;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.lang.InterruptedException;
@@ -55,7 +56,11 @@ public class ResolverListController {
private static final String TAG = "ResolverListController";
private static final boolean DEBUG = false;
+ Object mLock = new Object();
+
+ @GuardedBy("mLock")
private ResolverComparator mResolverComparator;
+ private boolean isComputed = false;
public ResolverListController(
Context context,
@@ -68,6 +73,10 @@ public class ResolverListController {
mLaunchedFromUid = launchedFromUid;
mTargetIntent = targetIntent;
mReferrerPackage = referrerPackage;
+ synchronized (mLock) {
+ mResolverComparator =
+ new ResolverComparator(mContext, mTargetIntent, mReferrerPackage, null);
+ }
}
@VisibleForTesting
@@ -232,25 +241,29 @@ public class ResolverListController {
@VisibleForTesting
@WorkerThread
public void sort(List<ResolverActivity.ResolvedComponentInfo> inputList) {
- final CountDownLatch finishComputeSignal = new CountDownLatch(1);
- ComputeCallback callback = new ComputeCallback(finishComputeSignal);
- if (mResolverComparator == null) {
- mResolverComparator =
- new ResolverComparator(mContext, mTargetIntent, mReferrerPackage, callback);
- } else {
+ synchronized (mLock) {
+ if (mResolverComparator == null) {
+ Log.d(TAG, "Comparator has already been destroyed; skipped.");
+ return;
+ }
+ final CountDownLatch finishComputeSignal = new CountDownLatch(1);
+ ComputeCallback callback = new ComputeCallback(finishComputeSignal);
mResolverComparator.setCallBack(callback);
- }
- try {
- long beforeRank = System.currentTimeMillis();
- mResolverComparator.compute(inputList);
- finishComputeSignal.await();
- Collections.sort(inputList, mResolverComparator);
- long afterRank = System.currentTimeMillis();
- if (DEBUG) {
- Log.d(TAG, "Time Cost: " + Long.toString(afterRank - beforeRank));
+ try {
+ long beforeRank = System.currentTimeMillis();
+ if (!isComputed) {
+ mResolverComparator.compute(inputList);
+ finishComputeSignal.await();
+ isComputed = true;
+ }
+ Collections.sort(inputList, mResolverComparator);
+ long afterRank = System.currentTimeMillis();
+ if (DEBUG) {
+ Log.d(TAG, "Time Cost: " + Long.toString(afterRank - beforeRank));
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, "Compute & Sort was interrupted: " + e);
}
- } catch (InterruptedException e) {
- Log.e(TAG, "Compute & Sort was interrupted: " + e);
}
}
@@ -271,27 +284,36 @@ public class ResolverListController {
@VisibleForTesting
public float getScore(ResolverActivity.DisplayResolveInfo target) {
- if (mResolverComparator == null) {
- return 0.0f;
+ synchronized (mLock) {
+ if (mResolverComparator == null) {
+ return 0.0f;
+ }
+ return mResolverComparator.getScore(target.getResolvedComponentName());
}
- return mResolverComparator.getScore(target.getResolvedComponentName());
}
public void updateModel(ComponentName componentName) {
- if (mResolverComparator != null) {
- mResolverComparator.updateModel(componentName);
+ synchronized (mLock) {
+ if (mResolverComparator != null) {
+ mResolverComparator.updateModel(componentName);
+ }
}
}
public void updateChooserCounts(String packageName, int userId, String action) {
- if (mResolverComparator != null) {
- mResolverComparator.updateChooserCounts(packageName, userId, action);
+ synchronized (mLock) {
+ if (mResolverComparator != null) {
+ mResolverComparator.updateChooserCounts(packageName, userId, action);
+ }
}
}
public void destroy() {
- if (mResolverComparator != null) {
- mResolverComparator.destroy();
+ synchronized (mLock) {
+ if (mResolverComparator != null) {
+ mResolverComparator.destroy();
+ }
+ mResolverComparator = null;
}
}
}