From fb21bd86a86e5fa8d94b4fc89226e22e9efb86a2 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Thu, 10 Jan 2019 14:16:23 -0800 Subject: [PATCH] ThermalManagerservice: add legacy Thermal HAL 1.0 polling support For legacy Thermal HAL 1.0, we cannot get notification but we still can support the getCurrentTemperatures API. Bug: 119228310 Test: manually on a device with Thermal HAL 1.0 Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java Change-Id: Ibe1784e4a904393113f8716db4e5af24debcdc8f --- Android.bp | 1 + .../server/power/ThermalManagerService.java | 87 ++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/Android.bp b/Android.bp index eb9cbbb136f9c..5dc34a582c0f8 100644 --- a/Android.bp +++ b/Android.bp @@ -731,6 +731,7 @@ java_defaults { "android.hardware.contexthub-V1.0-java", "android.hardware.health-V1.0-java-constants", "android.hardware.thermal-V1.0-java-constants", + "android.hardware.thermal-V1.0-java", "android.hardware.thermal-V1.1-java", "android.hardware.thermal-V2.0-java", "android.hardware.tv.input-V1.0-java-constants", diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java index 02689a90a98a6..7d03d821d4c87 100644 --- a/services/core/java/com/android/server/power/ThermalManagerService.java +++ b/services/core/java/com/android/server/power/ThermalManagerService.java @@ -134,10 +134,14 @@ public class ThermalManagerService extends SystemService { if (!halConnected) { mHalWrapper = new ThermalHal20Wrapper(); halConnected = mHalWrapper.connectToHal(); - if (!halConnected) { - mHalWrapper = new ThermalHal11Wrapper(); - halConnected = mHalWrapper.connectToHal(); - } + } + if (!halConnected) { + mHalWrapper = new ThermalHal11Wrapper(); + halConnected = mHalWrapper.connectToHal(); + } + if (!halConnected) { + mHalWrapper = new ThermalHal10Wrapper(); + halConnected = mHalWrapper.connectToHal(); } mHalWrapper.setCallback(this::onTemperatureChangedCallback); if (!halConnected) { @@ -616,6 +620,81 @@ public class ThermalManagerService extends SystemService { } } + + static class ThermalHal10Wrapper extends ThermalHalWrapper { + /** Proxy object for the Thermal HAL 1.0 service. */ + @GuardedBy("mHalLock") + private android.hardware.thermal.V1_0.IThermal mThermalHal10 = null; + + @Override + protected List getCurrentTemperatures(boolean shouldFilter, + int type) { + synchronized (mHalLock) { + List ret = new ArrayList<>(); + if (mThermalHal10 == null) { + return ret; + } + try { + mThermalHal10.getTemperatures( + (ThermalStatus status, + ArrayList + temperatures) -> { + if (ThermalStatusCode.SUCCESS == status.code) { + for (android.hardware.thermal.V1_0.Temperature + temperature : temperatures) { + if (shouldFilter && type != temperature.type) { + continue; + } + // Thermal HAL 1.0 doesn't report current throttling status + ret.add(new Temperature( + temperature.currentValue, temperature.type, + temperature.name, + Temperature.THROTTLING_NONE)); + } + } else { + Slog.e(TAG, + "Couldn't get temperatures because of HAL error: " + + status.debugMessage); + } + + }); + } catch (RemoteException e) { + Slog.e(TAG, "Couldn't getCurrentTemperatures, reconnecting...", e); + connectToHal(); + } + return ret; + } + } + + @Override + protected boolean connectToHal() { + synchronized (mHalLock) { + try { + mThermalHal10 = android.hardware.thermal.V1_0.IThermal.getService(); + mThermalHal10.linkToDeath(new DeathRecipient(), + THERMAL_HAL_DEATH_COOKIE); + Slog.i(TAG, + "Thermal HAL 1.0 service connected, no thermal call back will be " + + "called due to legacy API."); + } catch (NoSuchElementException | RemoteException e) { + Slog.e(TAG, + "Thermal HAL 1.0 service not connected."); + mThermalHal10 = null; + } + return (mThermalHal10 != null); + } + } + + @Override + protected void dump(PrintWriter pw, String prefix) { + synchronized (mHalLock) { + pw.print(prefix); + pw.println("ThermalHAL 1.0 connected: " + (mThermalHal10 != null ? "yes" + : "no")); + } + } + } + static class ThermalHal11Wrapper extends ThermalHalWrapper { /** Proxy object for the Thermal HAL 1.1 service. */ @GuardedBy("mHalLock")