summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java64
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) {