Loading core/java/android/view/DisplayCutout.java +26 −24 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.Path; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Region; import android.graphics.Region.Op; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.text.TextUtils; import android.text.TextUtils; Loading Loading @@ -325,14 +326,9 @@ public final class DisplayCutout { * @hide * @hide */ */ public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) { public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) { Path path = new Path(); Region r = Region.obtain(); path.reset(); r.set(left, top, right, bottom); path.moveTo(left, top); return fromBounds(r); path.lineTo(left, bottom); path.lineTo(right, bottom); path.lineTo(right, top); path.close(); return fromBounds(path); } } /** /** Loading @@ -340,26 +336,19 @@ public final class DisplayCutout { * * * @hide * @hide */ */ public static DisplayCutout fromBounds(Path path) { public static DisplayCutout fromBounds(Region region) { RectF clipRect = new RectF(); return new DisplayCutout(ZERO_RECT, region, false /* copyArguments */); path.computeBounds(clipRect, false /* unused */); Region clipRegion = Region.obtain(); clipRegion.set((int) clipRect.left, (int) clipRect.top, (int) clipRect.right, (int) clipRect.bottom); Region bounds = new Region(); bounds.setPath(path, clipRegion); clipRegion.recycle(); return new DisplayCutout(ZERO_RECT, bounds, false /* copyArguments */); } } /** /** * Creates the bounding path according to @android:string/config_mainBuiltInDisplayCutout. * Creates the display cutout according to * @android:string/config_mainBuiltInDisplayCutoutRectApproximation, which is the closest * rectangle-base approximation of the cutout. * * * @hide * @hide */ */ public static DisplayCutout fromResources(Resources res, int displayWidth, int displayHeight) { public static DisplayCutout fromResourcesRectApproximation(Resources res, int displayWidth, int displayHeight) { return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout), return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutoutRectApproximation), displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT); displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT); } } Loading @@ -369,7 +358,8 @@ public final class DisplayCutout { * @hide * @hide */ */ public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) { public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) { return pathAndDisplayCutoutFromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout), return pathAndDisplayCutoutFromSpec( res.getString(R.string.config_mainBuiltInDisplayCutout), displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT).first; displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT).first; } } Loading Loading @@ -417,6 +407,7 @@ public final class DisplayCutout { } } final Path p; final Path p; final Region r = Region.obtain(); try { try { p = PathParser.createPathFromPathData(spec); p = PathParser.createPathFromPathData(spec); } catch (Throwable e) { } catch (Throwable e) { Loading @@ -431,6 +422,8 @@ public final class DisplayCutout { m.postTranslate(offsetX, 0); m.postTranslate(offsetX, 0); p.transform(m); p.transform(m); addToRegion(p, r); if (bottomSpec != null) { if (bottomSpec != null) { final Path bottomPath; final Path bottomPath; try { try { Loading @@ -443,9 +436,10 @@ public final class DisplayCutout { m.postTranslate(0, displayHeight); m.postTranslate(0, displayHeight); bottomPath.transform(m); bottomPath.transform(m); p.addPath(bottomPath); p.addPath(bottomPath); addToRegion(bottomPath, r); } } final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(p)); final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(r)); synchronized (CACHE_LOCK) { synchronized (CACHE_LOCK) { sCachedSpec = spec; sCachedSpec = spec; sCachedDisplayWidth = displayWidth; sCachedDisplayWidth = displayWidth; Loading @@ -456,6 +450,14 @@ public final class DisplayCutout { return result; return result; } } private static void addToRegion(Path p, Region r) { final RectF rectF = new RectF(); final Rect rect = new Rect(); p.computeBounds(rectF, false /* unused */); rectF.round(rect); r.op(rect, Op.UNION); } private static Region boundingRectsToRegion(List<Rect> rects) { private static Region boundingRectsToRegion(List<Rect> rects) { Region result = Region.obtain(); Region result = Region.obtain(); if (rects != null) { if (rects != null) { Loading core/res/res/values/config.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -2961,6 +2961,14 @@ --> --> <string translatable="false" name="config_mainBuiltInDisplayCutout"></string> <string translatable="false" name="config_mainBuiltInDisplayCutout"></string> <!-- Like config_mainBuiltInDisplayCutout, but this path is used to report the one single bounding rect per device edge to the app via {@link DisplayCutout#getBoundingRect}. Note that this path should try to match the visual appearance of the cutout as much as possible, and may be smaller than config_mainBuiltInDisplayCutout --> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading core/res/res/values/symbols.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -3338,6 +3338,7 @@ <java-symbol type="string" name="global_action_logout" /> <java-symbol type="string" name="global_action_logout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutoutRectApproximation" /> <java-symbol type="drawable" name="messaging_user" /> <java-symbol type="drawable" name="messaging_user" /> <java-symbol type="bool" name="config_fillMainBuiltInDisplayCutout" /> <java-symbol type="bool" name="config_fillMainBuiltInDisplayCutout" /> <java-symbol type="drawable" name="ic_logout" /> <java-symbol type="drawable" name="ic_logout" /> Loading packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,8 @@ @right @right </string> </string> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,8 @@ @dp @dp </string> </string> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading Loading
core/java/android/view/DisplayCutout.java +26 −24 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.Path; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Region; import android.graphics.Region.Op; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import android.text.TextUtils; import android.text.TextUtils; Loading Loading @@ -325,14 +326,9 @@ public final class DisplayCutout { * @hide * @hide */ */ public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) { public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) { Path path = new Path(); Region r = Region.obtain(); path.reset(); r.set(left, top, right, bottom); path.moveTo(left, top); return fromBounds(r); path.lineTo(left, bottom); path.lineTo(right, bottom); path.lineTo(right, top); path.close(); return fromBounds(path); } } /** /** Loading @@ -340,26 +336,19 @@ public final class DisplayCutout { * * * @hide * @hide */ */ public static DisplayCutout fromBounds(Path path) { public static DisplayCutout fromBounds(Region region) { RectF clipRect = new RectF(); return new DisplayCutout(ZERO_RECT, region, false /* copyArguments */); path.computeBounds(clipRect, false /* unused */); Region clipRegion = Region.obtain(); clipRegion.set((int) clipRect.left, (int) clipRect.top, (int) clipRect.right, (int) clipRect.bottom); Region bounds = new Region(); bounds.setPath(path, clipRegion); clipRegion.recycle(); return new DisplayCutout(ZERO_RECT, bounds, false /* copyArguments */); } } /** /** * Creates the bounding path according to @android:string/config_mainBuiltInDisplayCutout. * Creates the display cutout according to * @android:string/config_mainBuiltInDisplayCutoutRectApproximation, which is the closest * rectangle-base approximation of the cutout. * * * @hide * @hide */ */ public static DisplayCutout fromResources(Resources res, int displayWidth, int displayHeight) { public static DisplayCutout fromResourcesRectApproximation(Resources res, int displayWidth, int displayHeight) { return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout), return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutoutRectApproximation), displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT); displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT); } } Loading @@ -369,7 +358,8 @@ public final class DisplayCutout { * @hide * @hide */ */ public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) { public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) { return pathAndDisplayCutoutFromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout), return pathAndDisplayCutoutFromSpec( res.getString(R.string.config_mainBuiltInDisplayCutout), displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT).first; displayWidth, displayHeight, DENSITY_DEVICE_STABLE / (float) DENSITY_DEFAULT).first; } } Loading Loading @@ -417,6 +407,7 @@ public final class DisplayCutout { } } final Path p; final Path p; final Region r = Region.obtain(); try { try { p = PathParser.createPathFromPathData(spec); p = PathParser.createPathFromPathData(spec); } catch (Throwable e) { } catch (Throwable e) { Loading @@ -431,6 +422,8 @@ public final class DisplayCutout { m.postTranslate(offsetX, 0); m.postTranslate(offsetX, 0); p.transform(m); p.transform(m); addToRegion(p, r); if (bottomSpec != null) { if (bottomSpec != null) { final Path bottomPath; final Path bottomPath; try { try { Loading @@ -443,9 +436,10 @@ public final class DisplayCutout { m.postTranslate(0, displayHeight); m.postTranslate(0, displayHeight); bottomPath.transform(m); bottomPath.transform(m); p.addPath(bottomPath); p.addPath(bottomPath); addToRegion(bottomPath, r); } } final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(p)); final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(r)); synchronized (CACHE_LOCK) { synchronized (CACHE_LOCK) { sCachedSpec = spec; sCachedSpec = spec; sCachedDisplayWidth = displayWidth; sCachedDisplayWidth = displayWidth; Loading @@ -456,6 +450,14 @@ public final class DisplayCutout { return result; return result; } } private static void addToRegion(Path p, Region r) { final RectF rectF = new RectF(); final Rect rect = new Rect(); p.computeBounds(rectF, false /* unused */); rectF.round(rect); r.op(rect, Op.UNION); } private static Region boundingRectsToRegion(List<Rect> rects) { private static Region boundingRectsToRegion(List<Rect> rects) { Region result = Region.obtain(); Region result = Region.obtain(); if (rects != null) { if (rects != null) { Loading
core/res/res/values/config.xml +8 −0 Original line number Original line Diff line number Diff line Loading @@ -2961,6 +2961,14 @@ --> --> <string translatable="false" name="config_mainBuiltInDisplayCutout"></string> <string translatable="false" name="config_mainBuiltInDisplayCutout"></string> <!-- Like config_mainBuiltInDisplayCutout, but this path is used to report the one single bounding rect per device edge to the app via {@link DisplayCutout#getBoundingRect}. Note that this path should try to match the visual appearance of the cutout as much as possible, and may be smaller than config_mainBuiltInDisplayCutout --> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading
core/res/res/values/symbols.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -3338,6 +3338,7 @@ <java-symbol type="string" name="global_action_logout" /> <java-symbol type="string" name="global_action_logout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutoutRectApproximation" /> <java-symbol type="drawable" name="messaging_user" /> <java-symbol type="drawable" name="messaging_user" /> <java-symbol type="bool" name="config_fillMainBuiltInDisplayCutout" /> <java-symbol type="bool" name="config_fillMainBuiltInDisplayCutout" /> <java-symbol type="drawable" name="ic_logout" /> <java-symbol type="drawable" name="ic_logout" /> Loading
packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values/config.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -37,6 +37,8 @@ @right @right </string> </string> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading
packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values/config.xml +2 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,8 @@ @dp @dp </string> </string> <string translatable="false" name="config_mainBuiltInDisplayCutoutRectApproximation">@*android:string/config_mainBuiltInDisplayCutout</string> <!-- Whether the display cutout region of the main built-in display should be forced to <!-- Whether the display cutout region of the main built-in display should be forced to black in software (to avoid aliasing or emulate a cutout that is not physically existent). black in software (to avoid aliasing or emulate a cutout that is not physically existent). --> --> Loading