summaryrefslogtreecommitdiff
path: root/core/java/android/view/WindowManagerImpl.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-05-25 16:36:50 -0700
committerDianne Hackborn <hackbod@google.com>2011-05-25 16:36:50 -0700
commitfee1c69a49d03b651e481983432ade94fc07650a (patch)
tree9e7cfad06ab1fb8e6fcb1ccd3fa60cf6d1b2f103 /core/java/android/view/WindowManagerImpl.java
parent1b9b34adf704c2c059ca439ace0c0b67c8c272f3 (diff)
parent77dd616e685e2671491d911d0847efa4f832717e (diff)
resolved conflicts for merge of 77dd616e to master
Change-Id: Idb7180177b01e7d822327ccc7c76617220860da2
Diffstat (limited to 'core/java/android/view/WindowManagerImpl.java')
-rw-r--r--core/java/android/view/WindowManagerImpl.java100
1 files changed, 90 insertions, 10 deletions
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index d7a309686d4d..d18ae0ed4672 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -16,6 +16,9 @@
package android.view;
+import java.util.HashMap;
+
+import android.content.res.CompatibilityInfo;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.AndroidRuntimeException;
@@ -74,9 +77,92 @@ public class WindowManagerImpl implements WindowManager {
public static final int ADD_MULTIPLE_SINGLETON = -7;
public static final int ADD_PERMISSION_DENIED = -8;
- public static WindowManagerImpl getDefault()
- {
- return mWindowManager;
+ private View[] mViews;
+ private ViewAncestor[] mRoots;
+ private WindowManager.LayoutParams[] mParams;
+
+ private final static Object sLock = new Object();
+ private final static WindowManagerImpl sWindowManager = new WindowManagerImpl();
+ private final static HashMap<CompatibilityInfo, WindowManager> sCompatWindowManagers
+ = new HashMap<CompatibilityInfo, WindowManager>();
+
+ static class CompatModeWrapper implements WindowManager {
+ private final WindowManager mWindowManager;
+ private final Display mDefaultDisplay;
+
+ CompatModeWrapper(WindowManager wm, CompatibilityInfo ci) {
+ mWindowManager = wm;
+
+ // Use the original display if there is no compatibility mode
+ // to apply, or the underlying window manager is already a
+ // compatibility mode wrapper. (We assume that if it is a
+ // wrapper, it is applying the same compatibility mode.)
+ if (ci == null || wm instanceof CompatModeWrapper
+ || (!ci.isScalingRequired() && ci.supportsScreen())) {
+ mDefaultDisplay = mWindowManager.getDefaultDisplay();
+ } else {
+ //mDefaultDisplay = mWindowManager.getDefaultDisplay();
+ mDefaultDisplay = Display.createCompatibleDisplay(
+ mWindowManager.getDefaultDisplay().getDisplayId(), ci);
+ }
+ }
+
+ @Override
+ public void addView(View view, android.view.ViewGroup.LayoutParams params) {
+ mWindowManager.addView(view, params);
+ }
+
+ @Override
+ public void updateViewLayout(View view, android.view.ViewGroup.LayoutParams params) {
+ mWindowManager.updateViewLayout(view, params);
+
+ }
+
+ @Override
+ public void removeView(View view) {
+ mWindowManager.removeView(view);
+ }
+
+ @Override
+ public Display getDefaultDisplay() {
+ return mDefaultDisplay;
+ }
+
+ @Override
+ public void removeViewImmediate(View view) {
+ mWindowManager.removeViewImmediate(view);
+ }
+
+ @Override
+ public boolean isHardwareAccelerated() {
+ return mWindowManager.isHardwareAccelerated();
+ }
+
+ }
+
+ public static WindowManagerImpl getDefault() {
+ return sWindowManager;
+ }
+
+ public static WindowManager getDefault(CompatibilityInfo compatInfo) {
+ if (compatInfo == null || (!compatInfo.isScalingRequired()
+ && compatInfo.supportsScreen())) {
+ return sWindowManager;
+ }
+
+ synchronized (sLock) {
+ // NOTE: It would be cleaner to move the implementation of
+ // WindowManagerImpl into a static inner class, and have this
+ // public impl just call into that. Then we can make multiple
+ // instances of WindowManagerImpl for compat mode rather than
+ // having to make wrappers.
+ WindowManager wm = sCompatWindowManagers.get(compatInfo);
+ if (wm == null) {
+ wm = new CompatModeWrapper(sWindowManager, compatInfo);
+ sCompatWindowManagers.put(compatInfo, wm);
+ }
+ return wm;
+ }
}
public boolean isHardwareAccelerated() {
@@ -340,13 +426,9 @@ public class WindowManagerImpl implements WindowManager {
}
public Display getDefaultDisplay() {
- return new Display(Display.DEFAULT_DISPLAY);
+ return new Display(Display.DEFAULT_DISPLAY, null);
}
- private View[] mViews;
- private ViewAncestor[] mRoots;
- private WindowManager.LayoutParams[] mParams;
-
private static void removeItem(Object[] dst, Object[] src, int index)
{
if (dst.length > 0) {
@@ -375,6 +457,4 @@ public class WindowManagerImpl implements WindowManager {
return -1;
}
}
-
- private static WindowManagerImpl mWindowManager = new WindowManagerImpl();
}