167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang/*
267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * Copyright (C) 2014 The Android Open Source Project
367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang *
467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * Licensed under the Apache License, Version 2.0 (the "License");
567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * you may not use this file except in compliance with the License.
667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * You may obtain a copy of the License at
767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang *
867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang *      http://www.apache.org/licenses/LICENSE-2.0
967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang *
1067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * Unless required by applicable law or agreed to in writing, software
1167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * distributed under the License is distributed on an "AS IS" BASIS,
1267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * See the License for the specific language governing permissions and
1467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * limitations under the License.
1567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang */
1667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
1767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jangpackage com.android.server.hdmi;
1867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
1961f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jangimport android.hardware.hdmi.HdmiDeviceInfo;
2067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jangimport android.util.Slog;
2167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
2267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang/**
2367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * Base feature action class for <Request ARC Initiation>/<Request ARC Termination>.
2467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang */
25b509c2ecd99619248b7a07fb0fa978bb27f25cc3Jungshik Jangabstract class RequestArcAction extends HdmiCecFeatureAction {
2667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    private static final String TAG = "RequestArcAction";
2767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
2867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    // State in which waits for ARC response.
2967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected static final int STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE = 1;
3067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
3167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    // Logical address of AV Receiver.
3267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected final int mAvrAddress;
3367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
3467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
3567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @Constructor
3667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
3779c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang     * @param source {@link HdmiCecLocalDevice} instance
3867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param avrAddress address of AV receiver. It should be AUDIO_SYSTEM type
3967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @throw IllegalArugmentException if device type of sourceAddress and avrAddress
4067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *                      is invalid
4167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
4279c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    RequestArcAction(HdmiCecLocalDevice source, int avrAddress) {
4379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        super(source);
4461f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang        HdmiUtils.verifyAddressType(getSourceAddress(), HdmiDeviceInfo.DEVICE_TV);
4561f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang        HdmiUtils.verifyAddressType(avrAddress, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
4667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        mAvrAddress = avrAddress;
4767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
4867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
4967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    @Override
5067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    boolean processCommand(HdmiCecMessage cmd) {
5163a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        if (mState != STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE
5263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                || !HdmiUtils.checkCommandSource(cmd, mAvrAddress, TAG)) {
5367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            return false;
5467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
5567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        int opcode = cmd.getOpcode();
5667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        switch (opcode) {
5767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            // Handles only <Feature Abort> here and, both <Initiate ARC> and <Terminate ARC>
5867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            // are handled in HdmiControlService itself because both can be
59339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang            // received without <Request ARC Initiation> or <Request ARC Termination>.
60c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_FEATURE_ABORT:
61339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                int originalOpcode = cmd.getParams()[0] & 0xFF;
62339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                if (originalOpcode == Constants.MESSAGE_REQUEST_ARC_INITIATION
63339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                        || originalOpcode == Constants.MESSAGE_REQUEST_ARC_TERMINATION) {
64339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                    disableArcTransmission();
65339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                    finish();
66339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                    return true;
67339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                } else {
68339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                    return false;
69339227da7cf025ce4ae0c85ddc52643d63972321Jungshik Jang                }
7067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
7167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return false;
7267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
7367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
7467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected final void disableArcTransmission() {
7567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        // Start Set ARC Transmission State action.
7679c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(localDevice(),
7779c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                mAvrAddress, false);
7879c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        addAndStartAction(action);
7967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
8067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
8167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    @Override
8267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    final void handleTimerEvent(int state) {
8367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        if (mState != state || state != STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE) {
8467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            return;
8567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
862e8f1b6399089626b4f0249427626ba6e63a62efJungshik Jang        HdmiLogger.debug("[T]RequestArcAction.");
8767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        disableArcTransmission();
88358164c09e367199cd3d4af6381a9f342ac9f0efJungshik Jang        finish();
8967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
9067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang}
91