diff options
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/content/pm/ActivityInfo.java | 10 | ||||
| -rw-r--r-- | core/java/android/content/pm/parsing/component/ParsedActivityUtils.java | 25 | ||||
| -rw-r--r-- | core/res/res/values/attrs_manifest.xml | 9 | ||||
| -rw-r--r-- | core/res/res/values/public.xml | 1 | ||||
| -rw-r--r-- | non-updatable-api/current.txt | 1 |
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 |