From dd31b92725da397601f54577d1ccd21864f1ad21 Mon Sep 17 00:00:00 2001 From: Keith Kozma Date: Thu, 26 Sep 2013 19:13:49 -0400 Subject: [PATCH] Fix HTC Headphones Change-Id: I2718a1d05d7355fffea8c8dd3b82f345393bdf6b --- .../com/android/server/WiredAccessoryManager.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/java/com/android/server/WiredAccessoryManager.java b/services/java/com/android/server/WiredAccessoryManager.java index eb5287a4113..2f7050d0bf8 100644 --- a/services/java/com/android/server/WiredAccessoryManager.java +++ b/services/java/com/android/server/WiredAccessoryManager.java @@ -306,7 +306,7 @@ void init() { FileReader file = new FileReader(uei.getSwitchStatePath()); int len = file.read(buffer, 0, 1024); file.close(); - curState = Integer.valueOf((new String(buffer, 0, len)).trim()); + curState = validateSwitchState(Integer.valueOf((new String(buffer, 0, len)).trim())); if (curState > 0) { updateStateLocked(uei.getDevPath(), uei.getDevName(), curState); @@ -328,7 +328,13 @@ void init() { startObserving("DEVPATH="+uei.getDevPath()); } } - + private int validateSwitchState(int state) { + // Some drivers, namely HTC headset ones, add additional bits to + // the switch state. As we only are able to deal with the states + // 0, 1 and 2, mask out all the other bits + return state & 0x3; + } + private List makeObservedUEventList() { List retVal = new ArrayList(); UEventInfo uei; @@ -381,7 +387,7 @@ public void onUEvent(UEventObserver.UEvent event) { try { String devPath = event.get("DEVPATH"); String name = event.get("SWITCH_NAME"); - int state = Integer.parseInt(event.get("SWITCH_STATE")); + int state = validateSwitchState(Integer.parseInt(event.get("SWITCH_STATE"))); synchronized (mLock) { updateStateLocked(devPath, name, state); }