diff options
| -rw-r--r-- | services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java index 2e99b6e9bd19..caf9ec6865e5 100644 --- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java @@ -16,6 +16,8 @@ package com.android.server.usb; +import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ActivityNotFoundException; @@ -41,6 +43,8 @@ import android.os.UserManager; import android.util.AtomicFile; import android.util.Log; import android.util.Slog; +import android.util.SparseArray; +import android.util.SparseIntArray; import android.util.Xml; import com.android.internal.annotations.GuardedBy; @@ -50,6 +54,8 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.XmlUtils; +import libcore.io.IoUtils; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -66,10 +72,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import libcore.io.IoUtils; - -import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE; - class UsbProfileGroupSettingsManager { private static final String TAG = UsbProfileGroupSettingsManager.class.getSimpleName(); private static final boolean DEBUG = false; @@ -873,6 +875,56 @@ class UsbProfileGroupSettingsManager { return resolveInfos; } + /** + * Only return those matches with the highest priority. + * + * @param matches All matches, some might have lower priority + * + * @return The matches with the highest priority + */ + @NonNull + private ArrayList<ResolveInfo> preferHighPriority( + @NonNull ArrayList<ResolveInfo> matches) { + SparseArray<ArrayList<ResolveInfo>> highestPriorityMatchesByUserId = new SparseArray<>(); + SparseIntArray highestPriorityByUserId = new SparseIntArray(); + + // Create list of highest priority matches per user in highestPriorityMatchesByUserId + int numMatches = matches.size(); + for (int matchNum = 0; matchNum < numMatches; matchNum++) { + ResolveInfo match = matches.get(matchNum); + + // If this a previously unknown user? + if (highestPriorityByUserId.indexOfKey(match.targetUserId) < 0) { + highestPriorityByUserId.put(match.targetUserId, Integer.MIN_VALUE); + highestPriorityMatchesByUserId.put(match.targetUserId, new ArrayList<>()); + } + + // Find current highest priority matches for the current user + int highestPriority = highestPriorityByUserId.get(match.targetUserId); + ArrayList<ResolveInfo> highestPriorityMatches = highestPriorityMatchesByUserId.get( + match.targetUserId); + + if (match.priority == highestPriority) { + highestPriorityMatches.add(match); + } else if (match.priority > highestPriority) { + highestPriorityByUserId.put(match.targetUserId, match.priority); + + highestPriorityMatches.clear(); + highestPriorityMatches.add(match); + } + } + + // Combine all users back together. This means that all matches have the same priority for a + // user. Matches for different users might have different priority. + ArrayList<ResolveInfo> combinedMatches = new ArrayList<>(); + int numMatchArrays = highestPriorityMatchesByUserId.size(); + for (int matchArrayNum = 0; matchArrayNum < numMatchArrays; matchArrayNum++) { + combinedMatches.addAll(highestPriorityMatchesByUserId.valueAt(matchArrayNum)); + } + + return combinedMatches; + } + private final ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) { ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>(); List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent); @@ -883,7 +935,7 @@ class UsbProfileGroupSettingsManager { matches.add(resolveInfo); } } - return matches; + return preferHighPriority(matches); } private final ArrayList<ResolveInfo> getAccessoryMatchesLocked( @@ -897,7 +949,7 @@ class UsbProfileGroupSettingsManager { matches.add(resolveInfo); } } - return matches; + return preferHighPriority(matches); } public void deviceAttached(UsbDevice device) { |