Youtube search back stack management created. Need some optimization.

This commit is contained in:
Tristan Roux
2019-02-02 01:28:21 +01:00
parent c5bcab66c6
commit 5e65048639
5 changed files with 106 additions and 92 deletions

View File

@@ -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;
}

View File

@@ -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<TabLayout>(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);

View File

@@ -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<Song> tracks = new List<Song>();
@@ -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)

View File

@@ -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<Suggestion> History = new List<Suggestion>();
@@ -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();
}

View File

@@ -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<YtFile> 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<RecyclerView>(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<TabLayout>(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);
}
}
}