summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/content/pm/ActivityInfo.java10
-rw-r--r--core/java/android/content/pm/parsing/component/ParsedActivityUtils.java25
-rw-r--r--core/res/res/values/attrs_manifest.xml9
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--non-updatable-api/current.txt1
6 files changed, 38 insertions, 9 deletions
diff --git a/api/current.txt b/api/current.txt
index 129465ab5731..d282be1a83de 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1613,6 +1613,7 @@ package android {
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
+ field public static final int windowLayoutAffinity = 16844313; // 0x1010619
field public static final int windowLayoutInDisplayCutoutMode = 16844166; // 0x1010586
field public static final int windowLightNavigationBar = 16844140; // 0x101056c
field public static final int windowLightStatusBar = 16844000; // 0x10104e0
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index ea4b76257ab7..b371141ca9c1 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -1419,6 +1419,13 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
public static final class WindowLayout {
public WindowLayout(int width, float widthFraction, int height, float heightFraction,
int gravity, int minWidth, int minHeight) {
+ this(width, widthFraction, height, heightFraction, gravity, minWidth, minHeight,
+ null /* windowLayoutAffinity */);
+ }
+
+ /** @hide */
+ public WindowLayout(int width, float widthFraction, int height, float heightFraction,
+ int gravity, int minWidth, int minHeight, String windowLayoutAffinity) {
this.width = width;
this.widthFraction = widthFraction;
this.height = height;
@@ -1426,6 +1433,7 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
this.gravity = gravity;
this.minWidth = minWidth;
this.minHeight = minHeight;
+ this.windowLayoutAffinity = windowLayoutAffinity;
}
/** @hide */
@@ -1506,6 +1514,8 @@ public class ActivityInfo extends ComponentInfo implements Parcelable {
/**
* Affinity of window layout parameters. Activities with the same UID and window layout
* affinity will share the same window dimension record.
+ *
+ * @attr ref android.R.styleable#AndroidManifestLayout_windowLayoutAffinity
* @hide
*/
public String windowLayoutAffinity;
diff --git a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
index 8c0bfef19d0f..511ee5d9580d 100644
--- a/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
+++ b/core/java/android/content/pm/parsing/component/ParsedActivityUtils.java
@@ -368,8 +368,8 @@ public class ParsedActivityUtils {
}
result = intentResult;
} else if (!isReceiver && !isAlias && parser.getName().equals("layout")) {
- ParseResult<ActivityInfo.WindowLayout> layoutResult = parseLayout(resources, parser,
- input);
+ ParseResult<ActivityInfo.WindowLayout> layoutResult =
+ parseActivityWindowLayout(resources, parser, input);
if (layoutResult.isSuccess()) {
activity.windowLayout = layoutResult.getResult();
}
@@ -383,7 +383,8 @@ public class ParsedActivityUtils {
}
}
- ParseResult<ActivityInfo.WindowLayout> layoutResult = resolveWindowLayout(activity, input);
+ ParseResult<ActivityInfo.WindowLayout> layoutResult =
+ resolveActivityWindowLayout(activity, input);
if (layoutResult.isError()) {
return input.error(layoutResult);
}
@@ -468,7 +469,7 @@ public class ParsedActivityUtils {
}
@NonNull
- private static ParseResult<ActivityInfo.WindowLayout> parseLayout(Resources res,
+ private static ParseResult<ActivityInfo.WindowLayout> parseActivityWindowLayout(Resources res,
AttributeSet attrs, ParseInput input) {
TypedArray sw = res.obtainAttributes(attrs, R.styleable.AndroidManifestLayout);
try {
@@ -496,8 +497,13 @@ public class ParsedActivityUtils {
int minWidth = sw.getDimensionPixelSize(R.styleable.AndroidManifestLayout_minWidth, -1);
int minHeight = sw.getDimensionPixelSize(R.styleable.AndroidManifestLayout_minHeight,
-1);
- return input.success(new ActivityInfo.WindowLayout(width, widthFraction, height,
- heightFraction, gravity, minWidth, minHeight));
+ String windowLayoutAffinity =
+ sw.getNonConfigurationString(
+ R.styleable.AndroidManifestLayout_windowLayoutAffinity, 0);
+ final ActivityInfo.WindowLayout windowLayout = new ActivityInfo.WindowLayout(width,
+ widthFraction, height, heightFraction, gravity, minWidth, minHeight,
+ windowLayoutAffinity);
+ return input.success(windowLayout);
} finally {
sw.recycle();
}
@@ -509,7 +515,7 @@ public class ParsedActivityUtils {
* <p>{@link ActivityInfo.WindowLayout#windowLayoutAffinity} has a fallback metadata used in
* Android R and some variants of pre-R.
*/
- private static ParseResult<ActivityInfo.WindowLayout> resolveWindowLayout(
+ private static ParseResult<ActivityInfo.WindowLayout> resolveActivityWindowLayout(
ParsedActivity activity, ParseInput input) {
// There isn't a metadata for us to fall back. Whatever is in layout is correct.
if (activity.metaData == null || !activity.metaData.containsKey(
@@ -528,9 +534,10 @@ public class ParsedActivityUtils {
if (layout == null) {
layout = new ActivityInfo.WindowLayout(-1 /* width */, -1 /* widthFraction */,
-1 /* height */, -1 /* heightFraction */, Gravity.NO_GRAVITY,
- -1 /* minWidth */, -1 /* minHeight */);
+ -1 /* minWidth */, -1 /* minHeight */, windowLayoutAffinity);
+ } else {
+ layout.windowLayoutAffinity = windowLayoutAffinity;
}
- layout.windowLayoutAffinity = windowLayoutAffinity;
return input.success(layout);
}
}
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 25c64a9f8781..e3ddbd8d25a2 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -3200,6 +3200,15 @@
then the system will set the same minimal height on all other activities in the task. It
will also ignore any other minimal height attributes of non-root activities. -->
<attr name="minHeight" />
+
+ <!-- Window layout affinity of this activity. Activities with the same window layout
+ affinity will share the same layout record. If an activity is launched in freeform window,
+ the activity will be launched to the latest position and size where any task, if the root
+ activity of that task shares the same window layout affinity with the activity being
+ launched. Window layout affinity is shared only among activities with the same UID.
+
+ <p>By default activity doesn't share any affinity with other activities. -->
+ <attr name="windowLayoutAffinity" format="string" />
</declare-styleable>
<!-- <code>restrict-update</code> tag restricts system apps from being updated unless the
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index fe17eca35545..45bdff99fb9f 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3046,6 +3046,7 @@
<public-group type="attr" first-id="0x01010617">
<public name="rollbackDataPolicy" />
<public name="allowClickWhenDisabled" />
+ <public name="windowLayoutAffinity" />
</public-group>
<public-group type="drawable" first-id="0x010800b5">
diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt
index bf2f613d895f..fb85c7c99053 100644
--- a/non-updatable-api/current.txt
+++ b/non-updatable-api/current.txt
@@ -1613,6 +1613,7 @@ package android {
field public static final int windowHideAnimation = 16842935; // 0x10100b7
field public static final int windowIsFloating = 16842839; // 0x1010057
field public static final int windowIsTranslucent = 16842840; // 0x1010058
+ field public static final int windowLayoutAffinity = 16844313; // 0x1010619
field public static final int windowLayoutInDisplayCutoutMode = 16844166; // 0x1010586
field public static final int windowLightNavigationBar = 16844140; // 0x101056c
field public static final int windowLightStatusBar = 16844000; // 0x10104e0