From b5a385a18644a72800aca2c5ef41b658b299dafe Mon Sep 17 00:00:00 2001 From: Song Hu Date: Mon, 8 Mar 2021 10:38:06 -0800 Subject: [PATCH] Remove append/quota mechanism from direct share target surfacing, due to ChooserTargetSevice sunset. Bug: 182146792 Test: verify on local phone Change-Id: Id9f76c9e1be5b0dfdff5ff1256b90a4b397045d6 --- ...ppPredictionServiceResolverComparator.java | 10 - .../android/internal/app/ChooserActivity.java | 83 +------ .../internal/app/ChooserListAdapter.java | 226 +----------------- 3 files changed, 4 insertions(+), 315 deletions(-) diff --git a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java index 26af61520593b..b76ef0fd4ed86 100644 --- a/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java +++ b/core/java/com/android/internal/app/AppPredictionServiceResolverComparator.java @@ -28,11 +28,9 @@ import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Message; import android.os.UserHandle; -import android.provider.DeviceConfig; import android.util.Log; import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import java.util.ArrayList; import java.util.HashMap; @@ -62,11 +60,6 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator // back to using the ResolverRankerService. private ResolverRankerServiceResolverComparator mResolverRankerService; - private boolean mAppendDirectShareEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.APPEND_DIRECT_SHARE_ENABLED, - true); - AppPredictionServiceResolverComparator( Context context, Intent intent, @@ -183,9 +176,6 @@ class AppPredictionServiceResolverComparator extends AbstractResolverComparator if (mResolverRankerService != null) { return mResolverRankerService.getScore(name); } - if (mAppendDirectShareEnabled && !mTargetScores.isEmpty()) { - return mTargetScores.get(name); - } Integer rank = mTargetRanks.get(name); if (rank == null) { Log.w(TAG, "Score requested for unknown component. Did you call compute yet?"); diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 00bcdda3f7f18..b113bcbb4efc1 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -256,15 +256,6 @@ public class ChooserActivity extends ResolverActivity implements SystemUiDeviceConfigFlags.HASH_SALT_MAX_DAYS, DEFAULT_SALT_EXPIRATION_DAYS); - private boolean mAppendDirectShareEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.APPEND_DIRECT_SHARE_ENABLED, - true); - private boolean mChooserTargetRankingEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.CHOOSER_TARGET_RANKING_ENABLED, - true); - private Bundle mReplacementExtras; private IntentSender mChosenComponentSender; private IntentSender mRefinementIntentSender; @@ -472,16 +463,10 @@ public class ChooserActivity extends ResolverActivity implements private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT = 4; private static final int SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED = 5; private static final int LIST_VIEW_UPDATE_MESSAGE = 6; - private static final int CHOOSER_TARGET_RANKING_SCORE = 7; private static final int WATCHDOG_TIMEOUT_MAX_MILLIS = 10000; private static final int WATCHDOG_TIMEOUT_MIN_MILLIS = 3000; - private static final int DEFAULT_DIRECT_SHARE_TIMEOUT_MILLIS = 1500; - private int mDirectShareTimeout = DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.SHARE_SHEET_DIRECT_SHARE_TIMEOUT, - DEFAULT_DIRECT_SHARE_TIMEOUT_MILLIS); - private boolean mMinTimeoutPassed = false; private void removeAllMessages() { @@ -491,7 +476,6 @@ public class ChooserActivity extends ResolverActivity implements removeMessages(CHOOSER_TARGET_SERVICE_RESULT); removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT); removeMessages(SHORTCUT_MANAGER_SHARE_TARGET_RESULT_COMPLETED); - removeMessages(CHOOSER_TARGET_RANKING_SCORE); } private void restartServiceRequestTimer() { @@ -501,14 +485,13 @@ public class ChooserActivity extends ResolverActivity implements if (DEBUG) { Log.d(TAG, "queryTargets setting watchdog timer for " - + mDirectShareTimeout + "-" + WATCHDOG_TIMEOUT_MAX_MILLIS + "ms"); } sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_MIN_TIMEOUT, WATCHDOG_TIMEOUT_MIN_MILLIS); sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_MAX_TIMEOUT, - mAppendDirectShareEnabled ? mDirectShareTimeout : WATCHDOG_TIMEOUT_MAX_MILLIS); + WATCHDOG_TIMEOUT_MAX_MILLIS); } private void maybeStopServiceRequestTimer() { @@ -608,17 +591,6 @@ public class ChooserActivity extends ResolverActivity implements getChooserActivityLogger().logSharesheetDirectLoadComplete(); break; - case CHOOSER_TARGET_RANKING_SCORE: - if (DEBUG) Log.d(TAG, "CHOOSER_TARGET_RANKING_SCORE"); - final ChooserTargetRankingInfo scoreInfo = (ChooserTargetRankingInfo) msg.obj; - ChooserListAdapter adapterForUserHandle = - mChooserMultiProfilePagerAdapter.getListAdapterForUserHandle( - scoreInfo.userHandle); - if (adapterForUserHandle != null) { - adapterForUserHandle.addChooserTargetRankingScore(scoreInfo.scores); - } - break; - default: super.handleMessage(msg); } @@ -885,17 +857,9 @@ public class ChooserActivity extends ResolverActivity implements if (appTarget.getShortcutInfo() == null) { continue; } - if (appTarget.getShortcutInfo().getId().equals(CHOOSER_TARGET)) { - chooserTargetScores.add(appTarget); - } else { - shortcutResults.add(appTarget); - } + shortcutResults.add(appTarget); } resultList = shortcutResults; - if (mChooserTargetRankingEnabled) { - sendChooserTargetRankingScore(chooserTargetScores, - chooserListAdapter.getUserHandle()); - } for (AppTarget appTarget : resultList) { shareShortcutInfos.add(new ShortcutManager.ShareShortcutInfo( appTarget.getShortcutInfo(), @@ -2148,14 +2112,6 @@ public class ChooserActivity extends ResolverActivity implements return true; } - private void sendChooserTargetRankingScore(List chooserTargetScores, - UserHandle userHandle) { - final Message msg = Message.obtain(); - msg.what = ChooserHandler.CHOOSER_TARGET_RANKING_SCORE; - msg.obj = new ChooserTargetRankingInfo(chooserTargetScores, userHandle); - mChooserHandler.sendMessage(msg); - } - private void sendShareShortcutInfoList( List resultList, ChooserListAdapter chooserListAdapter, @@ -2376,9 +2332,6 @@ public class ChooserActivity extends ResolverActivity implements } private void sendImpressionToAppPredictor(TargetInfo targetInfo, ChooserListAdapter adapter) { - if (!mChooserTargetRankingEnabled) { - return; - } AppPredictor directShareAppPredictor = getAppPredictorForDirectShareIfEnabled( mChooserMultiProfilePagerAdapter.getCurrentUserHandle()); if (directShareAppPredictor == null) { @@ -2399,11 +2352,6 @@ public class ChooserActivity extends ResolverActivity implements targetIds.add(new AppTargetId( String.format("%s/%s/%s", shortcutId, componentName.flattenToString(), SHORTCUT_TARGET))); - } else { - String titleHash = ChooserUtil.md5(chooserTarget.getTitle().toString()); - targetIds.add(new AppTargetId( - String.format("%s/%s/%s", titleHash, componentName.flattenToString(), - CHOOSER_TARGET))); } } directShareAppPredictor.notifyLaunchLocationShown(LAUNCH_LOCATION_DIRECT_SHARE, targetIds); @@ -2423,29 +2371,6 @@ public class ChooserActivity extends ResolverActivity implements if (mDirectShareAppTargetCache != null) { appTarget = mDirectShareAppTargetCache.get(chooserTarget); } - if (mChooserTargetRankingEnabled && appTarget == null) { - // Send ChooserTarget sharing info to AppPredictor. - ComponentName componentName = mChooserTargetComponentNameCache.getOrDefault( - chooserTarget.getComponentName(), chooserTarget.getComponentName()); - try { - appTarget = new AppTarget.Builder( - new AppTargetId(componentName.flattenToString()), - new ShortcutInfo.Builder( - createPackageContextAsUser( - componentName.getPackageName(), - 0 /* flags */, - getUser()), - CHOOSER_TARGET) - .setActivity(componentName) - .setShortLabel(ChooserUtil.md5(chooserTarget.getTitle().toString())) - .build()) - .setClassName(componentName.getClassName()) - .build(); - } catch (NameNotFoundException e) { - Log.e(TAG, "Could not look up service " + componentName - + "; component name not found"); - } - } // This is a direct share click that was provided by the APS if (appTarget != null) { directShareAppPredictor.notifyAppTargetEvent( @@ -3971,9 +3896,7 @@ public class ChooserActivity extends ResolverActivity implements // until they start to scroll ChooserListAdapter adapter = mChooserMultiProfilePagerAdapter.getActiveListAdapter(); - int validTargets = - mAppendDirectShareEnabled ? adapter.getNumServiceTargetsForExpand() - : adapter.getSelectableServiceTargetCount(); + int validTargets = adapter.getSelectableServiceTargetCount(); if (validTargets <= maxTargetsPerRow) { mHideDirectShareExpansion = true; return; diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 570066807f16a..d153107d77c73 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -21,7 +21,6 @@ import static com.android.internal.app.ChooserActivity.TARGET_TYPE_SHORTCUTS_FRO import android.app.ActivityManager; import android.app.prediction.AppPredictor; -import android.app.prediction.AppTarget; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -34,7 +33,6 @@ import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.UserHandle; import android.os.UserManager; -import android.provider.DeviceConfig; import android.service.chooser.ChooserTarget; import android.util.Log; import android.util.Pair; @@ -48,7 +46,6 @@ import com.android.internal.app.chooser.DisplayResolveInfo; import com.android.internal.app.chooser.MultiDisplayResolveInfo; import com.android.internal.app.chooser.SelectableTargetInfo; import com.android.internal.app.chooser.TargetInfo; -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import java.util.ArrayList; import java.util.Collections; @@ -57,17 +54,11 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; public class ChooserListAdapter extends ResolverListAdapter { private static final String TAG = "ChooserListAdapter"; private static final boolean DEBUG = false; - private boolean mAppendDirectShareEnabled = DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.APPEND_DIRECT_SHARE_ENABLED, - true); - private boolean mEnableStackedApps = true; public static final int NO_POSITION = -1; @@ -209,9 +200,6 @@ public class ChooserListAdapter extends ResolverListAdapter { void refreshListView() { if (mListViewDataChanged) { - if (mAppendDirectShareEnabled) { - appendServiceTargetsWithQuota(); - } super.notifyDataSetChanged(); } mListViewDataChanged = false; @@ -517,11 +505,6 @@ public class ChooserListAdapter extends ResolverListAdapter { + targets.size() + " targets"); } - if (mAppendDirectShareEnabled) { - parkTargetIntoMemory(origTarget, targets, targetType, directShareToShortcutInfos, - pendingChooserTargetServiceConnections); - return; - } if (targets.size() == 0) { return; } @@ -572,210 +555,6 @@ public class ChooserListAdapter extends ResolverListAdapter { } } - /** - * Store ChooserTarget ranking scores info wrapped in {@code targets}. - */ - public void addChooserTargetRankingScore(List targets) { - Log.i(TAG, "addChooserTargetRankingScore " + targets.size() + " targets score."); - for (AppTarget target : targets) { - if (target.getShortcutInfo() == null) { - continue; - } - ShortcutInfo shortcutInfo = target.getShortcutInfo(); - if (!shortcutInfo.getId().equals(ChooserActivity.CHOOSER_TARGET) - || shortcutInfo.getActivity() == null) { - continue; - } - ComponentName componentName = shortcutInfo.getActivity(); - if (!mChooserTargetScores.containsKey(componentName)) { - mChooserTargetScores.put(componentName, new HashMap<>()); - } - mChooserTargetScores.get(componentName).put(shortcutInfo.getShortLabel().toString(), - target.getRank()); - } - mChooserTargetScores.keySet().forEach(key -> rankTargetsWithinComponent(key)); - } - - /** - * Rank chooserTargets of the given {@code componentName} in mParkingDirectShareTargets as per - * available scores stored in mChooserTargetScores. - */ - private void rankTargetsWithinComponent(ComponentName componentName) { - if (!mParkingDirectShareTargets.containsKey(componentName) - || !mChooserTargetScores.containsKey(componentName)) { - return; - } - Map scores = mChooserTargetScores.get(componentName); - Collections.sort(mParkingDirectShareTargets.get(componentName).first, (o1, o2) -> { - // The score has been normalized between 0 and 2000, the default is 1000. - int score1 = scores.getOrDefault( - ChooserUtil.md5(o1.getChooserTarget().getTitle().toString()), - DEFAULT_DIRECT_SHARE_RANKING_SCORE); - int score2 = scores.getOrDefault( - ChooserUtil.md5(o2.getChooserTarget().getTitle().toString()), - DEFAULT_DIRECT_SHARE_RANKING_SCORE); - return score2 - score1; - }); - } - - /** - * Park {@code targets} into memory for the moment to surface them later when view is refreshed. - * Components pending on ChooserTargetService query are also recorded. - */ - private void parkTargetIntoMemory(DisplayResolveInfo origTarget, List targets, - @ChooserActivity.ShareTargetType int targetType, - Map directShareToShortcutInfos, - List - pendingChooserTargetServiceConnections) { - ComponentName origComponentName = origTarget != null ? origTarget.getResolvedComponentName() - : !targets.isEmpty() ? targets.get(0).getComponentName() : null; - Log.i(TAG, - "parkTargetIntoMemory " + origComponentName + ", " + targets.size() + " targets"); - mPendingChooserTargetService = pendingChooserTargetServiceConnections.stream() - .map(ChooserActivity.ChooserTargetServiceConnection::getComponentName) - .filter(componentName -> !componentName.equals(origComponentName)) - .collect(Collectors.toSet()); - // Park targets in memory - if (!targets.isEmpty()) { - final boolean isShortcutResult = - (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER - || targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); - Context contextAsUser = mContext.createContextAsUser(getUserHandle(), - 0 /* flags */); - List parkingTargetInfos = targets.stream() - .map(target -> - new SelectableTargetInfo( - contextAsUser, origTarget, target, target.getScore(), - mSelectableTargetInfoCommunicator, - (isShortcutResult ? directShareToShortcutInfos.get(target) - : null)) - ) - .collect(Collectors.toList()); - Pair, Integer> parkingTargetInfoPair = - mParkingDirectShareTargets.getOrDefault(origComponentName, - new Pair<>(new ArrayList<>(), 0)); - for (ChooserTargetInfo target : parkingTargetInfos) { - if (!checkDuplicateTarget(target, parkingTargetInfoPair.first) - && !checkDuplicateTarget(target, mServiceTargets)) { - parkingTargetInfoPair.first.add(target); - mAvailableServiceTargetsNum++; - } - } - mParkingDirectShareTargets.put(origComponentName, parkingTargetInfoPair); - rankTargetsWithinComponent(origComponentName); - if (isShortcutResult) { - mShortcutComponents.add(origComponentName); - } - } - notifyDataSetChanged(); - } - - /** - * Append targets of top ranked share app into direct share row with quota limit. Remove - * appended ones from memory. - */ - private void appendServiceTargetsWithQuota() { - int maxRankedTargets = mChooserListCommunicator.getMaxRankedTargets(); - List topComponentNames = getTopComponentNames(maxRankedTargets); - float totalScore = 0f; - for (ComponentName component : topComponentNames) { - if (!mPendingChooserTargetService.contains(component) - && !mParkingDirectShareTargets.containsKey(component)) { - continue; - } - totalScore += super.getScore(component); - } - boolean shouldWaitPendingService = false; - for (ComponentName component : topComponentNames) { - if (!mPendingChooserTargetService.contains(component) - && !mParkingDirectShareTargets.containsKey(component)) { - continue; - } - float score = super.getScore(component); - int quota = Math.round(maxRankedTargets * score / totalScore); - if (mPendingChooserTargetService.contains(component) && quota >= 1) { - shouldWaitPendingService = true; - } - if (!mParkingDirectShareTargets.containsKey(component)) { - continue; - } - // Append targets into direct share row as per quota. - Pair, Integer> parkingTargetsItem = - mParkingDirectShareTargets.get(component); - List parkingTargets = parkingTargetsItem.first; - int insertedNum = parkingTargetsItem.second; - while (insertedNum < quota && !parkingTargets.isEmpty()) { - if (!checkDuplicateTarget(parkingTargets.get(0), mServiceTargets)) { - mServiceTargets.add(mValidServiceTargetsNum, parkingTargets.get(0)); - mValidServiceTargetsNum++; - insertedNum++; - } - parkingTargets.remove(0); - } - Log.i(TAG, " appendServiceTargetsWithQuota component=" + component - + " appendNum=" + (insertedNum - parkingTargetsItem.second)); - if (DEBUG) { - Log.d(TAG, " appendServiceTargetsWithQuota component=" + component - + " score=" + score - + " totalScore=" + totalScore - + " quota=" + quota); - } - mParkingDirectShareTargets.put(component, new Pair<>(parkingTargets, insertedNum)); - } - if (!shouldWaitPendingService) { - fillAllServiceTargets(); - } - } - - /** - * Append all remaining targets (parking in memory) into direct share row as per their ranking. - */ - private void fillAllServiceTargets() { - if (mParkingDirectShareTargets.isEmpty()) { - return; - } - Log.i(TAG, " fillAllServiceTargets"); - List topComponentNames = getTopComponentNames(MAX_SERVICE_TARGET_APP); - // Append all remaining targets of top recommended components into direct share row. - for (ComponentName component : topComponentNames) { - if (!mParkingDirectShareTargets.containsKey(component)) { - continue; - } - mParkingDirectShareTargets.get(component).first.stream() - .filter(target -> !checkDuplicateTarget(target, mServiceTargets)) - .forEach(target -> { - mServiceTargets.add(mValidServiceTargetsNum, target); - mValidServiceTargetsNum++; - }); - mParkingDirectShareTargets.remove(component); - } - // Append all remaining shortcuts targets into direct share row. - mParkingDirectShareTargets.entrySet().stream() - .filter(entry -> mShortcutComponents.contains(entry.getKey())) - .map(entry -> entry.getValue()) - .map(pair -> pair.first) - .forEach(targets -> { - for (ChooserTargetInfo target : targets) { - if (!checkDuplicateTarget(target, mServiceTargets)) { - mServiceTargets.add(mValidServiceTargetsNum, target); - mValidServiceTargetsNum++; - } - } - }); - mParkingDirectShareTargets.clear(); - } - - private boolean checkDuplicateTarget(ChooserTargetInfo target, - List destination) { - // Check for duplicates and abort if found - for (ChooserTargetInfo otherTargetInfo : destination) { - if (target.isSimilar(otherTargetInfo)) { - return true; - } - } - return false; - } - /** * The return number have to exceed a minimum limit to make direct share area expandable. When * append direct share targets is enabled, return count of all available targets parking in the @@ -783,7 +562,7 @@ public class ChooserListAdapter extends ResolverListAdapter { * shuffling due to older-style direct share targets. */ int getNumServiceTargetsForExpand() { - return mAppendDirectShareEnabled ? mAvailableServiceTargetsNum : mNumShortcutResults; + return mNumShortcutResults; } /** @@ -820,9 +599,6 @@ public class ChooserListAdapter extends ResolverListAdapter { */ public void completeServiceTargetLoading() { mServiceTargets.removeIf(o -> o instanceof ChooserActivity.PlaceHolderTargetInfo); - if (mAppendDirectShareEnabled) { - fillAllServiceTargets(); - } if (mServiceTargets.isEmpty()) { mServiceTargets.add(new ChooserActivity.EmptyTargetInfo()); }