Merge "Merge "Fixes for handling users + default for USB" into oc-dev am: 5262ae9b87" into oc-dev-plus-aosp
This commit is contained in:
committed by
Android (Google) Code Review
commit
bc535b11b6
@@ -71,6 +71,7 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
class UsbProfileGroupSettingsManager {
|
||||
private static final String TAG = UsbProfileGroupSettingsManager.class.getSimpleName();
|
||||
@@ -139,7 +140,7 @@ class UsbProfileGroupSettingsManager {
|
||||
} else {
|
||||
UserPackage other = (UserPackage)obj;
|
||||
|
||||
return user.equals(user) && packageName.equals(other.packageName);
|
||||
return user.equals(other.user) && packageName.equals(other.packageName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,21 +320,32 @@ class UsbProfileGroupSettingsManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean matches(DeviceFilter f) {
|
||||
if (mVendorId != -1 && f.mVendorId != mVendorId) return false;
|
||||
if (mProductId != -1 && f.mProductId != mProductId) return false;
|
||||
if (f.mManufacturerName != null && mManufacturerName == null) return false;
|
||||
if (f.mProductName != null && mProductName == null) return false;
|
||||
if (f.mSerialNumber != null && mSerialNumber == null) return false;
|
||||
if (mManufacturerName != null && f.mManufacturerName != null &&
|
||||
!mManufacturerName.equals(f.mManufacturerName)) return false;
|
||||
if (mProductName != null && f.mProductName != null &&
|
||||
!mProductName.equals(f.mProductName)) return false;
|
||||
if (mSerialNumber != null && f.mSerialNumber != null &&
|
||||
!mSerialNumber.equals(f.mSerialNumber)) return false;
|
||||
/**
|
||||
* If the device described by {@code device} covered by this filter?
|
||||
*
|
||||
* @param device The device
|
||||
*
|
||||
* @return {@code true} iff this filter covers the {@code device}
|
||||
*/
|
||||
public boolean contains(DeviceFilter device) {
|
||||
// -1 and null means "match anything"
|
||||
|
||||
if (mVendorId != -1 && device.mVendorId != mVendorId) return false;
|
||||
if (mProductId != -1 && device.mProductId != mProductId) return false;
|
||||
if (mManufacturerName != null && !Objects.equals(mManufacturerName,
|
||||
device.mManufacturerName)) {
|
||||
return false;
|
||||
}
|
||||
if (mProductName != null && !Objects.equals(mProductName, device.mProductName)) {
|
||||
return false;
|
||||
}
|
||||
if (mSerialNumber != null
|
||||
&& !Objects.equals(mSerialNumber, device.mSerialNumber)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check device class/subclass/protocol
|
||||
return matches(f.mClass, f.mSubclass, f.mProtocol);
|
||||
return matches(device.mClass, device.mSubclass, device.mProtocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -493,10 +505,19 @@ class UsbProfileGroupSettingsManager {
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean matches(AccessoryFilter f) {
|
||||
if (mManufacturer != null && !f.mManufacturer.equals(mManufacturer)) return false;
|
||||
if (mModel != null && !f.mModel.equals(mModel)) return false;
|
||||
if (mVersion != null && !f.mVersion.equals(mVersion)) return false;
|
||||
/**
|
||||
* Is the accessories described {@code accessory} covered by this filter?
|
||||
*
|
||||
* @param accessory A filter describing the accessory
|
||||
*
|
||||
* @return {@code true} iff this the filter covers the accessory
|
||||
*/
|
||||
public boolean contains(AccessoryFilter accessory) {
|
||||
if (mManufacturer != null && !Objects.equals(accessory.mManufacturer, mManufacturer)) {
|
||||
return false;
|
||||
}
|
||||
if (mModel != null && !Objects.equals(accessory.mModel, mModel)) return false;
|
||||
if (mVersion != null && !Objects.equals(accessory.mVersion, mVersion)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -539,16 +560,21 @@ class UsbProfileGroupSettingsManager {
|
||||
private class MyPackageMonitor extends PackageMonitor {
|
||||
@Override
|
||||
public void onPackageAdded(String packageName, int uid) {
|
||||
handlePackageUpdate(packageName);
|
||||
}
|
||||
if (!mUserManager.isSameProfileGroup(mParentUser.getIdentifier(),
|
||||
UserHandle.getUserId(uid))) {
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPackageUpdateFinished(String packageName, int uid) {
|
||||
handlePackageUpdate(packageName);
|
||||
handlePackageAdded(new UserPackage(packageName, UserHandle.getUserHandleForUid(uid)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPackageRemoved(String packageName, int uid) {
|
||||
if (!mUserManager.isSameProfileGroup(mParentUser.getIdentifier(),
|
||||
UserHandle.getUserId(uid))) {
|
||||
return;
|
||||
}
|
||||
|
||||
clearDefaults(packageName, UserHandle.getUserHandleForUid(uid));
|
||||
}
|
||||
}
|
||||
@@ -595,7 +621,7 @@ class UsbProfileGroupSettingsManager {
|
||||
readSettingsLocked();
|
||||
}
|
||||
|
||||
mPackageMonitor.register(context, null, true);
|
||||
mPackageMonitor.register(context, null, UserHandle.ALL, true);
|
||||
mMtpNotificationManager = new MtpNotificationManager(
|
||||
parentUserContext,
|
||||
new MtpNotificationManager.OnOpenInAppListener() {
|
||||
@@ -989,9 +1015,12 @@ class UsbProfileGroupSettingsManager {
|
||||
|
||||
ApplicationInfo appInfo;
|
||||
try {
|
||||
appInfo = mPackageManager.getApplicationInfo(component.getPackageName(), 0);
|
||||
// Fixed handlers are always for parent user
|
||||
appInfo = mPackageManager.getApplicationInfoAsUser(component.getPackageName(), 0,
|
||||
mParentUser.getIdentifier());
|
||||
} catch (NameNotFoundException e) {
|
||||
Slog.e(TAG, "Default USB handling package not found: " + component.getPackageName());
|
||||
Slog.e(TAG, "Default USB handling package (" + component.getPackageName()
|
||||
+ ") not found for user " + mParentUser);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1175,10 +1204,10 @@ class UsbProfileGroupSettingsManager {
|
||||
if (userPackage != null) {
|
||||
// look for default activity
|
||||
for (final ResolveInfo info : matches) {
|
||||
if (info.activityInfo != null
|
||||
&& userPackage.packageName.equals(info.activityInfo.packageName)
|
||||
&& userPackage.user.getIdentifier()
|
||||
== UserHandle.getUserId(info.activityInfo.applicationInfo.uid)) {
|
||||
if (info.activityInfo != null && userPackage.equals(
|
||||
new UserPackage(info.activityInfo.packageName,
|
||||
UserHandle.getUserHandleForUid(
|
||||
info.activityInfo.applicationInfo.uid)))) {
|
||||
return info.activityInfo;
|
||||
}
|
||||
}
|
||||
@@ -1202,35 +1231,53 @@ class UsbProfileGroupSettingsManager {
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean clearCompatibleMatchesLocked(String packageName, DeviceFilter filter) {
|
||||
boolean changed = false;
|
||||
for (DeviceFilter test : mDevicePreferenceMap.keySet()) {
|
||||
if (filter.matches(test)) {
|
||||
UserPackage currentMatch = mDevicePreferenceMap.get(test);
|
||||
if (!currentMatch.packageName.equals(packageName)) {
|
||||
mDevicePreferenceMap.remove(test);
|
||||
changed = true;
|
||||
private boolean clearCompatibleMatchesLocked(@NonNull UserPackage userPackage,
|
||||
@NonNull DeviceFilter filter) {
|
||||
ArrayList<DeviceFilter> keysToRemove = new ArrayList<>();
|
||||
|
||||
// The keys in mDevicePreferenceMap are filters that match devices very narrowly
|
||||
for (DeviceFilter device : mDevicePreferenceMap.keySet()) {
|
||||
if (filter.contains(device)) {
|
||||
UserPackage currentMatch = mDevicePreferenceMap.get(device);
|
||||
if (!currentMatch.equals(userPackage)) {
|
||||
keysToRemove.add(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
|
||||
if (!keysToRemove.isEmpty()) {
|
||||
for (DeviceFilter keyToRemove : keysToRemove) {
|
||||
mDevicePreferenceMap.remove(keyToRemove);
|
||||
}
|
||||
}
|
||||
|
||||
return !keysToRemove.isEmpty();
|
||||
}
|
||||
|
||||
private boolean clearCompatibleMatchesLocked(String packageName, AccessoryFilter filter) {
|
||||
boolean changed = false;
|
||||
for (AccessoryFilter test : mAccessoryPreferenceMap.keySet()) {
|
||||
if (filter.matches(test)) {
|
||||
UserPackage currentMatch = mAccessoryPreferenceMap.get(test);
|
||||
if (!currentMatch.packageName.equals(packageName)) {
|
||||
mAccessoryPreferenceMap.remove(test);
|
||||
changed = true;
|
||||
private boolean clearCompatibleMatchesLocked(@NonNull UserPackage userPackage,
|
||||
@NonNull AccessoryFilter filter) {
|
||||
ArrayList<AccessoryFilter> keysToRemove = new ArrayList<>();
|
||||
|
||||
// The keys in mAccessoryPreferenceMap are filters that match accessories very narrowly
|
||||
for (AccessoryFilter accessory : mAccessoryPreferenceMap.keySet()) {
|
||||
if (filter.contains(accessory)) {
|
||||
UserPackage currentMatch = mAccessoryPreferenceMap.get(accessory);
|
||||
if (!currentMatch.equals(userPackage)) {
|
||||
keysToRemove.add(accessory);
|
||||
}
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
|
||||
if (!keysToRemove.isEmpty()) {
|
||||
for (AccessoryFilter keyToRemove : keysToRemove) {
|
||||
mAccessoryPreferenceMap.remove(keyToRemove);
|
||||
}
|
||||
}
|
||||
|
||||
return !keysToRemove.isEmpty();
|
||||
}
|
||||
|
||||
private boolean handlePackageUpdateLocked(String packageName, ActivityInfo aInfo,
|
||||
private boolean handlePackageAddedLocked(UserPackage userPackage, ActivityInfo aInfo,
|
||||
String metaDataName) {
|
||||
XmlResourceParser parser = null;
|
||||
boolean changed = false;
|
||||
@@ -1244,13 +1291,13 @@ class UsbProfileGroupSettingsManager {
|
||||
String tagName = parser.getName();
|
||||
if ("usb-device".equals(tagName)) {
|
||||
DeviceFilter filter = DeviceFilter.read(parser);
|
||||
if (clearCompatibleMatchesLocked(packageName, filter)) {
|
||||
if (clearCompatibleMatchesLocked(userPackage, filter)) {
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
else if ("usb-accessory".equals(tagName)) {
|
||||
AccessoryFilter filter = AccessoryFilter.read(parser);
|
||||
if (clearCompatibleMatchesLocked(packageName, filter)) {
|
||||
if (clearCompatibleMatchesLocked(userPackage, filter)) {
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@@ -1265,17 +1312,18 @@ class UsbProfileGroupSettingsManager {
|
||||
}
|
||||
|
||||
// Check to see if the package supports any USB devices or accessories.
|
||||
// If so, clear any non-matching preferences for matching devices/accessories.
|
||||
private void handlePackageUpdate(String packageName) {
|
||||
// If so, clear any preferences for matching devices/accessories.
|
||||
private void handlePackageAdded(@NonNull UserPackage userPackage) {
|
||||
synchronized (mLock) {
|
||||
PackageInfo info;
|
||||
boolean changed = false;
|
||||
|
||||
try {
|
||||
info = mPackageManager.getPackageInfo(packageName,
|
||||
PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA);
|
||||
info = mPackageManager.getPackageInfoAsUser(userPackage.packageName,
|
||||
PackageManager.GET_ACTIVITIES | PackageManager.GET_META_DATA,
|
||||
userPackage.user.getIdentifier());
|
||||
} catch (NameNotFoundException e) {
|
||||
Slog.e(TAG, "handlePackageUpdate could not find package " + packageName, e);
|
||||
Slog.e(TAG, "handlePackageUpdate could not find package " + userPackage, e);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1283,11 +1331,12 @@ class UsbProfileGroupSettingsManager {
|
||||
if (activities == null) return;
|
||||
for (int i = 0; i < activities.length; i++) {
|
||||
// check for meta-data, both for devices and accessories
|
||||
if (handlePackageUpdateLocked(packageName, activities[i],
|
||||
if (handlePackageAddedLocked(userPackage, activities[i],
|
||||
UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
|
||||
changed = true;
|
||||
}
|
||||
if (handlePackageUpdateLocked(packageName, activities[i],
|
||||
|
||||
if (handlePackageAddedLocked(userPackage, activities[i],
|
||||
UsbManager.ACTION_USB_ACCESSORY_ATTACHED)) {
|
||||
changed = true;
|
||||
}
|
||||
@@ -1318,16 +1367,18 @@ class UsbProfileGroupSettingsManager {
|
||||
* @param user The user the package belongs to
|
||||
*/
|
||||
void setDevicePackage(@NonNull UsbDevice device, @Nullable String packageName,
|
||||
@Nullable UserHandle user) {
|
||||
@NonNull UserHandle user) {
|
||||
DeviceFilter filter = new DeviceFilter(device);
|
||||
boolean changed = false;
|
||||
synchronized (mLock) {
|
||||
if (packageName == null) {
|
||||
changed = (mDevicePreferenceMap.remove(filter) != null);
|
||||
} else {
|
||||
changed = !packageName.equals(mDevicePreferenceMap.get(filter));
|
||||
UserPackage userPackage = new UserPackage(packageName, user);
|
||||
|
||||
changed = !userPackage.equals(mDevicePreferenceMap.get(filter));
|
||||
if (changed) {
|
||||
mDevicePreferenceMap.put(filter, new UserPackage(packageName, user));
|
||||
mDevicePreferenceMap.put(filter, userPackage);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
@@ -1344,16 +1395,18 @@ class UsbProfileGroupSettingsManager {
|
||||
* @param user The user the package belongs to
|
||||
*/
|
||||
void setAccessoryPackage(@NonNull UsbAccessory accessory, @Nullable String packageName,
|
||||
@Nullable UserHandle user) {
|
||||
@NonNull UserHandle user) {
|
||||
AccessoryFilter filter = new AccessoryFilter(accessory);
|
||||
boolean changed = false;
|
||||
synchronized (mLock) {
|
||||
if (packageName == null) {
|
||||
changed = (mAccessoryPreferenceMap.remove(filter) != null);
|
||||
} else {
|
||||
changed = !packageName.equals(mAccessoryPreferenceMap.get(filter));
|
||||
UserPackage userPackage = new UserPackage(packageName, user);
|
||||
|
||||
changed = !userPackage.equals(mAccessoryPreferenceMap.get(filter));
|
||||
if (changed) {
|
||||
mAccessoryPreferenceMap.put(filter, new UserPackage(packageName, user));
|
||||
mAccessoryPreferenceMap.put(filter, userPackage);
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
|
||||
Reference in New Issue
Block a user