From fbd471ea8c638e37065a466288085af4f3bc56da Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 8 Feb 2026 17:40:24 +0200 Subject: [PATCH 1/3] Hide native peers while sheets are visible --- CodenameOne/src/com/codename1/ui/Sheet.java | 89 +++++++++++++++---- .../tests/BrowserComponentScreenshotTest.java | 7 ++ 2 files changed, 81 insertions(+), 15 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 69cc9b045f..c90fd0cbdf 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -25,6 +25,7 @@ import com.codename1.ui.ComponentSelector.ComponentClosure; import com.codename1.ui.events.ActionEvent; import com.codename1.ui.events.ActionListener; +import com.codename1.ui.geom.Dimension; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -119,6 +120,8 @@ public class Sheet extends Container { private static final int W = 3; private static final int C = 4; private static final int DEFAULT_TRANSITION_DURATION = 300; + private static final String SHEET_BLOCKER_PROPERTY = "cn1$sheetBlocker"; + private static final String SHEET_LAYER_PROPERTY = "cn1$sheetLayer"; private final Sheet parentSheet; private final Label title = new Label(); private final EventDispatcher closeListeners = new EventDispatcher(); @@ -445,6 +448,9 @@ public void show(final int duration) { // END Deal with iPhoneX notch Form f = CN.getCurrentForm(); + if (Form.activePeerCount > 0) { + f.setLightweightMode(true); + } if (f.getAnimationManager().isAnimating()) { f.getAnimationManager().flushAnimation(new Runnable() { @Override @@ -458,15 +464,16 @@ public void run() { remove(); } Container cnt = CN.getCurrentForm().getFormLayeredPane(Sheet.class, true); - if (!(cnt.getLayout() instanceof BorderLayout)) { - cnt.setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE)); + if (!(cnt.getLayout() instanceof LayeredLayout)) { + cnt.setLayout(new LayeredLayout()); cnt.getStyle().setBgPainter(new ShowPainter()); cnt.revalidate(); } - if (cnt.getComponentCount() > 0) { + Container sheetLayer = getSheetLayer(cnt); + if (sheetLayer.getComponentCount() > 0) { $(".Sheet", cnt).each(new ComponentClosure() { @Override public void call(Component c) { @@ -502,17 +509,17 @@ public void call(Component c) { } }); - Component existing = cnt.getComponentAt(0); - cnt.replace(existing, this, null); - cnt.animateLayout(duration); + Component existing = sheetLayer.getComponentAt(0); + sheetLayer.replace(existing, this, null); + sheetLayer.animateLayout(duration); } else { - cnt.add(getPosition(), this); + sheetLayer.add(getPosition(), this); - this.setWidth(getPreferredW(cnt)); - this.setHeight(getPreferredH(cnt)); - this.setX(getHiddenX(cnt)); - this.setY(getHiddenY(cnt)); - cnt.animateLayout(duration); + this.setWidth(getPreferredW(sheetLayer)); + this.setHeight(getPreferredH(sheetLayer)); + this.setX(getHiddenX(sheetLayer)); + this.setY(getHiddenY(sheetLayer)); + sheetLayer.animateLayout(duration); } } @@ -788,15 +795,19 @@ public void back(int duration) { private void hide(int duration) { final Container cnt = CN.getCurrentForm().getFormLayeredPane(Sheet.class, true); - setX(getHiddenX(cnt)); - setY(getHiddenY(cnt)); - cnt.animateUnlayout(duration, 255, new Runnable() { + final Container sheetLayer = getSheetLayer(cnt); + setX(getHiddenX(sheetLayer)); + setY(getHiddenY(sheetLayer)); + sheetLayer.animateUnlayout(duration, 255, new Runnable() { @Override public void run() { Container parent = cnt.getParent(); if (parent != null && parent.getComponentForm() != null) { cnt.remove(); + if (Form.activePeerCount > 0) { + parent.getComponentForm().setLightweightMode(false); + } parent.getComponentForm().revalidateLater(); fireCloseEvent(true); @@ -920,6 +931,42 @@ private void fireBackEvent() { } + private Container getSheetLayer(Container cnt) { + Container sheetLayer = (Container) cnt.getClientProperty(SHEET_LAYER_PROPERTY); + if (sheetLayer == null) { + sheetLayer = new Container(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE)); + sheetLayer.setName("SheetLayer"); + cnt.putClientProperty(SHEET_LAYER_PROPERTY, sheetLayer); + ensureSheetBlocker(cnt, sheetLayer); + cnt.add(sheetLayer); + } else { + ensureSheetBlocker(cnt, sheetLayer); + } + return sheetLayer; + } + + private void ensureSheetBlocker(Container cnt, Container sheetLayer) { + Component blocker = (Component) cnt.getClientProperty(SHEET_BLOCKER_PROPERTY); + if (Form.activePeerCount <= 0) { + if (blocker != null && blocker.getParent() == cnt) { //NOPMD CompareObjectsWithEquals + cnt.removeComponent(blocker); + } + return; + } + if (blocker == null) { + blocker = new SheetBlocker(); + cnt.putClientProperty(SHEET_BLOCKER_PROPERTY, blocker); + } + if (blocker.getParent() != cnt) { //NOPMD CompareObjectsWithEquals + int sheetLayerIndex = cnt.getComponentIndex(sheetLayer); + if (sheetLayerIndex > -1) { + cnt.addComponent(sheetLayerIndex, blocker); + } else { + cnt.addComponent(0, blocker); + } + } + } + private static class ShowPainter implements Painter { @Override @@ -932,4 +979,16 @@ public void paint(Graphics g, Rectangle rect) { } } + + private static class SheetBlocker extends Container { + SheetBlocker() { + setGrabsPointerEvents(true); + setUIID("SheetBlocker"); + } + + @Override + protected Dimension calcPreferredSize() { + return new Dimension(CN.getDisplayWidth(), CN.getDisplayHeight()); + } + } } diff --git a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java index ff7c9e39de..4caa08eee4 100644 --- a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java +++ b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java @@ -2,6 +2,7 @@ import com.codename1.ui.BrowserComponent; import com.codename1.ui.Form; +import com.codename1.ui.Sheet; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.util.UITimer; import com.codename1.util.SuccessCallback; @@ -13,6 +14,7 @@ public class BrowserComponentScreenshotTest extends BaseTest { private Form form; private boolean jsReady; private boolean jsCheckPending; + private boolean sheetShown; @Override public boolean runTest() throws Exception { @@ -56,6 +58,11 @@ public void onSucess(BrowserComponent.JSRef result) { return; } + if (!sheetShown) { + sheetShown = true; + Sheet sheet = new Sheet(null, "Browser Sheet"); + sheet.show(); + } UITimer.timer(2000, false, form, readyRunnable); readyRunnable = null; } From 44ae4d5034e56266d581e4731ce050dc3d9ffc1c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 8 Feb 2026 21:25:12 +0200 Subject: [PATCH 2/3] Capture screenshot for sheets over native peers --- CodenameOne/src/com/codename1/ui/Sheet.java | 51 +++++++++++++++++---- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index c90fd0cbdf..8d5d4c3321 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -23,6 +23,7 @@ package com.codename1.ui; import com.codename1.ui.ComponentSelector.ComponentClosure; +import com.codename1.ui.Image; import com.codename1.ui.events.ActionEvent; import com.codename1.ui.events.ActionListener; import com.codename1.ui.geom.Dimension; @@ -36,6 +37,7 @@ import com.codename1.ui.plaf.Style; import com.codename1.ui.plaf.UIManager; import com.codename1.ui.util.EventDispatcher; +import com.codename1.util.SuccessCallback; import static com.codename1.ui.ComponentSelector.$; @@ -121,6 +123,7 @@ public class Sheet extends Container { private static final int C = 4; private static final int DEFAULT_TRANSITION_DURATION = 300; private static final String SHEET_BLOCKER_PROPERTY = "cn1$sheetBlocker"; + private static final String SHEET_BACKGROUND_PAINTER_PROPERTY = "cn1$sheetBackgroundPainter"; private static final String SHEET_LAYER_PROPERTY = "cn1$sheetLayer"; private final Sheet parentSheet; private final Label title = new Label(); @@ -448,9 +451,6 @@ public void show(final int duration) { // END Deal with iPhoneX notch Form f = CN.getCurrentForm(); - if (Form.activePeerCount > 0) { - f.setLightweightMode(true); - } if (f.getAnimationManager().isAnimating()) { f.getAnimationManager().flushAnimation(new Runnable() { @Override @@ -466,11 +466,24 @@ public void run() { Container cnt = CN.getCurrentForm().getFormLayeredPane(Sheet.class, true); if (!(cnt.getLayout() instanceof LayeredLayout)) { cnt.setLayout(new LayeredLayout()); - - cnt.getStyle().setBgPainter(new ShowPainter()); - cnt.revalidate(); - + } + SheetBackgroundPainter backgroundPainter = getSheetBackgroundPainter(cnt); + cnt.getStyle().setBgPainter(backgroundPainter); + if (Form.activePeerCount > 0) { + Display.getInstance().screenshot(new SuccessCallback() { + @Override + public void onSucess(Image value) { + if (Sheet.getCurrentSheet() != Sheet.this) { //NOPMD CompareObjectsWithEquals + return; + } + if (value != null) { + backgroundPainter.setScreenshot(value); + } + f.setLightweightMode(true); + cnt.repaint(); + } + }); } Container sheetLayer = getSheetLayer(cnt); if (sheetLayer.getComponentCount() > 0) { @@ -805,6 +818,10 @@ public void run() { if (parent != null && parent.getComponentForm() != null) { cnt.remove(); + SheetBackgroundPainter backgroundPainter = getSheetBackgroundPainter(cnt); + if (backgroundPainter != null) { + backgroundPainter.setScreenshot(null); + } if (Form.activePeerCount > 0) { parent.getComponentForm().setLightweightMode(false); } @@ -968,9 +985,27 @@ private void ensureSheetBlocker(Container cnt, Container sheetLayer) { } - private static class ShowPainter implements Painter { + private SheetBackgroundPainter getSheetBackgroundPainter(Container cnt) { + SheetBackgroundPainter painter = (SheetBackgroundPainter) cnt.getClientProperty(SHEET_BACKGROUND_PAINTER_PROPERTY); + if (painter == null) { + painter = new SheetBackgroundPainter(); + cnt.putClientProperty(SHEET_BACKGROUND_PAINTER_PROPERTY, painter); + } + return painter; + } + + private static class SheetBackgroundPainter implements Painter { + private Image screenshot; + + void setScreenshot(Image screenshot) { + this.screenshot = screenshot; + } + @Override public void paint(Graphics g, Rectangle rect) { + if (screenshot != null) { + g.drawImage(screenshot, rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); + } int alph = g.getAlpha(); g.setAlpha((int) (alph * 30 / 100.0)); g.setColor(0x0); From 0d26f1e70b8805563d5adffe74f7edc869c5b49d Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 8 Feb 2026 21:25:19 +0200 Subject: [PATCH 3/3] Delay sheet display in browser test --- CodenameOne/src/com/codename1/ui/Sheet.java | 134 +++--------------- .../tests/BrowserComponentScreenshotTest.java | 15 +- 2 files changed, 29 insertions(+), 120 deletions(-) diff --git a/CodenameOne/src/com/codename1/ui/Sheet.java b/CodenameOne/src/com/codename1/ui/Sheet.java index 8d5d4c3321..69cc9b045f 100644 --- a/CodenameOne/src/com/codename1/ui/Sheet.java +++ b/CodenameOne/src/com/codename1/ui/Sheet.java @@ -23,10 +23,8 @@ package com.codename1.ui; import com.codename1.ui.ComponentSelector.ComponentClosure; -import com.codename1.ui.Image; import com.codename1.ui.events.ActionEvent; import com.codename1.ui.events.ActionListener; -import com.codename1.ui.geom.Dimension; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -37,7 +35,6 @@ import com.codename1.ui.plaf.Style; import com.codename1.ui.plaf.UIManager; import com.codename1.ui.util.EventDispatcher; -import com.codename1.util.SuccessCallback; import static com.codename1.ui.ComponentSelector.$; @@ -122,9 +119,6 @@ public class Sheet extends Container { private static final int W = 3; private static final int C = 4; private static final int DEFAULT_TRANSITION_DURATION = 300; - private static final String SHEET_BLOCKER_PROPERTY = "cn1$sheetBlocker"; - private static final String SHEET_BACKGROUND_PAINTER_PROPERTY = "cn1$sheetBackgroundPainter"; - private static final String SHEET_LAYER_PROPERTY = "cn1$sheetLayer"; private final Sheet parentSheet; private final Label title = new Label(); private final EventDispatcher closeListeners = new EventDispatcher(); @@ -464,29 +458,15 @@ public void run() { remove(); } Container cnt = CN.getCurrentForm().getFormLayeredPane(Sheet.class, true); - if (!(cnt.getLayout() instanceof LayeredLayout)) { - cnt.setLayout(new LayeredLayout()); + if (!(cnt.getLayout() instanceof BorderLayout)) { + cnt.setLayout(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE)); + + cnt.getStyle().setBgPainter(new ShowPainter()); + cnt.revalidate(); + } - SheetBackgroundPainter backgroundPainter = getSheetBackgroundPainter(cnt); - cnt.getStyle().setBgPainter(backgroundPainter); - if (Form.activePeerCount > 0) { - Display.getInstance().screenshot(new SuccessCallback() { - @Override - public void onSucess(Image value) { - if (Sheet.getCurrentSheet() != Sheet.this) { //NOPMD CompareObjectsWithEquals - return; - } - if (value != null) { - backgroundPainter.setScreenshot(value); - } - f.setLightweightMode(true); - cnt.repaint(); - } - }); - } - Container sheetLayer = getSheetLayer(cnt); - if (sheetLayer.getComponentCount() > 0) { + if (cnt.getComponentCount() > 0) { $(".Sheet", cnt).each(new ComponentClosure() { @Override public void call(Component c) { @@ -522,17 +502,17 @@ public void call(Component c) { } }); - Component existing = sheetLayer.getComponentAt(0); - sheetLayer.replace(existing, this, null); - sheetLayer.animateLayout(duration); + Component existing = cnt.getComponentAt(0); + cnt.replace(existing, this, null); + cnt.animateLayout(duration); } else { - sheetLayer.add(getPosition(), this); + cnt.add(getPosition(), this); - this.setWidth(getPreferredW(sheetLayer)); - this.setHeight(getPreferredH(sheetLayer)); - this.setX(getHiddenX(sheetLayer)); - this.setY(getHiddenY(sheetLayer)); - sheetLayer.animateLayout(duration); + this.setWidth(getPreferredW(cnt)); + this.setHeight(getPreferredH(cnt)); + this.setX(getHiddenX(cnt)); + this.setY(getHiddenY(cnt)); + cnt.animateLayout(duration); } } @@ -808,23 +788,15 @@ public void back(int duration) { private void hide(int duration) { final Container cnt = CN.getCurrentForm().getFormLayeredPane(Sheet.class, true); - final Container sheetLayer = getSheetLayer(cnt); - setX(getHiddenX(sheetLayer)); - setY(getHiddenY(sheetLayer)); - sheetLayer.animateUnlayout(duration, 255, new Runnable() { + setX(getHiddenX(cnt)); + setY(getHiddenY(cnt)); + cnt.animateUnlayout(duration, 255, new Runnable() { @Override public void run() { Container parent = cnt.getParent(); if (parent != null && parent.getComponentForm() != null) { cnt.remove(); - SheetBackgroundPainter backgroundPainter = getSheetBackgroundPainter(cnt); - if (backgroundPainter != null) { - backgroundPainter.setScreenshot(null); - } - if (Form.activePeerCount > 0) { - parent.getComponentForm().setLightweightMode(false); - } parent.getComponentForm().revalidateLater(); fireCloseEvent(true); @@ -948,64 +920,10 @@ private void fireBackEvent() { } - private Container getSheetLayer(Container cnt) { - Container sheetLayer = (Container) cnt.getClientProperty(SHEET_LAYER_PROPERTY); - if (sheetLayer == null) { - sheetLayer = new Container(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE)); - sheetLayer.setName("SheetLayer"); - cnt.putClientProperty(SHEET_LAYER_PROPERTY, sheetLayer); - ensureSheetBlocker(cnt, sheetLayer); - cnt.add(sheetLayer); - } else { - ensureSheetBlocker(cnt, sheetLayer); - } - return sheetLayer; - } - - private void ensureSheetBlocker(Container cnt, Container sheetLayer) { - Component blocker = (Component) cnt.getClientProperty(SHEET_BLOCKER_PROPERTY); - if (Form.activePeerCount <= 0) { - if (blocker != null && blocker.getParent() == cnt) { //NOPMD CompareObjectsWithEquals - cnt.removeComponent(blocker); - } - return; - } - if (blocker == null) { - blocker = new SheetBlocker(); - cnt.putClientProperty(SHEET_BLOCKER_PROPERTY, blocker); - } - if (blocker.getParent() != cnt) { //NOPMD CompareObjectsWithEquals - int sheetLayerIndex = cnt.getComponentIndex(sheetLayer); - if (sheetLayerIndex > -1) { - cnt.addComponent(sheetLayerIndex, blocker); - } else { - cnt.addComponent(0, blocker); - } - } - } - - - private SheetBackgroundPainter getSheetBackgroundPainter(Container cnt) { - SheetBackgroundPainter painter = (SheetBackgroundPainter) cnt.getClientProperty(SHEET_BACKGROUND_PAINTER_PROPERTY); - if (painter == null) { - painter = new SheetBackgroundPainter(); - cnt.putClientProperty(SHEET_BACKGROUND_PAINTER_PROPERTY, painter); - } - return painter; - } - - private static class SheetBackgroundPainter implements Painter { - private Image screenshot; - - void setScreenshot(Image screenshot) { - this.screenshot = screenshot; - } + private static class ShowPainter implements Painter { @Override public void paint(Graphics g, Rectangle rect) { - if (screenshot != null) { - g.drawImage(screenshot, rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()); - } int alph = g.getAlpha(); g.setAlpha((int) (alph * 30 / 100.0)); g.setColor(0x0); @@ -1014,16 +932,4 @@ public void paint(Graphics g, Rectangle rect) { } } - - private static class SheetBlocker extends Container { - SheetBlocker() { - setGrabsPointerEvents(true); - setUIID("SheetBlocker"); - } - - @Override - protected Dimension calcPreferredSize() { - return new Dimension(CN.getDisplayWidth(), CN.getDisplayHeight()); - } - } } diff --git a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java index 4caa08eee4..e371aa5a8d 100644 --- a/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java +++ b/scripts/hellocodenameone/common/src/main/java/com/codenameone/examples/hellocodenameone/tests/BrowserComponentScreenshotTest.java @@ -58,13 +58,16 @@ public void onSucess(BrowserComponent.JSRef result) { return; } - if (!sheetShown) { - sheetShown = true; - Sheet sheet = new Sheet(null, "Browser Sheet"); - sheet.show(); - } - UITimer.timer(2000, false, form, readyRunnable); + Runnable run = readyRunnable; readyRunnable = null; + UITimer.timer(300, false, form, () -> { + if (!sheetShown) { + sheetShown = true; + Sheet sheet = new Sheet(null, "Browser Sheet"); + sheet.show(0); + } + UITimer.timer(700, false, form, run); + }); } private static String buildHtml() {