From 5e650486395cd5d8bd56396cf1b88346f16d3dae Mon Sep 17 00:00:00 2001 From: Tristan Roux Date: Sat, 2 Feb 2019 01:28:21 +0100 Subject: [PATCH] Youtube search back stack management created. Need some optimization. --- MusicApp/MainActivity.cs | 54 ++++-------- .../Resources/Portable Class/PagerFragment.cs | 42 ++++++--- .../Portable Class/PlaylistTracks.cs | 5 +- .../Portable Class/SearchableActivity.cs | 11 ++- .../Resources/Portable Class/YoutubeEngine.cs | 86 ++++++++++++------- 5 files changed, 106 insertions(+), 92 deletions(-) diff --git a/MusicApp/MainActivity.cs b/MusicApp/MainActivity.cs index 42f31d6..f1e20e8 100644 --- a/MusicApp/MainActivity.cs +++ b/MusicApp/MainActivity.cs @@ -40,6 +40,7 @@ using System.Net; using System.Threading.Tasks; using YoutubeExplode; using CursorLoader = Android.Support.V4.Content.CursorLoader; +using Fragment = Android.Support.V4.App.Fragment; using ICallback = Square.OkHttp.ICallback; using Playlist = MusicApp.Resources.Portable_Class.Playlist; using Request = Square.OkHttp.Request; @@ -439,7 +440,7 @@ namespace MusicApp public bool OnMenuItemActionCollapse(IMenuItem item) //Youtube search collapse { Console.WriteLine("&Youtube Search Collapse"); - if (YoutubeEngine.instances == null || PlaylistTracks.openned) + if (YoutubeEngine.instances == null || SearchableActivity.IgnoreMyself) return true; Console.WriteLine("&Youtube instnace != null"); @@ -448,18 +449,6 @@ namespace MusicApp 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; } @@ -480,25 +469,15 @@ namespace MusicApp public void OnFocusChange(View v, bool hasFocus) { - if (hasFocus && !PlaylistTracks.openned) + if (hasFocus && !SearchableActivity.IgnoreMyself) { Bundle animation = ActivityOptionsCompat.MakeCustomAnimation(this, Android.Resource.Animation.FadeIn, Android.Resource.Animation.FadeOut).ToBundle(); StartActivity(new Intent(this, typeof(SearchableActivity)), animation); } - PlaylistTracks.openned = false; + SearchableActivity.IgnoreMyself = false; } - public void SearchOnYoutube(string query) - { - YoutubeEngine.searchKeyWorld = query; - IMenuItem searchItem = menu.FindItem(Resource.Id.search); - SearchView searchView = (SearchView)searchItem.ActionView; - searchView.SetQuery(query, false); - searchView.ClearFocus(); - searchView.Focusable = false; - } - - public void CancelSearch() + public void CancelSearch() //SearchableActivity is finishing and no search has been made { IMenuItem searchItem = menu.FindItem(Resource.Id.search); searchItem.CollapseActionView(); @@ -1072,18 +1051,19 @@ namespace MusicApp else if(MusicPlayer.UseCastPlayer) MusicPlayer.GetQueueFromCast(); - if (SearchableActivity.instance != null && SearchableActivity.instance.searched) + if (SearchableActivity.instance != null && SearchableActivity.instance.SearchQuery != null && SearchableActivity.instance.SearchQuery != "") { - if (YoutubeEngine.instances != null) - { -#pragma warning disable CS4014 - foreach (YoutubeEngine instance in YoutubeEngine.instances) - instance.Search(YoutubeEngine.searchKeyWorld, instance.querryType, true); - } - else - { - SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(1, 0)).AddToBackStack("Youtube").Commit(); - } +// if (YoutubeEngine.instances != null) +// { +//#pragma warning disable CS4014 +// foreach (YoutubeEngine instance in YoutubeEngine.instances) +// instance.Search(SearchableActivity.instance.SearchQuery, instance.querryType, true); + +// SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.instance).AddToBackStack("Youtube").Commit(); +// } +// else + SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Pager.NewInstance(SearchableActivity.instance.SearchQuery, 0)).AddToBackStack("Youtube").Commit(); + SearchableActivity.instance = null; } diff --git a/MusicApp/Resources/Portable Class/PagerFragment.cs b/MusicApp/Resources/Portable Class/PagerFragment.cs index 223276f..630f154 100644 --- a/MusicApp/Resources/Portable Class/PagerFragment.cs +++ b/MusicApp/Resources/Portable Class/PagerFragment.cs @@ -11,6 +11,7 @@ namespace MusicApp.Resources.Portable_Class public static Pager instance; private ViewPagerAdapter adapter; private int type; + private string query; private int pos; public static Fragment NewInstance(int type, int pos) @@ -21,14 +22,23 @@ namespace MusicApp.Resources.Portable_Class return instance; } + public static Fragment NewInstance(string query, int pos) + { + instance = new Pager { Arguments = new Bundle() }; + instance.type = 1; + instance.query = query; + instance.pos = pos; + return instance; + } + 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"); - //} + 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); @@ -58,7 +68,7 @@ namespace MusicApp.Resources.Portable_Class tabs.TabMode = TabLayout.ModeFixed; tabs.SetScrollPosition(pos, 0f, true); } - else if (type == 1 || type == 2) + else if (type == 1) { tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.all))); tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.tracks))); @@ -67,7 +77,7 @@ namespace MusicApp.Resources.Portable_Class tabs.AddTab(tabs.NewTab().SetText(Resources.GetString(Resource.String.channels))); ViewPagerAdapter adapter = new ViewPagerAdapter(ChildFragmentManager); - Fragment[] fragment = YoutubeEngine.NewInstances(YoutubeEngine.searchKeyWorld); + Fragment[] fragment = YoutubeEngine.NewInstances(query); adapter.AddFragment(fragment[0], Resources.GetString(Resource.String.all)); adapter.AddFragment(fragment[1], Resources.GetString(Resource.String.tracks)); adapter.AddFragment(fragment[2], Resources.GetString(Resource.String.playlists)); @@ -84,7 +94,7 @@ namespace MusicApp.Resources.Portable_Class tabs.TabMode = TabLayout.ModeScrollable; tabs.SetScrollPosition(pos, 0f, true); - YoutubeEngine.instances[pos].focused = true; + YoutubeEngine.instances[pos].IsFocused = true; YoutubeEngine.instances[pos].OnFocus(); } return view; @@ -103,7 +113,7 @@ namespace MusicApp.Resources.Portable_Class { foreach (YoutubeEngine instance in YoutubeEngine.instances) { - if (instance.focused) + if (instance.IsFocused) { instance.ListView.SmoothScrollToPosition(0); } @@ -148,11 +158,11 @@ namespace MusicApp.Resources.Portable_Class { foreach (YoutubeEngine instance in YoutubeEngine.instances) { - if (instance.focused) + if (instance.IsFocused) instance.OnUnfocus(); - instance.focused = false; + instance.IsFocused = false; } - YoutubeEngine.instances[position].focused = true; + YoutubeEngine.instances[position].IsFocused = true; YoutubeEngine.instances[position].OnFocus(); } } @@ -175,6 +185,12 @@ namespace MusicApp.Resources.Portable_Class instance = null; } + public override void OnViewStateRestored(Bundle savedInstanceState) + { + base.OnViewStateRestored(savedInstanceState); + System.Console.WriteLine("&View state restored"); + } + //public override void OnSaveInstanceState(Bundle outState) //{ // base.OnSaveInstanceState(outState); diff --git a/MusicApp/Resources/Portable Class/PlaylistTracks.cs b/MusicApp/Resources/Portable Class/PlaylistTracks.cs index 0bfeb1f..f5b53a8 100644 --- a/MusicApp/Resources/Portable Class/PlaylistTracks.cs +++ b/MusicApp/Resources/Portable Class/PlaylistTracks.cs @@ -44,7 +44,6 @@ namespace MusicApp.Resources.Portable_Class public bool isEmpty = false; public bool lastVisible = false; public bool useHeader = true; - public static bool openned = false; public bool navigating = false; public List tracks = new List(); @@ -277,13 +276,13 @@ namespace MusicApp.Resources.Portable_Class Android.Support.V7.Widget.SearchView searchView = (Android.Support.V7.Widget.SearchView)MainActivity.instance.menu.FindItem(Resource.Id.search).ActionView; searchView.Focusable = false; MainActivity.instance.menu.FindItem(Resource.Id.search).ExpandActionView(); - searchView.SetQuery(YoutubeEngine.searchKeyWorld, false); + searchView.SetQuery(YoutubeEngine.instances[0].Query, false); searchView.ClearFocus(); int selectedTab = 0; for (int i = 0; i < YoutubeEngine.instances.Length; i++) { - if (YoutubeEngine.instances[i].focused) + if (YoutubeEngine.instances[i].IsFocused) selectedTab = i; } //if (!navigating) diff --git a/MusicApp/Resources/Portable Class/SearchableActivity.cs b/MusicApp/Resources/Portable Class/SearchableActivity.cs index fdac216..7824e81 100644 --- a/MusicApp/Resources/Portable Class/SearchableActivity.cs +++ b/MusicApp/Resources/Portable Class/SearchableActivity.cs @@ -21,8 +21,9 @@ namespace MusicApp.Resources.Portable_Class public class SearchableActivity : AppCompatActivity, IMenuItemOnActionExpandListener { public static SearchableActivity instance; + public static bool IgnoreMyself = false; public SearchView searchView; - public bool searched = false; + public string SearchQuery = null; private ListView ListView; private SuggestionAdapter adapter; private List History = new List(); @@ -47,7 +48,6 @@ namespace MusicApp.Resources.Portable_Class ListView.DividerHeight = 0; ListView.ItemClick += (sender, e) => { - searched = true; searchView.SetQuery(suggestions[e.Position].Text, true); }; ListView.ItemLongClick += (sender, e) => @@ -118,7 +118,7 @@ namespace MusicApp.Resources.Portable_Class suggestions = items.ConvertAll(StringToSugest); suggestions.InsertRange(0, History.Where(x => x.Text.StartsWith(e.NewText))); - if(!searched) + if(SearchQuery == null || SearchQuery == "") RunOnUiThread(new Java.Lang.Runnable(() => { ListView.Adapter = new SuggestionAdapter(instance, Resource.Layout.SuggestionLayout, suggestions); })); } } @@ -134,11 +134,10 @@ namespace MusicApp.Resources.Portable_Class }; searchView.QueryTextSubmit += (s, e) => { - searched = true; + SearchQuery = e.NewText; AddQueryToHistory(e.NewText); Finish(); OverridePendingTransition(Android.Resource.Animation.FadeIn, Android.Resource.Animation.FadeOut); - MainActivity.instance.SearchOnYoutube(e.NewText); e.Handled = true; }; searchItem.SetOnActionExpandListener(this); @@ -190,7 +189,7 @@ namespace MusicApp.Resources.Portable_Class { base.OnStop(); Window.SetNavigationBarColor(Android.Graphics.Color.Transparent); - if (!searched && YoutubeEngine.instances == null) + if ((SearchQuery == null || SearchQuery == "") && YoutubeEngine.instances == null) MainActivity.instance.CancelSearch(); } diff --git a/MusicApp/Resources/Portable Class/YoutubeEngine.cs b/MusicApp/Resources/Portable Class/YoutubeEngine.cs index 6304bfc..9602fd3 100644 --- a/MusicApp/Resources/Portable Class/YoutubeEngine.cs +++ b/MusicApp/Resources/Portable Class/YoutubeEngine.cs @@ -22,6 +22,7 @@ using TagLib; using YoutubeExplode; using YoutubeExplode.Models; using CursorLoader = Android.Support.V4.Content.CursorLoader; +using SearchView = Android.Support.V7.Widget.SearchView; namespace MusicApp.Resources.Portable_Class { @@ -29,13 +30,13 @@ namespace MusicApp.Resources.Portable_Class { public static YoutubeEngine[] instances; public static YouTubeService youtubeService; - public static string searchKeyWorld; + public string Query; public static bool error = false; private bool isEmpty = false; private string nextPageToken = null; public string querryType; - public bool focused = false; + public bool IsFocused = false; public RecyclerView ListView; public List result; @@ -44,18 +45,24 @@ namespace MusicApp.Resources.Portable_Class public ProgressBar LoadingView; private bool searching; - public override void OnActivityCreated(Bundle savedInstanceState) + + public YoutubeEngine(string Query, string querryType) { - base.OnActivityCreated(savedInstanceState); - ListView.ScrollChange += OnScroll; + this.Query = Query; + this.querryType = querryType; + } + + public override void OnCreate(Bundle savedInstanceState) + { + base.OnCreate(savedInstanceState); MainActivity.instance.contentRefresh.Refresh += OnRefresh; } private async void OnRefresh(object sender, EventArgs e) { - if (focused) + if (IsFocused) { - await Search(searchKeyWorld, querryType, false); + await Search(Query, querryType, false); MainActivity.instance.contentRefresh.Refreshing = false; } } @@ -74,7 +81,7 @@ namespace MusicApp.Resources.Portable_Class { searching = true; SearchResource.ListRequest searchResult = youtubeService.Search.List("snippet"); - searchResult.Q = searchKeyWorld.Replace(" ", "+-"); + searchResult.Q = Query.Replace(" ", "+-"); searchResult.PageToken = nextPageToken; searchResult.TopicId = "/m/04rlf"; switch (querryType) @@ -168,19 +175,19 @@ namespace MusicApp.Resources.Portable_Class switch (querryType) { case "All": - EmptyView.Text = "No result for " + searchKeyWorld; + EmptyView.Text = "No result for " + Query; break; case "Tracks": - EmptyView.Text = "No track for " + searchKeyWorld; + EmptyView.Text = "No track for " + Query; break; case "Playlists": - EmptyView.Text = "No playlist for " + searchKeyWorld; + EmptyView.Text = "No playlist for " + Query; break; case "Lives": - EmptyView.Text = "No lives for " + searchKeyWorld; + EmptyView.Text = "No lives for " + Query; break; case "Channels": - EmptyView.Text = "No channel for " + searchKeyWorld; + EmptyView.Text = "No channel for " + Query; break; default: break; @@ -194,20 +201,14 @@ namespace MusicApp.Resources.Portable_Class public static Fragment[] NewInstances(string searchQuery) { - searchKeyWorld = searchQuery; instances = new YoutubeEngine[] { - new YoutubeEngine { Arguments = new Bundle() }, - new YoutubeEngine { Arguments = new Bundle() }, - new YoutubeEngine { Arguments = new Bundle() }, - new YoutubeEngine { Arguments = new Bundle() }, - new YoutubeEngine { Arguments = new Bundle() }, + new YoutubeEngine(searchQuery, "All"), + new YoutubeEngine(searchQuery, "Tracks"), + new YoutubeEngine(searchQuery, "Playlists"), + new YoutubeEngine(searchQuery, "Lives"), + new YoutubeEngine(searchQuery, "Channels") }; - instances[0].querryType = "All"; - instances[1].querryType = "Tracks"; - instances[2].querryType = "Playlists"; - instances[3].querryType = "Lives"; - instances[4].querryType = "Channels"; return instances; } @@ -219,19 +220,31 @@ namespace MusicApp.Resources.Portable_Class ListView = view.FindViewById(Resource.Id.recycler); ListView.SetLayoutManager(new LinearLayoutManager(Android.App.Application.Context)); ListView.SetItemAnimator(new DefaultItemAnimator()); + ListView.ScrollChange += OnScroll; + + if (savedInstanceState != null) + Query = savedInstanceState.GetString("Query"); #pragma warning disable CS4014 - Search(searchKeyWorld, querryType, true); + Search(Query, querryType, true); return view; } public async Task Search(string search, string querryType, bool loadingBar) { + SearchableActivity.IgnoreMyself = true; + IMenuItem searchItem = MainActivity.instance.menu.FindItem(Resource.Id.search); + searchItem.ExpandActionView(); + SearchView searchView = (SearchView)searchItem.ActionView; + searchView.SetQuery(search, false); + searchView.ClearFocus(); + searchView.Focusable = false; + if (search == null || search == "" || error) return; searching = true; - searchKeyWorld = search; + Query = search; if (loadingBar) { @@ -241,7 +254,9 @@ namespace MusicApp.Resources.Portable_Class LoadingView.Visibility = ViewStates.Visible; } - if(!await MainActivity.instance.WaitForYoutube()) + SearchableActivity.IgnoreMyself = false; + + if (!await MainActivity.instance.WaitForYoutube()) { error = true; ListView.SetAdapter(null); @@ -368,7 +383,7 @@ namespace MusicApp.Resources.Portable_Class { isEmpty = true; - if (focused) + if (IsFocused) { switch (querryType) { @@ -382,7 +397,7 @@ namespace MusicApp.Resources.Portable_Class EmptyView.Text = "No playlist for " + search; break; case "Lives": - EmptyView.Text = "No lives for " + searchKeyWorld; + EmptyView.Text = "No lives for " + Query; break; case "Channels": EmptyView.Text = "No channel for " + search; @@ -400,7 +415,7 @@ namespace MusicApp.Resources.Portable_Class catch (System.Net.Http.HttpRequestException) { MainActivity.instance.Timout(); - if (focused) + if (IsFocused) { EmptyView.Text = "Timout exception, check if you're still connected to internet."; EmptyView.Visibility = ViewStates.Visible; @@ -417,12 +432,10 @@ namespace MusicApp.Resources.Portable_Class Play(item.YoutubeID, item.Title, item.Artist, item.Album); break; case YtKind.Playlist: - PlaylistTracks.openned = true; + SearchableActivity.IgnoreMyself = true; MainActivity.instance.menu.FindItem(Resource.Id.search).CollapseActionView(); MainActivity.instance.FindViewById(Resource.Id.tabs).Visibility = ViewStates.Gone; 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; @@ -1061,6 +1074,13 @@ namespace MusicApp.Resources.Portable_Class DownloadFiles(names.ToArray(), videoIDs.ToArray(), playlist); } + + public override void OnSaveInstanceState(Bundle outState) + { + outState.PutString("Query", Query); + Console.WriteLine("&Youtube engine state saved - query = " + Query); + base.OnSaveInstanceState(outState); + } } } \ No newline at end of file