Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Android, 9.0 Preview 7] Blue notification / action bar started to appear on all modal pages #24232

Closed
janne-hmp opened this issue Aug 14, 2024 · 18 comments
Labels
area-controls-modal i/regression This issue described a confirmed regression on a currently supported version p/0 Work that we can't release without platform/android 🤖 t/bug Something isn't working
Milestone

Comments

@janne-hmp
Copy link

janne-hmp commented Aug 14, 2024

Description

Compared to .NET MAUI 9.0 Preview 6, Preview 7 shows a blue notification / action bar on every modal page on Android, and it seems impossible to turn it off. MainPage does not have the blue bar, and it fades in when any other page (all modals) is opened. Does anybody know how disable the notification /action bar so that it does not appear on modal pages, similar to how it worked in Preview 6? (The blue bar used to be all black and empty in Preview 6.)

share_1412216750542625141

Steps to Reproduce

  1. Build GnollHackM at https://github.com/hyvanmielenpelit/GnollHack using .NET 9.0 Preview 7 and start the app.
  2. The first page (MainPage) does not have the blue notification bar.
  3. Go to About page. When the page opens, also the blue notification bar fades in, unlike if you build the app in Preview 6

Link to public reproduction project repository

https://github.com/hyvanmielenpelit/MauiAndroidBlueBarReproduction

Version with bug

Unknown/Other

Is this a regression from previous behavior?

Yes, this used to work in .NET MAUI

Last version that worked well

Unknown/Other

Affected platforms

Android

Affected platform versions

Android 14

Did you find any workaround?

No.

Relevant log output

No response

@janne-hmp janne-hmp added the t/bug Something isn't working label Aug 14, 2024
Copy link
Contributor

Hi I'm an AI powered bot that finds similar issues based off the issue title.

Please view the issues below to see if they solve your problem, and if the issue describes your problem please consider closing this one and thumbs upping the other issue to help us prioritize it. Thank you!

Open similar issues:

Closed similar issues:

Note: You can give me feedback by thumbs upping or thumbs downing this comment.

@jfversluis

This comment was marked as outdated.

@jfversluis jfversluis added platform/android 🤖 potential-regression This issue described a possible regression on a currently supported version., verification pending labels Aug 14, 2024
@mattleibow
Copy link
Member

Does this happen in the File | New template for you?

@jfversluis
Copy link
Member

Can you change these values here: https://github.com/hyvanmielenpelit/GnollHack/blob/a198e58835dac23f6cb5e539919e09c39d8cc768/win/win32/xpl/GnollHackM/Platforms/Android/Resources/values/colors.xml#L4

And let us know if that influences the behavior?

I think this always worked this way, I wonder why this changed between preview 6 and 7?

@janne-hmp
Copy link
Author

The notification bar used to be hidden, i.e., empty with just black. It is still like that on the game's MainPage, but then suddenly the bar fades in on all other pages (?). This may be related to Android SDK version 35 somehow.

share_3601464497344331126

@janne-hmp
Copy link
Author

Yes, changing PrimaryDark to "#000000" (<color name="colorPrimaryDark">#000000</color>) did change the notification bar's background color to black, but obviously did not hide it. The notification bar fades in when a modal page scrolls in, and fades out when the modal page scrolls out. Note also that there is both the top bar and the bottom bar on modal pages, while on MainPage there's neither.

Currently, the system bars are hidden using the following Android functions in MainActivity, which seems to work on MainPage, but not on modal pages anymore. (Also, Xamarin Android works still just fine using the same code.)

        Window.AddFlags(WindowManagerFlags.Fullscreen);
...
            activity.Window.SetDecorFitsSystemWindows(false);
            activity.Window.InsetsController?.Hide(WindowInsets.Type.SystemBars());
            if (activity.Window.InsetsController != null)
                activity.Window.InsetsController.SystemBarsBehavior = (int)WindowInsetsControllerBehavior.ShowTransientBarsBySwipe;

There's a remark in Visual Studio that SetDecorFitsSystemWindows has been obsoleted in Android SDK version 35. That does not seem to explain though, why things work on MainPage, but not on modal pages.

share_1297602274416553086

@janne-hmp
Copy link
Author

janne-hmp commented Aug 14, 2024

This may have something to do with the fact that App.Current.MainPage was deprecated and I had changed App.Current.MainPage.Navigation.PushModalAsync(page) to App.Current.Windows[0].Navigation.PushModalAsync(page). I now also tried just Navigation.PushModalAsync(page) (via ContentPage), but the result stays the same.

EDIT: In .NET 8.0: The default MAUI project seems to work just fine in this respect, but I have still no idea what my app does differently from the default app in showing modal pages. In GnollHack, I did override OnCreateWindow as per the Preview 7 instructions but setting App.MainPage instead of overridden window creation does not seem to help here.

EDIT: In .NET 9.0 Preview 7, the same blue bar appears in the default MAUI app on Android on a modal page, when you hide the bars as per the other comments.

@PureWeen PureWeen added this to the 9.0-rc1 milestone Aug 14, 2024
@PureWeen PureWeen added p/0 Work that we can't release without i/regression This issue described a confirmed regression on a currently supported version and removed potential-regression This issue described a possible regression on a currently supported version., verification pending labels Aug 14, 2024
@janne-hmp
Copy link
Author

I can also confirm that this happens in the default MAUI app in 9.0 Preview 7 when you hide the bars as per above:

        Window.AddFlags(WindowManagerFlags.Fullscreen);
...
            activity.Window.SetDecorFitsSystemWindows(false);
            activity.Window.InsetsController?.Hide(WindowInsets.Type.SystemBars());
            if (activity.Window.InsetsController != null)
                activity.Window.InsetsController.SystemBarsBehavior = (int)WindowInsetsControllerBehavior.ShowTransientBarsBySwipe;

I tested earlier accidently 8.0, which worked fine.

The main page (no blue bar):

share_6032163884974552140

There's a modal page added to the click button (it is mostly all beige), and when it opens the page, the blue bar and the bottom navigation bar both fade in, also resulting in janky readjustment of the screen size:

share_5964786855831932218

If anybody knows any workarounds for this, let me know, or should I just wait for RC1?

@janne-hmp
Copy link
Author

I can confirm this still happens in RC1.

@maonaoda
Copy link
Contributor

Need a way to modify dialog.Window before model(dialog) is displayed
eg:set BarColor to Transparent

            window.ClearFlags(WindowManagerFlags.TranslucentStatus);
            window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
            window.SetStatusBarColor(Android.Graphics.Color.Transparent);
            window.SetNavigationBarColor(Android.Graphics.Color.Transparent);

public override global::Android.App.Dialog OnCreateDialog(Bundle? savedInstanceState)
{
var dialog = new CustomComponentDialog(RequireContext(), Theme);
if (dialog is null || dialog.Window is null)
throw new InvalidOperationException($"{dialog} or {dialog?.Window} is null, and it's invalid");
dialog.Window.SetBackgroundDrawable(TransparentColorDrawable);
return dialog;
}

@pictos
Copy link
Contributor

pictos commented Sep 30, 2024

@janne-hmp can you share a simple sample that reproduces your issue? The attached repo is a huge project, which makes hard to focus on the real issue. Thanks in advance

@janne-hmp
Copy link
Author

@janne-hmp can you share a simple sample that reproduces your issue? The attached repo is a huge project, which makes hard to focus on the real issue. Thanks in advance

Sure, here you go: https://github.com/hyvanmielenpelit/MauiAndroidBlueBarReproduction

Let me know if you have any questions. I will also update the repro repo in this issue.

@janne-hmp
Copy link
Author

I would like to further note that that I added a full screen dotnet bot picture on the main page background so that you can additionally see its janky adjustment when you open or close the modal window when the system bars fade in / out. That alone is pretty annoying in a production quality game.

@pictos
Copy link
Contributor

pictos commented Oct 2, 2024

Thanks @janne-hmp!

@tranb3r
Copy link

tranb3r commented Oct 2, 2024

@pictos Maybe you can take a look at this issue (and repro) at the same time? (could be the same problem) #24903

@janne-hmp
Copy link
Author

I just tested that this still happens in RC2, too.

@pictos
Copy link
Contributor

pictos commented Oct 9, 2024

@janne-hmp and others, now modal pages uses a DialogFragment and it has it own Window, so you need to configure that window to match whatever you've for your or MainActivity, here you can find how to do it.

@janne-hmp
Copy link
Author

Thanks a lot! I now added the following code to MauiProgram.cs, and the modal windows now do not have system bars anymore, as before:

            .ConfigureLifecycleEvents(static lifecycleBuilder =>
            {
            #if ANDROID
                lifecycleBuilder.AddAndroid(androidLifecycleBuilder =>
                {
                    androidLifecycleBuilder.OnCreate((activity, savedInstance) =>
                    {
                        if (activity is ComponentActivity componentActivity)
                        {
                            componentActivity.GetFragmentManager()?.RegisterFragmentLifecycleCallbacks(new MyFragmentLifecycleCallbacks((fragmentManager, fragment) =>
                            {
                                // Modals in MAUI in NET9 use DialogFragment
                                if (fragment is AndroidX.Fragment.App.DialogFragment dialogFragment)
                                {
                                    if (Build.VERSION.SdkInt >= BuildVersionCodes.R)
                                    {
#pragma warning disable CA1416 // Supported on: 'android' 30.0 and later
                                        dialogFragment.Dialog!.Window!.SetDecorFitsSystemWindows(false);
                                        dialogFragment.Dialog!.Window!.InsetsController?.Hide(WindowInsets.Type.SystemBars());
                                        if (dialogFragment.Dialog!.Window!.InsetsController != null)
                                            dialogFragment.Dialog!.Window!.InsetsController.SystemBarsBehavior = (int)WindowInsetsControllerBehavior.ShowTransientBarsBySwipe;
#pragma warning restore CA1416 // Supported on: 'android' 30.0 and later
                                    }
                                    else
                                    {
#pragma warning disable CS0618 // Type or member is obsolete
                                        SystemUiFlags systemUiVisibility = (SystemUiFlags)dialogFragment.Dialog!.Window!.DecorView.SystemUiVisibility;
                                        systemUiVisibility |= SystemUiFlags.HideNavigation;
                                        systemUiVisibility |= SystemUiFlags.Immersive;
                                        dialogFragment.Dialog!.Window!.DecorView.SystemUiVisibility = (StatusBarVisibility)systemUiVisibility;
#pragma warning restore CS0618 // Type or member is obsolete
                                    }
                                }
                            }), false);
                        }
                    });
                });
            #endif
            })

There's also the following code at the end of the page:

#if ANDROID
public class MyFragmentLifecycleCallbacks(Action<AndroidX.Fragment.App.FragmentManager, AndroidX.Fragment.App.Fragment> onFragmentStarted) : AndroidX.Fragment.App.FragmentManager.FragmentLifecycleCallbacks
{
    public override void OnFragmentStarted(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment f)
    {
        onFragmentStarted?.Invoke(fm, f);
        base.OnFragmentStarted(fm, f);
    }
}
#endif

@github-project-automation github-project-automation bot moved this from Cut from this Milestone to Done in MAUI SDK Ongoing Oct 10, 2024
@github-actions github-actions bot locked and limited conversation to collaborators Nov 9, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-controls-modal i/regression This issue described a confirmed regression on a currently supported version p/0 Work that we can't release without platform/android 🤖 t/bug Something isn't working
Projects
Status: Done
Development

No branches or pull requests

8 participants