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