diff options
| -rw-r--r-- | services/core/java/com/android/server/ExtconStateObserver.java | 28 | ||||
| -rw-r--r-- | services/core/java/com/android/server/policy/PhoneWindowManager.java | 45 |
2 files changed, 51 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/ExtconStateObserver.java b/services/core/java/com/android/server/ExtconStateObserver.java index 6b561c7af63e..92f30ff50112 100644 --- a/services/core/java/com/android/server/ExtconStateObserver.java +++ b/services/core/java/com/android/server/ExtconStateObserver.java @@ -21,7 +21,6 @@ import android.os.FileUtils; import android.util.Slog; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; /** @@ -36,31 +35,18 @@ public abstract class ExtconStateObserver<S> extends ExtconUEventObserver { private static final boolean LOG = false; /** - * Parses the current state from the state file for {@code extconInfo} and calls {@link - * #updateState(ExtconInfo, String, Object)} + * Parses the current state from the state file for {@code extconInfo}. * - * @param extconInfo the extconInfo to update state for + * @param extconInfo the extconInfo to parse state for * @see #parseState(ExtconInfo, String) * @see ExtconInfo#getStatePath() */ - public void updateStateFromFile(ExtconInfo extconInfo) { + @Nullable + public S parseStateFromFile(ExtconInfo extconInfo) throws IOException { String statePath = extconInfo.getStatePath(); - try { - S state = - parseState( - extconInfo, - FileUtils.readTextFile(new File(statePath), 0, null).trim()); - if (state != null) { - updateState(extconInfo, extconInfo.getName(), state); - } - } catch (FileNotFoundException e) { - Slog.w(TAG, statePath + " not found while attempting to determine initial state", e); - } catch (IOException e) { - Slog.e( - TAG, - "Error reading " + statePath + " while attempting to determine initial state ", - e); - } + return parseState( + extconInfo, + FileUtils.readTextFile(new File(statePath), 0, null).trim()); } @Override diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 282746af2784..59c6d0a78e1c 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -275,6 +275,8 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.ScreenShapeHelper; import com.android.internal.util.ScreenshotHelper; import com.android.internal.widget.PointerLocationView; +import com.android.server.ExtconStateObserver; +import com.android.server.ExtconUEventObserver; import com.android.server.GestureLauncherService; import com.android.server.LocalServices; import com.android.server.SystemServiceManager; @@ -296,6 +298,7 @@ import com.android.server.wm.WindowManagerInternal.AppTransitionListener; import com.android.server.wm.utils.InsetUtils; import java.io.File; +import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; @@ -5707,7 +5710,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { char[] buf = new char[15]; int n = reader.read(buf); if (n > 1) { - plugged = 0 != Integer.parseInt(new String(buf, 0, n-1)); + plugged = 0 != Integer.parseInt(new String(buf, 0, n - 1)); } } catch (IOException ex) { Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex); @@ -5721,6 +5724,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } + } else if (ExtconUEventObserver.extconExists()) { + HdmiVideoExtconUEventObserver observer = new HdmiVideoExtconUEventObserver(); + plugged = observer.init(); + mHDMIObserver = observer; } // This dance forces the code in setHdmiPlugged to run. // Always do this so the sticky intent is stuck (to false) if there is no hdmi. @@ -8315,4 +8322,40 @@ public class PhoneWindowManager implements WindowManagerPolicy { } return false; } + + private class HdmiVideoExtconUEventObserver extends ExtconStateObserver<Boolean> { + private static final String HDMI_EXIST = "HDMI=1"; + private final ExtconInfo mHdmi = new ExtconInfo("hdmi"); + + private boolean init() { + boolean plugged = false; + try { + plugged = parseStateFromFile(mHdmi); + } catch (FileNotFoundException e) { + Slog.w(TAG, mHdmi.getStatePath() + + " not found while attempting to determine initial state", e); + } catch (IOException e) { + Slog.e( + TAG, + "Error reading " + mHdmi.getStatePath() + + " while attempting to determine initial state", + e); + } + startObserving(mHdmi); + return plugged; + } + + @Override + public void updateState(ExtconInfo extconInfo, String eventName, Boolean state) { + mDefaultDisplayPolicy.setHdmiPlugged(state); + } + + @Override + public Boolean parseState(ExtconInfo extconIfno, String state) { + // extcon event state changes from kernel4.9 + // new state will be like STATE=HDMI=1 + return state.contains(HDMI_EXIST); + } + } + } |