[GH-ISSUE #580] Update the Android GUI to Google's Material 3 / You style. #440

Closed
opened 2026-05-07 00:24:09 +02:00 by BreizhHardware · 26 comments

Originally created by @RokeJulianLockhart on GitHub (Jan 12, 2023).
Original GitHub issue: https://github.com/binwiederhier/ntfy/issues/580

For AOSP. My rationale is available at RokeJulianLockhart/RokeJulianLockhart/issues/4.

Originally created by @RokeJulianLockhart on GitHub (Jan 12, 2023). Original GitHub issue: https://github.com/binwiederhier/ntfy/issues/580 For AOSP. My rationale is available at [`RokeJulianLockhart/RokeJulianLockhart/issues/4`](https://github.com/RokeJulianLockhart/RokeJulianLockhart/issues/4#issue-2885081776).
Author
Owner

@binwiederhier commented on GitHub (Mar 31, 2023):

Reference - @Bnyro implemented this here: https://github.com/binwiederhier/ntfy-android/pull/56

<!-- gh-comment-id:1491148968 --> @binwiederhier commented on GitHub (Mar 31, 2023): Reference - @Bnyro implemented this here: https://github.com/binwiederhier/ntfy-android/pull/56
Author
Owner

@mpeter50 commented on GitHub (Apr 28, 2024):

I don't know about the possibilities, but if not too much of a burden I (and probably others too) would prefer to keep the original Material design.

Material design 3 does not only introduce customizable colors, but also many other changes that are not customizable however quite ugly: these include unnecessary larger whitespaces, and largely rounded corners.

Contrary to the above rationale, from my side at least sticking with Material (1) does not mean that the software is unmaintained, and I don't think many are thinking that way. In my opinion, the appearance of the software is consistent with the latest tasteful version of the Material Design Guidelines.
The app's current version may not be fashionable, but usability is unaffected.

<!-- gh-comment-id:2081590133 --> @mpeter50 commented on GitHub (Apr 28, 2024): I don't know about the possibilities, but if not too much of a burden I (and probably others too) would prefer to keep the original Material design. Material design 3 does not only introduce customizable colors, but also many other changes that are _not_ customizable however quite ugly: these include unnecessary larger whitespaces, and largely rounded corners. Contrary to the above rationale, from my side at least sticking with Material (1) does not mean that the software is unmaintained, and I don't think many are thinking that way. In my opinion, the appearance of the software is consistent with the latest tasteful version of the Material Design Guidelines. The app's current version may not be fashionable, but usability is unaffected.
Author
Owner

@RokeJulianLockhart commented on GitHub (Apr 28, 2024):

#issuecomment-2081590133

@mpeter50, I'd say that it's more akin to what m2.material.io/design/introduction#baseline-grid describes than what m1.material.io/material-design/introduction.html does.

<!-- gh-comment-id:2081595596 --> @RokeJulianLockhart commented on GitHub (Apr 28, 2024): > [`#issuecomment-2081590133`](https://github.com/binwiederhier/ntfy/issues/580#issuecomment-2081590133) @mpeter50, I'd say that it's more akin to what [`m2.material.io/design/introduction#baseline-grid`](https://m2.material.io/design/introduction#baseline-grid) describes than what [`m1.material.io/material-design/introduction.html`](https://m1.material.io/material-design/introduction.html) does.
Author
Owner

@TecdataOfficial commented on GitHub (May 8, 2025):

Material design 3 does not only introduce customizable colors, but also many other changes that are not customizable however quite ugly: these include unnecessary larger whitespaces, and largely rounded corners.

Apps can absolutely utilize the guidelines within a reasonable and customizable scope that fits their a usable design for them. Ie. Developers don't have to use the large margins and can use the guidelines to fit the characteristics of their app. By characteristics, one example could be Material 3 style presentable and friendly information cards for each notification / message without unnecessarily using up screen space real-estate. Designs and controls can use elements that make information flow easier and brings new options for easily showing the user additional screens or slide out views. On larger screen sizes, these views can dynamically show together, on small screen sizes the elements scale appropriately.

Better more usable and accessible UI elements: It's also important to understand why Material 3 exists the way it does. I'm not advocating for large white spaces and margins which can certainly waste screen space of certain apps and how they present their information. However, I'm certainly an advocate of accessibility and UI scalability. You need to keep in mind, Android is used on a variety of screen sizes, device types, PCs, Dex UI containerization, split screens, foldable phones. Google engineers worked very hard on exceeding accessibility requirements, and their reasoning is quite sound for many of the design choices they made.

However, if you look at many Google apps, they don't use every single Material 3 element outlined, many exclude tinted backgrounds and large tinted elements, etc; they may use 60% of the elements. It's all about pleasing aesthetics in an accessible fashion. Accessibility and Material 3 needs to fit to the app's characteristics and information flow, giant margins are not for everyone.

Let's discuss rounded corners for a second: This isn't just a new hip fashion. There is a sound design decision around this. Rounded corners with color offsets for inner elements, as opposed to Material 2 which has a corner rounded px of around 4 and shows inner elements without inner color offsets, doesn't make things as easy to understand or find.

Eg: A dialog with a question in M. 2 is a white rectangle with capital blue letters for each button. There's no distinction between which option is the best choice for the user. M. 3 suggests that the tap targets should be rounded corner buttons with slight background color variations to distinguish them; the best option for the user or the option the user has selected in the past, should be a darker tone to direct their attention to that button. If the user knows what the dialog says, tapping the appropriate button is quick. Material 2 makes no such usability. Essentially, rounded corner elements with color offsets subtly direct attention inward, helping users focus on the content inside a button or container, and tap the best choice action.

Contrary to the above rationale, from my side at least sticking with Material 2 does not mean that the software is unmaintained, and I don't think many are thinking that way. In my opinion, the appearance of the software is consistent with the latest tasteful version of the Material Design Guidelines. The app's current version may not be fashionable, but usability is unaffected.

Material 3 does not subtract from usability. If it does, then it's implemented wrong. It should add additional usability, it should make things more friendlier, especially from a design and aesthetic point. Material 3 is designed to be more usable and accessible

<!-- gh-comment-id:2864379875 --> @TecdataOfficial commented on GitHub (May 8, 2025): > Material design 3 does not only introduce customizable colors, but also many other changes that are _not_ customizable however quite ugly: these include unnecessary larger whitespaces, and largely rounded corners. Apps can absolutely utilize the guidelines within a reasonable and customizable scope that fits their a usable design for them. Ie. Developers don't have to use the large margins and can use the guidelines to fit the characteristics of their app. By characteristics, one example could be Material 3 style presentable and friendly information cards for each notification / message without unnecessarily using up screen space real-estate. Designs and controls can use elements that make information flow easier and brings new options for easily showing the user additional screens or slide out views. On larger screen sizes, these views can dynamically show together, on small screen sizes the elements scale appropriately. **Better more usable and accessible UI elements:** It's also important to understand why Material 3 exists the way it does. I'm not advocating for large white spaces and margins which can certainly waste screen space of certain apps and how they present their information. However, I'm certainly an advocate of accessibility and UI scalability. You need to keep in mind, Android is used on a variety of screen sizes, device types, PCs, Dex UI containerization, split screens, foldable phones. Google engineers worked very hard on exceeding accessibility requirements, and their reasoning is quite sound for many of the design choices they made. However, if you look at many Google apps, they don't use every single Material 3 element outlined, many exclude tinted backgrounds and large tinted elements, etc; they may use 60% of the elements. It's all about pleasing aesthetics in an accessible fashion. **Accessibility and Material 3 needs to fit to the app's characteristics and information flow, giant margins are not for everyone.** **Let's discuss rounded corners for a second:** This isn't just a new hip fashion. There is a sound design decision around this. Rounded corners with color offsets for inner elements, as opposed to Material 2 which has a corner rounded px of around 4 and shows inner elements without inner color offsets, doesn't make things as easy to understand or find. Eg: A dialog with a question in M. 2 is a white rectangle with capital blue letters for each button. There's no distinction between which option is the best choice for the user. M. 3 suggests that the tap targets should be rounded corner buttons with slight background color variations to distinguish them; the best option for the user or the option the user has selected in the past, should be a darker tone to direct their attention to that button. If the user knows what the dialog says, tapping the appropriate button is quick. Material 2 makes no such usability. **Essentially, rounded corner elements with color offsets subtly direct attention inward, helping users focus on the content inside a button or container, and tap the best choice action.** > Contrary to the above rationale, from my side at least sticking with Material 2 does not mean that the software is unmaintained, and I don't think many are thinking that way. In my opinion, the appearance of the software is consistent with the latest tasteful version of the Material Design Guidelines. The app's current version may not be fashionable, but usability is unaffected. **Material 3 does not subtract from usability.** If it does, then it's implemented wrong. It should add additional usability, it should make things more friendlier, especially from a design and aesthetic point. Material 3 is designed to be more usable and accessible
Author
Owner

@mpeter50 commented on GitHub (May 8, 2025):

Accessibility certainly does not need 10px and more rounded corners. There is a tasteful amount. In my opinion, that is way, way below that (and not 0, mind you).

Margin sizes should be based on settings, possibly system settings, instead of making smaller screens unusable, and thus also forcing people to not even consider phones with smaller screens. We already have this for 3 different parameters about animations, but this one should be more accessible.
That way users with bigger thumbs can use UIs conveniently.

Let's discuss rounded corners for a second: This isn't just a new hip fashion.

Well I agree its not new, this madness has been going for years now. Under the flag of customizability, where the only possibility for me to customize is by writing an Xposed module that makes the changes.

Let's discuss rounded corners for a second: This isn't just a new hip fashion. There is a sound design decision around this. Rounded corners with color offsets for inner elements, as opposed to Material 2 which has a corner rounded px of around 4 and shows inner elements without inner color offsets, doesn't make things as easy to understand or find.

I'll be honest here and tell you that I dont know what kind of color offsets on inner elements are you referring to, especially the inner element part. Colored text with color based on accent color? But I dont see how rounding the corners are helping here, so probably not that.

Eg: A dialog with a question in M. 2 is a white rectangle with capital blue letters for each button. There's no distinction between which option is the best choice for the user. M. 3 suggests that the tap targets should be rounded corner buttons with slight background color variations to distinguish them; the best option for the user or the option the user has selected in the past, should be a darker tone to direct their attention to that button. If the user knows what the dialog says, tapping the appropriate button is quick. Material 2 makes no such usability. Essentially, rounded corner elements with color offsets subtly direct attention inward, helping users focus on the content inside a button or container, and tap the best choice action.

The distinction was always being made with colors, wasn't it? Also, rounded corners for the button does not seem to be a meaningful thing here. Sure, do not keep the buttons with sharp pointy colors but why apply 15px radius? 2-3 px is totally fine.

Material 3 does not subtract from usability. If it does, then it's implemented wrong.

Then that means it has no single correct implementation, and something somewhere is entirely broken.

It should add additional usability, it should make things more friendlier, especially from a design and aesthetic point. Material 3 is designed to be more usable and accessible

Achieving that goal does not need any amount of forced rounded corners and forced large margins.
The only thing I can understand about these two is large margins, as I said, for people with big thumbs. Let it be configurable for them, preferably systemwide. But do not force it.

<!-- gh-comment-id:2864548345 --> @mpeter50 commented on GitHub (May 8, 2025): Accessibility certainly does not need 10px and more rounded corners. There is a tasteful amount. In my opinion, that is way, way below that (and not 0, mind you). Margin sizes should be based on settings, possibly system settings, instead of making smaller screens unusable, and thus also forcing people to not even consider phones with smaller screens. We already have this for 3 different parameters about animations, but this one should be more accessible. That way users with bigger thumbs can use UIs conveniently. > Let's discuss rounded corners for a second: This isn't just a new hip fashion. Well I agree its not new, this madness has been going for years now. Under the flag of customizability, where the only possibility for me to customize is by writing an Xposed module that makes the changes. > Let's discuss rounded corners for a second: This isn't just a new hip fashion. There is a sound design decision around this. Rounded corners with color offsets for inner elements, as opposed to Material 2 which has a corner rounded px of around 4 and shows inner elements without inner color offsets, doesn't make things as easy to understand or find. I'll be honest here and tell you that I dont know what kind of color offsets on inner elements are you referring to, especially the inner element part. Colored text with color based on accent color? But I dont see how rounding the corners are helping here, so probably not that. > Eg: A dialog with a question in M. 2 is a white rectangle with capital blue letters for each button. There's no distinction between which option is the best choice for the user. M. 3 suggests that the tap targets should be rounded corner buttons with slight background color variations to distinguish them; the best option for the user or the option the user has selected in the past, should be a darker tone to direct their attention to that button. If the user knows what the dialog says, tapping the appropriate button is quick. Material 2 makes no such usability. Essentially, rounded corner elements with color offsets subtly direct attention inward, helping users focus on the content inside a button or container, and tap the best choice action. The distinction was always being made with colors, wasn't it? Also, rounded corners for the button does not seem to be a meaningful thing here. Sure, do not keep the buttons with sharp pointy colors but why apply 15px radius? 2-3 px is totally fine. > Material 3 does not subtract from usability. If it does, then it's implemented wrong. Then that means it has no single correct implementation, and something somewhere is entirely broken. > It should add additional usability, it should make things more friendlier, especially from a design and aesthetic point. Material 3 is designed to be more usable and accessible Achieving that goal does not need any amount of forced rounded corners and forced large margins. The only thing I can understand about these two is large margins, as I said, for people with big thumbs. Let it be configurable for them, preferably systemwide. But do not force it.
Author
Owner

@RokeJulianLockhart commented on GitHub (May 8, 2025):

Margin sizes should be based on settings, possibly system settings, instead of making smaller screens unusable, and thus also forcing people to not even consider phones with smaller screens. We already have this for 3 different parameters about animations, but this one should be more accessible.

@mpeter50, I'd be amazed if anyone disagreed with you on this, but it's nigh infeasible without a very homogenous GUI toolkit landscape. Irrespective, it's out-of-scope for this issue, but if you bring it to issuetracker.google.com, although futile, I'll support you.

<!-- gh-comment-id:2864563422 --> @RokeJulianLockhart commented on GitHub (May 8, 2025): > Margin sizes should be based on settings, possibly system settings, instead of making smaller screens unusable, and thus also forcing people to not even consider phones with smaller screens. We already have this for 3 different parameters about animations, but this one should be more accessible. @mpeter50, I'd be amazed if anyone disagreed with you on this, but it's nigh infeasible without a very homogenous GUI toolkit landscape. Irrespective, it's out-of-scope for *this* issue, but if you bring it to `issuetracker.google.com`, although futile, I'll support you.
Author
Owner

@binwiederhier commented on GitHub (Dec 11, 2025):

This is now merged and will go out with ntfy Androud 1.19.x

<!-- gh-comment-id:3642668324 --> @binwiederhier commented on GitHub (Dec 11, 2025): This is now merged and will go out with ntfy Androud 1.19.x
Author
Owner

@binwiederhier commented on GitHub (Dec 11, 2025):

@cyb3rko and @RokeJulianLockhart and everyone else who'd like to test:

Untested:

  • Topic icons

Known bugs:

  • The ripple effect is gone when tapping on a topic
  • The toolbar background color in action mode should be colorSurface
<!-- gh-comment-id:3642918950 --> @binwiederhier commented on GitHub (Dec 11, 2025): @cyb3rko and @RokeJulianLockhart and everyone else who'd like to test: * Google Play from Android: https://play.google.com/store/apps/details?id=io.heckel.ntfy * Google Play from Web: https://play.google.com/apps/testing/io.heckel.ntfy * APKs are available here: https://github.com/binwiederhier/ntfy-android/releases/tag/v1.19.0-rc2 Untested: - [x] Topic icons Known bugs: - [x] The ripple effect is gone when tapping on a topic - [ ] The toolbar background color in action mode should be colorSurface
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 11, 2025):

@binwiederhier, the window decorations / title bar of 1.19.0-debug, invoked as am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity, 1 shouldn't be colourised, nor should elements render outside the window border, and atop one-another, rather than moving into the overflow context menu:

Image

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy rotation="0">
    <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
        <node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
            <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
                <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/action_bar_root" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
                    <node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
                        <node index="0" text="" resource-id="" class="android.widget.ScrollView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]">
                            <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/app_bar_drawer" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,508]">
                                <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/toolbar" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,298][779,508]">
                                    <node index="0" text="Subscribed topics" resource-id="" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[102,354][464,451]" />
                                    <node index="1" text="" resource-id="" class="androidx.appcompat.widget.LinearLayoutCompat" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[490,311][779,494]">
                                        <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_menu_notifications_enabled" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="Notifications on" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[490,324][647,481]" />
                                        <node index="1" text="" resource-id="" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[647,324][779,481]" />
                                    </node>
                                </node>
                            </node>
                            <node index="1" text="" resource-id="" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]">
                                <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,760]">
                                    <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions_image" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,575]" />
                                    <node index="1" text="It looks like you don't have any subscriptions yet." resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions_text" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,575][779,760]" />
                                </node>
                                <node index="1" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery" class="androidx.cardview.widget.CardView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]">
                                    <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_constraint" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]">
                                        <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_image" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[99,623][191,715]" />
                                        <node index="1" text="Battery optimization should be off for the app to avoid notification delivery issues." resource-id="io.heckel.ntfy.debug:id/main_banner_battery_text" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[224,557][730,781]" />
                                        <node index="2" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_flow" class="android.view.View" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[99,781][730,851]" />
                                        <node index="3" text="ASK LATER" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_ask_later" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[121,781][442,851]" />
                                        <node index="4" text="DISMISS" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_dontaskagain" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[442,781][730,851]" />
                                    </node>
                                </node>
                                <node index="2" text="" resource-id="io.heckel.ntfy.debug:id/fab" class="com.google.android.material.floatingactionbutton.FloatingActionButton" package="io.heckel.ntfy.debug" content-desc="Add subscription" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[517,668][700,851]" />
                            </node>
                        </node>
                    </node>
                </node>
            </node>
        </node>
    </node>
</hierarchy>

...and its banner shouldn't be rounded at the top (due to the toolbar), unless it gains a margin around its border. However, that'd be a waste of space. It's slightly better with monochromatic dynamic colouration, 3 however, but that's niche:

Image Image
Image Image
<!-- gh-comment-id:3643155223 --> @RokeJulianLockhart commented on GitHub (Dec 11, 2025): @binwiederhier, the window decorations / title bar of [`1.19.0-debug`](https://github.com/binwiederhier/ntfy-android/releases/download/v1.19.0-rc2/ntfy-1.19.0-fdroid-debug.apk), invoked as `am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity`, [^3] shouldn't be colourised, nor should elements render outside the window border, and atop one-another, rather than moving into the overflow context menu: [^3]: [`android.stackexchange.com/revisions/263426/2`](https://android.stackexchange.com/revisions/263426/2#:~:text=activity='com.android.settings/.homepage.SettingsHomepageActivity'-,am%20start%20%2D%2DwindowingMode%205,-$activity) <p></p> <img width="729" height="743" alt="Image" src="https://github.com/user-attachments/assets/7320bc38-1b30-4866-8445-60150e6b8253" /> <p></p> <blockquote> ~~~XML <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <hierarchy rotation="0"> <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/action_bar_root" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="" class="android.widget.ScrollView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,903]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/app_bar_drawer" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,160][779,508]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/toolbar" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,298][779,508]"> <node index="0" text="Subscribed topics" resource-id="" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[102,354][464,451]" /> <node index="1" text="" resource-id="" class="androidx.appcompat.widget.LinearLayoutCompat" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[490,311][779,494]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_menu_notifications_enabled" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="Notifications on" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[490,324][647,481]" /> <node index="1" text="" resource-id="" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="More options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[647,324][779,481]" /> </node> </node> </node> <node index="1" text="" resource-id="" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions" class="android.widget.LinearLayout" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,760]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions_image" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,575]" /> <node index="1" text="It looks like you don't have any subscriptions yet." resource-id="io.heckel.ntfy.debug:id/main_no_subscriptions_text" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,575][779,760]" /> </node> <node index="1" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery" class="androidx.cardview.widget.CardView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_constraint" class="android.view.ViewGroup" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[50,508][779,851]"> <node index="0" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_image" class="android.widget.ImageView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[99,623][191,715]" /> <node index="1" text="Battery optimization should be off for the app to avoid notification delivery issues." resource-id="io.heckel.ntfy.debug:id/main_banner_battery_text" class="android.widget.TextView" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[224,557][730,781]" /> <node index="2" text="" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_flow" class="android.view.View" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[99,781][730,851]" /> <node index="3" text="ASK LATER" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_ask_later" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[121,781][442,851]" /> <node index="4" text="DISMISS" resource-id="io.heckel.ntfy.debug:id/main_banner_battery_dontaskagain" class="android.widget.Button" package="io.heckel.ntfy.debug" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[442,781][730,851]" /> </node> </node> <node index="2" text="" resource-id="io.heckel.ntfy.debug:id/fab" class="com.google.android.material.floatingactionbutton.FloatingActionButton" package="io.heckel.ntfy.debug" content-desc="Add subscription" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[517,668][700,851]" /> </node> </node> </node> </node> </node> </node> </node> </hierarchy> ~~~ </blockquote> [^1]: [`chatgpt.com/s/t_693b065808a08191826688df8d4701cb`](https://chatgpt.com/s/t_693b065808a08191826688df8d4701cb) [^2] [^2]: [`chatgpt.com/c/693b0545-0748-8332-97f5-b6072087367e`](https://chatgpt.com/c/693b0545-0748-8332-97f5-b6072087367e) ...and its banner shouldn't be rounded at the top (due to the toolbar), unless it gains a margin around its border. However, that'd be a waste of space. It's slightly better with monochromatic dynamic colouration, [^1] however, but that's niche: [^1]: [`Mahmud0808/ColorBlendr/issues/218#issue-3157556958`](https://github.com/Mahmud0808/ColorBlendr/issues/218#issue-3157556958) | <img width="738" height="721" alt="Image" src="https://github.com/user-attachments/assets/f8124b54-14b6-4977-92ba-df9ce244b95a" /> | <img width="738" height="721" alt="Image" src="https://github.com/user-attachments/assets/94a6dcd8-9ccf-4d94-abf3-6f1a65575f12" />| |-|-| |<img width="1224" height="2700" alt="Image" src="https://github.com/user-attachments/assets/d042f19e-8d51-4646-b523-10104b56b126" />|<img width="1224" height="2700" alt="Image" src="https://github.com/user-attachments/assets/5ed0f51a-d712-40be-a7d7-739a7d9f3334" />|
Author
Owner

@binwiederhier commented on GitHub (Dec 20, 2025):

I'll release a new 1.19.1-rc1 to Google Play and publish in https://github.com/binwiederhier/ntfy-android/releases

@RokeJulianLockhart I honestly don't know what you're trying to tell me with the window decorations and title bars. How does that manifest when started normally on the phone?

<!-- gh-comment-id:3677899423 --> @binwiederhier commented on GitHub (Dec 20, 2025): - I fixed the rounded corners in the banners https://github.com/binwiederhier/ntfy-android/commit/74968ac2e28795b712540714335ae06eac0b1299 - I added the ripple effect in the main activity back https://github.com/binwiederhier/ntfy-android/commit/62fac9ce68a341c7cfda793d135031ced39acf0b I'll release a new 1.19.1-rc1 to Google Play and publish in https://github.com/binwiederhier/ntfy-android/releases @RokeJulianLockhart I honestly don't know what you're trying to tell me with the window decorations and title bars. How does that manifest when started normally on the phone?
Author
Owner

@binwiederhier commented on GitHub (Dec 20, 2025):

Another tiny fix:

I'll release a new 1.19.2-rc1 to Google Play and publish in https://github.com/binwiederhier/ntfy-android/releases

<!-- gh-comment-id:3677946636 --> @binwiederhier commented on GitHub (Dec 20, 2025): Another tiny fix: * Do not cover last setting with 3-button nav bar https://github.com/binwiederhier/ntfy-android/commit/99086f98ae53b887ba9f039e17be1d76dbe2faf4 I'll release a new 1.19.2-rc1 to Google Play and publish in https://github.com/binwiederhier/ntfy-android/releases
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 21, 2025):

@RokeJulianLockhart I honestly don't know what you're trying to tell me with the window decorations and title bars. How does that manifest when started normally on the phone?

@binwiederhier, apologies for the wait. Been quite unwell. I merely mean that:

  • when in, what Quickstep refers to as, “Freeform” mode, the colour of the window's title bar should match the background

  • the battery notification's buttons should either become a context menu, or a minimum window size should be applied. The former is, likely, easier than the latter (and more adaptive; useful for something like a smart-watch)

  • the battery notification should be padded around its sides, or unrounded where it meets the header

<!-- gh-comment-id:3678690050 --> @RokeJulianLockhart commented on GitHub (Dec 21, 2025): > @RokeJulianLockhart I honestly don't know what you're trying to tell me with the window decorations and title bars. How does that manifest when started normally on the phone? @binwiederhier, apologies for the wait. Been quite unwell. I merely mean that: - when in, what Quickstep refers to as, “Freeform” mode, the colour of the window's title bar should match the background - the battery notification's buttons should either become a context menu, or a minimum window size should be applied. The former is, likely, easier than the latter (and more adaptive; useful for something like a smart-watch) - the battery notification should be padded around its sides, or unrounded where it meets the header
Author
Owner

@binwiederhier commented on GitHub (Dec 23, 2025):

This is being released now.

@RokeJulianLockhart Lots of folks have tested it and it seems fine for them. How can I test/reproduce what you are doing? Do you have a different kind of device? I am closing this ticket, but we can have follow up pull requests and tickets any time!

<!-- gh-comment-id:3686671953 --> @binwiederhier commented on GitHub (Dec 23, 2025): This is being released now. @RokeJulianLockhart Lots of folks have tested it and it seems fine for them. How can I test/reproduce what you are doing? Do you have a different kind of device? I am closing this ticket, but we can have follow up pull requests and tickets any time!
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 23, 2025):

How can I test/reproduce what you are doing?

@binwiederhier, you should be able to confirm any of that on waydroid-1.6.0-3.fc43.noarch, with:

#!/system/bin/sh
curl 'https://github.com/binwiederhier/ntfy-android/releases/download/v1.19.0-rc2/ntfy-1.19.0-fdroid-debug.apk' && \
pm install ntfy-1.19.0-fdroid-debug.apk && \
am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity

…except the colouration, which must be modified at:

#!/system/bin/sh
cmd activity start -a android.intent.action.VIEW -n com.android.wallpaper/com.android.customization.picker.CustomizationPickerActivity

Do you have a different kind of device?

I'm uncertain of what this means, but my environment is:

[ro.product.brand]: [Fairphone]
[ro.build.product]: [FP5]
[ro.build.version.release]: [15]
[ro.build.display.id]: [FP5.VT2I.C.072.20251122]
<!-- gh-comment-id:3687159155 --> @RokeJulianLockhart commented on GitHub (Dec 23, 2025): > How can I test/reproduce what you are doing? @binwiederhier, you should be able to confirm any of that on `waydroid-1.6.0-3.fc43.noarch`, with: ~~~sh #!/system/bin/sh curl 'https://github.com/binwiederhier/ntfy-android/releases/download/v1.19.0-rc2/ntfy-1.19.0-fdroid-debug.apk' && \ pm install ntfy-1.19.0-fdroid-debug.apk && \ am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity ~~~ …except the colouration, which must be modified at: ~~~sh #!/system/bin/sh cmd activity start -a android.intent.action.VIEW -n com.android.wallpaper/com.android.customization.picker.CustomizationPickerActivity ~~~ > Do you have a different kind of device? I'm uncertain of what this means, but my environment is: <blockquote> ~~~YAML [ro.product.brand]: [Fairphone] [ro.build.product]: [FP5] [ro.build.version.release]: [15] [ro.build.display.id]: [FP5.VT2I.C.072.20251122] ~~~ </blockquote>
Author
Owner

@cyb3rko commented on GitHub (Dec 24, 2025):

@binwiederhier To answer the question:

He seems to use some kind of desktop connection to his phone. But which one, I don't understand.

@RokeJulianLockhart Maybe give us some more details on which software you use?

<!-- gh-comment-id:3690027669 --> @cyb3rko commented on GitHub (Dec 24, 2025): @binwiederhier To answer the question: He seems to use some kind of desktop connection to his phone. But which one, I don't understand. @RokeJulianLockhart Maybe give us some more details on which software you use?
Author
Owner

@mpeter50 commented on GitHub (Dec 24, 2025):

I suspect he first experienced the issue on his Fairphone 5, then he was able to reproduce it with waydroid (an android "emulator" for linux), and shared the details on how to reproduce it with waydroid, believing that its easier to reproduce the issue that way.

<!-- gh-comment-id:3690036323 --> @mpeter50 commented on GitHub (Dec 24, 2025): I suspect he first experienced the issue on his Fairphone 5, then he was able to reproduce it with waydroid (an android "emulator" for linux), and shared the details on how to reproduce it with waydroid, believing that its easier to reproduce the issue that way.
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 24, 2025):

@mpeter50, exactly. All of that was conducted on a real OEM AOSP installation. @cyb3rko, I've already provided what you ask for, in the getprop output (the ro.* keys). However, this might be reproducible in android-studio-2025.2.2.8-1.fc43's sdkmanager 1 / avdmanager, too:

Image

<!-- gh-comment-id:3690126163 --> @RokeJulianLockhart commented on GitHub (Dec 24, 2025): @mpeter50, exactly. All of that was conducted on a real OEM AOSP installation. @cyb3rko, I've already provided what you ask for, in the `getprop` output (the `ro.*` keys). However, this might be reproducible in `android-studio-2025.2.2.8-1.fc43`~~'s `sdkmanager`~~ [^1] / ~~`avdmanager`~~, too: <p></p><img width="252" height="134" alt="Image" src="https://github.com/user-attachments/assets/a047abb5-8abc-407a-b309-f456ea5594ae" /><p></p> [^1]: [`bugzilla.redhat.com/show_bug.cgi?id=2422333`](https://bugzilla.redhat.com/show_bug.cgi?id=2422333#c0)
Author
Owner

@cyb3rko commented on GitHub (Dec 24, 2025):

@mpeter50 provided what I was looking for.

The usage of Waydroid is the most important information in this thread, because on all physical phones it seems to work fine.

<!-- gh-comment-id:3690272430 --> @cyb3rko commented on GitHub (Dec 24, 2025): @mpeter50 provided what I was looking for. The usage of Waydroid is the most important information in this thread, because on all physical phones it seems to work fine.
Author
Owner

@mpeter50 commented on GitHub (Dec 24, 2025):

The usage of Waydroid is the most important information in this thread, because on all physical phones it seems to work fine.

The way he phrased it makes me think he also has this problem on a Fairphone 5.

<!-- gh-comment-id:3690348672 --> @mpeter50 commented on GitHub (Dec 24, 2025): > The usage of Waydroid is the most important information in this thread, because on all physical phones it seems to work fine. The way he phrased it makes me think he also has this problem on a Fairphone 5.
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 24, 2025):

@mpeter50, thanks again. Indeed, I do.

<!-- gh-comment-id:3690351136 --> @RokeJulianLockhart commented on GitHub (Dec 24, 2025): @mpeter50, thanks again. Indeed, I do.
Author
Owner

@cyb3rko commented on GitHub (Dec 25, 2025):

So you are referring to those two screenshots, which seem to belong to a physical phone, right?
Because they show a titlebar as expected, I would say.

Or what else is wrong here? Unfortunately I still don't quite understand

<!-- gh-comment-id:3691242403 --> @cyb3rko commented on GitHub (Dec 25, 2025): So you are referring to those two screenshots, which seem to belong to a physical phone, right? Because they show a titlebar as expected, I would say. Or what else is wrong here? Unfortunately I still don't quite understand > <img width="350" src="https://github.com/user-attachments/assets/66b93ee9-77b6-4fb1-89c3-7e2d9158d81e" /> > <img width="350" src="https://github.com/user-attachments/assets/205480de-d1b1-48af-8670-2a68cb3e401e" />
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 25, 2025):

So you are referring to those two screenshots, which seem to belong to a physical phone, right?

@cyb3rko, I was referring to all of the screenshots.

Because they show a titlebar as expected, I would say.

Those screenshots don't show a title bar, at all. isInMultiWindowMode would return false.

Or what else is wrong here? Unfortunately I still don't quite understand

I have even explained what the exact problem is, and provided the exec-out uiautomator dump /dev/tty output to empirically demonstrate which elements I'm referring to, in the cited activity. Instead of asking me to essentially prove a negative, please elaborate on what you don't understand, so that I can rephrase.

<!-- gh-comment-id:3691383529 --> @RokeJulianLockhart commented on GitHub (Dec 25, 2025): > So you are referring to those two screenshots, which seem to belong to a physical phone, right? @cyb3rko, I was referring to *all* of the screenshots. > Because they show a titlebar as expected, I would say. *Those* screenshots don't show a title bar, at all. `isInMultiWindowMode` would return `false`. > Or what else is wrong here? Unfortunately I still don't quite understand I have even explained what the exact problem is, and provided the `exec-out uiautomator dump /dev/tty` output to empirically demonstrate which elements I'm referring to, in the cited activity. Instead of asking me to essentially prove a negative, please elaborate on what you don't understand, so that I can rephrase.
Author
Owner

@cyb3rko commented on GitHub (Dec 25, 2025):

Then we are talking about different things here, because officially there is not title bar.

To speak in Android lingo, I mean the "Top abb bar" (https://m3.material.io/components/app-bars/overview), which is clearly there in your screenshots.
Do you mean the "Status bar" (https://developer.android.com/design/ui/mobile/guides/foundations/system-bars#status-bar)?


Maybe I'm just stupid. Please give me the steps how I can replicate your issue on my physical phone, without any CLI commands or emulator tools from inside the app itself.
If the scope is not the ntfy app but some emulation tool, I'm gonna leave that to other contributors.

<!-- gh-comment-id:3691527631 --> @cyb3rko commented on GitHub (Dec 25, 2025): Then we are talking about different things here, because officially there is not title bar. To speak in Android lingo, I mean the "Top abb bar" (https://m3.material.io/components/app-bars/overview), which is clearly there in your screenshots. Do you mean the "Status bar" (https://developer.android.com/design/ui/mobile/guides/foundations/system-bars#status-bar)? --- Maybe I'm just stupid. Please give me the steps how I can replicate your issue on my physical phone, without any CLI commands or emulator tools from inside the app itself. If the scope is not the ntfy app but some emulation tool, I'm gonna leave that to other contributors.
Author
Owner

@binwiederhier commented on GitHub (Dec 25, 2025):

I am feeling equally lost. We want to help but I think we legitimately do not know what you're talking about. You speak about stuff that I've never heard before, like you're talking about the engine of something, but I don't know if you're talking about a car or a plane or an electric toothbrush. Please ELI5 it for us. What are you talking about? ;-)

<!-- gh-comment-id:3691551644 --> @binwiederhier commented on GitHub (Dec 25, 2025): I am feeling equally lost. We want to help but I think we legitimately do not know what you're talking about. You speak about stuff that I've never heard before, like you're talking about the engine of something, but I don't know if you're talking about a car or a plane or an electric toothbrush. Please ELI5 it for us. What are you talking about? ;-)
Author
Owner

@mpeter50 commented on GitHub (Dec 25, 2025):

I think the bugs he found are those that can be seen on the screenshots here: https://github.com/binwiederhier/ntfy/issues/580#issuecomment-3643155223

On the first 3 screenshots, the app is opened in Freeform/"windowed" mode. This was partly added to android for desktop usage with an external screen, but it can be useful on the phone screen too.
How to test windowed mode: some launchers allow you opening apps in windowed mode, including the Quickstep launcher, which is the base of the google pixel phones' launcher.
Other than that, you can also move already open apps into windowed mode: open the task manager on the navigation bar, and depending on your android flavor tap a recent app's icon and select "freeform" from the menu that just opened, or like on xiaomi phones long tap a recent app's screenshot in this same menu and one of the buttons that appear should move the app into freeform windowed mode.
An app can also be started in freeform windowed mode with am start --windowingMode 5 <package name>/<activity name> (didnt check the command but looks fine).
You can use these ways for testing on your phones.

As I see, the problem in this mode is that the window frame (that has back, minimize, maximize, close buttons) is colored with the app's accent color, instead of the status bar color, and this is probably distracting.

Another complaint that windowed mode highlights is that on small screens, in small windows, and when a vision impared user has set their screen content magnification to very large, there are some issues.
For one, on the title bar of the "subscribed topics" activity the bell icon is forced to be shown. It may be better if even that icon could be collapsed into the 3 dots menu.
But also, the buttons in the battery optimization warning box are hardly clickable because they dont fit in the window, and the "plus" floating action button overlaps this warning box further making it harder to be used.

Yet another complaint is that on the "subscribed topics" activity, the battery optimization warning box has the top corners rounded, which looks a bit weird when this warning box touches the toolbar.

He has written some suggestions here on how it could work insetead.

The XML output in this comment is made by an android developer tool, I guess he pasted it in to help debugging as it shows the structure of the views in the app.

<!-- gh-comment-id:3691558971 --> @mpeter50 commented on GitHub (Dec 25, 2025): I think the bugs he found are those that can be seen on the screenshots here: https://github.com/binwiederhier/ntfy/issues/580#issuecomment-3643155223 On the first 3 screenshots, the app is opened in Freeform/"windowed" mode. This was partly added to android for desktop usage with an external screen, but it can be useful on the phone screen too. How to test windowed mode: some launchers allow you opening apps in windowed mode, including the Quickstep launcher, which is the base of the google pixel phones' launcher. Other than that, you can also move already open apps into windowed mode: open the task manager on the navigation bar, and depending on your android flavor tap a recent app's icon and select "freeform" from the menu that just opened, or like on xiaomi phones long tap a recent app's screenshot in this same menu and one of the buttons that appear should move the app into freeform windowed mode. An app can also be started in freeform windowed mode with `am start --windowingMode 5 <package name>/<activity name>` (didnt check the command but looks fine). You can use these ways for testing on your phones. As I see, the problem in this mode is that the window frame (that has back, minimize, maximize, close buttons) is colored with the app's accent color, instead of the status bar color, and this is probably distracting. Another complaint that windowed mode highlights is that on small screens, in small windows, and when a vision impared user has set their screen content magnification to very large, there are some issues. For one, on the title bar of the "subscribed topics" activity the bell icon is forced to be shown. It may be better if even that icon could be collapsed into the 3 dots menu. But also, the buttons in the battery optimization warning box are hardly clickable because they dont fit in the window, and the "plus" floating action button overlaps this warning box further making it harder to be used. Yet another complaint is that on the "subscribed topics" activity, the battery optimization warning box has the top corners rounded, which looks a bit weird when this warning box touches the toolbar. He has written some suggestions [here](https://github.com/binwiederhier/ntfy/issues/580#issuecomment-3678690050) on how it could work insetead. The XML output in [this](https://github.com/binwiederhier/ntfy/issues/580#issuecomment-3643155223) comment is made by an android developer tool, I guess he pasted it in to help debugging as it shows the structure of the views in the app.
Author
Owner

@RokeJulianLockhart commented on GitHub (Dec 25, 2025):

Then we are talking about different things here, because officially there is not title bar.

To speak in Android lingo, I mean the "Top abb bar" (https://m3.material.io/components/app-bars/overview), which is clearly there in your screenshots.

@cyb3rko, I referred to two distinct attributes (not problems, per se, but opportunities for improvement), so I need to know which you're referring to. Specifically, when you state that “there is not title bar”, I presume that you're referring to your cited “top app bar”, visible even with <meta-data android:name="com.sec.android.support.multiwindow" android:value="false"\>, rather than WindowManager's title bar, which does exist, per the aforecited: am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity; I've even screenshotted it.

If so, I'm not. I'm referring to WindowManager's, accessible via what android.stackexchange.com/revisions/263426/2 explains, and what I've aforestated.

Do you mean the "Status bar" (https://developer.android.com/design/ui/mobile/guides/foundations/system-bars#status-bar)?

No. That's com.android.systemui's purview.

Maybe I'm just stupid. Please give me the steps how I can replicate your issue on my physical phone, without any CLI commands or emulator tools from inside the app itself.

I doubt that you're stupid. 😊 However, I find you asking me to provide replication steps without using the CLI a little lazy; CLI steps are easy to test, empirical, and significantly more reproducible. (What happens if you're on AOSP 12 or 16, and I'm on 15? The GUI shall differ.)

Regardless, I'll try. However, the sole thing that I imagine that you might require documentation for, might be invoking the application in freeform mode, because the rest is very basic. If so, see the screenshot that I've uploaded to android.stackexchange.com/revisions/261679/1. If not, as aforestated, please elaborate on specifics.

If the scope is not the ntfy app but some emulation tool, I'm gonna leave that to other contributors.

I've already informed you that I reproduced everything I've stated on a bare-metal AOSP installation on real, consumer hardware. I wouldn't even recommend an emulator for this, due to farmerbb/Taskbar/issues/352 1 making this difficult to confirm outside of real OS installations.


@mpeter50, after writing all that I just did, I've realised that you've more courteously and helpfully explained all that I have, so consider this to be a corroboration; my sincere thanks for all of your assistance thus far. @binwiederhier, I hope that these, combined, explain.

<!-- gh-comment-id:3691760021 --> @RokeJulianLockhart commented on GitHub (Dec 25, 2025): > Then we are talking about different things here, because officially there is not title bar. > > To speak in Android lingo, I mean the "Top abb bar" (https://m3.material.io/components/app-bars/overview), which is clearly there in your screenshots. @cyb3rko, I referred to two distinct attributes (not problems, per se, but opportunities for improvement), so I need to know which you're referring to. Specifically, when you state that “there is not title bar”, I presume that you're referring to your cited “top app bar”, visible even with `<meta-data android:name="com.sec.android.support.multiwindow" android:value="false"\>`, rather than *`WindowManager`'s title bar*, which *does* exist, per the aforecited: `am start --windowingMode 5 io.heckel.ntfy.debug/io.heckel.ntfy.ui.MainActivity`; I've even screenshotted it. If so, I'm not. I'm referring to `WindowManager`'s, accessible via what [`android.stackexchange.com/revisions/263426/2`](https://android.stackexchange.com/revisions/263426/2#:~:text=activity='com.android.settings/.homepage.SettingsHomepageActivity'-,am%20start%20%2D%2DwindowingMode%205,-$activity) explains, and what I've aforestated. > Do you mean the "Status bar" (https://developer.android.com/design/ui/mobile/guides/foundations/system-bars#status-bar)? No. That's `com.android.systemui`'s purview. > Maybe I'm just stupid. Please give me the steps how I can replicate your issue on my physical phone, without any CLI commands or emulator tools from inside the app itself. I doubt that you're stupid. 😊 However, I find you asking me to provide replication steps without using the CLI a little lazy; CLI steps are easy to test, empirical, and significantly more reproducible. (What happens if you're on AOSP 12 or 16, and I'm on 15? The GUI shall differ.) Regardless, I'll try. However, the sole thing that I imagine that you might require documentation for, might be invoking the application in freeform mode, because the rest is very basic. If so, see the screenshot that I've uploaded to [`android.stackexchange.com/revisions/261679/1`](https://android.stackexchange.com/revisions/261679/1#:~:text=can%20from%20com.android.quickstep.RecentsActivity?-,Screenshot,-Context). If not, as aforestated, please elaborate on specifics. > If the scope is not the ntfy app but some emulation tool, I'm gonna leave that to other contributors. I've already informed you that I reproduced everything I've stated on a bare-metal AOSP installation on real, consumer hardware. I wouldn't even recommend an emulator for this, due to [`farmerbb/Taskbar/issues/352`](https://github.com/farmerbb/Taskbar/issues/352#issue-3762551323) [^1] making this difficult to confirm outside of real OS installations. [^1]: [`reddit.com/r/GooglePixel/comments/1nvn3qm/comment/nvy18j1`](https://www.reddit.com/r/GooglePixel/comments/1nvn3qm/comment/nvy18j1/?context=3&utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button) --- @mpeter50, after writing all that I just did, I've realised that you've more courteously and helpfully explained all that I have, so consider this to be a corroboration; my sincere thanks for all of your assistance thus far. @binwiederhier, I hope that these, combined, explain.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ntfy#440
No description provided.