RequestArcAction.java revision b509c2ecd99619248b7a07fb0fa978bb27f25cc3
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;
20c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim
2167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jangimport android.util.Slog;
2267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
2367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang/**
2467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang * Base feature action class for <Request ARC Initiation>/<Request ARC Termination>.
2567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang */
26b509c2ecd99619248b7a07fb0fa978bb27f25cc3Jungshik Jangabstract class RequestArcAction extends HdmiCecFeatureAction {
2767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    private static final String TAG = "RequestArcAction";
2867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
2967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    // State in which waits for ARC response.
3067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected static final int STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE = 1;
3167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
3267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    // Logical address of AV Receiver.
3367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected final int mAvrAddress;
3467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
3567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    /**
3667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @Constructor
3767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *
3879c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang     * @param source {@link HdmiCecLocalDevice} instance
3967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @param avrAddress address of AV receiver. It should be AUDIO_SYSTEM type
4067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     * @throw IllegalArugmentException if device type of sourceAddress and avrAddress
4167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     *                      is invalid
4267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang     */
4379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang    RequestArcAction(HdmiCecLocalDevice source, int avrAddress) {
4479c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        super(source);
4561f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang        HdmiUtils.verifyAddressType(getSourceAddress(), HdmiDeviceInfo.DEVICE_TV);
4661f4fbd2e8436a1ecd478c2a1f516d064a24d43bJungshik Jang        HdmiUtils.verifyAddressType(avrAddress, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
4767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        mAvrAddress = avrAddress;
4867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
4967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
5067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    @Override
5167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    boolean processCommand(HdmiCecMessage cmd) {
5263a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo        if (mState != STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE
5363a2e0696ce2a04fbe0f1f00cfe9c93189f944daYuncheol Heo                || !HdmiUtils.checkCommandSource(cmd, mAvrAddress, TAG)) {
5467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            return false;
5567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
5667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        int opcode = cmd.getOpcode();
5767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        switch (opcode) {
5867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            // Handles only <Feature Abort> here and, both <Initiate ARC> and <Terminate ARC>
5967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            // are handled in HdmiControlService itself because both can be
6067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            // received wihtout <Request ARC Initiation> or <Request ARC Termination>.
61c0c20d0522d7756d80f011e7a54bf3b51c78df41Jinsuk Kim            case Constants.MESSAGE_FEATURE_ABORT:
6267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                disableArcTransmission();
6367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                finish();
6467ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                return true;
6567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            default:
6667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang                Slog.w(TAG, "Unsupported opcode:" + cmd.toString());
6767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
6867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        return false;
6967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
7067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
7167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    protected final void disableArcTransmission() {
7267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        // Start Set ARC Transmission State action.
7379c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        SetArcTransmissionStateAction action = new SetArcTransmissionStateAction(localDevice(),
7479c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang                mAvrAddress, false);
7579c58a4b97f27ede6a1b680d2fece9c2a0edf7b7Jungshik Jang        addAndStartAction(action);
7667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
7767ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang
7867ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    @Override
7967ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    final void handleTimerEvent(int state) {
8067ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        if (mState != state || state != STATE_WATING_FOR_REQUEST_ARC_REQUEST_RESPONSE) {
8167ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang            return;
8267ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        }
8367ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang        disableArcTransmission();
84358164c09e367199cd3d4af6381a9f342ac9f0efJungshik Jang        finish();
8567ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang    }
8667ea521d14f366fe5aac09e512865d31bfa0ee53Jungshik Jang}
87