blob: b52ab76660d7dba720802572a4365895767bb04a [file] [log] [blame]
Jinsuk Kim78d695d2014-05-13 16:36:15 +09001package com.android.server.hdmi;
2
3/*
4 * Copyright (C) 2014 The Android Open Source Project
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
Jungshik Jang79c58a42014-06-16 16:45:36 +090019import android.hardware.hdmi.HdmiControlManager;
Jungshik Jang8e93c842014-08-06 15:48:33 +090020import android.hardware.hdmi.HdmiPlaybackClient;
21import android.hardware.hdmi.HdmiPlaybackClient.DisplayStatusCallback;
Jungshik Jang79c58a42014-06-16 16:45:36 +090022import android.hardware.hdmi.IHdmiControlCallback;
Jinsuk Kim78d695d2014-05-13 16:36:15 +090023import android.os.RemoteException;
24import android.util.Slog;
25
Jinsuk Kimcb802872015-10-13 08:22:09 +090026import java.util.ArrayList;
27import java.util.List;
28
Jinsuk Kim78d695d2014-05-13 16:36:15 +090029/**
Jungshik Jang8e93c842014-08-06 15:48:33 +090030 * Feature action that queries the power status of other device. This action is initiated via
31 * {@link HdmiPlaybackClient#queryDisplayStatus(DisplayStatusCallback)} from the Android system
32 * working as playback device to get the power status of TV device.
33 * <p>
34 * Package-private, accessed by {@link HdmiControlService} only.
Jinsuk Kim78d695d2014-05-13 16:36:15 +090035 */
Jungshik Jangb509c2e2014-08-07 13:45:01 +090036final class DevicePowerStatusAction extends HdmiCecFeatureAction {
Jinsuk Kim78d695d2014-05-13 16:36:15 +090037 private static final String TAG = "DevicePowerStatusAction";
38
39 // State in which the action is waiting for <Report Power Status>.
40 private static final int STATE_WAITING_FOR_REPORT_POWER_STATUS = 1;
41
42 private final int mTargetAddress;
Jinsuk Kimcb802872015-10-13 08:22:09 +090043 private final List<IHdmiControlCallback> mCallbacks = new ArrayList<>();
Jinsuk Kim78d695d2014-05-13 16:36:15 +090044
Jungshik Jang79c58a42014-06-16 16:45:36 +090045 static DevicePowerStatusAction create(HdmiCecLocalDevice source,
Jinsuk Kim78d695d2014-05-13 16:36:15 +090046 int targetAddress, IHdmiControlCallback callback) {
Jungshik Jang79c58a42014-06-16 16:45:36 +090047 if (source == null || callback == null) {
Jinsuk Kim78d695d2014-05-13 16:36:15 +090048 Slog.e(TAG, "Wrong arguments");
49 return null;
50 }
Jungshik Jang79c58a42014-06-16 16:45:36 +090051 return new DevicePowerStatusAction(source, targetAddress, callback);
Jinsuk Kim78d695d2014-05-13 16:36:15 +090052 }
53
Jungshik Jang79c58a42014-06-16 16:45:36 +090054 private DevicePowerStatusAction(HdmiCecLocalDevice localDevice,
Jinsuk Kim78d695d2014-05-13 16:36:15 +090055 int targetAddress, IHdmiControlCallback callback) {
Jungshik Jang79c58a42014-06-16 16:45:36 +090056 super(localDevice);
Jinsuk Kim78d695d2014-05-13 16:36:15 +090057 mTargetAddress = targetAddress;
Jinsuk Kimcb802872015-10-13 08:22:09 +090058 addCallback(callback);
Jinsuk Kim78d695d2014-05-13 16:36:15 +090059 }
60
61 @Override
62 boolean start() {
63 queryDevicePowerStatus();
64 mState = STATE_WAITING_FOR_REPORT_POWER_STATUS;
Jinsuk Kim5fba96d2014-07-11 11:51:34 +090065 addTimer(mState, HdmiConfig.TIMEOUT_MS);
Jinsuk Kim78d695d2014-05-13 16:36:15 +090066 return true;
67 }
68
69 private void queryDevicePowerStatus() {
Jungshik Jang79c58a42014-06-16 16:45:36 +090070 sendCommand(HdmiCecMessageBuilder.buildGiveDevicePowerStatus(getSourceAddress(),
71 mTargetAddress));
Jinsuk Kim78d695d2014-05-13 16:36:15 +090072 }
73
74 @Override
75 boolean processCommand(HdmiCecMessage cmd) {
Jungshik Jang5352081c2014-09-22 15:14:49 +090076 if (mState != STATE_WAITING_FOR_REPORT_POWER_STATUS
77 || mTargetAddress != cmd.getSource()) {
Jinsuk Kim78d695d2014-05-13 16:36:15 +090078 return false;
79 }
Jinsuk Kimc0c20d02014-07-04 14:34:31 +090080 if (cmd.getOpcode() == Constants.MESSAGE_REPORT_POWER_STATUS) {
Jinsuk Kim78d695d2014-05-13 16:36:15 +090081 int status = cmd.getParams()[0];
82 invokeCallback(status);
83 finish();
84 return true;
85 }
86 return false;
87 }
88
89 @Override
90 void handleTimerEvent(int state) {
91 if (mState != state) {
92 return;
93 }
94 if (state == STATE_WAITING_FOR_REPORT_POWER_STATUS) {
95 // Got no response from TV. Report status 'unknown'.
Jinsuk Kimc0c20d02014-07-04 14:34:31 +090096 invokeCallback(HdmiControlManager.POWER_STATUS_UNKNOWN);
Jinsuk Kim78d695d2014-05-13 16:36:15 +090097 finish();
98 }
99 }
100
Jinsuk Kimcb802872015-10-13 08:22:09 +0900101 public void addCallback(IHdmiControlCallback callback) {
102 mCallbacks.add(callback);
103 }
104
Jinsuk Kim78d695d2014-05-13 16:36:15 +0900105 private void invokeCallback(int result) {
106 try {
Jinsuk Kimcb802872015-10-13 08:22:09 +0900107 for (IHdmiControlCallback callback : mCallbacks) {
108 callback.onComplete(result);
109 }
Jinsuk Kim78d695d2014-05-13 16:36:15 +0900110 } catch (RemoteException e) {
111 Slog.e(TAG, "Callback failed:" + e);
112 }
113 }
114}