From c5bcab66c6501014511f5a8e99ec178121573bc0 Mon Sep 17 00:00:00 2001 From: Tristan Roux Date: Thu, 31 Jan 2019 22:08:39 +0100 Subject: [PATCH] Reworking backstack management for view pagers and for the playlist view. --- MusicApp/MainActivity.cs | 56 +++++++++++-------- MusicApp/Resources/Portable Class/Browse.cs | 2 +- .../Resources/Portable Class/FolderBrowse.cs | 1 + .../Resources/Portable Class/FolderTracks.cs | 9 +++ .../Resources/Portable Class/PagerFragment.cs | 27 ++++++--- MusicApp/Resources/Portable Class/Playlist.cs | 10 +--- .../Portable Class/PlaylistTracks.cs | 21 ++++--- .../Resources/Portable Class/YoutubeEngine.cs | 14 +---- 8 files changed, 80 insertions(+), 60 deletions(-) diff --git a/MusicApp/MainActivity.cs b/MusicApp/MainActivity.cs index 5a0f208..42f31d6 100644 --- a/MusicApp/MainActivity.cs +++ b/MusicApp/MainActivity.cs @@ -397,9 +397,16 @@ namespace MusicApp { if(item.ItemId == Android.Resource.Id.Home) { - if (PlaylistTracks.instance != null) + if (PlaylistTracks.instance != null || FolderTracks.instance != null) { - SupportFragmentManager.BeginTransaction().Remove(PlaylistTracks.instance).Commit(); + Console.WriteLine("&PlaylistTrack back"); + for (int i = 0; i < SupportFragmentManager.BackStackEntryCount; i++) + { + Console.WriteLine("&Back stack entry " + i + ": " + SupportFragmentManager.GetBackStackEntryAt(i)); + } + + SupportFragmentManager.PopBackStack(); + //SupportFragmentManager.BeginTransaction().Remove(PlaylistTracks.instance).Commit(); } else if (YoutubeEngine.instances != null) { @@ -412,15 +419,10 @@ namespace MusicApp SupportActionBar.SetDisplayHomeAsUpEnabled(false); YoutubeEngine.instances = null; } - else if (FolderTracks.instance != null) - { - HideSearch(); - SupportActionBar.SetHomeButtonEnabled(false); - SupportActionBar.SetDisplayHomeAsUpEnabled(false); - SupportActionBar.Title = "MusicApp"; - FolderTracks.instance = null; - SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(0, 1)).Commit(); - } + //else if (FolderTracks.instance != null) + //{ + // SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(0, 1)).Commit(); + //} } else if(item.ItemId == Resource.Id.search) { @@ -436,19 +438,28 @@ namespace MusicApp public bool OnMenuItemActionCollapse(IMenuItem item) //Youtube search collapse { - if (YoutubeEngine.instances == null) + Console.WriteLine("&Youtube Search Collapse"); + if (YoutubeEngine.instances == null || PlaylistTracks.openned) return true; - if(Browse.instance != null) + Console.WriteLine("&Youtube instnace != null"); + for (int i = 0; i < SupportFragmentManager.BackStackEntryCount; i++) { - YoutubeEngine.instances = null; - SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(0, 0)).Commit(); - } - else if (YoutubeEngine.instances != null && !PlaylistTracks.openned) - { - YoutubeEngine.instances = null; - SupportFragmentManager.PopBackStack(); + Console.WriteLine("&Back stack entry " + i + ": " + SupportFragmentManager.GetBackStackEntryAt(i)); } + SupportFragmentManager.PopBackStack(); + //if (Browse.instance != null) + //{ + // Console.WriteLine("&Browse insatnce != null"); + // YoutubeEngine.instances = null; + // SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(0, 0)).Commit(); + //} + //else if (YoutubeEngine.instances != null && !PlaylistTracks.openned) + //{ + // Console.WriteLine("&Backstack"); + // YoutubeEngine.instances = null; + // SupportFragmentManager.PopBackStack(); + //} return true; } @@ -1071,10 +1082,7 @@ namespace MusicApp } else { - if(PlaylistTracks.instance != null) - SupportFragmentManager.BeginTransaction().Remove(PlaylistTracks.instance).CommitNow(); - - SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(1, 0)).AddToBackStack(null).Commit(); + SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(1, 0)).AddToBackStack("Youtube").Commit(); } SearchableActivity.instance = null; } diff --git a/MusicApp/Resources/Portable Class/Browse.cs b/MusicApp/Resources/Portable Class/Browse.cs index 958151d..41bc2e7 100644 --- a/MusicApp/Resources/Portable Class/Browse.cs +++ b/MusicApp/Resources/Portable Class/Browse.cs @@ -75,7 +75,7 @@ namespace MusicApp.Resources.Portable_Class public static Fragment NewInstance() { - if(instance == null) + if (instance == null) instance = new Browse { Arguments = new Bundle() }; return instance; } diff --git a/MusicApp/Resources/Portable Class/FolderBrowse.cs b/MusicApp/Resources/Portable Class/FolderBrowse.cs index 3f2cd4d..a5b491f 100644 --- a/MusicApp/Resources/Portable Class/FolderBrowse.cs +++ b/MusicApp/Resources/Portable Class/FolderBrowse.cs @@ -53,6 +53,7 @@ namespace MusicApp.Resources.Portable_Class public override void OnDestroy() { + System.Console.WriteLine("&Destroy called"); MainActivity.instance.contentRefresh.Refresh -= OnRefresh; if (isEmpty) { diff --git a/MusicApp/Resources/Portable Class/FolderTracks.cs b/MusicApp/Resources/Portable Class/FolderTracks.cs index 8827fa5..214de9f 100644 --- a/MusicApp/Resources/Portable Class/FolderTracks.cs +++ b/MusicApp/Resources/Portable Class/FolderTracks.cs @@ -267,5 +267,14 @@ namespace MusicApp.Resources.Portable_Class base.OnResume(); instance = this; } + + public override void OnDestroyView() + { + MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(false); + MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(false); + MainActivity.instance.SupportActionBar.Title = "MusicApp"; + MainActivity.instance.HideSearch(); + base.OnDestroyView(); + } } } \ No newline at end of file diff --git a/MusicApp/Resources/Portable Class/PagerFragment.cs b/MusicApp/Resources/Portable Class/PagerFragment.cs index 507c4a0..223276f 100644 --- a/MusicApp/Resources/Portable Class/PagerFragment.cs +++ b/MusicApp/Resources/Portable Class/PagerFragment.cs @@ -13,12 +13,6 @@ namespace MusicApp.Resources.Portable_Class private int type; private int pos; - - public override void OnCreate(Bundle savedInstanceState) - { - base.OnCreate(savedInstanceState); - } - public static Fragment NewInstance(int type, int pos) { instance = new Pager { Arguments = new Bundle() }; @@ -29,6 +23,13 @@ namespace MusicApp.Resources.Portable_Class public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + //if(savedInstanceState != null) + //{ + // System.Console.WriteLine("&Instance state restored"); + // type = savedInstanceState.GetInt("type"); + // pos = savedInstanceState.GetInt("pos"); + //} + View view = inflater.Inflate(Resource.Layout.ViewPager, container, false); TabLayout tabs = Activity.FindViewById(Resource.Id.tabs); ViewPager pager = view.FindViewById(Resource.Id.pager); @@ -42,7 +43,7 @@ namespace MusicApp.Resources.Portable_Class tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.songs))); tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.folders))); - adapter = new ViewPagerAdapter(Activity.SupportFragmentManager); + adapter = new ViewPagerAdapter(ChildFragmentManager); adapter.AddFragment(Browse.NewInstance(), Resources.GetString(Resource.String.songs)); adapter.AddFragment(FolderBrowse.NewInstance(), Resources.GetString(Resource.String.folders)); @@ -65,7 +66,7 @@ namespace MusicApp.Resources.Portable_Class tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.lives))); tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.channels))); - ViewPagerAdapter adapter = new ViewPagerAdapter(Activity.SupportFragmentManager); + ViewPagerAdapter adapter = new ViewPagerAdapter(ChildFragmentManager); Fragment[] fragment = YoutubeEngine.NewInstances(YoutubeEngine.searchKeyWorld); adapter.AddFragment(fragment[0], Resources.GetString(Resource.String.all)); adapter.AddFragment(fragment[1], Resources.GetString(Resource.String.tracks)); @@ -161,6 +162,8 @@ namespace MusicApp.Resources.Portable_Class base.OnDestroyView(); Browse.instance = null; FolderBrowse.instance = null; + YoutubeEngine.instances = null; + adapter?.Dispose(); TabLayout tabs = Activity.FindViewById(Resource.Id.tabs); @@ -171,5 +174,13 @@ namespace MusicApp.Resources.Portable_Class instance = null; } + + //public override void OnSaveInstanceState(Bundle outState) + //{ + // base.OnSaveInstanceState(outState); + // System.Console.WriteLine("&Pager insatnce state saved"); + // outState.PutInt("type", type); + // outState.PutInt("pos", View.FindViewById(Resource.Id.pager).CurrentItem); + //} } } \ No newline at end of file diff --git a/MusicApp/Resources/Portable Class/Playlist.cs b/MusicApp/Resources/Portable Class/Playlist.cs index c8b50bf..cec0ae0 100644 --- a/MusicApp/Resources/Portable Class/Playlist.cs +++ b/MusicApp/Resources/Portable Class/Playlist.cs @@ -446,21 +446,17 @@ namespace MusicApp.Resources.Portable_Class return; } - AppCompatActivity act = (AppCompatActivity)Activity; - act.SupportActionBar.SetHomeButtonEnabled(true); - act.SupportActionBar.SetDisplayHomeAsUpEnabled(true); - act.SupportActionBar.Title = playlist.Name; instance = null; MainActivity.instance.contentRefresh.Refresh -= OnRefresh; MainActivity.instance.contentRefresh.Refresh -= OnRefresh; if (playlist.SyncState == SyncState.True || playlist.SyncState == SyncState.Loading) - MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.YoutubeID, playlist.LocalID, playlist.Name, playlist.HasWritePermission, true, playlist.Owner, playlist.Count, playlist.ImageURL)).AddToBackStack(null).Commit(); + MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.YoutubeID, playlist.LocalID, playlist.Name, playlist.HasWritePermission, true, playlist.Owner, playlist.Count, playlist.ImageURL)).AddToBackStack("Playlist Track").Commit(); else if (local || (playlist.SyncState == SyncState.Error && playlist.LocalID != 0 && playlist.LocalID != -1)) - MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.LocalID, playlist.Name)).AddToBackStack(null).Commit(); + MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.LocalID, playlist.Name)).AddToBackStack("Playlist Track").Commit(); else - MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.YoutubeID, playlist.Name, playlist.HasWritePermission, true, playlist.Owner, playlist.Count, playlist.ImageURL)).AddToBackStack(null).Commit(); + MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlist.YoutubeID, playlist.Name, playlist.HasWritePermission, true, playlist.Owner, playlist.Count, playlist.ImageURL)).AddToBackStack("Playlist Track").Commit(); } private void ListView_ItemLongClick(object sender, int position) diff --git a/MusicApp/Resources/Portable Class/PlaylistTracks.cs b/MusicApp/Resources/Portable Class/PlaylistTracks.cs index a4af7cc..0bfeb1f 100644 --- a/MusicApp/Resources/Portable Class/PlaylistTracks.cs +++ b/MusicApp/Resources/Portable Class/PlaylistTracks.cs @@ -61,6 +61,9 @@ namespace MusicApp.Resources.Portable_Class MainActivity.instance.FindViewById(Resource.Id.contentLayout).SetPadding(0, 0, 0, 0); MainActivity.instance.FindViewById(Resource.Id.toolbar).SetPadding(0, statusHeight, 0, 0); MainActivity.instance.FindViewById(Resource.Id.toolbar).LayoutParameters.Height += statusHeight; + MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(true); + MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(true); + MainActivity.instance.SupportActionBar.Title = playlistName; } public bool OnMenuItemClick(IMenuItem item) @@ -241,7 +244,7 @@ namespace MusicApp.Resources.Portable_Class dialog.Show(); } - public override void OnStop() + public override void OnDestroyView() { Activity.FindViewById(Resource.Id.headerMore).Click -= PlaylistMore; @@ -283,18 +286,18 @@ namespace MusicApp.Resources.Portable_Class if (YoutubeEngine.instances[i].focused) selectedTab = i; } - if (!navigating) - { - MainActivity.instance?.SupportFragmentManager.BeginTransaction().Attach(YoutubeEngine.instances[selectedTab]).Commit(); - MainActivity.instance?.SupportFragmentManager.BeginTransaction().Remove(instance).Commit(); - } + //if (!navigating) + //{ + // MainActivity.instance?.SupportFragmentManager.BeginTransaction().Attach(YoutubeEngine.instances[selectedTab]).Commit(); + // MainActivity.instance?.SupportFragmentManager.BeginTransaction().Remove(instance).Commit(); + //} } - else if (!navigating && Queue.instance == null) - MainActivity.instance.SupportFragmentManager.PopBackStack(); + //else if (!navigating && Queue.instance == null) + // MainActivity.instance.SupportFragmentManager.PopBackStack(); instance = null; } - base.OnStop(); + base.OnDestroyView(); } public static async Task CompleteItem(Song song, string YoutubeID) diff --git a/MusicApp/Resources/Portable Class/YoutubeEngine.cs b/MusicApp/Resources/Portable Class/YoutubeEngine.cs index 1277943..6304bfc 100644 --- a/MusicApp/Resources/Portable Class/YoutubeEngine.cs +++ b/MusicApp/Resources/Portable Class/YoutubeEngine.cs @@ -417,20 +417,12 @@ namespace MusicApp.Resources.Portable_Class Play(item.YoutubeID, item.Title, item.Artist, item.Album); break; case YtKind.Playlist: - ViewGroup rootView = Activity.FindViewById(Android.Resource.Id.Content); - rootView.RemoveView(LoadingView); - foreach(YoutubeEngine instance in instances) - { - rootView.RemoveView(instance.EmptyView); - } - - MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(true); - MainActivity.instance.SupportActionBar.Title = item.Title; PlaylistTracks.openned = true; MainActivity.instance.menu.FindItem(Resource.Id.search).CollapseActionView(); MainActivity.instance.FindViewById(Resource.Id.tabs).Visibility = ViewStates.Gone; - MainActivity.instance.SupportFragmentManager.BeginTransaction().Add(Resource.Id.contentView, PlaylistTracks.NewInstance(item.YoutubeID, item.Title, false, false, item.Artist, -1, item.Album)).Commit(); - MainActivity.instance.SupportFragmentManager.BeginTransaction().Detach(this).Commit(); + MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(item.YoutubeID, item.Title, false, false, item.Artist, -1, item.Album)).AddToBackStack("Playlist Track").Commit(); + //MainActivity.instance.SupportFragmentManager.BeginTransaction().Add(Resource.Id.contentView, PlaylistTracks.NewInstance(item.YoutubeID, item.Title, false, false, item.Artist, -1, item.Album)).Commit(); + //MainActivity.instance.SupportFragmentManager.BeginTransaction().Detach(this).Commit(); break; default: break;