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