using Android.Content; using Android.Views; using Android.Widget; using Google.Android.Material.BottomNavigation; using Google.Android.Material.Tabs; using Microsoft.Maui.Handlers; using System; using Xamarin.Forms; using Xamarin.Forms.Clinical6.UI.Controls; using Xamarin.Forms.Clinical6.Views; namespace MAUI.Clinical6.Platforms.Android.Controls { public partial class DashboardTabbedPageHandler : ViewHandler { private TabLayout _tabLayout; private BottomNavigationView _bottomNavigationView; private TextView _badgeView; private TabbedPage _page; private int _lastItemId = -1; // Use MauiContext.Context when you need Android context private Context ContextAndroid => MauiContext?.Context; public DashboardTabbedPageHandler() : base(DashboardTabbedPageMapper) { } protected override FrameLayout CreatePlatformView() { return new FrameLayout(ContextAndroid); } protected override void ConnectHandler(FrameLayout platformView) { base.ConnectHandler(platformView); if (VirtualView == null) return; _page = VirtualView; _page.CurrentPageChanged += Page_CurrentPageChanged; if (_page is DashboardTabPage dashboardPage) { dashboardPage.DashboardBadgeEvent += DashboardBadgeEventHandler; } platformView.Post(() => SetupBottomNavigation(platformView)); } protected override void DisconnectHandler(FrameLayout platformView) { base.DisconnectHandler(platformView); if (_page != null) { _page.CurrentPageChanged -= Page_CurrentPageChanged; if (_page is DashboardTabPage dashboardPage) dashboardPage.DashboardBadgeEvent -= DashboardBadgeEventHandler; } if (_bottomNavigationView != null) { _bottomNavigationView.SetOnItemSelectedListener(null); _bottomNavigationView.SetOnItemReselectedListener(null); _bottomNavigationView = null; } } private void Page_CurrentPageChanged(object sender, EventArgs e) { MainThread.BeginInvokeOnMainThread(() => { try { if (_bottomNavigationView != null) _bottomNavigationView.SelectedItemId = _lastItemId; } catch (ObjectDisposedException disposedExc) { _page.CurrentPageChanged -= Page_CurrentPageChanged; Console.WriteLine($"DashboardTabbedPageHandler Disposed Exception: {disposedExc}"); } }); } private void DashboardBadgeEventHandler(object sender, int count) { MainThread.BeginInvokeOnMainThread(() => UpdateBadge(count)); } private void SetupBottomNavigation(FrameLayout platformView) { for (int i = 0; i < platformView.ChildCount; i++) { if (platformView.GetChildAt(i) is RelativeLayout layout) { for (int j = 0; j < layout.ChildCount; j++) { if (layout.GetChildAt(j) is BottomNavigationView bottomNav) { _bottomNavigationView = bottomNav; // Attach listener objects _bottomNavigationView.SetOnItemSelectedListener(new ItemSelectedListener(_page, ref _lastItemId)); _bottomNavigationView.SetOnItemReselectedListener(new ItemReselectedListener(_page, ref _lastItemId)); return; } } } } } private void UpdateBadge(int count) { try { if (_bottomNavigationView == null) return; if (count == 0) { RemoveBadge(); return; } if (_badgeView == null) { var menuView = (BottomNavigationMenuView)_bottomNavigationView.GetChildAt(0); var itemView = (BottomNavigationItemView)menuView.GetChildAt(0); var badgeLayout = LayoutInflater.From(ContextAndroid).Inflate(Resource.Layout.CustomTabLayout, itemView, true); _badgeView = badgeLayout.FindViewById(Resource.Id.text_badge); } _badgeView.Visibility = ViewStates.Visible; _badgeView.Text = count.ToString(); } catch (Exception ex) { Console.WriteLine(ex); } } private void RemoveBadge() { if (_bottomNavigationView == null) return; if (_badgeView == null) { var menuView = (BottomNavigationMenuView)_bottomNavigationView.GetChildAt(0); var itemView = (BottomNavigationItemView)menuView.GetChildAt(0); var badgeLayout = LayoutInflater.From(ContextAndroid).Inflate(Resource.Layout.CustomTabLayout, itemView, true); _badgeView = badgeLayout.FindViewById(Resource.Id.text_badge); } _badgeView.Visibility = ViewStates.Gone; _badgeView.Text = "0"; } private class ItemSelectedListener : Java.Lang.Object, BottomNavigationView.IOnItemSelectedListener { private readonly TabbedPage _page; private int _lastItemId; public ItemSelectedListener(TabbedPage page, ref int lastItemId) { _page = page; _lastItemId = lastItemId; } public bool OnNavigationItemSelected(IMenuItem item) { _lastItemId = item.ItemId; if (_page != null && _lastItemId >= 0 && _lastItemId < _page.Children.Count) _page.CurrentPage = _page.Children[_lastItemId]; return true; } } private class ItemReselectedListener : Java.Lang.Object, BottomNavigationView.IOnItemReselectedListener { private readonly TabbedPage _page; private int _lastItemId; public ItemReselectedListener(TabbedPage page, ref int lastItemId) { _page = page; _lastItemId = lastItemId; } public void OnNavigationItemReselected(IMenuItem item) { _lastItemId = item.ItemId; if (_page != null && _lastItemId >= 0 && _lastItemId < _page.Children.Count) _page.CurrentPage = _page.Children[_lastItemId]; } } // Default property mapper for DashboardTabbedPageHandler public static IPropertyMapper DashboardTabbedPageMapper = new PropertyMapper(ViewHandler.ViewMapper); } }