summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kwangho Lim <kwangho.lim@samsung.com> 2020-05-28 13:39:37 +0900
committer Vishnu Nair <vishnun@google.com> 2020-06-01 08:34:38 -0700
commit2141f707b71bc761b6fc93117bc18d807cbb7d4c (patch)
tree45b16eb45815e7ded2a0a9b572d60c526d80be51
parentb9a239bef34ab52350924f3a17d59201b6192a69 (diff)
[wm] Introduce meta-data tag (android.supports_size_changes)
Introduce meta-data tag "android.supports_size_changes" which will indicated that an activity works well with size changes like display changing size. Test: Manual - Run by adding metadata to the app running with SizeCompatMode. Bug: 155041354 Change-Id: I0f358f63c9e14c63294275c0bfcd08744bee1108
-rw-r--r--core/java/android/content/pm/ActivityInfo.java13
-rw-r--r--core/java/android/content/pm/PackageParser.java15
-rw-r--r--core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java1
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java18
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedActivity.java15
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java6
6 files changed, 68 insertions, 0 deletions
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index b1f88693d9c0..bd02210259b8 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -245,6 +245,13 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
public float minAspectRatio;
/**
+ * Indicates that the activity works well with size changes like display changing size.
+ *
+ * @hide
+ */
+ public boolean supportsSizeChanges;
+
+ /**
* Name of the VrListenerService component to run for this activity.
* @see android.R.attr#enableVrMode
* @hide
@@ -1013,6 +1020,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
colorMode = orig.colorMode;
maxAspectRatio = orig.maxAspectRatio;
minAspectRatio = orig.minAspectRatio;
+ supportsSizeChanges = orig.supportsSizeChanges;
}
/**
@@ -1188,6 +1196,9 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
if (minAspectRatio != 0) {
pw.println(prefix + "minAspectRatio=" + minAspectRatio);
}
+ if (supportsSizeChanges) {
+ pw.println(prefix + "supportsSizeChanges=true");
+ }
super.dumpBack(pw, prefix, dumpFlags);
}
@@ -1232,6 +1243,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
dest.writeInt(colorMode);
dest.writeFloat(maxAspectRatio);
dest.writeFloat(minAspectRatio);
+ dest.writeBoolean(supportsSizeChanges);
}
/**
@@ -1350,6 +1362,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
colorMode = source.readInt();
maxAspectRatio = source.readFloat();
minAspectRatio = source.readFloat();
+ supportsSizeChanges = source.readBoolean();
}
/**
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 0d8618fe7e86..c8dd4d9d9d51 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -207,6 +207,7 @@ public class PackageParser {
public static final String TAG_USES_SPLIT = "uses-split";
public static final String METADATA_MAX_ASPECT_RATIO = "android.max_aspect";
+ public static final String METADATA_SUPPORTS_SIZE_CHANGES = "android.supports_size_changes";
public static final String METADATA_ACTIVITY_WINDOW_LAYOUT_AFFINITY =
"android.activity_window_layout_affinity";
@@ -3897,6 +3898,7 @@ public class PackageParser {
// every activity info has had a chance to set it from its attributes.
setMaxAspectRatio(owner);
setMinAspectRatio(owner);
+ setSupportsSizeChanges(owner);
if (hasDomainURLs(owner)) {
owner.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS;
@@ -4694,6 +4696,18 @@ public class PackageParser {
}
}
+ private void setSupportsSizeChanges(Package owner) {
+ final boolean supportsSizeChanges = owner.mAppMetaData != null
+ && owner.mAppMetaData.getBoolean(METADATA_SUPPORTS_SIZE_CHANGES, false);
+
+ for (Activity activity : owner.activities) {
+ if (supportsSizeChanges || (activity.metaData != null
+ && activity.metaData.getBoolean(METADATA_SUPPORTS_SIZE_CHANGES, false))) {
+ activity.info.supportsSizeChanges = true;
+ }
+ }
+ }
+
/**
* @param configChanges The bit mask of configChanges fetched from AndroidManifest.xml.
* @param recreateOnConfigChanges The bit mask recreateOnConfigChanges fetched from
@@ -4863,6 +4877,7 @@ public class PackageParser {
info.resizeMode = target.info.resizeMode;
info.maxAspectRatio = target.info.maxAspectRatio;
info.minAspectRatio = target.info.minAspectRatio;
+ info.supportsSizeChanges = target.info.supportsSizeChanges;
info.requestedVrComponent = target.info.requestedVrComponent;
info.directBootAware = target.info.directBootAware;
diff --git a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
index 216b3bb5de8e..e4507483c08f 100644
--- a/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
+++ b/core/java/android/content/pm/parsing/PackageInfoWithoutStateUtils.java
@@ -445,6 +445,7 @@ public class PackageInfoWithoutStateUtils {
ai.maxAspectRatio = maxAspectRatio != null ? maxAspectRatio : 0f;
Float minAspectRatio = a.getMinAspectRatio();
ai.minAspectRatio = minAspectRatio != null ? minAspectRatio : 0f;
+ ai.supportsSizeChanges = a.getSupportsSizeChanges();
ai.requestedVrComponent = a.getRequestedVrComponent();
ai.rotationAnimation = a.getRotationAnimation();
ai.colorMode = a.getColorMode();
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index 5a7947503d5c..317107829623 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -1912,6 +1912,7 @@ public class ParsingPackageUtils {
// every activity info has had a chance to set it from its attributes.
setMaxAspectRatio(pkg);
setMinAspectRatio(pkg);
+ setSupportsSizeChanges(pkg);
pkg.setHasDomainUrls(hasDomainURLs(pkg));
@@ -2366,6 +2367,23 @@ public class ParsingPackageUtils {
}
}
+ private void setSupportsSizeChanges(ParsingPackage pkg) {
+ final Bundle appMetaData = pkg.getMetaData();
+ final boolean supportsSizeChanges = appMetaData != null
+ && appMetaData.getBoolean(PackageParser.METADATA_SUPPORTS_SIZE_CHANGES, false);
+
+ List<ParsedActivity> activities = pkg.getActivities();
+ int activitiesSize = activities.size();
+ for (int index = 0; index < activitiesSize; index++) {
+ ParsedActivity activity = activities.get(index);
+ if (supportsSizeChanges || (activity.getMetaData() != null
+ && activity.getMetaData().getBoolean(
+ PackageParser.METADATA_SUPPORTS_SIZE_CHANGES, false))) {
+ activity.setSupportsSizeChanges(true);
+ }
+ }
+ }
+
private static ParseResult<ParsingPackage> parseOverlay(ParseInput input, ParsingPackage pkg,
Resources res, XmlResourceParser parser) {
TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestResourceOverlay);
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivity.java b/core/java/android/content/pm/parsing/component/ParsedActivity.java
index 4c93d0950388..19150283d71e 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivity.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivity.java
@@ -73,6 +73,8 @@ public class ParsedActivity extends ParsedMainComponent {
@Nullable
private Float minAspectRatio;
+ private boolean supportsSizeChanges;
+
@Nullable
String requestedVrComponent;
int rotationAnimation = -1;
@@ -101,6 +103,7 @@ public class ParsedActivity extends ParsedMainComponent {
this.resizeMode = other.resizeMode;
this.maxAspectRatio = other.maxAspectRatio;
this.minAspectRatio = other.minAspectRatio;
+ this.supportsSizeChanges = other.supportsSizeChanges;
this.requestedVrComponent = other.requestedVrComponent;
this.rotationAnimation = other.rotationAnimation;
this.colorMode = other.colorMode;
@@ -165,6 +168,7 @@ public class ParsedActivity extends ParsedMainComponent {
alias.resizeMode = target.resizeMode;
alias.maxAspectRatio = target.maxAspectRatio;
alias.minAspectRatio = target.minAspectRatio;
+ alias.supportsSizeChanges = target.supportsSizeChanges;
alias.requestedVrComponent = target.requestedVrComponent;
alias.directBootAware = target.directBootAware;
alias.setProcessName(target.getProcessName());
@@ -217,6 +221,11 @@ public class ParsedActivity extends ParsedMainComponent {
return this;
}
+ public ParsedActivity setSupportsSizeChanges(boolean supportsSizeChanges) {
+ this.supportsSizeChanges = supportsSizeChanges;
+ return this;
+ }
+
public ParsedActivity setFlags(int flags) {
this.flags = flags;
return this;
@@ -279,6 +288,7 @@ public class ParsedActivity extends ParsedMainComponent {
dest.writeInt(this.resizeMode);
dest.writeValue(this.maxAspectRatio);
dest.writeValue(this.minAspectRatio);
+ dest.writeBoolean(this.supportsSizeChanges);
dest.writeString(this.requestedVrComponent);
dest.writeInt(this.rotationAnimation);
dest.writeInt(this.colorMode);
@@ -315,6 +325,7 @@ public class ParsedActivity extends ParsedMainComponent {
this.resizeMode = in.readInt();
this.maxAspectRatio = (Float) in.readValue(Float.class.getClassLoader());
this.minAspectRatio = (Float) in.readValue(Float.class.getClassLoader());
+ this.supportsSizeChanges = in.readBoolean();
this.requestedVrComponent = in.readString();
this.rotationAnimation = in.readInt();
this.colorMode = in.readInt();
@@ -414,6 +425,10 @@ public class ParsedActivity extends ParsedMainComponent {
return minAspectRatio;
}
+ public boolean getSupportsSizeChanges() {
+ return supportsSizeChanges;
+ }
+
@Nullable
public String getRequestedVrComponent() {
return requestedVrComponent;
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 7c33c7cf6398..fe2b144bcdd6 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -1001,6 +1001,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
if (info.minAspectRatio != 0) {
pw.println(prefix + "minAspectRatio=" + info.minAspectRatio);
}
+ if (info.supportsSizeChanges) {
+ pw.println(prefix + "supportsSizeChanges=true");
+ }
}
}
@@ -6376,6 +6379,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
* aspect ratio.
*/
boolean shouldUseSizeCompatMode() {
+ if (info.supportsSizeChanges) {
+ return false;
+ }
if (inMultiWindowMode() || getWindowConfiguration().hasWindowDecorCaption()) {
final ActivityRecord root = task != null ? task.getRootActivity() : null;
if (root != null && root != this && !root.shouldUseSizeCompatMode()) {