Fix wrong target launches in Chooser.

The service target row was sometimes overfull - with more targets in
the list than were displayed - when we used each row's offset
to calculate which target was selected to launch.
This fix makes sure we are not overfilling.

Test: ChooserActivityTest & manual repro -- use targets from
alphabetical section, make sure you have at least one old-API target
available
Fixes: 170518649, 165944833

Change-Id: I8a554197c01f4eadbeac43742984e4c86ca49601
(cherry picked from commit 6f015708fb7aeec4c1d2f6717e291723aedd9318)
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 460561b..a3c00ff 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -162,6 +162,9 @@
     private AppPredictor mWorkAppPredictor;
     private boolean mShouldDisplayLandscape;
 
+    private static final int MAX_TARGETS_PER_ROW_PORTRAIT = 4;
+    private static final int MAX_TARGETS_PER_ROW_LANDSCAPE = 8;
+
     @UnsupportedAppUsage
     public ChooserActivity() {
     }
@@ -904,7 +907,7 @@
                 adapter,
                 getPersonalProfileUserHandle(),
                 /* workProfileUserHandle= */ null,
-                isSendAction(getTargetIntent()));
+                isSendAction(getTargetIntent()), getMaxTargetsPerRow());
     }
 
     private ChooserMultiProfilePagerAdapter createChooserMultiProfilePagerAdapterForTwoProfiles(
@@ -933,7 +936,7 @@
                 selectedProfile,
                 getPersonalProfileUserHandle(),
                 getWorkProfileUserHandle(),
-                isSendAction(getTargetIntent()));
+                isSendAction(getTargetIntent()), getMaxTargetsPerRow());
     }
 
     private int findSelectedProfile() {
@@ -2660,7 +2663,7 @@
                 // and b/150936654
                 recyclerView.setAdapter(gridAdapter);
                 ((GridLayoutManager) recyclerView.getLayoutManager()).setSpanCount(
-                        gridAdapter.getMaxTargetsPerRow());
+                        getMaxTargetsPerRow());
             }
 
             UserHandle currentUserHandle = mChooserMultiProfilePagerAdapter.getCurrentUserHandle();
@@ -2825,9 +2828,7 @@
 
     @Override // ChooserListCommunicator
     public int getMaxRankedTargets() {
-        return mChooserMultiProfilePagerAdapter.getCurrentRootAdapter() == null
-                ? ChooserGridAdapter.MAX_TARGETS_PER_ROW_PORTRAIT
-                : mChooserMultiProfilePagerAdapter.getCurrentRootAdapter().getMaxTargetsPerRow();
+        return getMaxTargetsPerRow();
     }
 
     @Override // ChooserListCommunicator
@@ -3176,6 +3177,13 @@
         }
     }
 
+    int getMaxTargetsPerRow() {
+        int maxTargets = MAX_TARGETS_PER_ROW_PORTRAIT;
+        if (mShouldDisplayLandscape) {
+            maxTargets = MAX_TARGETS_PER_ROW_LANDSCAPE;
+        }
+        return maxTargets;
+    }
     /**
      * Adapter for all types of items and targets in ShareSheet.
      * Note that ranked sections like Direct Share - while appearing grid-like - are handled on the
@@ -3204,9 +3212,6 @@
         private static final int VIEW_TYPE_CALLER_AND_RANK = 5;
         private static final int VIEW_TYPE_FOOTER = 6;
 
-        private static final int MAX_TARGETS_PER_ROW_PORTRAIT = 4;
-        private static final int MAX_TARGETS_PER_ROW_LANDSCAPE = 8;
-
         private static final int NUM_EXPANSIONS_TO_HIDE_AZ_LABEL = 20;
 
         ChooserGridAdapter(ChooserListAdapter wrappedAdapter) {
@@ -3255,14 +3260,6 @@
             return false;
         }
 
-        int getMaxTargetsPerRow() {
-            int maxTargets = MAX_TARGETS_PER_ROW_PORTRAIT;
-            if (mShouldDisplayLandscape) {
-                maxTargets = MAX_TARGETS_PER_ROW_LANDSCAPE;
-            }
-            return maxTargets;
-        }
-
         /**
          * Hides the list item content preview.
          * <p>Not to be confused with the sticky content preview which is above the
@@ -3632,8 +3629,7 @@
             position -= getSystemRowCount() + getProfileRowCount();
 
             final int serviceCount = mChooserListAdapter.getServiceTargetCount();
-            final int serviceRows = (int) Math.ceil((float) serviceCount
-                    / ChooserListAdapter.MAX_SERVICE_TARGETS);
+            final int serviceRows = (int) Math.ceil((float) serviceCount / getMaxRankedTargets());
             if (position < serviceRows) {
                 return position * getMaxTargetsPerRow();
             }
diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java
index 00b5cb6..5700668 100644
--- a/core/java/com/android/internal/app/ChooserListAdapter.java
+++ b/core/java/com/android/internal/app/ChooserListAdapter.java
@@ -82,8 +82,6 @@
     private static final int MAX_SERVICE_TARGET_APP = 8;
     private static final int DEFAULT_DIRECT_SHARE_RANKING_SCORE = 1000;
 
-    static final int MAX_SERVICE_TARGETS = 8;
-
     /** {@link #getBaseScore} */
     public static final float CALLER_TARGET_SCORE_BOOST = 900.f;
     /** {@link #getBaseScore} */
@@ -130,10 +128,10 @@
         super(context, payloadIntents, null, rList, filterLastUsed,
                 resolverListController, chooserListCommunicator, false);
 
-        createPlaceHolders();
         mMaxShortcutTargetsPerApp =
                 context.getResources().getInteger(R.integer.config_maxShortcutTargetsPerApp);
         mChooserListCommunicator = chooserListCommunicator;
+        createPlaceHolders();
         mSelectableTargetInfoCommunicator = selectableTargetInfoCommunicator;
 
         if (initialIntents != null) {
@@ -227,7 +225,7 @@
         mParkingDirectShareTargets.clear();
         mPendingChooserTargetService.clear();
         mShortcutComponents.clear();
-        for (int i = 0; i < MAX_SERVICE_TARGETS; i++) {
+        for (int i = 0; i < mChooserListCommunicator.getMaxRankedTargets(); i++) {
             mServiceTargets.add(mPlaceHolderTargetInfo);
         }
     }
@@ -382,7 +380,7 @@
     public int getServiceTargetCount() {
         if (mChooserListCommunicator.isSendAction(mChooserListCommunicator.getTargetIntent())
                 && !ActivityManager.isLowRamDeviceStatic()) {
-            return Math.min(mServiceTargets.size(), MAX_SERVICE_TARGETS);
+            return Math.min(mServiceTargets.size(), mChooserListCommunicator.getMaxRankedTargets());
         }
 
         return 0;
@@ -847,7 +845,8 @@
 
         int currentSize = mServiceTargets.size();
         final float newScore = chooserTargetInfo.getModifiedScore();
-        for (int i = 0; i < Math.min(currentSize, MAX_SERVICE_TARGETS); i++) {
+        for (int i = 0; i < Math.min(currentSize, mChooserListCommunicator.getMaxRankedTargets());
+                i++) {
             final ChooserTargetInfo serviceTarget = mServiceTargets.get(i);
             if (serviceTarget == null) {
                 mServiceTargets.set(i, chooserTargetInfo);
@@ -858,7 +857,7 @@
             }
         }
 
-        if (currentSize < MAX_SERVICE_TARGETS) {
+        if (currentSize < mChooserListCommunicator.getMaxRankedTargets()) {
             mServiceTargets.add(chooserTargetInfo);
             return true;
         }
diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
index 3a65a32..dd837fc 100644
--- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
+++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java
@@ -39,17 +39,19 @@
     private final ChooserProfileDescriptor[] mItems;
     private final boolean mIsSendAction;
     private int mBottomOffset;
+    private int mMaxTargetsPerRow;
 
     ChooserMultiProfilePagerAdapter(Context context,
             ChooserActivity.ChooserGridAdapter adapter,
             UserHandle personalProfileUserHandle,
             UserHandle workProfileUserHandle,
-            boolean isSendAction) {
+            boolean isSendAction, int maxTargetsPerRow) {
         super(context, /* currentPage */ 0, personalProfileUserHandle, workProfileUserHandle);
         mItems = new ChooserProfileDescriptor[] {
                 createProfileDescriptor(adapter)
         };
         mIsSendAction = isSendAction;
+        mMaxTargetsPerRow = maxTargetsPerRow;
     }
 
     ChooserMultiProfilePagerAdapter(Context context,
@@ -58,7 +60,7 @@
             @Profile int defaultProfile,
             UserHandle personalProfileUserHandle,
             UserHandle workProfileUserHandle,
-            boolean isSendAction) {
+            boolean isSendAction, int maxTargetsPerRow) {
         super(context, /* currentPage */ defaultProfile, personalProfileUserHandle,
                 workProfileUserHandle);
         mItems = new ChooserProfileDescriptor[] {
@@ -66,6 +68,7 @@
                 createProfileDescriptor(workAdapter)
         };
         mIsSendAction = isSendAction;
+        mMaxTargetsPerRow = maxTargetsPerRow;
     }
 
     private ChooserProfileDescriptor createProfileDescriptor(
@@ -114,7 +117,7 @@
         ChooserActivity.ChooserGridAdapter chooserGridAdapter =
                 getItem(pageIndex).chooserGridAdapter;
         GridLayoutManager glm = (GridLayoutManager) recyclerView.getLayoutManager();
-        glm.setSpanCount(chooserGridAdapter.getMaxTargetsPerRow());
+        glm.setSpanCount(mMaxTargetsPerRow);
         glm.setSpanSizeLookup(
                 new GridLayoutManager.SpanSizeLookup() {
                     @Override