From ded6e6f7c7f57cd29bb8c61a2be40bd3f95b09fa Mon Sep 17 00:00:00 2001 From: Firefly Date: Thu, 20 Aug 2015 15:20:45 +0800 Subject: [PATCH] A->framwork:make vga and hdmi switch function --- .../android/view/WindowManagerPolicy.java | 2 + frameworks/base/core/res/AndroidManifest.xml | 1 + .../policy/impl/PhoneWindowManager.java | 77 +++++++++++++++++++ system/displayd/DisplayManager.cpp | 28 +++++++ 4 files changed, 108 insertions(+) diff --git a/frameworks/base/core/java/android/view/WindowManagerPolicy.java b/frameworks/base/core/java/android/view/WindowManagerPolicy.java index 2af0165e0b..63df86a4e3 100644 --- a/frameworks/base/core/java/android/view/WindowManagerPolicy.java +++ b/frameworks/base/core/java/android/view/WindowManagerPolicy.java @@ -97,12 +97,14 @@ public interface WindowManagerPolicy { * Sticky broadcast of the current HDMI plugged state. */ public final static String ACTION_HDMI_PLUGGED = "android.intent.action.HDMI_PLUGGED"; + public final static String ACTION_VGA_PLUGGED = "android.intent.action.VGA_PLUGGED"; /** * Extra in {@link #ACTION_HDMI_PLUGGED} indicating the state: true if * plugged in to HDMI, false if not. */ public final static String EXTRA_HDMI_PLUGGED_STATE = "state"; + public final static String EXTRA_VGA_PLUGGED_STATE = "state"; /** * Pass this event to the user / app. To be returned from diff --git a/frameworks/base/core/res/AndroidManifest.xml b/frameworks/base/core/res/AndroidManifest.xml index ccdb5db3d6..00655f4e3f 100644 --- a/frameworks/base/core/res/AndroidManifest.xml +++ b/frameworks/base/core/res/AndroidManifest.xml @@ -268,6 +268,7 @@ + diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 1b8c11b510..3755e5a367 100755 --- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -125,6 +125,7 @@ import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_CO import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED; import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED; import android.net.Uri; +import android.os.DisplayOutputManager; /** * WindowManagerPolicy implementation for the Android phone UI. This @@ -183,6 +184,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static public final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist"; + private DisplayOutputManager mDom = null; /** * These are the system UI flags that, when changing, can cause the layout @@ -333,6 +335,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mSystemReady; boolean mSystemBooted; boolean mHdmiPlugged; + boolean mVGAPlugged; IUiModeManager mUiModeManager; int mUiMode; int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; @@ -726,6 +729,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { setHdmiPlugged("1".equals(event.get("SWITCH_STATE"))); } }; + + private UEventObserver mVGAObserver = new UEventObserver() { + @Override + public void onUEvent(UEventObserver.UEvent event) { + setVGAPlugged("1".equals(event.get("SWITCH_STATE"))); + } + }; class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { @@ -1438,6 +1448,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Controls rotation and the like. initializeHdmiState(); + initializeVGAState(); // Match current screen state. if (!mPowerManager.isInteractive()) { @@ -4644,7 +4655,36 @@ public class PhoneWindowManager implements WindowManagerPolicy { } mCameraLensCoverState = lensCoverState; } + + void setVGAPlugged(boolean plugged) { + if (mVGAPlugged != plugged) { + mVGAPlugged = plugged; +//$_rbox_$_modify_$_huangyl_begin_0528 + if(mSystemReady == true) + updateRotation(true, true); +//$_rbox_$_modify_end + Intent intent = new Intent(ACTION_VGA_PLUGGED); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.putExtra(EXTRA_VGA_PLUGGED_STATE, plugged); + mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + try { + if(mSystemReady==true && mDom==null) { + mDom = new DisplayOutputManager(); + } + } catch (Exception e){ + } + if (mDom != null) + { + if (plugged==false) { + //mDom.setMode(0,2,"1280x720p-60"); + } else { + mDom.setMode(0,4,"unknow"); + } + } + } + } + void setHdmiPlugged(boolean plugged) { if (mHdmiPlugged != plugged) { mHdmiPlugged = plugged; @@ -4689,6 +4729,42 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHdmiPlugged = !plugged; setHdmiPlugged(!mHdmiPlugged); } + + void initializeVGAState() { + boolean plugged = false; + + // watch for HDMI plug messages if the hdmi switch exists + if (new File("/sys/devices/virtual/switch/vga/state").exists()) { + mVGAObserver.startObserving("DEVPATH=/devices/virtual/switch/vga"); + + final String filename = "/sys/class/switch/vga/state"; + FileReader reader = null; + try { + reader = new FileReader(filename); + char[] buf = new char[15]; + int n = reader.read(buf); + if (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); + } catch (NumberFormatException ex) { + Slog.w(TAG, "Couldn't read hdmi state from " + filename + ": " + ex); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException ex) { + } + } + } + } + // 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. + mVGAPlugged = !plugged; + setVGAPlugged(!mVGAPlugged); + } + final Object mScreenshotLock = new Object(); ServiceConnection mScreenshotConnection = null; @@ -6536,6 +6612,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.print(" mLidOpenRotation="); pw.print(mLidOpenRotation); pw.print(" mCameraLensCoverState="); pw.print(mCameraLensCoverState); pw.print(" mHdmiPlugged="); pw.println(mHdmiPlugged); + pw.print(" mVGAPlugged="); pw.println(mVGAPlugged); if (mLastSystemUiFlags != 0 || mResettingSystemUiFlags != 0 || mForceClearedSystemUiFlags != 0) { pw.print(prefix); pw.print("mLastSystemUiFlags=0x"); diff --git a/system/displayd/DisplayManager.cpp b/system/displayd/DisplayManager.cpp index 1462bfdf38..038e42e01e 100755 --- a/system/displayd/DisplayManager.cpp +++ b/system/displayd/DisplayManager.cpp @@ -927,6 +927,9 @@ void DisplayManager::getModeList(SocketClient *cli, int display, char* iface) { void DisplayManager::getCurMode(SocketClient *cli, int display, char* iface) { struct displaynode *head, *node; + FILE *fd = NULL; + int modelen; + char buf[BUFFER_LENGTH]; int type = string2type(iface); if(display == MAIN_DISPLAY) @@ -943,6 +946,31 @@ void DisplayManager::getCurMode(SocketClient *cli, int display, char* iface) { cli->sendMsg(ResponseCode::CommandParameterError, "Missing iface", false); return; } + + if(strlen(node->mode)) { + //ALOGD("[%s] %s %s %s %d %d", __FUNCTION__, node->path, node->mode, node->name,strlen(node->name),strcmp(node->name,"firefly_vga")); + if(strcmp(node->name,"firefly_vga") == 0) { + // Read modelist; + memset(buf, 0, BUFFER_LENGTH); + strcpy(buf, node->path); + strcat(buf, "/mode"); + fd = fopen(buf, "r"); + + memset(buf, 0, BUFFER_LENGTH); + if(fgets(buf, BUFFER_LENGTH, fd) != NULL) + { + modelen = strlen(buf); + if(modelen) + { + ALOGD("%s", buf); + buf[modelen -1] = 0; + memset(node->mode, 0, MODE_LENGTH); + memcpy(node->mode, buf, modelen -1); + } + } + fclose(fd); + } + } // if(!strlen(node->mode)) { operateIfaceMode(node, DISPLAY_OPERATE_READ, node->mode);