diff options
| author | Kang Li <kanlig@google.com> | 2017-06-23 12:54:38 -0700 |
|---|---|---|
| committer | Kang Li <kanlig@google.com> | 2017-06-28 21:11:14 +0000 |
| commit | 6afa4f2901f113ec2ad47a7564654b9cc5d2fc17 (patch) | |
| tree | 7feac2aaf9810779a841b191a751568d8e9b08f0 /core/java | |
| parent | 58d47a6f04a0bbfe2654854c294e065ab46cbbc3 (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')
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; } } } |
