Allow current VrListenerService to read thermal info.
Bug: 27549685
Bug: 22855417
Change-Id: I2d0cb85b54767876bcbf503b5f198bd7f4065680
diff --git a/services/core/java/com/android/server/HardwarePropertiesManagerService.java b/services/core/java/com/android/server/HardwarePropertiesManagerService.java
index 575d99e..23cf64a 100644
--- a/services/core/java/com/android/server/HardwarePropertiesManagerService.java
+++ b/services/core/java/com/android/server/HardwarePropertiesManagerService.java
@@ -23,6 +23,8 @@
import android.os.CpuUsageInfo;
import android.os.IHardwarePropertiesManager;
import android.os.Process;
+import android.os.UserHandle;
+import com.android.server.vr.VrManagerInternal;
import java.util.Arrays;
@@ -78,14 +80,15 @@
*
* @param callingPackage The calling package name.
*
- * @throws SecurityException if a non profile or device owner or system tries to retrieve
- * information provided by the service.
+ * @throws SecurityException if something other than the profile or device owner, or the
+ * current VR service tries to retrieve information provided by this service.
*/
private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage)
throws SecurityException {
final PackageManager pm = mContext.getPackageManager();
+ int uid = 0;
try {
- final int uid = pm.getPackageUid(callingPackage, 0);
+ uid = pm.getPackageUid(callingPackage, 0);
if (Binder.getCallingUid() != uid) {
throw new SecurityException("The caller has faked the package name.");
}
@@ -93,10 +96,13 @@
throw new SecurityException("The caller has faked the package name.");
}
+ final int userId = UserHandle.getUserId(uid);
+ final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)
- && Binder.getCallingUid() != Process.SYSTEM_UID) {
- throw new SecurityException("The caller is not a device or profile owner or system.");
+ && !vrService.isCurrentVrListener(callingPackage, userId)) {
+ throw new SecurityException("The caller is not a device or profile owner or bound "
+ + "VrListenerService.");
}
}
}
diff --git a/services/core/java/com/android/server/vr/VrManagerInternal.java b/services/core/java/com/android/server/vr/VrManagerInternal.java
index 8316efa..93bb9d7 100644
--- a/services/core/java/com/android/server/vr/VrManagerInternal.java
+++ b/services/core/java/com/android/server/vr/VrManagerInternal.java
@@ -38,6 +38,17 @@
public abstract boolean isInVrMode();
/**
+ * Return {@code true} if the given package is the currently bound VrListenerService for the
+ * given user.
+ *
+ * @param packageName The package name to check.
+ * @param userId the user ID to check the package name for.
+ *
+ * @return {@code true} if the given package is the currently bound VrListenerService.
+ */
+ public abstract boolean isCurrentVrListener(String packageName, int userId);
+
+ /**
* Set the current VR mode state.
*
* @param enabled {@code true} to enable VR mode.
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 6bf949c..aa6f59e 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -127,6 +127,11 @@
}
@Override
+ public boolean isCurrentVrListener(String packageName, int userId) {
+ return VrManagerService.this.isCurrentVrListener(packageName, userId);
+ }
+
+ @Override
public void registerListener(VrStateListener listener) {
VrManagerService.this.addListener(listener);
}
@@ -355,6 +360,16 @@
}
}
+ private boolean isCurrentVrListener(String packageName, int userId) {
+ synchronized (mLock) {
+ if (mCurrentVrService == null) {
+ return false;
+ }
+ return mCurrentVrService.getComponent().getPackageName().equals(packageName) &&
+ userId == mCurrentVrService.getUserId();
+ }
+ }
+
private void addListener(VrStateListener listener) {
synchronized (mLock) {
mListeners.add(listener);