OSDN Git Service

Add observer for extcon events
authorFaouaz TENOUTIT <faouaz.tenoutit@intel.com>
Wed, 28 Jan 2015 09:57:01 +0000 (10:57 +0100)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 20 Jul 2016 09:53:14 +0000 (17:53 +0800)
Recent kernel drivers are using EXTCON instead of SWITCH class.

This patch will extend the current WiredAccessoryManager to monitor
and notify about both events (switch & extcon), depending on the current
running kernel configuration.

Issue: IRDA-3090

Change-Id: Ica61534236ed96eda3afdc44934741945b243952
Signed-off-by: Faouaz TENOUTIT <faouaz.tenoutit@intel.com>
Signed-off-by: Guillaume Zajac <guillaume.zajac@intel.com>
Reviewed-on: https://android.intel.com/327024
Reviewed-by: cactus <cactus@intel.com>
Reviewed-by: Bhat, Sudheendra S <sudheendra.s.bhat@intel.com>
Tested-by: Bhat, Sudheendra S <sudheendra.s.bhat@intel.com>
Reviewed-on: https://android.intel.com/335886
Reviewed-by: Fagerstedt, Axel <axel.fagerstedt@intel.com>
Reviewed-on: https://android.intel.com/385132
Reviewed-by: Sjolander, Simon <simon.sjolander@intel.com>
Tested-by: Sjolander, Simon <simon.sjolander@intel.com>
Tested-by: Fagerstedt, Axel <axel.fagerstedt@intel.com>
services/core/java/com/android/server/WiredAccessoryManager.java

index e0e6070..d9a8e78 100644 (file)
@@ -412,6 +412,17 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
             } catch (NumberFormatException e) {
                 Slog.e(TAG, "Could not parse switch state from event " + event);
             }
+
+            try {
+                String devPath = event.get("DEVPATH");
+                String name = event.get("NAME");
+                int state = Integer.parseInt(event.get("STATE"));
+                synchronized (mLock) {
+                    updateStateLocked(devPath, name, state);
+                }
+            } catch (NumberFormatException e) {
+                Slog.e(TAG, "Could not parse extcon state from event " + event);
+            }
         }
 
         private void updateStateLocked(String devPath, String name, int state) {
@@ -426,12 +437,22 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
 
         private final class UEventInfo {
             private final String mDevName;
+            private final String mClassName;
             private final int mState1Bits;
             private final int mState2Bits;
             private final int mStateNbits;
 
             public UEventInfo(String devName, int state1Bits, int state2Bits, int stateNbits) {
                 mDevName = devName;
+
+                /* Check if the kernel is using EXTCON class */
+                File f_extcon = new File(String.format(Locale.US, "/sys/class/extcon/%s/state", mDevName));
+                if (f_extcon.exists()) {
+                    mClassName = "extcon";
+                } else {
+                    mClassName = "switch";
+                }
+
                 mState1Bits = state1Bits;
                 mState2Bits = state2Bits;
                 mStateNbits = stateNbits;
@@ -440,11 +461,11 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks {
             public String getDevName() { return mDevName; }
 
             public String getDevPath() {
-                return String.format(Locale.US, "/devices/virtual/switch/%s", mDevName);
+                return String.format(Locale.US, "/devices/virtual/%s/%s", mClassName, mDevName);
             }
 
             public String getSwitchStatePath() {
-                return String.format(Locale.US, "/sys/class/switch/%s/state", mDevName);
+                return String.format(Locale.US, "/sys/class/%s/%s/state", mClassName, mDevName);
             }
 
             public boolean checkSwitchExists() {