Loading services/core/java/com/android/server/power/ThermalManagerService.java +14 −16 Original line number Original line Diff line number Diff line Loading @@ -110,9 +110,6 @@ public class ThermalManagerService extends SystemService { @VisibleForTesting @VisibleForTesting final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher(); final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher(); /** Invalid throttling status */ private static final int INVALID_THROTTLING = Integer.MIN_VALUE; public ThermalManagerService(Context context) { public ThermalManagerService(Context context) { this(context, null); this(context, null); } } Loading @@ -121,8 +118,7 @@ public class ThermalManagerService extends SystemService { ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) { ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) { super(context); super(context); mHalWrapper = halWrapper; mHalWrapper = halWrapper; // Initialize to invalid to send status onActivityManagerReady mStatus = Temperature.THROTTLING_NONE; mStatus = INVALID_THROTTLING; } } @Override @Override Loading Loading @@ -155,11 +151,15 @@ public class ThermalManagerService extends SystemService { } } mHalWrapper.setCallback(this::onTemperatureChangedCallback); mHalWrapper.setCallback(this::onTemperatureChangedCallback); if (!halConnected) { if (!halConnected) { Slog.w(TAG, "No Thermal HAL service on this device"); return; return; } } List<Temperature> temperatures = mHalWrapper.getCurrentTemperatures(false, List<Temperature> temperatures = mHalWrapper.getCurrentTemperatures(false, 0); 0); final int count = temperatures.size(); final int count = temperatures.size(); if (count == 0) { Slog.w(TAG, "Thermal HAL reported invalid data, abort connection"); } for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { onTemperatureChanged(temperatures.get(i), false); onTemperatureChanged(temperatures.get(i), false); } } Loading @@ -183,9 +183,6 @@ public class ThermalManagerService extends SystemService { } } private void notifyStatusListenersLocked() { private void notifyStatusListenersLocked() { if (!Temperature.isValidStatus(mStatus)) { return; } final int length = mThermalStatusListeners.beginBroadcast(); final int length = mThermalStatusListeners.beginBroadcast(); try { try { for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) { Loading @@ -199,7 +196,7 @@ public class ThermalManagerService extends SystemService { } } private void onTemperatureMapChangedLocked() { private void onTemperatureMapChangedLocked() { int newStatus = INVALID_THROTTLING; int newStatus = Temperature.THROTTLING_NONE; final int count = mTemperatureMap.size(); final int count = mTemperatureMap.size(); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { Temperature t = mTemperatureMap.valueAt(i); Temperature t = mTemperatureMap.valueAt(i); Loading Loading @@ -292,11 +289,7 @@ public class ThermalManagerService extends SystemService { shutdownIfNeeded(temperature); shutdownIfNeeded(temperature); synchronized (mLock) { synchronized (mLock) { Temperature old = mTemperatureMap.put(temperature.getName(), temperature); Temperature old = mTemperatureMap.put(temperature.getName(), temperature); if (old != null) { if (old == null || old.getStatus() != temperature.getStatus()) { if (old.getStatus() != temperature.getStatus()) { notifyEventListenersLocked(temperature); } } else { notifyEventListenersLocked(temperature); notifyEventListenersLocked(temperature); } } if (sendStatus) { if (sendStatus) { Loading Loading @@ -438,8 +431,7 @@ public class ThermalManagerService extends SystemService { synchronized (mLock) { synchronized (mLock) { final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity(); try { try { return Temperature.isValidStatus(mStatus) ? mStatus return mStatus; : Temperature.THROTTLING_NONE; } finally { } finally { Binder.restoreCallingIdentity(token); Binder.restoreCallingIdentity(token); } } Loading Loading @@ -964,6 +956,12 @@ public class ThermalManagerService extends SystemService { if (ThermalStatusCode.SUCCESS == status.code) { if (ThermalStatusCode.SUCCESS == status.code) { for (android.hardware.thermal.V2_0.Temperature for (android.hardware.thermal.V2_0.Temperature temperature : temperatures) { temperature : temperatures) { if (!Temperature.isValidStatus( temperature.throttlingStatus)) { Slog.e(TAG, "Invalid status data from HAL"); temperature.throttlingStatus = Temperature.THROTTLING_NONE; } ret.add(new Temperature( ret.add(new Temperature( temperature.value, temperature.type, temperature.value, temperature.type, temperature.name, temperature.name, Loading services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -216,11 +216,11 @@ public class ThermalManagerServiceTest { verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(0)).notifyThrottling(any(Temperature.class)); .times(0)).notifyThrottling(any(Temperature.class)); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(anyInt()); .times(1)).onStatusChange(Temperature.THROTTLING_NONE); verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(0)).notifyThrottling(any(Temperature.class)); .times(0)).notifyThrottling(any(Temperature.class)); verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(anyInt()); .times(1)).onStatusChange(Temperature.THROTTLING_NONE); resetListenerMock(); resetListenerMock(); mService.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY); mService.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY); ArgumentCaptor<Temperature> captor = ArgumentCaptor.forClass(Temperature.class); ArgumentCaptor<Temperature> captor = ArgumentCaptor.forClass(Temperature.class); Loading @@ -228,7 +228,7 @@ public class ThermalManagerServiceTest { .times(4)).notifyThrottling(captor.capture()); .times(4)).notifyThrottling(captor.capture()); assertListEqualsIgnoringOrder(mFakeHal.mTemperatureList, captor.getAllValues()); assertListEqualsIgnoringOrder(mFakeHal.mTemperatureList, captor.getAllValues()); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(Temperature.THROTTLING_NONE); .times(0)).onStatusChange(Temperature.THROTTLING_NONE); captor = ArgumentCaptor.forClass(Temperature.class); captor = ArgumentCaptor.forClass(Temperature.class); verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(2)).notifyThrottling(captor.capture()); .times(2)).notifyThrottling(captor.capture()); Loading @@ -236,7 +236,7 @@ public class ThermalManagerServiceTest { new ArrayList<>(Arrays.asList(mFakeHal.mSkin1, mFakeHal.mSkin2)), new ArrayList<>(Arrays.asList(mFakeHal.mSkin1, mFakeHal.mSkin2)), captor.getAllValues()); captor.getAllValues()); verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(Temperature.THROTTLING_NONE); .times(0)).onStatusChange(Temperature.THROTTLING_NONE); } } private void resetListenerMock() { private void resetListenerMock() { Loading Loading
services/core/java/com/android/server/power/ThermalManagerService.java +14 −16 Original line number Original line Diff line number Diff line Loading @@ -110,9 +110,6 @@ public class ThermalManagerService extends SystemService { @VisibleForTesting @VisibleForTesting final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher(); final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher(); /** Invalid throttling status */ private static final int INVALID_THROTTLING = Integer.MIN_VALUE; public ThermalManagerService(Context context) { public ThermalManagerService(Context context) { this(context, null); this(context, null); } } Loading @@ -121,8 +118,7 @@ public class ThermalManagerService extends SystemService { ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) { ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) { super(context); super(context); mHalWrapper = halWrapper; mHalWrapper = halWrapper; // Initialize to invalid to send status onActivityManagerReady mStatus = Temperature.THROTTLING_NONE; mStatus = INVALID_THROTTLING; } } @Override @Override Loading Loading @@ -155,11 +151,15 @@ public class ThermalManagerService extends SystemService { } } mHalWrapper.setCallback(this::onTemperatureChangedCallback); mHalWrapper.setCallback(this::onTemperatureChangedCallback); if (!halConnected) { if (!halConnected) { Slog.w(TAG, "No Thermal HAL service on this device"); return; return; } } List<Temperature> temperatures = mHalWrapper.getCurrentTemperatures(false, List<Temperature> temperatures = mHalWrapper.getCurrentTemperatures(false, 0); 0); final int count = temperatures.size(); final int count = temperatures.size(); if (count == 0) { Slog.w(TAG, "Thermal HAL reported invalid data, abort connection"); } for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { onTemperatureChanged(temperatures.get(i), false); onTemperatureChanged(temperatures.get(i), false); } } Loading @@ -183,9 +183,6 @@ public class ThermalManagerService extends SystemService { } } private void notifyStatusListenersLocked() { private void notifyStatusListenersLocked() { if (!Temperature.isValidStatus(mStatus)) { return; } final int length = mThermalStatusListeners.beginBroadcast(); final int length = mThermalStatusListeners.beginBroadcast(); try { try { for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) { Loading @@ -199,7 +196,7 @@ public class ThermalManagerService extends SystemService { } } private void onTemperatureMapChangedLocked() { private void onTemperatureMapChangedLocked() { int newStatus = INVALID_THROTTLING; int newStatus = Temperature.THROTTLING_NONE; final int count = mTemperatureMap.size(); final int count = mTemperatureMap.size(); for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) { Temperature t = mTemperatureMap.valueAt(i); Temperature t = mTemperatureMap.valueAt(i); Loading Loading @@ -292,11 +289,7 @@ public class ThermalManagerService extends SystemService { shutdownIfNeeded(temperature); shutdownIfNeeded(temperature); synchronized (mLock) { synchronized (mLock) { Temperature old = mTemperatureMap.put(temperature.getName(), temperature); Temperature old = mTemperatureMap.put(temperature.getName(), temperature); if (old != null) { if (old == null || old.getStatus() != temperature.getStatus()) { if (old.getStatus() != temperature.getStatus()) { notifyEventListenersLocked(temperature); } } else { notifyEventListenersLocked(temperature); notifyEventListenersLocked(temperature); } } if (sendStatus) { if (sendStatus) { Loading Loading @@ -438,8 +431,7 @@ public class ThermalManagerService extends SystemService { synchronized (mLock) { synchronized (mLock) { final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity(); try { try { return Temperature.isValidStatus(mStatus) ? mStatus return mStatus; : Temperature.THROTTLING_NONE; } finally { } finally { Binder.restoreCallingIdentity(token); Binder.restoreCallingIdentity(token); } } Loading Loading @@ -964,6 +956,12 @@ public class ThermalManagerService extends SystemService { if (ThermalStatusCode.SUCCESS == status.code) { if (ThermalStatusCode.SUCCESS == status.code) { for (android.hardware.thermal.V2_0.Temperature for (android.hardware.thermal.V2_0.Temperature temperature : temperatures) { temperature : temperatures) { if (!Temperature.isValidStatus( temperature.throttlingStatus)) { Slog.e(TAG, "Invalid status data from HAL"); temperature.throttlingStatus = Temperature.THROTTLING_NONE; } ret.add(new Temperature( ret.add(new Temperature( temperature.value, temperature.type, temperature.value, temperature.type, temperature.name, temperature.name, Loading
services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java +4 −4 Original line number Original line Diff line number Diff line Loading @@ -216,11 +216,11 @@ public class ThermalManagerServiceTest { verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(0)).notifyThrottling(any(Temperature.class)); .times(0)).notifyThrottling(any(Temperature.class)); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(anyInt()); .times(1)).onStatusChange(Temperature.THROTTLING_NONE); verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(0)).notifyThrottling(any(Temperature.class)); .times(0)).notifyThrottling(any(Temperature.class)); verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(anyInt()); .times(1)).onStatusChange(Temperature.THROTTLING_NONE); resetListenerMock(); resetListenerMock(); mService.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY); mService.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY); ArgumentCaptor<Temperature> captor = ArgumentCaptor.forClass(Temperature.class); ArgumentCaptor<Temperature> captor = ArgumentCaptor.forClass(Temperature.class); Loading @@ -228,7 +228,7 @@ public class ThermalManagerServiceTest { .times(4)).notifyThrottling(captor.capture()); .times(4)).notifyThrottling(captor.capture()); assertListEqualsIgnoringOrder(mFakeHal.mTemperatureList, captor.getAllValues()); assertListEqualsIgnoringOrder(mFakeHal.mTemperatureList, captor.getAllValues()); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(Temperature.THROTTLING_NONE); .times(0)).onStatusChange(Temperature.THROTTLING_NONE); captor = ArgumentCaptor.forClass(Temperature.class); captor = ArgumentCaptor.forClass(Temperature.class); verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mEventListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(2)).notifyThrottling(captor.capture()); .times(2)).notifyThrottling(captor.capture()); Loading @@ -236,7 +236,7 @@ public class ThermalManagerServiceTest { new ArrayList<>(Arrays.asList(mFakeHal.mSkin1, mFakeHal.mSkin2)), new ArrayList<>(Arrays.asList(mFakeHal.mSkin1, mFakeHal.mSkin2)), captor.getAllValues()); captor.getAllValues()); verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) verify(mStatusListener2, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).onStatusChange(Temperature.THROTTLING_NONE); .times(0)).onStatusChange(Temperature.THROTTLING_NONE); } } private void resetListenerMock() { private void resetListenerMock() { Loading