Merge "Add ICompanionDeviceManager.getAssociation overload with explicit userId" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-10 15:06:05 +00:00
committed by Android (Google) Code Review
4 changed files with 57 additions and 11 deletions

View File

@@ -167,7 +167,7 @@ public final class CompanionDeviceManager {
return Collections.emptyList(); return Collections.emptyList();
} }
try { try {
return mService.getAssociations(mContext.getPackageName()); return mService.getAssociations(mContext.getPackageName(), mContext.getUserId());
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }

View File

@@ -29,7 +29,7 @@ interface ICompanionDeviceManager {
in IFindDeviceCallback callback, in IFindDeviceCallback callback,
in String callingPackage); in String callingPackage);
List<String> getAssociations(String callingPackage); List<String> getAssociations(String callingPackage, int userId);
void disassociate(String deviceMacAddress, String callingPackage); void disassociate(String deviceMacAddress, String callingPackage);
//TODO add these //TODO add these

View File

@@ -113,6 +113,26 @@ public class Preconditions {
return reference; return reference;
} }
/**
* Ensures that an object reference passed as a parameter to the calling
* method is not null.
*
* @param reference an object reference
* @param messageTemplate a printf-style message template to use if the check fails; will
* be converted to a string using {@link String#format(String, Object...)}
* @param messageArgs arguments for {@code messageTemplate}
* @return the non-null reference that was validated
* @throws NullPointerException if {@code reference} is null
*/
public static @NonNull <T> T checkNotNull(final T reference,
final String messageTemplate,
final Object... messageArgs) {
if (reference == null) {
throw new NullPointerException(String.format(messageTemplate, messageArgs));
}
return reference;
}
/** /**
* Ensures the truth of an expression involving the state of the calling * Ensures the truth of an expression involving the state of the calling
* instance, but not involving any parameters to the calling method. * instance, but not involving any parameters to the calling method.

View File

@@ -17,6 +17,7 @@
package com.android.server.print; package com.android.server.print;
import static com.android.internal.util.Preconditions.checkArgument;
import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkNotNull;
import android.Manifest; import android.Manifest;
@@ -50,6 +51,7 @@ import android.util.ExceptionUtils;
import android.util.Slog; import android.util.Slog;
import android.util.Xml; import android.util.Xml;
import com.android.internal.app.IAppOpsService;
import com.android.internal.content.PackageMonitor; import com.android.internal.content.PackageMonitor;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils; import com.android.internal.util.CollectionUtils;
@@ -98,12 +100,15 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
private IDeviceIdleController mIdleController; private IDeviceIdleController mIdleController;
private IFindDeviceCallback mFindDeviceCallback; private IFindDeviceCallback mFindDeviceCallback;
private ServiceConnection mServiceConnection; private ServiceConnection mServiceConnection;
private IAppOpsService mAppOpsManager;
public CompanionDeviceManagerService(Context context) { public CompanionDeviceManagerService(Context context) {
super(context); super(context);
mImpl = new CompanionDeviceManagerImpl(); mImpl = new CompanionDeviceManagerImpl();
mIdleController = IDeviceIdleController.Stub.asInterface( mIdleController = IDeviceIdleController.Stub.asInterface(
ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
mAppOpsManager = IAppOpsService.Stub.asInterface(
ServiceManager.getService(Context.APP_OPS_SERVICE));
registerPackageMonitor(); registerPackageMonitor();
} }
@@ -182,13 +187,14 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
public void associate( public void associate(
AssociationRequest request, AssociationRequest request,
IFindDeviceCallback callback, IFindDeviceCallback callback,
String callingPackage) { String callingPackage) throws RemoteException {
if (DEBUG) { if (DEBUG) {
Slog.i(LOG_TAG, "associate(request = " + request + ", callback = " + callback Slog.i(LOG_TAG, "associate(request = " + request + ", callback = " + callback
+ ", callingPackage = " + callingPackage + ")"); + ", callingPackage = " + callingPackage + ")");
} }
checkNotNull(request, "Request cannot be null"); checkNotNull(request, "Request cannot be null");
checkNotNull(callback, "Callback cannot be null"); checkNotNull(callback, "Callback cannot be null");
checkCallerIsSystemOr(callingPackage);
final long callingIdentity = Binder.clearCallingIdentity(); final long callingIdentity = Binder.clearCallingIdentity();
try { try {
//TODO bindServiceAsUser //TODO bindServiceAsUser
@@ -203,20 +209,40 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
@Override @Override
public List<String> getAssociations(String callingPackage) { public List<String> getAssociations(String callingPackage, int userId)
throws RemoteException {
checkCallerIsSystemOr(callingPackage, userId);
return CollectionUtils.map( return CollectionUtils.map(
readAllAssociations(getUserId(), callingPackage), readAllAssociations(userId, callingPackage),
a -> a.deviceAddress); a -> a.deviceAddress);
} }
@Override @Override
public void disassociate(String deviceMacAddress, String callingPackage) { public void disassociate(String deviceMacAddress, String callingPackage)
updateAssociations((associations) -> ArrayUtils.remove(associations, throws RemoteException {
new Association(getUserId(), checkNotNull(deviceMacAddress), callingPackage))); checkNotNull(deviceMacAddress);
checkCallerIsSystemOr(callingPackage);
updateAssociations(associations -> ArrayUtils.remove(associations,
new Association(getCallingUserId(), deviceMacAddress, callingPackage)));
}
private void checkCallerIsSystemOr(String pkg) throws RemoteException {
checkCallerIsSystemOr(pkg, getCallingUserId());
}
private void checkCallerIsSystemOr(String pkg, int userId) throws RemoteException {
if (getCallingUserId() == UserHandle.USER_SYSTEM) {
return;
}
checkArgument(getCallingUserId() == userId,
"Must be called by either same user or system");
mAppOpsManager.checkPackage(Binder.getCallingUid(), pkg);
} }
} }
private int getUserId() { private int getCallingUserId() {
return UserHandle.getUserId(Binder.getCallingUid()); return UserHandle.getUserId(Binder.getCallingUid());
} }
@@ -320,11 +346,11 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
private void recordAssociation(String priviledgedPackage, String deviceAddress) { private void recordAssociation(String priviledgedPackage, String deviceAddress) {
updateAssociations((associations) -> ArrayUtils.add(associations, updateAssociations((associations) -> ArrayUtils.add(associations,
new Association(getUserId(), deviceAddress, priviledgedPackage))); new Association(getCallingUserId(), deviceAddress, priviledgedPackage)));
} }
private void updateAssociations(Function<ArrayList<Association>, List<Association>> update) { private void updateAssociations(Function<ArrayList<Association>, List<Association>> update) {
updateAssociations(update, getUserId()); updateAssociations(update, getCallingUserId());
} }
private void updateAssociations(Function<ArrayList<Association>, List<Association>> update, private void updateAssociations(Function<ArrayList<Association>, List<Association>> update,