summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/health/SystemHealthManager.java30
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl12
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java15
3 files changed, 45 insertions, 12 deletions
diff --git a/core/java/android/os/health/SystemHealthManager.java b/core/java/android/os/health/SystemHealthManager.java
index 9d0e221bd9e7..a8a22f675e08 100644
--- a/core/java/android/os/health/SystemHealthManager.java
+++ b/core/java/android/os/health/SystemHealthManager.java
@@ -473,17 +473,31 @@ public class SystemHealthManager {
}
}
- final HealthStats[] results = new HealthStats[uids.length];
- if (result.bundle != null) {
- HealthStatsParceler[] parcelers = result.bundle.getParcelableArray(
- IBatteryStats.KEY_UID_SNAPSHOTS, HealthStatsParceler.class);
- if (parcelers != null && parcelers.length == uids.length) {
- for (int i = 0; i < parcelers.length; i++) {
- results[i] = parcelers[i].getHealthStats();
+ switch (result.resultCode) {
+ case IBatteryStats.RESULT_OK: {
+ final HealthStats[] results = new HealthStats[uids.length];
+ if (result.bundle != null) {
+ HealthStatsParceler[] parcelers = result.bundle.getParcelableArray(
+ IBatteryStats.KEY_UID_SNAPSHOTS, HealthStatsParceler.class);
+ if (parcelers != null && parcelers.length == uids.length) {
+ for (int i = 0; i < parcelers.length; i++) {
+ results[i] = parcelers[i].getHealthStats();
+ }
+ }
}
+ return results;
+ }
+ case IBatteryStats.RESULT_SECURITY_EXCEPTION: {
+ throw new SecurityException(result.bundle != null
+ ? result.bundle.getString(IBatteryStats.KEY_EXCEPTION_MESSAGE) : null);
+ }
+ case IBatteryStats.RESULT_RUNTIME_EXCEPTION: {
+ throw new RuntimeException(result.bundle != null
+ ? result.bundle.getString(IBatteryStats.KEY_EXCEPTION_MESSAGE) : null);
}
+ default:
+ throw new RuntimeException("Error code: " + result.resultCode);
}
- return results;
}
/**
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index a5e166b95177..5f1a641945e8 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -35,8 +35,20 @@ import android.telephony.SignalStrength;
interface IBatteryStats {
/** @hide */
+ const int RESULT_OK = 0;
+
+ /** @hide */
+ const int RESULT_RUNTIME_EXCEPTION = 1;
+
+ /** @hide */
+ const int RESULT_SECURITY_EXCEPTION = 2;
+
+ /** @hide */
const String KEY_UID_SNAPSHOTS = "uid_snapshots";
+ /** @hide */
+ const String KEY_EXCEPTION_MESSAGE = "exception";
+
// These first methods are also called by native code, so must
// be kept in sync with frameworks/native/libs/binder/include_batterystats/batterystats/IBatteryStats.h
@EnforcePermission("UPDATE_DEVICE_STATS")
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index c8b0a57fe9f0..5ff6999e40b3 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -3705,8 +3705,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub
@Override
public void takeUidSnapshotsAsync(int[] requestUids, ResultReceiver resultReceiver) {
if (!onlyCaller(requestUids)) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.BATTERY_STATS, null);
+ try {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.BATTERY_STATS, null);
+ } catch (SecurityException ex) {
+ resultReceiver.send(IBatteryStats.RESULT_SECURITY_EXCEPTION,
+ Bundle.forPair(IBatteryStats.KEY_EXCEPTION_MESSAGE, ex.getMessage()));
+ return;
+ }
}
if (shouldCollectExternalStats()) {
@@ -3727,13 +3733,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
Bundle resultData = new Bundle(1);
resultData.putParcelableArray(IBatteryStats.KEY_UID_SNAPSHOTS, results);
- resultReceiver.send(0, resultData);
+ resultReceiver.send(IBatteryStats.RESULT_OK, resultData);
} catch (Exception ex) {
if (DBG) {
Slog.d(TAG, "Crashed while returning results for takeUidSnapshots("
+ Arrays.toString(requestUids) + ") i=" + i, ex);
}
- throw ex;
+ resultReceiver.send(IBatteryStats.RESULT_RUNTIME_EXCEPTION,
+ Bundle.forPair(IBatteryStats.KEY_EXCEPTION_MESSAGE, ex.getMessage()));
} finally {
Binder.restoreCallingIdentity(ident);
}