diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-06-07 14:09:47 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2011-06-08 18:45:43 -0700 |
commit | 5fd2169eabd77e6bfafaf456e58051a3bafb2bca (patch) | |
tree | 77048c3540c64cad77e5c140b6477a321190c586 /core/java/android/view/Display.java | |
parent | 4381f6421ca408d1dc66430ddfb107c5011bfe25 (diff) | |
download | frameworks_base-5fd2169eabd77e6bfafaf456e58051a3bafb2bca.zip frameworks_base-5fd2169eabd77e6bfafaf456e58051a3bafb2bca.tar.gz frameworks_base-5fd2169eabd77e6bfafaf456e58051a3bafb2bca.tar.bz2 |
Work on issue #4518815: Compatibility mode introduces compatibility regression...
...for Market App iRunner
There were a lot of serious issues with how we updated (or often didn't update)
the display and resource state when switching compatibility mode in conjunction
with restarting and updating application components. This addresses everything
I could find.
Unfortunately it does *not* fix this particular app. I am starting to think this
is just an issue in the app. This change does fix a number of other problems
I could repro, such as switching the compatibility mode of an IME.
Also a few changes here and there to get rid of $#*&^!! debug logs.
Change-Id: Ib15572eac9ec93b4b9966ddcbbc830ce9dec1317
Diffstat (limited to 'core/java/android/view/Display.java')
-rw-r--r-- | core/java/android/view/Display.java | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 8032546..3fa8dfd 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -26,6 +26,9 @@ import android.util.DisplayMetrics; import android.util.Slog; public class Display { + static final String TAG = "Display"; + static final boolean DEBUG_COMPAT = false; + /** * Specify the default Display */ @@ -38,7 +41,7 @@ public class Display { * Display gives you access to some information about a particular display * connected to the device. */ - Display(int display, CompatibilityInfo compatInfo) { + Display(int display, CompatibilityInfoHolder compatInfo) { // initalize the statics when this class is first instansiated. This is // done here instead of in the static block because Zygote synchronized (sStaticInit) { @@ -47,14 +50,19 @@ public class Display { sInitialized = true; } } + mCompatibilityInfo = compatInfo != null ? compatInfo : new CompatibilityInfoHolder(); + mDisplay = display; + init(display); + } + + /** @hide */ + public static void setCompatibilityInfo(CompatibilityInfo compatInfo) { if (compatInfo != null && (compatInfo.isScalingRequired() || !compatInfo.supportsScreen())) { - mCompatibilityInfo = compatInfo; + sCompatibilityInfo = compatInfo; } else { - mCompatibilityInfo = null; + sCompatibilityInfo = null; } - mDisplay = display; - init(display); } /** @@ -96,12 +104,13 @@ public class Display { IWindowManager wm = getWindowManager(); if (wm != null) { wm.getDisplaySize(outSize); - if (doCompat && mCompatibilityInfo != null) { + CompatibilityInfo ci; + if (doCompat && (ci=mCompatibilityInfo.getIfNeeded()) != null) { synchronized (mTmpMetrics) { mTmpMetrics.unscaledWidthPixels = outSize.x; mTmpMetrics.unscaledHeightPixels = outSize.y; mTmpMetrics.density = mDensity; - mCompatibilityInfo.applyToDisplayMetrics(mTmpMetrics); + ci.applyToDisplayMetrics(mTmpMetrics); outSize.x = mTmpMetrics.widthPixels; outSize.y = mTmpMetrics.heightPixels; } @@ -111,6 +120,7 @@ public class Display { // system process before the window manager is up. outSize.y = getRealHeight(); } + if (DEBUG_COMPAT && doCompat) Slog.v(TAG, "Returning display size: " + outSize); } catch (RemoteException e) { Slog.w("Display", "Unable to get display size", e); } @@ -236,9 +246,13 @@ public class Display { } getNonSizeMetrics(outMetrics); - if (mCompatibilityInfo != null) { - mCompatibilityInfo.applyToDisplayMetrics(outMetrics); + CompatibilityInfo ci = mCompatibilityInfo.getIfNeeded(); + if (ci != null) { + ci.applyToDisplayMetrics(outMetrics); } + + if (DEBUG_COMPAT) Slog.v(TAG, "Returning DisplayMetrics: " + outMetrics.widthPixels + + "x" + outMetrics.heightPixels + " " + outMetrics.density); } /** @@ -282,7 +296,7 @@ public class Display { private native void init(int display); - private final CompatibilityInfo mCompatibilityInfo; + private final CompatibilityInfoHolder mCompatibilityInfo; private final int mDisplay; // Following fields are initialized from native code private int mPixelFormat; @@ -299,11 +313,13 @@ public class Display { private static boolean sInitialized = false; private static IWindowManager sWindowManager; + private static volatile CompatibilityInfo sCompatibilityInfo; + /** * Returns a display object which uses the metric's width/height instead. * @hide */ - public static Display createCompatibleDisplay(int displayId, CompatibilityInfo compat) { + public static Display createCompatibleDisplay(int displayId, CompatibilityInfoHolder compat) { return new Display(displayId, compat); } } |