mirror of
https://github.com/zoriya/Opus.git
synced 2025-12-06 06:26:15 +00:00
Youtube search back stack management created. Need some optimization.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user