am a5f88510: am 2969b511: Merge "Add new supports-screen API to set maximum allowed size." into honeycomb-mr2

* commit 'a5f8851019605be26dd9a628280092e27f8a5f31':
  Add new supports-screen API to set maximum allowed size.
This commit is contained in:
Dianne Hackborn
2011-06-01 22:34:31 -07:00
committed by Android Git Automerger
6 changed files with 74 additions and 5 deletions

View File

@ -5889,6 +5889,17 @@
visibility="public"
>
</field>
<field name="largestWidthLimitDp"
type="int"
transient="false"
volatile="false"
value="16843622"
static="true"
final="true"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="launchMode"
type="int"
transient="false"
@ -58742,6 +58753,16 @@
visibility="public"
>
</field>
<field name="largestWidthLimitDp"
type="int"
transient="false"
volatile="false"
static="false"
final="false"
deprecated="not deprecated"
visibility="public"
>
</field>
<field name="manageSpaceActivityName"
type="java.lang.String"
transient="false"

View File

@ -336,6 +336,14 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
*/
public int compatibleWidthLimitDp = 0;
/**
* The maximum smallest screen width the application will work on. If 0,
* nothing has been specified. Comes from
* {@link android.R.styleable#AndroidManifestSupportsScreens_largestWidthLimitDp
* android:largestWidthLimitDp} attribute of the &lt;supports-screens&gt; tag.
*/
public int largestWidthLimitDp = 0;
/**
* Full path to the location of this package.
*/
@ -418,7 +426,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags)
+ " theme=0x" + Integer.toHexString(theme));
pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp
+ " compatibleWidthLimitDp=" + compatibleWidthLimitDp);
+ " compatibleWidthLimitDp=" + compatibleWidthLimitDp
+ " largestWidthLimitDp=" + largestWidthLimitDp);
pw.println(prefix + "sourceDir=" + sourceDir);
if (sourceDir == null) {
if (publicSourceDir != null) {
@ -480,6 +489,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
flags = orig.flags;
requiresSmallestWidthDp = orig.requiresSmallestWidthDp;
compatibleWidthLimitDp = orig.compatibleWidthLimitDp;
largestWidthLimitDp = orig.largestWidthLimitDp;
sourceDir = orig.sourceDir;
publicSourceDir = orig.publicSourceDir;
nativeLibraryDir = orig.nativeLibraryDir;
@ -515,6 +525,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
dest.writeInt(flags);
dest.writeInt(requiresSmallestWidthDp);
dest.writeInt(compatibleWidthLimitDp);
dest.writeInt(largestWidthLimitDp);
dest.writeString(sourceDir);
dest.writeString(publicSourceDir);
dest.writeString(nativeLibraryDir);
@ -550,6 +561,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
flags = source.readInt();
requiresSmallestWidthDp = source.readInt();
compatibleWidthLimitDp = source.readInt();
largestWidthLimitDp = source.readInt();
sourceDir = source.readString();
publicSourceDir = source.readString();
nativeLibraryDir = source.readString();

View File

@ -999,6 +999,9 @@ public class PackageParser {
pkg.applicationInfo.compatibleWidthLimitDp = sa.getInteger(
com.android.internal.R.styleable.AndroidManifestSupportsScreens_compatibleWidthLimitDp,
0);
pkg.applicationInfo.largestWidthLimitDp = sa.getInteger(
com.android.internal.R.styleable.AndroidManifestSupportsScreens_largestWidthLimitDp,
0);
// This is a trick to get a boolean and still able to detect
// if a value was actually set.

View File

@ -96,21 +96,42 @@ public class CompatibilityInfo implements Parcelable {
boolean forceCompat) {
int compatFlags = 0;
if (appInfo.requiresSmallestWidthDp != 0 || appInfo.compatibleWidthLimitDp != 0) {
if (appInfo.requiresSmallestWidthDp != 0 || appInfo.compatibleWidthLimitDp != 0
|| appInfo.largestWidthLimitDp != 0) {
// New style screen requirements spec.
int required = appInfo.requiresSmallestWidthDp != 0
? appInfo.requiresSmallestWidthDp
: appInfo.compatibleWidthLimitDp;
if (required == 0) {
required = appInfo.largestWidthLimitDp;
}
int compat = appInfo.compatibleWidthLimitDp != 0
? appInfo.compatibleWidthLimitDp
: appInfo.requiresSmallestWidthDp;
? appInfo.compatibleWidthLimitDp : required;
if (compat < required) {
compat = required;
}
int largest = appInfo.largestWidthLimitDp;
if (compat >= sw) {
if (required > DEFAULT_NORMAL_SHORT_DIMENSION) {
// For now -- if they require a size larger than the only
// size we can do in compatibility mode, then don't ever
// allow the app to go in to compat mode. Trying to run
// it at a smaller size it can handle will make it far more
// broken than running at a larger size than it wants or
// thinks it can handle.
compatFlags |= NEVER_NEEDS_COMPAT;
} else if (largest != 0 && sw > largest) {
// If the screen size is larger than the largest size the
// app thinks it can work with, then always force it in to
// compatibility mode.
compatFlags |= NEEDS_SCREEN_COMPAT | ALWAYS_NEEDS_COMPAT;
} else if (compat >= sw) {
// The screen size is something the app says it was designed
// for, so never do compatibility mode.
compatFlags |= NEVER_NEEDS_COMPAT;
} else if (forceCompat) {
// The app may work better with or without compatibility mode.
// Let the user decide.
compatFlags |= NEEDS_SCREEN_COMPAT;
}

View File

@ -1035,6 +1035,17 @@
used with this attribute are 320 for a phone screen, 600 for a
7" tablet, and 720 for a 10" tablet. -->
<attr name="compatibleWidthLimitDp" format="integer" />
<!-- Starting with {@link android.os.Build.VERSION_CODES#HONEYCOMB_MR2},
this is the new way to specify the screens an application is
compatible with. This attribute provides the maximum
"smallest screen width" (as per the -swNNNdp resource configuration)
that the application can work well on. If this value is smaller than
the "smallest screen width" of the device it is running on, the
application will be forced in to screen compatibility mode with
no way for the user to turn it off. Currently the compatibility mode
only emulates phone screens, so even if this value is larger than 320
the width the app runs in will be a 320 phone dimension. -->
<attr name="largestWidthLimitDp" format="integer" />
<!-- Indicates whether the application supports smaller screen form-factors.
A small screen is defined as one with a smaller aspect ratio than
the traditional HVGA screen; that is, for a portrait screen, less

View File

@ -1656,4 +1656,5 @@
<eat-comment />
<public type="attr" name="requiresSmallestWidthDp" id="0x01010364" />
<public type="attr" name="compatibleWidthLimitDp" />
<public type="attr" name="largestWidthLimitDp" />
</resources>