HdmiCecLocalDevice.java revision 1a4485dcd25ed036fb8de1a271b37121d8135f4e
12918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim/*
22918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * Copyright (C) 2014 The Android Open Source Project
32918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim *
42918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * Licensed under the Apache License, Version 2.0 (the "License");
52918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * you may not use this file except in compliance with the License.
62918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * You may obtain a copy of the License at
72918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim *
82918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim *      http://www.apache.org/licenses/LICENSE-2.0
92918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim *
102918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * Unless required by applicable law or agreed to in writing, software
112918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * distributed under the License is distributed on an "AS IS" BASIS,
122918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * See the License for the specific language governing permissions and
142918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * limitations under the License.
152918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim */
162918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
172918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kimpackage com.android.server.hdmi;
182918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
192918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kimimport com.android.server.hdmi.HdmiCecController.AllocateLogicalAddressCallback;
202918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
212918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kimimport android.hardware.hdmi.HdmiCec;
221a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jangimport android.hardware.hdmi.HdmiCecDeviceInfo;
232918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
242918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim/**
252918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * Class that models a logical CEC device hosted in this system. Handles initialization,
262918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim * CEC commands that call for actions customized per device type.
272918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim */
282918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kimabstract class HdmiCecLocalDevice {
292918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
302918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected final HdmiCecController mController;
312918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected final int mDeviceType;
322918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected int mAddress;
332918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected int mPreferredAddress;
341a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    protected HdmiCecDeviceInfo mDeviceInfo;
352918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
362918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected HdmiCecLocalDevice(HdmiCecController controller, int deviceType) {
372918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mController = controller;
382918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mDeviceType = deviceType;
392918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mAddress = HdmiCec.ADDR_UNREGISTERED;
402918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
412918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
422918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    // Factory method that returns HdmiCecLocalDevice of corresponding type.
432918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    static HdmiCecLocalDevice create(HdmiCecController controller, int deviceType) {
442918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        switch (deviceType) {
452918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        case HdmiCec.DEVICE_TV:
462918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            return new HdmiCecLocalDeviceTv(controller);
472918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        case HdmiCec.DEVICE_PLAYBACK:
482918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            return new HdmiCecLocalDevicePlayback(controller);
492918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        default:
502918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            return null;
512918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        }
522918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
532918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
542918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    abstract void init();
552918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
562918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    protected void allocateAddress(int type) {
572918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mController.allocateLogicalAddress(type, mPreferredAddress,
582918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim                new AllocateLogicalAddressCallback() {
592918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            @Override
602918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            public void onAllocated(int deviceType, int logicalAddress) {
612918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim                mAddress = mPreferredAddress = logicalAddress;
621a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang
631a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang                // Create and set device info.
641a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang                HdmiCecDeviceInfo deviceInfo = createDeviceInfo(mAddress, deviceType);
651a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang                setDeviceInfo(deviceInfo);
661a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang                mController.addDeviceInfo(deviceInfo);
671a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang
682918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim                mController.addLogicalAddress(logicalAddress);
692918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim            }
702918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        });
712918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
722918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
731a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    private final HdmiCecDeviceInfo createDeviceInfo(int logicalAddress, int deviceType) {
741a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        int vendorId = mController.getVendorId();
751a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        int physicalAddress = mController.getPhysicalAddress();
761a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        // TODO: get device name read from system configuration.
771a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        String displayName = HdmiCec.getDefaultDeviceName(logicalAddress);
781a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        return new HdmiCecDeviceInfo(logicalAddress,
791a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang                physicalAddress, deviceType, vendorId, displayName);
801a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    }
811a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang
821a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    HdmiCecDeviceInfo getDeviceInfo() {
831a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        return mDeviceInfo;
841a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    }
851a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang
861a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    void setDeviceInfo(HdmiCecDeviceInfo info) {
871a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang        mDeviceInfo = info;
881a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang    }
891a4485dcd25ed036fb8de1a271b37121d8135f4eJungshik Jang
902918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    // Returns true if the logical address is same as the argument.
912918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    boolean isAddressOf(int addr) {
922918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        return addr == mAddress;
932918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
942918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
952918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    // Resets the logical address to unregistered(15), meaning the logical device is invalid.
962918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    void clearAddress() {
972918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mAddress = HdmiCec.ADDR_UNREGISTERED;
982918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
992918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim
1002918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    void setPreferredAddress(int addr) {
1012918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim        mPreferredAddress = addr;
1022918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim    }
1032918e9e133de8066ab497a5f8dac1c310c792767Jinsuk Kim}
104