From 8f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8 Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Tue, 22 Mar 2016 18:08:41 -0700 Subject: [PATCH] Allow current VrListenerService to read thermal info. Bug: 27549685 Bug: 22855417 Change-Id: I2d0cb85b54767876bcbf503b5f198bd7f4065680 --- core/java/android/os/HardwarePropertiesManager.java | 9 ++++++--- .../android/server/HardwarePropertiesManagerService.java | 16 +++++++++++----- .../java/com/android/server/vr/VrManagerInternal.java | 11 +++++++++++ .../java/com/android/server/vr/VrManagerService.java | 15 +++++++++++++++ 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java index 0f2e33d8e7e1..f13e5b57cbd0 100644 --- a/core/java/android/os/HardwarePropertiesManager.java +++ b/core/java/android/os/HardwarePropertiesManager.java @@ -101,7 +101,8 @@ public class HardwarePropertiesManager { * {@link #UNDEFINED_TEMPERATURE} if undefined. * Empty if platform doesn't provide the queried temperature. * - * @throws SecurityException if a non profile or device owner tries to call this method. + * @throws SecurityException if something other than the profile or device owner, or the + * current VR service tries to retrieve information provided by this service. */ public @NonNull float[] getDeviceTemperatures(@DeviceTemperatureType int type, @TemperatureSource int source) { @@ -137,7 +138,8 @@ public class HardwarePropertiesManager { * each unplugged core. * Empty if CPU usage is not supported on this system. * - * @throws SecurityException if a non profile or device owner tries to call this method. + * @throws SecurityException if something other than the profile or device owner, or the + * current VR service tries to retrieve information provided by this service. */ public @NonNull CpuUsageInfo[] getCpuUsages() { try { @@ -153,7 +155,8 @@ public class HardwarePropertiesManager { * @return an array of float fan speeds in RPM. Empty if there are no fans or fan speed is not * supported on this system. * - * @throws SecurityException if a non profile or device owner tries to call this method. + * @throws SecurityException if something other than the profile or device owner, or the + * current VR service tries to retrieve information provided by this service. */ public @NonNull float[] getFanSpeeds() { try { diff --git a/services/core/java/com/android/server/HardwarePropertiesManagerService.java b/services/core/java/com/android/server/HardwarePropertiesManagerService.java index 575d99e06507..23cf64a031af 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.Binder; 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 @@ public class HardwarePropertiesManagerService extends IHardwarePropertiesManager * * @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 @@ public class HardwarePropertiesManagerService extends IHardwarePropertiesManager 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 8316efa7eb4c..93bb9d795ddd 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 class VrManagerInternal { 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 6bf949cf8655..aa6f59ef6e9a 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC } @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 @@ public class VrManagerService extends SystemService implements EnabledComponentC } } + 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); -- 2.11.0