From ad7fa7fa77318d416ed338ede6aae582c239f822 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 7 Jan 2011 14:06:50 -0800 Subject: WM part of #3293405: Screen needs to be redrawn when HDMI is plugged in Change-Id: If5ceb28073c6abf14165871bd99cb481b31a863b --- .../internal/policy/impl/PhoneWindowManager.java | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'policy') diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 281ac2e..5ad0edb 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -37,12 +37,12 @@ import android.graphics.Rect; import android.os.Handler; import android.os.IBinder; import android.os.LocalPowerManager; -import android.os.Looper; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.UEventObserver; import android.os.Vibrator; import android.provider.Settings; @@ -120,6 +120,7 @@ import android.view.animation.AnimationUtils; import android.media.IAudioService; import android.media.AudioManager; +import java.io.File; import java.util.ArrayList; /** @@ -236,6 +237,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mSystemReady; boolean mLidOpen; + boolean mHdmiPlugged; int mUiMode = Configuration.UI_MODE_TYPE_NORMAL; int mDockMode = Intent.EXTRA_DOCK_STATE_UNDOCKED; int mLidOpenRotation; @@ -351,6 +353,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { final KeyCharacterMap.FallbackAction mFallbackAction = new KeyCharacterMap.FallbackAction(); + private UEventObserver mHDMIObserver = new UEventObserver() { + @Override + public void onUEvent(UEventObserver.UEvent event) { + setHdmiPlugged("1".equals(event.get("SWITCH_STATE"))); + } + }; + class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); @@ -698,6 +707,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { mSafeModeEnabledVibePattern = getLongIntArray(mContext.getResources(), com.android.internal.R.array.config_safeModeEnabledVibePattern); + // watch for HDMI plug messages if the hdmi switch exists + if (new File("/sys/devices/virtual/switch/hdmi/state").exists()) { + mHDMIObserver.startObserving("DEVPATH=/devices/virtual/switch/hdmi"); + } + // Note: the Configuration is not stable here, so we cannot load mStatusBarCanHide from // config_statusBarCanHide because the latter depends on the screen size } @@ -1963,7 +1977,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean awakeNow = mKeyguardMediator.doLidChangeTq(mLidOpen); updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); if (awakeNow) { - // If the lid opening and we don't have to keep the + // If the lid is opening and we don't have to keep the // keyguard up, then we can turn on the screen // immediately. mKeyguardMediator.pokeWakelock(); @@ -1987,6 +2001,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + void setHdmiPlugged(boolean plugged) { + if (mHdmiPlugged != plugged) { + mHdmiPlugged = plugged; + updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE); + Intent intent = new Intent(ACTION_HDMI_PLUGGED); + intent.putExtra(EXTRA_HDMI_PLUGGED_STATE, plugged); + mContext.sendStickyBroadcast(intent); + } + } + /** * @return Whether music is being played right now. */ @@ -2418,7 +2442,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { // case for nosensor meaning ignore sensor and consider only lid // or orientation sensor disabled //or case.unspecified - if (mLidOpen) { + if (mHdmiPlugged) { + return Surface.ROTATION_0; + } else if (mLidOpen) { return mLidOpenRotation; } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) { return mCarDockRotation; @@ -2586,7 +2612,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { void updateRotation(int animFlags) { mPowerManager.setKeyboardVisibility(mLidOpen); int rotation = Surface.ROTATION_0; - if (mLidOpen) { + if (mHdmiPlugged) { + rotation = Surface.ROTATION_0; + } else if (mLidOpen) { rotation = mLidOpenRotation; } else if (mDockMode == Intent.EXTRA_DOCK_STATE_CAR && mCarDockRotation >= 0) { rotation = mCarDockRotation; -- cgit v1.1