From e66763516a9c27c192adaba417616371a1c3c9bf Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 1 Jun 2011 16:51:20 -0700 Subject: [PATCH] Work around OpenFeint bug. Change-Id: Ib8320e50bb63fc56dc0118d5c8e9e328dbd3fcb1 --- core/java/android/app/ActivityThread.java | 2 +- core/java/android/content/pm/ActivityInfo.java | 31 ++++++++++++++++++++-- core/java/android/content/pm/PackageParser.java | 5 ---- core/java/android/os/Build.java | 10 +++++++ .../java/com/android/server/am/ActivityStack.java | 4 +-- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 063665be2b91..69cb27e4ad72 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3256,7 +3256,7 @@ public final class ActivityThread { // If this activity doesn't handle any of the config changes // then don't bother calling onConfigurationChanged as we're // going to destroy it. - if ((~activity.mActivityInfo.configChanges & diff) == 0) { + if ((~activity.mActivityInfo.getRealConfigChanged() & diff) == 0) { shouldChangeConfig = true; } } diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 4285388af73b..4858f1498f60 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -335,13 +335,25 @@ public class ActivityInfo extends ComponentInfo /** * Bit in {@link #configChanges} that indicates that the activity * can itself handle the screen size. Set from the - * {@link android.R.attr#configChanges} attribute. + * {@link android.R.attr#configChanges} attribute. This will be + * set by default for applications that target an earlier version + * than {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}... + * however, you will not see the bit set here becomes some + * applications incorrectly compare {@link #configChanges} against + * an absolute value rather than correctly masking out the bits + * they are interested in. Please don't do that, thanks. */ public static final int CONFIG_SCREEN_SIZE = 0x0400; /** * Bit in {@link #configChanges} that indicates that the activity * can itself handle the smallest screen size. Set from the - * {@link android.R.attr#configChanges} attribute. + * {@link android.R.attr#configChanges} attribute. This will be + * set by default for applications that target an earlier version + * than {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2}... + * however, you will not see the bit set here becomes some + * applications incorrectly compare {@link #configChanges} against + * an absolute value rather than correctly masking out the bits + * they are interested in. Please don't do that, thanks. */ public static final int CONFIG_SMALLEST_SCREEN_SIZE = 0x0800; /** @@ -386,6 +398,21 @@ public class ActivityInfo extends ComponentInfo } /** + * @hide + * Unfortunately some developers (OpenFeint I am looking at you) have + * compared the configChanges bit field against absolute values, so if we + * introduce a new bit they break. To deal with that, we will make sure + * the public field will not have a value that breaks them, and let the + * framework call here to get the real value. + */ + public int getRealConfigChanged() { + return applicationInfo.targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB_MR2 + ? (configChanges | ActivityInfo.CONFIG_SCREEN_SIZE + | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) + : configChanges; + } + + /** * Bit mask of kinds of configuration changes that this activity * can handle itself (without being restarted by the system). * Contains any combination of {@link #CONFIG_FONT_SCALE}, diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 42e24f9e1a00..9b4ff754ec3d 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1938,11 +1938,6 @@ public class PackageParser { a.info.configChanges = sa.getInt( com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 0); - if (owner.applicationInfo.targetSdkVersion - < android.os.Build.VERSION_CODES.HONEYCOMB_MR2) { - a.info.configChanges |= ActivityInfo.CONFIG_SCREEN_SIZE - | ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE; - } a.info.softInputMode = sa.getInt( com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 0); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 8735019512c3..3c91d64065fe 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -233,6 +233,16 @@ public class Build { /** * Current development version. + * + *

Update to Honeycomb MR1 to support 7 inch tablets, improve + * screen compatibility mode, etc.

+ * + *

As of this version, applications that don't say whether they + * support XLARGE screens will be assumed to do so only if they target + * {@link #HONEYCOMB} or later; it had been {@link #GINGERBREAD} or + * later. Applications that don't support a screen size at least as + * large as the current screen will provide the user with a UI to + * switch them in to screen size compatibility mode.

*/ public static final int HONEYCOMB_MR2 = CUR_DEVELOPMENT; } diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 2706d49b2e67..5cbb9e1853ad 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -3801,10 +3801,10 @@ public class ActivityStack { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { Slog.v(TAG, "Checking to restart " + r.info.name + ": changed=0x" + Integer.toHexString(changes) + ", handles=0x" - + Integer.toHexString(r.info.configChanges) + + Integer.toHexString(r.info.getRealConfigChanged()) + ", newConfig=" + newConfig); } - if ((changes&(~r.info.configChanges)) != 0 || r.forceNewConfig) { + if ((changes&(~r.info.getRealConfigChanged())) != 0 || r.forceNewConfig) { // Aha, the activity isn't handling the change, so DIE DIE DIE. r.configChangeFlags |= changes; r.startFreezingScreenLocked(r.app, globalChanges); -- 2.11.0