Loading services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java +16 −27 Original line number Original line Diff line number Diff line Loading @@ -28,21 +28,17 @@ import com.android.internal.annotations.VisibleForTesting; */ */ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { private static final String TAG = "PowerStatusMonitorActionFromPlayback"; private static final String TAG = "PowerStatusMonitorActionFromPlayback"; // State that waits for next monitoring. private static final int STATE_WAIT_FOR_NEXT_MONITORING = 1; // State that waits for <Report Power Status> once sending <Give Device Power Status> // State that waits for <Report Power Status> once sending <Give Device Power Status> // to all external devices. // to the TV. private static final int STATE_WAIT_FOR_REPORT_POWER_STATUS = 1; private static final int STATE_WAIT_FOR_REPORT_POWER_STATUS = 2; // State that waits for next monitoring. private static final int STATE_WAIT_FOR_NEXT_MONITORING = 2; // Monitoring interval (60s) // Monitoring interval (60s) @VisibleForTesting @VisibleForTesting protected static final int MONITORING_INTERVAL_MS = 60000; protected static final int MONITORING_INTERVAL_MS = 60000; // Timeout once sending <Give Device Power Status> // Timeout once sending <Give Device Power Status> private static final int REPORT_POWER_STATUS_TIMEOUT_MS = 5000; // Maximum number of retries in case the <Give Device Power Status> failed being sent or times // out. private static final int GIVE_POWER_STATUS_FOR_SOURCE_RETRIES = 5; private int mPowerStatusRetries = 0; PowerStatusMonitorActionFromPlayback(HdmiCecLocalDevice source) { PowerStatusMonitorActionFromPlayback(HdmiCecLocalDevice source) { super(source); super(source); Loading @@ -68,11 +64,10 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { private boolean handleReportPowerStatusFromTv(HdmiCecMessage cmd) { private boolean handleReportPowerStatusFromTv(HdmiCecMessage cmd) { int powerStatus = cmd.getParams()[0] & 0xFF; int powerStatus = cmd.getParams()[0] & 0xFF; mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); if (powerStatus == POWER_STATUS_STANDBY) { if (powerStatus == POWER_STATUS_STANDBY) { Slog.d(TAG, "TV reported it turned off, going to sleep."); Slog.d(TAG, "TV reported it turned off, going to sleep."); source().getService().standby(); source().getService().standby(); finish(); return true; return true; } } return false; return false; Loading @@ -80,13 +75,19 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { @Override @Override void handleTimerEvent(int state) { void handleTimerEvent(int state) { if (mState != state) { return; } switch (mState) { switch (mState) { case STATE_WAIT_FOR_NEXT_MONITORING: case STATE_WAIT_FOR_NEXT_MONITORING: mPowerStatusRetries = 0; queryPowerStatus(); queryPowerStatus(); break; break; case STATE_WAIT_FOR_REPORT_POWER_STATUS: case STATE_WAIT_FOR_REPORT_POWER_STATUS: handleTimeout(); mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); break; default: break; break; } } } } Loading @@ -96,18 +97,6 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { Constants.ADDR_TV)); Constants.ADDR_TV)); mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; addTimer(mState, REPORT_POWER_STATUS_TIMEOUT_MS); addTimer(mState, HdmiConfig.TIMEOUT_MS); } private void handleTimeout() { if (mState == STATE_WAIT_FOR_REPORT_POWER_STATUS) { if (mPowerStatusRetries++ < GIVE_POWER_STATUS_FOR_SOURCE_RETRIES) { queryPowerStatus(); } else { mPowerStatusRetries = 0; mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); } } } } } } services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -2868,6 +2868,9 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mPowerManager.isInteractive()).isTrue(); assertThat(mPowerManager.isInteractive()).isTrue(); mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages(); mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.dispatchAll(); mTestLooper.moveTimeForward(MONITORING_INTERVAL_MS); mTestLooper.moveTimeForward(MONITORING_INTERVAL_MS); mTestLooper.dispatchAll(); mTestLooper.dispatchAll(); Loading Loading
services/core/java/com/android/server/hdmi/PowerStatusMonitorActionFromPlayback.java +16 −27 Original line number Original line Diff line number Diff line Loading @@ -28,21 +28,17 @@ import com.android.internal.annotations.VisibleForTesting; */ */ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { private static final String TAG = "PowerStatusMonitorActionFromPlayback"; private static final String TAG = "PowerStatusMonitorActionFromPlayback"; // State that waits for next monitoring. private static final int STATE_WAIT_FOR_NEXT_MONITORING = 1; // State that waits for <Report Power Status> once sending <Give Device Power Status> // State that waits for <Report Power Status> once sending <Give Device Power Status> // to all external devices. // to the TV. private static final int STATE_WAIT_FOR_REPORT_POWER_STATUS = 1; private static final int STATE_WAIT_FOR_REPORT_POWER_STATUS = 2; // State that waits for next monitoring. private static final int STATE_WAIT_FOR_NEXT_MONITORING = 2; // Monitoring interval (60s) // Monitoring interval (60s) @VisibleForTesting @VisibleForTesting protected static final int MONITORING_INTERVAL_MS = 60000; protected static final int MONITORING_INTERVAL_MS = 60000; // Timeout once sending <Give Device Power Status> // Timeout once sending <Give Device Power Status> private static final int REPORT_POWER_STATUS_TIMEOUT_MS = 5000; // Maximum number of retries in case the <Give Device Power Status> failed being sent or times // out. private static final int GIVE_POWER_STATUS_FOR_SOURCE_RETRIES = 5; private int mPowerStatusRetries = 0; PowerStatusMonitorActionFromPlayback(HdmiCecLocalDevice source) { PowerStatusMonitorActionFromPlayback(HdmiCecLocalDevice source) { super(source); super(source); Loading @@ -68,11 +64,10 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { private boolean handleReportPowerStatusFromTv(HdmiCecMessage cmd) { private boolean handleReportPowerStatusFromTv(HdmiCecMessage cmd) { int powerStatus = cmd.getParams()[0] & 0xFF; int powerStatus = cmd.getParams()[0] & 0xFF; mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); if (powerStatus == POWER_STATUS_STANDBY) { if (powerStatus == POWER_STATUS_STANDBY) { Slog.d(TAG, "TV reported it turned off, going to sleep."); Slog.d(TAG, "TV reported it turned off, going to sleep."); source().getService().standby(); source().getService().standby(); finish(); return true; return true; } } return false; return false; Loading @@ -80,13 +75,19 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { @Override @Override void handleTimerEvent(int state) { void handleTimerEvent(int state) { if (mState != state) { return; } switch (mState) { switch (mState) { case STATE_WAIT_FOR_NEXT_MONITORING: case STATE_WAIT_FOR_NEXT_MONITORING: mPowerStatusRetries = 0; queryPowerStatus(); queryPowerStatus(); break; break; case STATE_WAIT_FOR_REPORT_POWER_STATUS: case STATE_WAIT_FOR_REPORT_POWER_STATUS: handleTimeout(); mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); break; default: break; break; } } } } Loading @@ -96,18 +97,6 @@ public class PowerStatusMonitorActionFromPlayback extends HdmiCecFeatureAction { Constants.ADDR_TV)); Constants.ADDR_TV)); mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; mState = STATE_WAIT_FOR_REPORT_POWER_STATUS; addTimer(mState, REPORT_POWER_STATUS_TIMEOUT_MS); addTimer(mState, HdmiConfig.TIMEOUT_MS); } private void handleTimeout() { if (mState == STATE_WAIT_FOR_REPORT_POWER_STATUS) { if (mPowerStatusRetries++ < GIVE_POWER_STATUS_FOR_SOURCE_RETRIES) { queryPowerStatus(); } else { mPowerStatusRetries = 0; mState = STATE_WAIT_FOR_NEXT_MONITORING; addTimer(mState, MONITORING_INTERVAL_MS); } } } } } }
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +3 −0 Original line number Original line Diff line number Diff line Loading @@ -2868,6 +2868,9 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mPowerManager.isInteractive()).isTrue(); assertThat(mPowerManager.isInteractive()).isTrue(); mNativeWrapper.clearResultMessages(); mNativeWrapper.clearResultMessages(); mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.dispatchAll(); mTestLooper.moveTimeForward(MONITORING_INTERVAL_MS); mTestLooper.moveTimeForward(MONITORING_INTERVAL_MS); mTestLooper.dispatchAll(); mTestLooper.dispatchAll(); Loading