From 60b17cc0944a855d6a867d7674c9c33b1251a3f7 Mon Sep 17 00:00:00 2001 From: Jinsuk Kim Date: Fri, 28 Mar 2014 11:46:04 +0900 Subject: Use build property for CEC device OSD name Previously OSD name was based on device type. This CL makes it independent of device type. CEC spec says "A device that implements more than one type of CEC functionality should respond with the same OSD name for each logical address. It is recommended that the name refers to the complete physical product rather than the individual CEC functionality". Now the default name comes from system build property. I removed setOsdName() from aidl for now since it won't be in use. Change-Id: I3c9fb877fad4bc5efef56268d155a3f37a865fc2 --- .../com/android/server/hdmi/HdmiCecDevice.java | 19 ---------- .../com/android/server/hdmi/HdmiCecService.java | 41 ++++++---------------- .../jni/com_android_server_hdmi_HdmiCecService.cpp | 35 ++++++++++-------- 3 files changed, 30 insertions(+), 65 deletions(-) (limited to 'services') diff --git a/services/core/java/com/android/server/hdmi/HdmiCecDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecDevice.java index ebb48dd..64b51c9 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecDevice.java @@ -55,7 +55,6 @@ abstract class HdmiCecDevice { private final Binder mBinder = new Binder(); private final HdmiCecService mService; - private String mName; private boolean mIsActiveSource; /** @@ -107,24 +106,6 @@ abstract class HdmiCecDevice { } /** - * Set the name of the device. The name will be transferred via the message - * <Set OSD Name> to other HDMI-CEC devices connected through HDMI - * cables and shown on TV screen to identify the devicie. - * - * @param name name of the device - */ - public void setName(String name) { - mName = name; - } - - /** - * Return the name of this device. - */ - public String getName() { - return mName; - } - - /** * Register a listener to be invoked when events occur. * * @param listener the listern that will run diff --git a/services/core/java/com/android/server/hdmi/HdmiCecService.java b/services/core/java/com/android/server/hdmi/HdmiCecService.java index 1c9fed1..aa496c5 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecService.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecService.java @@ -23,6 +23,7 @@ import android.hardware.hdmi.HdmiCecMessage; import android.hardware.hdmi.IHdmiCecListener; import android.hardware.hdmi.IHdmiCecService; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.os.RemoteException; import android.text.TextUtils; @@ -76,6 +77,9 @@ public final class HdmiCecService extends SystemService { public void onStart() { mNativePtr = nativeInit(this); if (mNativePtr != 0) { + // TODO: Consider using a dedicated, configurable identifier for OSD name, maybe from + // Settings. It should be ASCII only, not a very long one (limited to 15 chars). + setOsdNameLocked(Build.MODEL); publishBinderService(Context.HDMI_CEC_SERVICE, new BinderService()); } } @@ -139,22 +143,6 @@ public final class HdmiCecService extends SystemService { } /** - * Called by native when a request for the device OSD name was received. - * The native part uses the return value to generate the message - * <Set Osd Name> in response. - */ - private byte[] getOsdName(int type) { - // TODO: Consider getting the OSD name from device name instead. - synchronized (mLock) { - HdmiCecDevice device = mLogicalDevices.get(type); - if (device != null) { - return device.getName().getBytes(Charset.forName("US-ASCII")); - } - } - return null; - } - - /** * Called by native when a request for the menu language of the device was * received. The native part uses the return value to generate the message * <Set Menu Language> in response. The language should be of @@ -175,8 +163,7 @@ public final class HdmiCecService extends SystemService { synchronized (mLock) { for (int i = 0; i < mLogicalDevices.size(); ++i) { HdmiCecDevice device = mLogicalDevices.valueAt(i); - pw.println("Device: name=" + device.getName() + - ", type=" + device.getType() + + pw.println("Device: type=" + device.getType() + ", active=" + device.isActiveSource()); } } @@ -211,6 +198,10 @@ public final class HdmiCecService extends SystemService { nativeSendMessage(mNativePtr, type, address, opcode, params); } + private void setOsdNameLocked(String name) { + nativeSetOsdName(mNativePtr, name.getBytes(Charset.forName("US-ASCII"))); + } + private final class ListenerRecord implements IBinder.DeathRecipient { private final IHdmiCecListener mListener; private final int mType; @@ -259,7 +250,6 @@ public final class HdmiCecService extends SystemService { Log.e(TAG, "Device type not supported yet."); return null; } - device.setName(HdmiCec.getDefaultDeviceName(address)); device.initialize(); mLogicalDevices.put(type, device); } @@ -283,18 +273,6 @@ public final class HdmiCecService extends SystemService { } @Override - public void setOsdName(IBinder b, String name) { - enforceAccessPermission(); - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null"); - } - synchronized (mLock) { - HdmiCecDevice device = getLogicalDeviceLocked(b); - device.setName(name); - } - } - - @Override public void sendActiveSource(IBinder b) { enforceAccessPermission(); synchronized (mLock) { @@ -408,4 +386,5 @@ public final class HdmiCecService extends SystemService { private static native void nativeSendMessage(long handler, int deviceType, int destination, int opcode, byte[] params); private static native int nativeGetPhysicalAddress(long handler); + private static native void nativeSetOsdName(long handler, byte[] name); } diff --git a/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp b/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp index 61edda8..a00aaa8 100644 --- a/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp +++ b/services/core/jni/com_android_server_hdmi_HdmiCecService.cpp @@ -20,7 +20,7 @@ #include "ScopedPrimitiveArray.h" -#include +#include #include #include @@ -34,7 +34,6 @@ static struct { jmethodID handleMessage; jmethodID handleHotplug; jmethodID getActiveSource; - jmethodID getOsdName; jmethodID getLanguage; } gHdmiCecServiceClassInfo; @@ -84,6 +83,7 @@ public: void sendSetMenuLanguage(cec_logical_address_t srcAddr, cec_logical_address_t dstAddr); void sendCecMessage(const cec_message_t& message); + void setOsdName(const char* name, size_t len); private: enum { @@ -156,6 +156,7 @@ private: std::deque mMessageQueue; uint16_t mPhysicalAddress; + std::string mOsdName; }; @@ -373,6 +374,10 @@ void HdmiCecHandler::sendCecMessage(const cec_message_t& message) { mDevice->send_message(mDevice, &message); } +void HdmiCecHandler::setOsdName(const char* name, size_t len) { + mOsdName.assign(name, min(len, CEC_MESSAGE_BODY_MAX_LENGTH - 1)); +} + // static void HdmiCecHandler::onReceived(const hdmi_event_t* event, void* arg) { HdmiCecHandler* handler = static_cast(arg); @@ -504,18 +509,9 @@ void HdmiCecHandler::handleRequestActiveSource() { } void HdmiCecHandler::handleGetOsdName(const cec_message_t& msg) { - cec_logical_address_t addr = msg.destination; - JNIEnv* env = AndroidRuntime::getJNIEnv(); - jbyteArray res = (jbyteArray) env->CallObjectMethod(mCallbacksObj, - gHdmiCecServiceClassInfo.getOsdName, - getDeviceType(addr)); - jbyte *name = env->GetByteArrayElements(res, NULL); - if (name != NULL) { - sendSetOsdName(addr, msg.initiator, reinterpret_cast(name), - env->GetArrayLength(res)); - env->ReleaseByteArrayElements(res, name, JNI_ABORT); + if (!mOsdName.empty()) { + sendSetOsdName(msg.destination, msg.initiator, mOsdName.c_str(), mOsdName.length()); } - checkAndClearExceptionFromCallback(env, __FUNCTION__); } void HdmiCecHandler::handleGiveDeviceVendorID(const cec_message_t& msg) { @@ -562,8 +558,6 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject callbacksObj) { "handleHotplug", "(Z)V"); GET_METHOD_ID(gHdmiCecServiceClassInfo.getActiveSource, clazz, "getActiveSource", "()I"); - GET_METHOD_ID(gHdmiCecServiceClassInfo.getOsdName, clazz, - "getOsdName", "(I)[B"); GET_METHOD_ID(gHdmiCecServiceClassInfo.getLanguage, clazz, "getLanguage", "(I)Ljava/lang/String;"); @@ -603,6 +597,15 @@ static jint nativeGetPhysicalAddress(JNIEnv* env, jclass clazz, jlong handlerPtr return handler->getPhysicalAddress(); } +static void nativeSetOsdName(JNIEnv* env, jclass clazz, jlong handlerPtr, jbyteArray name) { + HdmiCecHandler *handler = reinterpret_cast(handlerPtr); + jsize len = env->GetArrayLength(name); + if (len > 0) { + ScopedByteArrayRO namePtr(env, name); + handler->setOsdName(reinterpret_cast(namePtr.get()), len); + } +} + static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ { "nativeInit", "(Lcom/android/server/hdmi/HdmiCecService;)J", @@ -615,6 +618,8 @@ static JNINativeMethod sMethods[] = { (void *)nativeRemoveLogicalAddress }, { "nativeGetPhysicalAddress", "(J)I", (void *)nativeGetPhysicalAddress }, + { "nativeSetOsdName", "(J[B)V", + (void *)nativeSetOsdName }, }; #define CLASS_PATH "com/android/server/hdmi/HdmiCecService" -- cgit v1.1