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); }