Finishing the channel details view, need to finish transition from and to it.

This commit is contained in:
Anonymus Raccoon
2019-06-25 02:02:24 +02:00
parent 1661e9f6b1
commit e376f53701
21 changed files with 568 additions and 499 deletions

View File

@@ -0,0 +1,57 @@
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using Opus.DataStructure;
using System.Collections.Generic;
using System.Threading.Tasks;
using Channel = Opus.DataStructure.Channel;
namespace Opus.Api
{
public class ChannelManager
{
/// <summary>
/// Return a complete Channel object from the youtube id of the channel
/// </summary>
/// <param name="channelID"></param>
/// <returns></returns>
public async static Task<Channel> GetChannel(string channelID)
{
ChannelsResource.ListRequest request = YoutubeManager.YoutubeService.Channels.List("snippet");
request.Id = channelID;
ChannelListResponse response = await request.ExecuteAsync();
if (response.Items.Count > 0)
{
var result = response.Items[0];
return new Channel(result.Snippet.Title, channelID, result.Snippet.Thumbnails.High.Url);
}
else
return null;
}
/// <summary>
/// Return a list of complete Channel objects from the youtube ids of the channels
/// </summary>
/// <param name="channelID"></param>
/// <returns></returns>
public async static Task<IEnumerable<Channel>> GetChannels(IEnumerable<string> channelIDs)
{
ChannelsResource.ListRequest request = YoutubeManager.YoutubeService.Channels.List("snippet");
request.Id = string.Join(";", channelIDs);
ChannelListResponse response = await request.ExecuteAsync();
if (response.Items.Count > 0)
{
List<Channel> channels = new List<Channel>();
foreach (var result in response.Items)
channels.Add(new Channel(result.Snippet.Title, result.Id, result.Snippet.Thumbnails.High.Url));
return channels;
}
else
return null;
}
}
}

View File

@@ -39,23 +39,30 @@ namespace Opus.Api
/// <returns></returns> /// <returns></returns>
public static async Task<PlaylistItem> GetPlaylist(string playlistID) public static async Task<PlaylistItem> GetPlaylist(string playlistID)
{ {
PlaylistsResource.ListRequest request = YoutubeManager.YoutubeService.Playlists.List("snippet"); try
request.Id = playlistID;
PlaylistListResponse response = await request.ExecuteAsync();
if (response.Items.Count > 0)
{ {
Playlist result = response.Items[0]; PlaylistsResource.ListRequest request = YoutubeManager.YoutubeService.Playlists.List("snippet");
return new PlaylistItem(result.Snippet.Title, -1, playlistID) request.Id = playlistID;
PlaylistListResponse response = await request.ExecuteAsync();
if (response.Items.Count > 0)
{ {
HasWritePermission = false, return new PlaylistItem(response.Items[0].Snippet.Title, -1, playlistID)
ImageURL = result.Snippet.Thumbnails.High.Url, {
Owner = result.Snippet.ChannelTitle HasWritePermission = false,
}; ImageURL = response.Items[0].Snippet.Thumbnails.Standard.Url,
Owner = response.Items[0].Snippet.ChannelTitle
};
}
else
return null;
} }
else catch(Exception ex)
{
Console.WriteLine("&Get playlist catch called, ex: " + ex.Message);
return null; return null;
}
} }
#region PlayInOrder #region PlayInOrder

View File

@@ -21,7 +21,7 @@ using Com.Google.Android.Exoplayer2.Trackselection;
using Com.Google.Android.Exoplayer2.Upstream; using Com.Google.Android.Exoplayer2.Upstream;
using Com.Google.Android.Exoplayer2.Util; using Com.Google.Android.Exoplayer2.Util;
using Newtonsoft.Json; using Newtonsoft.Json;
using Opus.Code.Api; using Opus.Api;
using Opus.DataStructure; using Opus.DataStructure;
using Opus.Fragments; using Opus.Fragments;
using Opus.Others; using Opus.Others;
@@ -974,7 +974,7 @@ namespace Opus.Api.Services
} }
else else
{ {
SongParser.playPosition = -1; SongParser.playPosition = -2;
currentID = position; currentID = position;
Play(song, StartFromOldPosition ? LastTimer : -1, false); Play(song, StartFromOldPosition ? LastTimer : -1, false);
} }

View File

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
using YoutubeExplode; using YoutubeExplode;
using YoutubeExplode.Models; using YoutubeExplode.Models;
namespace Opus.Code.Api namespace Opus.Api
{ {
public class SongParser public class SongParser
{ {
@@ -20,7 +20,7 @@ namespace Opus.Code.Api
/// <summary> /// <summary>
/// The reference of the play item. The song parser will start the playback of this queue item as soon as possible. /// The reference of the play item. The song parser will start the playback of this queue item as soon as possible.
/// </summary> /// </summary>
public static int playPosition = -1; public static int playPosition = -2;
private int queuePosition = -1; private int queuePosition = -1;
private bool canceled = false; private bool canceled = false;
@@ -154,7 +154,7 @@ namespace Opus.Code.Api
} }
MusicPlayer.instance.Play(song, -1, queuePosition == -1); MusicPlayer.instance.Play(song, -1, queuePosition == -1);
playPosition = -1; playPosition = -2;
} }
Video video = await client.GetVideoAsync(song.YoutubeID); Video video = await client.GetVideoAsync(song.YoutubeID);
@@ -187,7 +187,7 @@ namespace Opus.Code.Api
if(playPosition == queuePosition) if(playPosition == queuePosition)
{ {
playPosition = -1; playPosition = -2;
Queue.instance.RefreshCurrent(); Queue.instance.RefreshCurrent();
Player.instance?.Ready(); Player.instance?.Ready();
MainActivity.instance.Timout(); MainActivity.instance.Timout();
@@ -206,7 +206,7 @@ namespace Opus.Code.Api
if (playPosition == queuePosition) if (playPosition == queuePosition)
{ {
playPosition = -1; playPosition = -2;
Queue.instance.RefreshCurrent(); Queue.instance.RefreshCurrent();
Player.instance?.Ready(); Player.instance?.Ready();
} }
@@ -223,7 +223,7 @@ namespace Opus.Code.Api
if (playPosition == queuePosition) if (playPosition == queuePosition)
{ {
playPosition = -1; playPosition = -2;
Queue.instance.RefreshCurrent(); Queue.instance.RefreshCurrent();
Player.instance?.Ready(); Player.instance?.Ready();
} }
@@ -237,7 +237,7 @@ namespace Opus.Code.Api
if (playPosition == queuePosition) if (playPosition == queuePosition)
{ {
playPosition = -1; playPosition = -2;
Queue.instance.RefreshCurrent(); Queue.instance.RefreshCurrent();
Player.instance?.Ready(); Player.instance?.Ready();
MainActivity.instance.UnknowError(ErrorCode.SP1, null, Snackbar.LengthLong); MainActivity.instance.UnknowError(ErrorCode.SP1, null, Snackbar.LengthLong);
@@ -245,7 +245,7 @@ namespace Opus.Code.Api
} }
if (playPosition == queuePosition) if (playPosition == queuePosition)
playPosition = -1; playPosition = -2;
queuePosition = -1; queuePosition = -1;
instances.Remove(this); instances.Remove(this);
return song; return song;

View File

@@ -11,6 +11,7 @@ namespace Opus.DataStructure
public List<Song> contentValue; public List<Song> contentValue;
public List<PlaylistItem> playlistContent; public List<PlaylistItem> playlistContent;
public List<Channel> channelContent; public List<Channel> channelContent;
public PlaylistItem playlist;
public RecyclerView recycler; public RecyclerView recycler;
public Section(string sectionTitle, SectionType contentType) public Section(string sectionTitle, SectionType contentType)
@@ -26,6 +27,14 @@ namespace Opus.DataStructure
this.contentValue = contentValue; this.contentValue = contentValue;
} }
public Section(string sectionTitle, SectionType contentType, List<Song> contentValue, PlaylistItem playlist)
{
SectionTitle = sectionTitle;
this.contentType = contentType;
this.contentValue = contentValue;
this.playlist = playlist;
}
public Section(string sectionTitle, SectionType contentType, List<PlaylistItem> playlistContent) public Section(string sectionTitle, SectionType contentType, List<PlaylistItem> playlistContent)
{ {
SectionTitle = sectionTitle; SectionTitle = sectionTitle;

View File

@@ -313,13 +313,12 @@ namespace Opus
{ {
if(item.ItemId == Android.Resource.Id.Home) if(item.ItemId == Android.Resource.Id.Home)
{ {
if (PlaylistTracks.instance != null || FolderTracks.instance != null) if (PlaylistTracks.instance != null || FolderTracks.instance != null || ChannelDetails.instance != null)
{ {
Console.WriteLine("&PlaylistTrack back"); //for (int i = 0; i < SupportFragmentManager.BackStackEntryCount; i++)
for (int i = 0; i < SupportFragmentManager.BackStackEntryCount; i++) //{
{ // Console.WriteLine("&Back stack entry " + i + ": " + SupportFragmentManager.GetBackStackEntryAt(i));
Console.WriteLine("&Back stack entry " + i + ": " + SupportFragmentManager.GetBackStackEntryAt(i)); //}
}
SupportFragmentManager.PopBackStack(); SupportFragmentManager.PopBackStack();
} }

View File

@@ -13,59 +13,86 @@ using System.Collections.Generic;
namespace Opus.Adapter namespace Opus.Adapter
{ {
public class HomeListAdapter : RecyclerView.Adapter public class SmallListAdapter : RecyclerView.Adapter
{ {
public RecyclerView recycler; public RecyclerView recycler;
public int listPadding = 0; public List<Channel> channels;
public List<Song> channels;
public List<PlaylistItem> playlists; public List<PlaylistItem> playlists;
public List<Song> allItems;
private readonly bool UseChannel; private readonly bool UseChannel;
public bool expanded = false; public bool expanded = false;
public override int ItemCount => UseChannel ? (expanded ? (channels.Count > 3 ? 3 : channels.Count) : channels.Count) : public override int ItemCount
expanded ? (playlists.Count > 3 ? 3 : playlists.Count) : playlists.Count; {
get
{
if ((UseChannel && channels == null) || (!UseChannel && playlists == null))
return 1;
public HomeListAdapter(List<Song> channels, RecyclerView recycler) return UseChannel? (expanded? (channels.Count > 3 ? 3 : channels.Count) : channels.Count) :
expanded? (playlists.Count > 3 ? 3 : playlists.Count) : playlists.Count;
}
}
public SmallListAdapter(List<Channel> channels, RecyclerView recycler)
{ {
this.recycler = recycler; this.recycler = recycler;
this.channels = channels; this.channels = channels;
UseChannel = true; UseChannel = true;
} }
public HomeListAdapter(List<PlaylistItem> playlists, RecyclerView recycler) public SmallListAdapter(List<PlaylistItem> playlists, RecyclerView recycler)
{ {
this.recycler = recycler; this.recycler = recycler;
this.playlists = playlists; this.playlists = playlists;
UseChannel = false; UseChannel = false;
} }
public SmallListAdapter(bool UseChannel, RecyclerView recycler)
{
this.recycler = recycler;
this.UseChannel = UseChannel;
}
public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
{ {
SongHolder holder = (SongHolder)viewHolder; if (position == 0 && ((UseChannel && channels == null) || (!UseChannel && playlists == null)))
if(UseChannel)
{ {
holder.Title.Text = channels[position].Title; EmptyHolder holder = (EmptyHolder)viewHolder;
Picasso.With(Application.Context).Load(channels[position].Album).Placeholder(Resource.Color.background_material_dark).Transform(new CircleTransformation()).Into(holder.AlbumArt); holder.text.Text = MainActivity.instance.GetString(Resource.String.long_loading);
holder.ItemView.SetPadding(4, 1, 4, 1); holder.text.SetHeight(MainActivity.instance.DpToPx(157));
} }
else else
{ {
holder.Title.Text = playlists[position].Name; SongHolder holder = (SongHolder)viewHolder;
Picasso.With(Application.Context).Load(playlists[position].ImageURL).Placeholder(Resource.Color.background_material_dark).Resize(400, 400).CenterCrop().Into(holder.AlbumArt);
if(!holder.RightButtons.FindViewById<ImageButton>(Resource.Id.play).HasOnClickListeners) if (UseChannel)
{ {
//Only support local playlists for now. holder.Title.Text = channels[position].Name;
holder.RightButtons.FindViewById<ImageButton>(Resource.Id.play).Click += (sender, e) => { PlaylistManager.PlayInOrder(playlists[position]); }; Picasso.With(Application.Context).Load(channels[position].ImageURL).Placeholder(Resource.Color.background_material_dark).Transform(new CircleTransformation()).Into(holder.AlbumArt);
holder.RightButtons.FindViewById<ImageButton>(Resource.Id.shuffle).Click += (sender, e) => { PlaylistManager.Shuffle(playlists[position]); }; holder.ItemView.SetPadding(4, 1, 4, 1);
}
else
{
holder.Title.Text = playlists[position].Name;
Picasso.With(Application.Context).Load(playlists[position].ImageURL).Placeholder(Resource.Color.background_material_dark).Resize(400, 400).CenterCrop().Into(holder.AlbumArt);
if (!holder.RightButtons.FindViewById<ImageButton>(Resource.Id.play).HasOnClickListeners)
{
//Only support local playlists for now.
holder.RightButtons.FindViewById<ImageButton>(Resource.Id.play).Click += (sender, e) => { PlaylistManager.PlayInOrder(playlists[position]); };
holder.RightButtons.FindViewById<ImageButton>(Resource.Id.shuffle).Click += (sender, e) => { PlaylistManager.Shuffle(playlists[position]); };
}
} }
} }
} }
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{ {
if(UseChannel) if ((UseChannel && channels == null) || (!UseChannel && playlists == null))
{
View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.EmptyView, parent, false);
return new EmptyHolder(itemView);
}
else if (UseChannel)
{ {
View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.HomeChannel, parent, false); View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.HomeChannel, parent, false);
return new SongHolder(itemView, OnClick, OnLongClick); return new SongHolder(itemView, OnClick, OnLongClick);
@@ -80,15 +107,9 @@ namespace Opus.Adapter
void OnClick(int position) void OnClick(int position)
{ {
if(UseChannel) if(UseChannel)
{ MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, ChannelDetails.NewInstance(channels[position])).AddToBackStack("Channel Details").Commit();
//Open a channel view
}
else else
{
MainActivity.instance.contentRefresh.Refresh -= Home.instance.OnRefresh;
Home.instance = null;
MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlists[position])).AddToBackStack("Playlist Track").Commit(); MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(playlists[position])).AddToBackStack("Playlist Track").Commit();
}
} }
void OnLongClick(int position) { } void OnLongClick(int position) { }

View File

@@ -59,7 +59,7 @@ namespace Opus.Adapter
if (position == 0 && isEmpty) if (position == 0 && isEmpty)
{ {
EmptyHolder holder = (EmptyHolder)viewHolder; EmptyHolder holder = (EmptyHolder)viewHolder;
holder.text.Text = "No song currently in queue,\nstart playing song now !"; holder.text.Text = UseQueue ? MainActivity.instance.GetString(Resource.String.empty_queue) : MainActivity.instance.GetString(Resource.String.long_loading);
holder.text.SetHeight(MainActivity.instance.DpToPx(157)); holder.text.SetHeight(MainActivity.instance.DpToPx(157));
return; return;
} }

View File

@@ -7,8 +7,8 @@ using Android.Text;
using Android.Text.Style; using Android.Text.Style;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
using Opus.Api;
using Opus.Api.Services; using Opus.Api.Services;
using Opus.Code.Api;
using Opus.DataStructure; using Opus.DataStructure;
using Opus.Others; using Opus.Others;
using Square.Picasso; using Square.Picasso;

View File

@@ -70,10 +70,10 @@ namespace Opus.Adapter
MainActivity.instance.ShowPlayer(); MainActivity.instance.ShowPlayer();
Player.instance.ShowQueue(); Player.instance.ShowQueue();
}; };
if(MusicPlayer.CurrentID() != -1 && MusicPlayer.CurrentID() <= MusicPlayer.queue.Count) if (MusicPlayer.CurrentID() != -1 && MusicPlayer.CurrentID() <= MusicPlayer.queue.Count)
holder.recycler.ScrollToPosition(MusicPlayer.CurrentID()); holder.recycler.ScrollToPosition(MusicPlayer.CurrentID());
} }
else if(items[position].SectionTitle == null) else if (items[position].SectionTitle == null)
{ {
//The playlist is loading //The playlist is loading
holder.recycler.SetAdapter(new LineAdapter(new List<Song>(), holder.recycler)); holder.recycler.SetAdapter(new LineAdapter(new List<Song>(), holder.recycler));
@@ -85,65 +85,109 @@ namespace Opus.Adapter
holder.more.Click += (sender, e) => holder.more.Click += (sender, e) =>
{ {
position = holder.AdapterPosition; position = holder.AdapterPosition;
//MainActivity.instance.contentRefresh.Refresh -= Home.instance.OnRefresh; if (items[position].playlist == null)
//Home.instance = null; MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(items[position].contentValue, items[position].SectionTitle)).AddToBackStack(null).Commit();
MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(items[position].contentValue, items[position].SectionTitle)).AddToBackStack(null).Commit(); else
MainActivity.instance.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, PlaylistTracks.NewInstance(items[position].playlist)).AddToBackStack(null).Commit();
}; };
} }
} }
else if(items[position].contentType == SectionType.ChannelList) else if (items[position].contentType == SectionType.ChannelList)
{ {
LineSongHolder holder = (LineSongHolder)viewHolder; LineSongHolder holder = (LineSongHolder)viewHolder;
items[position].recycler = holder.recycler; items[position].recycler = holder.recycler;
holder.title.Text = items[position].SectionTitle; holder.title.Text = items[position].SectionTitle;
holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Vertical, false)); holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Vertical, false));
holder.recycler.SetAdapter(new HomeListAdapter(items[position].contentValue.GetRange(0, items[position].contentValue.Count > 4 ? 4 : items[position].contentValue.Count), holder.recycler) { allItems = items[position].contentValue.GetRange(4, items[position].contentValue.Count - 4) });
((GradientDrawable)holder.more.Background).SetStroke(5, Android.Content.Res.ColorStateList.ValueOf(Color.Argb(255, 21, 183, 237))); if(items[position].channelContent != null)
holder.more.SetTextColor(Color.Argb(255, 21, 183, 237));
holder.more.Text = ((HomeListAdapter)holder.recycler.GetAdapter()).channels.Count > 4 ? "View Less" : "View More";
holder.more.Click += (sender, e) =>
{ {
HomeListAdapter adapter = (HomeListAdapter)holder.recycler.GetAdapter(); holder.recycler.SetAdapter(new SmallListAdapter(items[position].channelContent.GetRange(0, items[position].channelContent.Count > 4 ? 4 : items[position].channelContent.Count), holder.recycler));
if(adapter.ItemCount == 4)
if (items[position].channelContent.Count > 4)
{ {
adapter.channels.AddRange(items[position].contentValue.GetRange(4, items[position].contentValue.Count - 4)); holder.more.Visibility = ViewStates.Visible;
adapter.NotifyItemRangeInserted(4, items[position].contentValue.Count - 4); ((GradientDrawable)holder.more.Background).SetStroke(5, Android.Content.Res.ColorStateList.ValueOf(Color.Argb(255, 21, 183, 237)));
holder.more.Text = "View Less"; holder.more.SetTextColor(Color.Argb(255, 21, 183, 237));
holder.more.Text = ((SmallListAdapter)holder.recycler.GetAdapter()).channels.Count > 4 ? MainActivity.instance.GetString(Resource.String.view_less) : MainActivity.instance.GetString(Resource.String.view_more);
holder.more.Click += (sender, e) =>
{
SmallListAdapter adapter = (SmallListAdapter)holder.recycler.GetAdapter();
if (adapter.ItemCount == 4)
{
adapter.channels.AddRange(items[position].channelContent.GetRange(4, items[position].channelContent.Count - 4));
adapter.NotifyItemRangeInserted(4, items[position].channelContent.Count - 4);
holder.more.Text = MainActivity.instance.GetString(Resource.String.view_less);
}
else
{
int count = adapter.channels.Count - 4;
adapter.channels.RemoveRange(4, count);
adapter.NotifyItemRangeRemoved(4, count);
holder.more.Text = MainActivity.instance.GetString(Resource.String.view_more);
}
};
} }
else else
{ holder.more.Visibility = ViewStates.Gone;
int count = adapter.channels.Count - 4; }
adapter.channels.RemoveRange(4, count); else
adapter.NotifyItemRangeRemoved(4, count); {
holder.more.Text = "View More"; holder.recycler.SetAdapter(new SmallListAdapter(false, holder.recycler));
} }
};
} }
else if (items[position].contentType == SectionType.PlaylistList) else if (items[position].contentType == SectionType.PlaylistList)
{ {
LineSongHolder holder = (LineSongHolder)viewHolder; LineSongHolder holder = (LineSongHolder)viewHolder;
items[position].recycler = holder.recycler;
holder.title.Text = items[position].SectionTitle; holder.title.Text = items[position].SectionTitle;
holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Vertical, false)); holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Vertical, false));
holder.recycler.SetAdapter(new HomeListAdapter(items[position].playlistContent.GetRange(0, items[position].playlistContent.Count > 4 ? 4 : items[position].playlistContent.Count), holder.recycler)); if (items[position].playlistContent != null)
holder.more.Click += (sender, e) => { MainActivity.instance.FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.playlistLayout; }; {
holder.recycler.SetAdapter(new SmallListAdapter(items[position].playlistContent.GetRange(0, items[position].playlistContent.Count > 4 ? 4 : items[position].playlistContent.Count), holder.recycler));
if (ChannelDetails.instance != null)
{
if (items[position].playlistContent.Count > 4)
{
holder.more.Visibility = ViewStates.Visible;
((GradientDrawable)holder.more.Background).SetStroke(5, Android.Content.Res.ColorStateList.ValueOf(Color.Argb(255, 21, 183, 237)));
holder.more.SetTextColor(Color.Argb(255, 21, 183, 237));
holder.more.Text = ((SmallListAdapter)holder.recycler.GetAdapter()).playlists.Count > 4 ? MainActivity.instance.GetString(Resource.String.view_less) : MainActivity.instance.GetString(Resource.String.view_more);
holder.more.Click += (sender, e) =>
{
SmallListAdapter adapter = (SmallListAdapter)holder.recycler.GetAdapter();
if (adapter.ItemCount == 4)
{
adapter.playlists.AddRange(items[position].playlistContent.GetRange(4, items[position].playlistContent.Count - 4));
adapter.NotifyItemRangeInserted(4, items[position].playlistContent.Count - 4);
holder.more.Text = MainActivity.instance.GetString(Resource.String.view_less);
}
else
{
int count = adapter.playlists.Count - 4;
adapter.playlists.RemoveRange(4, count);
adapter.NotifyItemRangeRemoved(4, count);
holder.more.Text = MainActivity.instance.GetString(Resource.String.view_more);
}
};
}
else
holder.more.Visibility = ViewStates.Gone;
}
else
{
holder.more.Click += (sender, e) => { MainActivity.instance.FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.playlistLayout; };
holder.more.Visibility = ViewStates.Visible;
}
}
else
{
holder.recycler.SetAdapter(new SmallListAdapter(true, holder.recycler));
holder.more.Visibility = ViewStates.Gone;
}
} }
//else if(items[position].contentType == SectionType.TopicSelector)
//{
// LineSongHolder holder = (LineSongHolder)viewHolder;
// items[position].recycler = holder.recycler;
// holder.title.Text = items[position].SectionTitle;
// holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Vertical, false));
// holder.recycler.SetAdapter(new HomeListAdapter(items[position].contentValue));
// holder.more.Click += (sender, e) =>
// {
// Intent intent = new Intent(MainActivity.instance, typeof(Preferences));
// MainActivity.instance.StartActivity(intent);
// };
//}
} }
void OnClick(int position) void OnClick(int position)
@@ -173,7 +217,11 @@ namespace Opus.Adapter
else if (items[position].contentType == SectionType.ChannelList) else if (items[position].contentType == SectionType.ChannelList)
return 1; return 1;
else if (items[position].contentType == SectionType.PlaylistList) else if (items[position].contentType == SectionType.PlaylistList)
{
if (ChannelDetails.instance != null)
return 1; //We want to display the playlists with the same view as the channels for this fragment.
return 2; return 2;
}
else else
return 4; return 4;
} }

View File

@@ -1,39 +1,32 @@
using Android.Content; using Android.OS;
using Android.Database;
using Android.Net;
using Android.OS;
using Android.Support.Design.Widget; using Android.Support.Design.Widget;
using Android.Support.V4.App; using Android.Support.V4.App;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
using Java.Lang;
using Opus.Adapter; using Opus.Adapter;
using Opus.Api; using Opus.Api;
using Opus.DataStructure; using Opus.DataStructure;
using Opus.Others; using Opus.Others;
using Square.Picasso; using Square.Picasso;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using YoutubeExplode; using YoutubeExplode;
using static Android.Provider.MediaStore.Audio;
using CursorLoader = Android.Support.V4.Content.CursorLoader;
using PlaylistItem = Opus.DataStructure.PlaylistItem; using PlaylistItem = Opus.DataStructure.PlaylistItem;
using PopupMenu = Android.Support.V7.Widget.PopupMenu;
using RecyclerView = Android.Support.V7.Widget.RecyclerView; using RecyclerView = Android.Support.V7.Widget.RecyclerView;
using SearchView = Android.Support.V7.Widget.SearchView; using SearchView = Android.Support.V7.Widget.SearchView;
using Toolbar = Android.Support.V7.Widget.Toolbar; using Toolbar = Android.Support.V7.Widget.Toolbar;
namespace Opus.Fragments namespace Opus.Fragments
{ {
public class ChannelDetails : Fragment, /*PopupMenu.IOnMenuItemClickListener,*/ AppBarLayout.IOnOffsetChangedListener public class ChannelDetails : Fragment, AppBarLayout.IOnOffsetChangedListener
{ {
public static ChannelDetails instance; public static ChannelDetails instance;
private Channel item; private Channel item;
private TextView EmptyView;
private RecyclerView ListView; private RecyclerView ListView;
private SectionAdapter adapter; private SectionAdapter adapter;
private List<Section> sections = new List<Section>(); private readonly List<Section> sections = new List<Section>();
public override void OnActivityCreated(Bundle savedInstanceState) public override void OnActivityCreated(Bundle savedInstanceState)
{ {
@@ -83,7 +76,6 @@ namespace Opus.Fragments
public override void OnDestroyView() public override void OnDestroyView()
{ {
//MainActivity.instance.RemoveFilterListener(Search);
if (!MainActivity.instance.Paused) if (!MainActivity.instance.Paused)
{ {
Activity.FindViewById(Resource.Id.playlistButtons).Visibility = ViewStates.Visible; Activity.FindViewById(Resource.Id.playlistButtons).Visibility = ViewStates.Visible;
@@ -92,8 +84,8 @@ namespace Opus.Fragments
MainActivity.instance.HideSearch(); MainActivity.instance.HideSearch();
MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(false); MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(false);
MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(false); MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(false);
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true);
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(false); MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(false);
MainActivity.instance.FindViewById(Resource.Id.toolbarLogo).Visibility = ViewStates.Visible;
MainActivity.instance.contentRefresh.Refresh -= OnRefresh; MainActivity.instance.contentRefresh.Refresh -= OnRefresh;
Activity.FindViewById<AppBarLayout>(Resource.Id.appbar).RemoveOnOffsetChangedListener(this); Activity.FindViewById<AppBarLayout>(Resource.Id.appbar).RemoveOnOffsetChangedListener(this);
@@ -139,18 +131,23 @@ namespace Opus.Fragments
for (int i = 0; i < response.Items.Count; i++) for (int i = 0; i < response.Items.Count; i++)
{ {
if (response.Items[i].ContentDetails?.Playlists.Count == 1) if (response.Items[i].ContentDetails?.Playlists?.Count == 1)
{ {
System.Console.WriteLine("&Single playlsit");
sections.Add(new Section(null, SectionType.SinglePlaylist)); sections.Add(new Section(null, SectionType.SinglePlaylist));
LoadPlaylist(sections.Count - 1, response.Items[i].ContentDetails.Playlists[0]); LoadPlaylist(sections.Count - 1, response.Items[i].ContentDetails.Playlists[0]);
} }
//else if (item.ContentDetails.Playlists.Count > 1) else if (response.Items[i].ContentDetails?.Playlists?.Count > 1)
// sections.Add(new Section(item.Snippet.Title, SectionType.PlaylistList, new List<PlaylistItem>())); {
sections.Add(new Section(response.Items[i].Snippet.Title, SectionType.PlaylistList));
LoadMulitplePlaylists(sections.Count - 1, response.Items[i].ContentDetails.Playlists);
}
//else if (item.ContentDetails.Channels.Count > 1) else if (response.Items[i].ContentDetails?.Channels?.Count > 1)
// sections.Add(new Section(item.Snippet.Title, SectionType.ChannelList, new List<Channel>())); {
sections.Add(new Section(response.Items[i].Snippet.Title, SectionType.ChannelList));
LoadChannels(sections.Count - 1, response.Items[i].ContentDetails.Channels);
}
} }
adapter = new SectionAdapter(sections); adapter = new SectionAdapter(sections);
@@ -161,9 +158,28 @@ namespace Opus.Fragments
async void LoadPlaylist(int slot, string playlistID) async void LoadPlaylist(int slot, string playlistID)
{ {
System.Console.WriteLine("&Loading playlist: " + playlistID + " slot: " + slot + " sections count " + sections.Count);
var pl = await new YoutubeClient().GetPlaylistAsync(playlistID, 1); var pl = await new YoutubeClient().GetPlaylistAsync(playlistID, 1);
sections[slot] = new Section(pl.Title, SectionType.SinglePlaylist, Song.FromVideoArray(pl.Videos)); sections[slot] = new Section(pl.Title, SectionType.SinglePlaylist, Song.FromVideoArray(pl.Videos), new PlaylistItem(pl.Title, -1, playlistID) { HasWritePermission = false, Owner = item.Name });
adapter.NotifyItemChanged(slot);
}
async void LoadMulitplePlaylists(int slot, IList<string> playlistIDs)
{
List<PlaylistItem> playlists = new List<PlaylistItem>();
foreach (string playlistID in playlistIDs)
{
PlaylistItem playlist = await PlaylistManager.GetPlaylist(playlistID);
if(playlist != null)
playlists.Add(playlist);
}
sections[slot] = new Section(sections[slot].SectionTitle, SectionType.PlaylistList, playlists);
adapter.NotifyItemChanged(slot);
}
async void LoadChannels(int slot, IList<string> channelIDs)
{
IEnumerable<Channel> channels = await ChannelManager.GetChannels(channelIDs);
sections[slot] = new Section(sections[slot].SectionTitle, SectionType.ChannelList, channels.ToList());
adapter.NotifyItemChanged(slot); adapter.NotifyItemChanged(slot);
} }
@@ -173,122 +189,10 @@ namespace Opus.Fragments
MainActivity.instance.contentRefresh.Refreshing = false; MainActivity.instance.contentRefresh.Refreshing = false;
} }
//public void Search(object sender, SearchView.QueryTextChangeEventArgs e)
//{
// if (e.NewText == "")
// query = null;
// else
// query = e.NewText.ToLower();
// if (item.LocalID != -1)
// LoaderManager.GetInstance(this).RestartLoader(0, null, this);
// else
// {
// if (query == null)
// adapter.tracks.SetFilter(x => true);
// else
// adapter.tracks.SetFilter(x => x.Title.ToLower().Contains(query) || x.Artist.ToLower().Contains(query));
// adapter.NotifyDataSetChanged();
// }
//}
public void More(Song song, int position)
{
//BottomSheetDialog bottomSheet = new BottomSheetDialog(MainActivity.instance);
//View bottomView = LayoutInflater.Inflate(Resource.Layout.BottomSheet, null);
//bottomView.FindViewById<TextView>(Resource.Id.bsTitle).Text = song.Title;
//bottomView.FindViewById<TextView>(Resource.Id.bsArtist).Text = song.Artist;
//if (song.AlbumArt == -1 || song.IsYt)
//{
// Picasso.With(MainActivity.instance).Load(song.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(bottomView.FindViewById<ImageView>(Resource.Id.bsArt));
//}
//else
//{
// var songCover = Uri.Parse("content://media/external/audio/albumart");
// var songAlbumArtUri = ContentUris.WithAppendedId(songCover, song.AlbumArt);
// Picasso.With(MainActivity.instance).Load(songAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(bottomView.FindViewById<ImageView>(Resource.Id.bsArt));
//}
//bottomSheet.SetContentView(bottomView);
//List<BottomSheetAction> actions = new List<BottomSheetAction>
//{
// new BottomSheetAction(Resource.Drawable.Play, Resources.GetString(Resource.String.play), (sender, eventArg) =>
// {
// if(useHeader)
// PlaylistManager.PlayInOrder(item, position);
// else
// SongManager.Play(song);
// bottomSheet.Dismiss();
// }),
// new BottomSheetAction(Resource.Drawable.PlaylistPlay, Resources.GetString(Resource.String.play_next), (sender, eventArg) =>
// {
// SongManager.PlayNext(song);
// bottomSheet.Dismiss();
// }),
// new BottomSheetAction(Resource.Drawable.Queue, Resources.GetString(Resource.String.play_last), (sender, eventArg) =>
// {
// SongManager.PlayLast(song);
// bottomSheet.Dismiss();
// }),
// new BottomSheetAction(Resource.Drawable.PlaylistAdd, Resources.GetString(Resource.String.add_to_playlist), (sender, eventArg) =>
// {
// PlaylistManager.AddSongToPlaylistDialog(song);
// bottomSheet.Dismiss();
// })
//};
//if (item.HasWritePermission)
//{
// actions.Add(new BottomSheetAction(Resource.Drawable.Close, Resources.GetString(Resource.String.remove_track_from_playlist), (sender, eventArg) =>
// {
// RemoveFromPlaylist(song, position);
// bottomSheet.Dismiss();
// }));
//}
//if (!song.IsYt)
//{
// actions.Add(new BottomSheetAction(Resource.Drawable.Edit, Resources.GetString(Resource.String.edit_metadata), (sender, eventArg) =>
// {
// LocalManager.EditMetadata(song);
// bottomSheet.Dismiss();
// }));
//}
//else
//{
// actions.AddRange(new BottomSheetAction[]
// {
// new BottomSheetAction(Resource.Drawable.PlayCircle, Resources.GetString(Resource.String.create_mix_from_song), (sender, eventArg) =>
// {
// YoutubeManager.CreateMixFromSong(song);
// bottomSheet.Dismiss();
// }),
// new BottomSheetAction(Resource.Drawable.Download, Resources.GetString(Resource.String.download), (sender, eventArg) =>
// {
// YoutubeManager.Download(new[] { song });
// bottomSheet.Dismiss();
// })
// });
//}
//bottomSheet.FindViewById<ListView>(Resource.Id.bsItems).Adapter = new BottomSheetAdapter(MainActivity.instance, Resource.Layout.BottomSheetText, actions);
//bottomSheet.Show();
}
public override void OnResume() public override void OnResume()
{ {
base.OnResume(); base.OnResume();
instance = this; instance = this;
//if (!Activity.FindViewById<ImageButton>(Resource.Id.headerPlay).HasOnClickListeners)
// Activity.FindViewById<ImageButton>(Resource.Id.headerPlay).Click += (sender, e0) => { PlaylistManager.PlayInOrder(item); };
//if (!Activity.FindViewById<ImageButton>(Resource.Id.headerShuffle).HasOnClickListeners)
// Activity.FindViewById<ImageButton>(Resource.Id.headerShuffle).Click += (sender, e0) => { PlaylistManager.Shuffle(item); };
//if (!Activity.FindViewById<ImageButton>(Resource.Id.headerMore).HasOnClickListeners)
// Activity.FindViewById<ImageButton>(Resource.Id.headerMore).Click += PlaylistMore;
} }
public void OnOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) public void OnOffsetChanged(AppBarLayout appBarLayout, int verticalOffset)
@@ -307,11 +211,5 @@ namespace Opus.Fragments
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true); MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true);
} }
} }
public override void OnDestroy()
{
base.OnDestroy();
MainActivity.instance.FindViewById(Resource.Id.toolbarLogo).Visibility = ViewStates.Visible;
}
} }
} }

View File

@@ -113,7 +113,8 @@ namespace Opus.Fragments
if (item.Count == -1) if (item.Count == -1)
Activity.FindViewById<TextView>(Resource.Id.headerNumber).Text = "NaN" + " " + GetString(Resource.String.songs); Activity.FindViewById<TextView>(Resource.Id.headerNumber).Text = "NaN" + " " + GetString(Resource.String.songs);
Picasso.With(Android.App.Application.Context).Load(item.ImageURL).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(Activity.FindViewById<ImageView>(Resource.Id.headerArt)); if(item.ImageURL != null)
Picasso.With(Android.App.Application.Context).Load(item.ImageURL).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(Activity.FindViewById<ImageView>(Resource.Id.headerArt));
} }
Activity.FindViewById(Resource.Id.collapsingToolbar).RequestLayout(); Activity.FindViewById(Resource.Id.collapsingToolbar).RequestLayout();
} }
@@ -147,8 +148,8 @@ namespace Opus.Fragments
MainActivity.instance.HideSearch(); MainActivity.instance.HideSearch();
MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(false); MainActivity.instance.SupportActionBar.SetHomeButtonEnabled(false);
MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(false); MainActivity.instance.SupportActionBar.SetDisplayHomeAsUpEnabled(false);
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true);
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(false); MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(false);
MainActivity.instance.FindViewById(Resource.Id.toolbarLogo).Visibility = ViewStates.Visible;
MainActivity.instance.contentRefresh.Refresh -= OnRefresh; MainActivity.instance.contentRefresh.Refresh -= OnRefresh;
Activity.FindViewById<AppBarLayout>(Resource.Id.appbar).RemoveOnOffsetChangedListener(this); Activity.FindViewById<AppBarLayout>(Resource.Id.appbar).RemoveOnOffsetChangedListener(this);
@@ -342,6 +343,9 @@ namespace Opus.Fragments
tracks.Invalidate(); tracks.Invalidate();
adapter.NotifyDataSetChanged(); adapter.NotifyDataSetChanged();
if(item?.ImageURL == null)
Picasso.With(Android.App.Application.Context).Load(tracks[0].Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(Activity.FindViewById<ImageView>(Resource.Id.headerArt));
} }
catch (System.Net.Http.HttpRequestException) { } catch (System.Net.Http.HttpRequestException) { }
} }
@@ -604,11 +608,5 @@ namespace Opus.Fragments
MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true); MainActivity.instance.SupportActionBar.SetDisplayShowTitleEnabled(true);
} }
} }
public override void OnDestroy()
{
base.OnDestroy();
MainActivity.instance.FindViewById(Resource.Id.toolbarLogo).Visibility = ViewStates.Visible;
}
} }
} }

View File

@@ -15,7 +15,6 @@ using Opus;
using Opus.Adapter; using Opus.Adapter;
using Opus.Api; using Opus.Api;
using Opus.Api.Services; using Opus.Api.Services;
using Opus.Code.Api;
using Opus.DataStructure; using Opus.DataStructure;
using Opus.Others; using Opus.Others;
using Opus.Views; using Opus.Views;
@@ -111,7 +110,8 @@ public class Queue : Fragment, RecyclerView.IOnItemTouchListener, PopupMenu.IOnM
int last = ((LinearLayoutManager)ListView.GetLayoutManager()).FindLastVisibleItemPosition(); int last = ((LinearLayoutManager)ListView.GetLayoutManager()).FindLastVisibleItemPosition();
for (int i = first; i <= last; i++) for (int i = first; i <= last; i++)
{ {
if (ListView.GetChildViewHolder(((LinearLayoutManager)ListView.GetLayoutManager()).FindViewByPosition(i)) is SongHolder holder) View child = ((LinearLayoutManager)ListView.GetLayoutManager()).FindViewByPosition(i);
if (child != null && ListView.GetChildViewHolder(child) is SongHolder holder)
{ {
if (MusicPlayer.CurrentID() == i - 1) //The -1 is because the first displayed item of the queue is a header. if (MusicPlayer.CurrentID() == i - 1) //The -1 is because the first displayed item of the queue is a header.
{ {

View File

@@ -295,6 +295,8 @@ namespace Opus.Fragments
Console.WriteLine("&Exception catched in the youtube search: " + ex.Source + " - " + ex.Message); Console.WriteLine("&Exception catched in the youtube search: " + ex.Source + " - " + ex.Message);
EmptyView.Text = GetString(Resource.String.timout); EmptyView.Text = GetString(Resource.String.timout);
EmptyView.Visibility = ViewStates.Visible; EmptyView.Visibility = ViewStates.Visible;
EmptyView.Visibility = ViewStates.Visible;
LoadingView.Visibility = ViewStates.Gone;
} }
} }

View File

@@ -324,6 +324,7 @@
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Code\Api\ChannelManager.cs" />
<Compile Include="Code\Api\SongParser.cs" /> <Compile Include="Code\Api\SongParser.cs" />
<Compile Include="Code\DataStructure\SearchableList.cs" /> <Compile Include="Code\DataStructure\SearchableList.cs" />
<Compile Include="Code\UI\Adapter\BaseCursor.cs" /> <Compile Include="Code\UI\Adapter\BaseCursor.cs" />

View File

@@ -7183,14 +7183,14 @@ namespace Opus
// aapt resource value: 0x7f0d0072 // aapt resource value: 0x7f0d0072
public const int abc_toolbar_collapse_description = 2131558514; public const int abc_toolbar_collapse_description = 2131558514;
// aapt resource value: 0x7f0d0135 // aapt resource value: 0x7f0d0139
public const int add = 2131558709; public const int add = 2131558713;
// aapt resource value: 0x7f0d00fb // aapt resource value: 0x7f0d00fc
public const int add_playlist = 2131558651; public const int add_playlist = 2131558652;
// aapt resource value: 0x7f0d010f // aapt resource value: 0x7f0d0110
public const int add_playlist_msg = 2131558671; public const int add_playlist_msg = 2131558672;
// aapt resource value: 0x7f0d00df // aapt resource value: 0x7f0d00df
public const int add_to_library = 2131558623; public const int add_to_library = 2131558623;
@@ -7201,23 +7201,23 @@ namespace Opus
// aapt resource value: 0x7f0d00d9 // aapt resource value: 0x7f0d00d9
public const int add_to_queue = 2131558617; public const int add_to_queue = 2131558617;
// aapt resource value: 0x7f0d011c // aapt resource value: 0x7f0d0120
public const int album = 2131558684; public const int album = 2131558688;
// aapt resource value: 0x7f0d00e9 // aapt resource value: 0x7f0d00ea
public const int all = 2131558633; public const int all = 2131558634;
// aapt resource value: 0x7f0d0080 // aapt resource value: 0x7f0d0080
public const int appbar_scrolling_view_behavior = 2131558528; public const int appbar_scrolling_view_behavior = 2131558528;
// aapt resource value: 0x7f0d013f // aapt resource value: 0x7f0d0143
public const int appearances = 2131558719; public const int appearances = 2131558723;
// aapt resource value: 0x7f0d0132 // aapt resource value: 0x7f0d0136
public const int apply = 2131558706; public const int apply = 2131558710;
// aapt resource value: 0x7f0d011b // aapt resource value: 0x7f0d011f
public const int artist = 2131558683; public const int artist = 2131558687;
// aapt resource value: 0x7f0d00ca // aapt resource value: 0x7f0d00ca
public const int autoplay = 2131558602; public const int autoplay = 2131558602;
@@ -7225,17 +7225,17 @@ namespace Opus
// aapt resource value: 0x7f0d00cb // aapt resource value: 0x7f0d00cb
public const int autoplay_desc = 2131558603; public const int autoplay_desc = 2131558603;
// aapt resource value: 0x7f0d0111 // aapt resource value: 0x7f0d0112
public const int badplaylisturl = 2131558673; public const int badplaylisturl = 2131558674;
// aapt resource value: 0x7f0d0139 // aapt resource value: 0x7f0d013d
public const int behavior = 2131558713; public const int behavior = 2131558717;
// aapt resource value: 0x7f0d0159 // aapt resource value: 0x7f0d015d
public const int beta_available = 2131558745; public const int beta_available = 2131558749;
// aapt resource value: 0x7f0d0144 // aapt resource value: 0x7f0d0148
public const int black_theme = 2131558724; public const int black_theme = 2131558728;
// aapt resource value: 0x7f0d0081 // aapt resource value: 0x7f0d0081
public const int bottom_sheet_behavior = 2131558529; public const int bottom_sheet_behavior = 2131558529;
@@ -7243,17 +7243,17 @@ namespace Opus
// aapt resource value: 0x7f0d00b2 // aapt resource value: 0x7f0d00b2
public const int browse = 2131558578; public const int browse = 2131558578;
// aapt resource value: 0x7f0d0133 // aapt resource value: 0x7f0d0137
public const int cancel = 2131558707; public const int cancel = 2131558711;
// aapt resource value: 0x7f0d015f // aapt resource value: 0x7f0d0163
public const int cancelling = 2131558751; public const int cancelling = 2131558755;
// aapt resource value: 0x7f0d00f1 // aapt resource value: 0x7f0d00f2
public const int cant_delete = 2131558641; public const int cant_delete = 2131558642;
// aapt resource value: 0x7f0d015c // aapt resource value: 0x7f0d0160
public const int cant_play_non_youtube = 2131558748; public const int cant_play_non_youtube = 2131558752;
// aapt resource value: 0x7f0d00b7 // aapt resource value: 0x7f0d00b7
public const int cast = 2131558583; public const int cast = 2131558583;
@@ -7336,11 +7336,11 @@ namespace Opus
// aapt resource value: 0x7f0d0015 // aapt resource value: 0x7f0d0015
public const int cast_play = 2131558421; public const int cast_play = 2131558421;
// aapt resource value: 0x7f0d0130 // aapt resource value: 0x7f0d0134
public const int cast_queue_push = 2131558704; public const int cast_queue_push = 2131558708;
// aapt resource value: 0x7f0d0131 // aapt resource value: 0x7f0d0135
public const int cast_queue_pushed = 2131558705; public const int cast_queue_pushed = 2131558709;
// aapt resource value: 0x7f0d0016 // aapt resource value: 0x7f0d0016
public const int cast_rewind = 2131558422; public const int cast_rewind = 2131558422;
@@ -7390,14 +7390,14 @@ namespace Opus
// aapt resource value: 0x7f0d0025 // aapt resource value: 0x7f0d0025
public const int cast_unmute = 2131558437; public const int cast_unmute = 2131558437;
// aapt resource value: 0x7f0d011e // aapt resource value: 0x7f0d0122
public const int change_albumart = 2131558686; public const int change_albumart = 2131558690;
// aapt resource value: 0x7f0d0123 // aapt resource value: 0x7f0d0127
public const int changes_saved = 2131558691; public const int changes_saved = 2131558695;
// aapt resource value: 0x7f0d00eb // aapt resource value: 0x7f0d00ec
public const int channels = 2131558635; public const int channels = 2131558636;
// aapt resource value: 0x7f0d0082 // aapt resource value: 0x7f0d0082
public const int character_counter_content_description = 2131558530; public const int character_counter_content_description = 2131558530;
@@ -7405,8 +7405,8 @@ namespace Opus
// aapt resource value: 0x7f0d0083 // aapt resource value: 0x7f0d0083
public const int character_counter_pattern = 2131558531; public const int character_counter_pattern = 2131558531;
// aapt resource value: 0x7f0d0146 // aapt resource value: 0x7f0d014a
public const int check_updates = 2131558726; public const int check_updates = 2131558730;
// aapt resource value: 0x7f0d002b // aapt resource value: 0x7f0d002b
public const int common_google_play_services_enable_button = 2131558443; public const int common_google_play_services_enable_button = 2131558443;
@@ -7462,14 +7462,14 @@ namespace Opus
// aapt resource value: 0x7f0d003b // aapt resource value: 0x7f0d003b
public const int common_signin_button_text_long = 2131558459; public const int common_signin_button_text_long = 2131558459;
// aapt resource value: 0x7f0d012f // aapt resource value: 0x7f0d0133
public const int completed = 2131558703; public const int completed = 2131558707;
// aapt resource value: 0x7f0d0153 // aapt resource value: 0x7f0d0157
public const int country_blocked = 2131558739; public const int country_blocked = 2131558743;
// aapt resource value: 0x7f0d0117 // aapt resource value: 0x7f0d0118
public const int create_local = 2131558679; public const int create_local = 2131558680;
// aapt resource value: 0x7f0d00cc // aapt resource value: 0x7f0d00cc
public const int create_mix = 2131558604; public const int create_mix = 2131558604;
@@ -7477,71 +7477,74 @@ namespace Opus
// aapt resource value: 0x7f0d00d0 // aapt resource value: 0x7f0d00d0
public const int create_mix_from_song = 2131558608; public const int create_mix_from_song = 2131558608;
// aapt resource value: 0x7f0d0113 // aapt resource value: 0x7f0d0114
public const int create_playlist = 2131558675; public const int create_playlist = 2131558676;
// aapt resource value: 0x7f0d011a
public const int create_synced = 2131558682;
// aapt resource value: 0x7f0d0119 // aapt resource value: 0x7f0d0119
public const int create_synced = 2131558681; public const int create_youtube = 2131558681;
// aapt resource value: 0x7f0d0118 // aapt resource value: 0x7f0d0147
public const int create_youtube = 2131558680; public const int dark_theme = 2131558727;
// aapt resource value: 0x7f0d0143
public const int dark_theme = 2131558723;
// aapt resource value: 0x7f0d00db // aapt resource value: 0x7f0d00db
public const int delete = 2131558619; public const int delete = 2131558619;
// aapt resource value: 0x7f0d010b // aapt resource value: 0x7f0d010c
public const int delete_playlist = 2131558667; public const int delete_playlist = 2131558668;
// aapt resource value: 0x7f0d0129 // aapt resource value: 0x7f0d012d
public const int deleted_file = 2131558697; public const int deleted_file = 2131558701;
// aapt resource value: 0x7f0d00d3 // aapt resource value: 0x7f0d00d3
public const int download = 2131558611; public const int download = 2131558611;
// aapt resource value: 0x7f0d0120 // aapt resource value: 0x7f0d0124
public const int download_albumart = 2131558688; public const int download_albumart = 2131558692;
// aapt resource value: 0x7f0d013b // aapt resource value: 0x7f0d013f
public const int download_directory = 2131558715; public const int download_directory = 2131558719;
// aapt resource value: 0x7f0d0121 // aapt resource value: 0x7f0d0125
public const int download_meta = 2131558689; public const int download_meta = 2131558693;
// aapt resource value: 0x7f0d00ee
public const int download_path_error = 2131558638;
// aapt resource value: 0x7f0d00ed // aapt resource value: 0x7f0d00ed
public const int download_path_error = 2131558637; public const int download_path_not_set = 2131558637;
// aapt resource value: 0x7f0d00ec
public const int download_path_not_set = 2131558636;
// aapt resource value: 0x7f0d0128
public const int download_queue = 2131558696;
// aapt resource value: 0x7f0d012c // aapt resource value: 0x7f0d012c
public const int downloader_playlist = 2131558700; public const int download_queue = 2131558700;
// aapt resource value: 0x7f0d00ef // aapt resource value: 0x7f0d0130
public const int downloading = 2131558639; public const int downloader_playlist = 2131558704;
// aapt resource value: 0x7f0d015d // aapt resource value: 0x7f0d00f0
public const int downloading_notification = 2131558749; public const int downloading = 2131558640;
// aapt resource value: 0x7f0d012d // aapt resource value: 0x7f0d0161
public const int downloading_status = 2131558701; public const int downloading_notification = 2131558753;
// aapt resource value: 0x7f0d015a // aapt resource value: 0x7f0d0131
public const int downloading_update = 2131558746; public const int downloading_status = 2131558705;
// aapt resource value: 0x7f0d015e
public const int downloading_update = 2131558750;
// aapt resource value: 0x7f0d00d2 // aapt resource value: 0x7f0d00d2
public const int edit_metadata = 2131558610; public const int edit_metadata = 2131558610;
// aapt resource value: 0x7f0d0101
public const int element = 2131558657;
// aapt resource value: 0x7f0d0102 // aapt resource value: 0x7f0d0102
public const int elements = 2131558658; public const int element = 2131558658;
// aapt resource value: 0x7f0d0103
public const int elements = 2131558659;
// aapt resource value: 0x7f0d00e6
public const int empty_queue = 2131558630;
// aapt resource value: 0x7f0d0090 // aapt resource value: 0x7f0d0090
public const int exo_controls_fastforward_description = 2131558544; public const int exo_controls_fastforward_description = 2131558544;
@@ -7654,11 +7657,11 @@ namespace Opus
// aapt resource value: 0x7f0d00b6 // aapt resource value: 0x7f0d00b6
public const int filter = 2131558582; public const int filter = 2131558582;
// aapt resource value: 0x7f0d00e7 // aapt resource value: 0x7f0d00e8
public const int folders = 2131558631; public const int folders = 2131558632;
// aapt resource value: 0x7f0d0127 // aapt resource value: 0x7f0d012b
public const int format_unsupported = 2131558695; public const int format_unsupported = 2131558699;
// aapt resource value: 0x7f0d0086 // aapt resource value: 0x7f0d0086
public const int hide_bottom_view_on_scroll_behavior = 2131558534; public const int hide_bottom_view_on_scroll_behavior = 2131558534;
@@ -7672,53 +7675,56 @@ namespace Opus
// aapt resource value: 0x7f0d00c2 // aapt resource value: 0x7f0d00c2
public const int hours = 2131558594; public const int hours = 2131558594;
// aapt resource value: 0x7f0d012a // aapt resource value: 0x7f0d012e
public const int initialization = 2131558698; public const int initialization = 2131558702;
// aapt resource value: 0x7f0d0136 // aapt resource value: 0x7f0d013a
public const int later = 2131558710; public const int later = 2131558714;
// aapt resource value: 0x7f0d00d6 // aapt resource value: 0x7f0d00d6
public const int list_songs = 2131558614; public const int list_songs = 2131558614;
// aapt resource value: 0x7f0d00ea // aapt resource value: 0x7f0d00eb
public const int lives = 2131558634; public const int lives = 2131558635;
// aapt resource value: 0x7f0d00c7 // aapt resource value: 0x7f0d00c7
public const int loading = 2131558599; public const int loading = 2131558599;
// aapt resource value: 0x7f0d00fe // aapt resource value: 0x7f0d00ff
public const int local_playlist_empty = 2131558654; public const int local_playlist_empty = 2131558655;
// aapt resource value: 0x7f0d00f9 // aapt resource value: 0x7f0d00fa
public const int local_playlists = 2131558649; public const int local_playlists = 2131558650;
// aapt resource value: 0x7f0d0100 // aapt resource value: 0x7f0d0101
public const int localpl_noperm = 2131558656; public const int localpl_noperm = 2131558657;
// aapt resource value: 0x7f0d014a // aapt resource value: 0x7f0d014e
public const int log_in = 2131558730; public const int log_in = 2131558734;
// aapt resource value: 0x7f0d014b // aapt resource value: 0x7f0d014f
public const int log_out = 2131558731; public const int log_out = 2131558735;
// aapt resource value: 0x7f0d0149 // aapt resource value: 0x7f0d014d
public const int logged_in = 2131558729; public const int logged_in = 2131558733;
// aapt resource value: 0x7f0d014c // aapt resource value: 0x7f0d0150
public const int login_disabled = 2131558732; public const int login_disabled = 2131558736;
// aapt resource value: 0x7f0d013c // aapt resource value: 0x7f0d011b
public const int max_download = 2131558716; public const int long_loading = 2131558683;
// aapt resource value: 0x7f0d013d // aapt resource value: 0x7f0d0140
public const int max_download_dialog = 2131558717; public const int max_download = 2131558720;
// aapt resource value: 0x7f0d012b // aapt resource value: 0x7f0d0141
public const int metadata = 2131558699; public const int max_download_dialog = 2131558721;
// aapt resource value: 0x7f0d0124 // aapt resource value: 0x7f0d012f
public const int metdata_error_noid = 2131558692; public const int metadata = 2131558703;
// aapt resource value: 0x7f0d0128
public const int metdata_error_noid = 2131558696;
// aapt resource value: 0x7f0d00bf // aapt resource value: 0x7f0d00bf
public const int minute = 2131558591; public const int minute = 2131558591;
@@ -7729,11 +7735,11 @@ namespace Opus
// aapt resource value: 0x7f0d00e3 // aapt resource value: 0x7f0d00e3
public const int more = 2131558627; public const int more = 2131558627;
// aapt resource value: 0x7f0d0125 // aapt resource value: 0x7f0d0129
public const int mount_error = 2131558693; public const int mount_error = 2131558697;
// aapt resource value: 0x7f0d0126 // aapt resource value: 0x7f0d012a
public const int mount_error_action = 2131558694; public const int mount_error_action = 2131558698;
// aapt resource value: 0x7f0d0040 // aapt resource value: 0x7f0d0040
public const int mr_button_content_description = 2131558464; public const int mr_button_content_description = 2131558464;
@@ -7810,44 +7816,44 @@ namespace Opus
// aapt resource value: 0x7f0d0087 // aapt resource value: 0x7f0d0087
public const int mtrl_chip_close_icon_content_description = 2131558535; public const int mtrl_chip_close_icon_content_description = 2131558535;
// aapt resource value: 0x7f0d0116 // aapt resource value: 0x7f0d0117
public const int new_playlist = 2131558678; public const int new_playlist = 2131558679;
// aapt resource value: 0x7f0d00bc // aapt resource value: 0x7f0d00bc
public const int next_loading = 2131558588; public const int next_loading = 2131558588;
// aapt resource value: 0x7f0d0138 // aapt resource value: 0x7f0d013c
public const int no = 2131558712; public const int no = 2131558716;
// aapt resource value: 0x7f0d00f7
public const int no_channel = 2131558647;
// aapt resource value: 0x7f0d00f6 // aapt resource value: 0x7f0d00f6
public const int no_channel = 2131558646; public const int no_lives = 2131558646;
// aapt resource value: 0x7f0d0152
public const int no_permission = 2131558738;
// aapt resource value: 0x7f0d00f5 // aapt resource value: 0x7f0d00f5
public const int no_lives = 2131558645; public const int no_playlist = 2131558645;
// aapt resource value: 0x7f0d014e
public const int no_permission = 2131558734;
// aapt resource value: 0x7f0d00f4
public const int no_playlist = 2131558644;
// aapt resource value: 0x7f0d00f2
public const int no_result = 2131558642;
// aapt resource value: 0x7f0d00e8
public const int no_song = 2131558632;
// aapt resource value: 0x7f0d014f
public const int no_song_mix = 2131558735;
// aapt resource value: 0x7f0d00f3 // aapt resource value: 0x7f0d00f3
public const int no_track = 2131558643; public const int no_result = 2131558643;
// aapt resource value: 0x7f0d0148 // aapt resource value: 0x7f0d00e9
public const int not_log = 2131558728; public const int no_song = 2131558633;
// aapt resource value: 0x7f0d0154 // aapt resource value: 0x7f0d0153
public const int not_streamable = 2131558740; public const int no_song_mix = 2131558739;
// aapt resource value: 0x7f0d00f4
public const int no_track = 2131558644;
// aapt resource value: 0x7f0d014c
public const int not_log = 2131558732;
// aapt resource value: 0x7f0d0158
public const int not_streamable = 2131558744;
// aapt resource value: 0x7f0d00bb // aapt resource value: 0x7f0d00bb
public const int nothing = 2131558587; public const int nothing = 2131558587;
@@ -7855,14 +7861,14 @@ namespace Opus
// aapt resource value: 0x7f0d00be // aapt resource value: 0x7f0d00be
public const int off = 2131558590; public const int off = 2131558590;
// aapt resource value: 0x7f0d0134 // aapt resource value: 0x7f0d0138
public const int ok = 2131558708; public const int ok = 2131558712;
// aapt resource value: 0x7f0d00c4 // aapt resource value: 0x7f0d00c4
public const int open_youtube = 2131558596; public const int open_youtube = 2131558596;
// aapt resource value: 0x7f0d0145 // aapt resource value: 0x7f0d0149
public const int others = 2131558725; public const int others = 2131558729;
// aapt resource value: 0x7f0d0088 // aapt resource value: 0x7f0d0088
public const int password_toggle_content_description = 2131558536; public const int password_toggle_content_description = 2131558536;
@@ -7882,8 +7888,8 @@ namespace Opus
// aapt resource value: 0x7f0d00c6 // aapt resource value: 0x7f0d00c6
public const int paused = 2131558598; public const int paused = 2131558598;
// aapt resource value: 0x7f0d011f // aapt resource value: 0x7f0d0123
public const int pick_album_local = 2131558687; public const int pick_album_local = 2131558691;
// aapt resource value: 0x7f0d00cd // aapt resource value: 0x7f0d00cd
public const int play = 2131558605; public const int play = 2131558605;
@@ -7900,29 +7906,29 @@ namespace Opus
// aapt resource value: 0x7f0d00c5 // aapt resource value: 0x7f0d00c5
public const int playing = 2131558597; public const int playing = 2131558597;
// aapt resource value: 0x7f0d010a // aapt resource value: 0x7f0d010b
public const int playlist_add_song_not_found = 2131558666; public const int playlist_add_song_not_found = 2131558667;
// aapt resource value: 0x7f0d0107
public const int playlist_already_saved = 2131558663;
// aapt resource value: 0x7f0d0103
public const int playlist_empty = 2131558659;
// aapt resource value: 0x7f0d0110
public const int playlist_fork = 2131558672;
// aapt resource value: 0x7f0d0109
public const int playlist_not_found = 2131558665;
// aapt resource value: 0x7f0d0106
public const int playlist_saved = 2131558662;
// aapt resource value: 0x7f0d0108 // aapt resource value: 0x7f0d0108
public const int playlist_unsaved = 2131558664; public const int playlist_already_saved = 2131558664;
// aapt resource value: 0x7f0d0112 // aapt resource value: 0x7f0d0104
public const int playlist_uptodate = 2131558674; public const int playlist_empty = 2131558660;
// aapt resource value: 0x7f0d0111
public const int playlist_fork = 2131558673;
// aapt resource value: 0x7f0d010a
public const int playlist_not_found = 2131558666;
// aapt resource value: 0x7f0d0107
public const int playlist_saved = 2131558663;
// aapt resource value: 0x7f0d0109
public const int playlist_unsaved = 2131558665;
// aapt resource value: 0x7f0d0113
public const int playlist_uptodate = 2131558675;
// aapt resource value: 0x7f0d00b3 // aapt resource value: 0x7f0d00b3
public const int playlists = 2131558579; public const int playlists = 2131558579;
@@ -7933,23 +7939,23 @@ namespace Opus
// aapt resource value: 0x7f0d00d8 // aapt resource value: 0x7f0d00d8
public const int random_play = 2131558616; public const int random_play = 2131558616;
// aapt resource value: 0x7f0d00f8 // aapt resource value: 0x7f0d00f9
public const int remove = 2131558648; public const int remove = 2131558649;
// aapt resource value: 0x7f0d0104 // aapt resource value: 0x7f0d0105
public const int remove_from_playlist = 2131558660; public const int remove_from_playlist = 2131558661;
// aapt resource value: 0x7f0d00d4 // aapt resource value: 0x7f0d00d4
public const int remove_from_queue = 2131558612; public const int remove_from_queue = 2131558612;
// aapt resource value: 0x7f0d00f7 // aapt resource value: 0x7f0d00f8
public const int remove_search = 2131558647; public const int remove_search = 2131558648;
// aapt resource value: 0x7f0d00d5 // aapt resource value: 0x7f0d00d5
public const int remove_track_from_playlist = 2131558613; public const int remove_track_from_playlist = 2131558613;
// aapt resource value: 0x7f0d0105 // aapt resource value: 0x7f0d0106
public const int removed_from_playlist = 2131558661; public const int removed_from_playlist = 2131558662;
// aapt resource value: 0x7f0d00c8 // aapt resource value: 0x7f0d00c8
public const int removed_from_queue = 2131558600; public const int removed_from_queue = 2131558600;
@@ -7957,8 +7963,8 @@ namespace Opus
// aapt resource value: 0x7f0d00da // aapt resource value: 0x7f0d00da
public const int rename = 2131558618; public const int rename = 2131558618;
// aapt resource value: 0x7f0d010c // aapt resource value: 0x7f0d010d
public const int rename_playlist = 2131558668; public const int rename_playlist = 2131558669;
// aapt resource value: 0x7f0d00b4 // aapt resource value: 0x7f0d00b4
public const int repeat = 2131558580; public const int repeat = 2131558580;
@@ -7966,17 +7972,17 @@ namespace Opus
// aapt resource value: 0x7f0d00c9 // aapt resource value: 0x7f0d00c9
public const int save_as_playlist = 2131558601; public const int save_as_playlist = 2131558601;
// aapt resource value: 0x7f0d0115 // aapt resource value: 0x7f0d0116
public const int save_folder_playlist = 2131558677; public const int save_folder_playlist = 2131558678;
// aapt resource value: 0x7f0d0114 // aapt resource value: 0x7f0d0115
public const int save_playlist = 2131558676; public const int save_playlist = 2131558677;
// aapt resource value: 0x7f0d0073 // aapt resource value: 0x7f0d0073
public const int search_menu_title = 2131558515; public const int search_menu_title = 2131558515;
// aapt resource value: 0x7f0d00ee // aapt resource value: 0x7f0d00ef
public const int set_path = 2131558638; public const int set_path = 2131558639;
// aapt resource value: 0x7f0d00b8 // aapt resource value: 0x7f0d00b8
public const int settings = 2131558584; public const int settings = 2131558584;
@@ -7993,8 +7999,8 @@ namespace Opus
// aapt resource value: 0x7f0d00bd // aapt resource value: 0x7f0d00bd
public const int sleep_timer = 2131558589; public const int sleep_timer = 2131558589;
// aapt resource value: 0x7f0d00e6 // aapt resource value: 0x7f0d00e7
public const int songs = 2131558630; public const int songs = 2131558631;
// aapt resource value: 0x7f0d008d // aapt resource value: 0x7f0d008d
public const int status_bar_notification_info_overflow = 2131558541; public const int status_bar_notification_info_overflow = 2131558541;
@@ -8002,8 +8008,8 @@ namespace Opus
// aapt resource value: 0x7f0d00de // aapt resource value: 0x7f0d00de
public const int stop_sync = 2131558622; public const int stop_sync = 2131558622;
// aapt resource value: 0x7f0d010d // aapt resource value: 0x7f0d010e
public const int stop_syncing = 2131558669; public const int stop_syncing = 2131558670;
// aapt resource value: 0x7f0d003d // aapt resource value: 0x7f0d003d
public const int summary_collapsed_preference_list = 2131558461; public const int summary_collapsed_preference_list = 2131558461;
@@ -8014,65 +8020,65 @@ namespace Opus
// aapt resource value: 0x7f0d00dd // aapt resource value: 0x7f0d00dd
public const int sync_now = 2131558621; public const int sync_now = 2131558621;
// aapt resource value: 0x7f0d013e // aapt resource value: 0x7f0d0142
public const int sync_remove = 2131558718; public const int sync_remove = 2131558722;
// aapt resource value: 0x7f0d00f0 // aapt resource value: 0x7f0d00f1
public const int syncing = 2131558640; public const int syncing = 2131558641;
// aapt resource value: 0x7f0d015e // aapt resource value: 0x7f0d0162
public const int tap_details = 2131558750; public const int tap_details = 2131558754;
// aapt resource value: 0x7f0d0140 // aapt resource value: 0x7f0d0144
public const int theme = 2131558720; public const int theme = 2131558724;
// aapt resource value: 0x7f0d0141 // aapt resource value: 0x7f0d0145
public const int theme_dialog = 2131558721; public const int theme_dialog = 2131558725;
// aapt resource value: 0x7f0d00c3 // aapt resource value: 0x7f0d00c3
public const int timer = 2131558595; public const int timer = 2131558595;
// aapt resource value: 0x7f0d0155
public const int timout = 2131558741;
// aapt resource value: 0x7f0d011e
public const int title = 2131558686;
// aapt resource value: 0x7f0d0151 // aapt resource value: 0x7f0d0151
public const int timout = 2131558737; public const int undo = 2131558737;
// aapt resource value: 0x7f0d011a // aapt resource value: 0x7f0d0126
public const int title = 2131558682; public const int undo_change = 2131558694;
// aapt resource value: 0x7f0d014d
public const int undo = 2131558733;
// aapt resource value: 0x7f0d0122
public const int undo_change = 2131558690;
// aapt resource value: 0x7f0d00e0 // aapt resource value: 0x7f0d00e0
public const int unfork = 2131558624; public const int unfork = 2131558624;
// aapt resource value: 0x7f0d010e // aapt resource value: 0x7f0d010f
public const int unfork_playlist = 2131558670; public const int unfork_playlist = 2131558671;
// aapt resource value: 0x7f0d0152 // aapt resource value: 0x7f0d0156
public const int unknow = 2131558738; public const int unknow = 2131558742;
// aapt resource value: 0x7f0d00ba // aapt resource value: 0x7f0d00ba
public const int up_next = 2131558586; public const int up_next = 2131558586;
// aapt resource value: 0x7f0d0158 // aapt resource value: 0x7f0d015c
public const int up_to_date = 2131558744; public const int up_to_date = 2131558748;
// aapt resource value: 0x7f0d012e // aapt resource value: 0x7f0d0132
public const int up_to_date_status = 2131558702; public const int up_to_date_status = 2131558706;
// aapt resource value: 0x7f0d0156 // aapt resource value: 0x7f0d015a
public const int update = 2131558742; public const int update = 2131558746;
// aapt resource value: 0x7f0d0157
public const int update_message = 2131558743;
// aapt resource value: 0x7f0d0155
public const int update_no_internet = 2131558741;
// aapt resource value: 0x7f0d015b // aapt resource value: 0x7f0d015b
public const int updating = 2131558747; public const int update_message = 2131558747;
// aapt resource value: 0x7f0d0159
public const int update_no_internet = 2131558745;
// aapt resource value: 0x7f0d015f
public const int updating = 2131558751;
// aapt resource value: 0x7f0d003e // aapt resource value: 0x7f0d003e
public const int v7_preference_off = 2131558462; public const int v7_preference_off = 2131558462;
@@ -8080,38 +8086,44 @@ namespace Opus
// aapt resource value: 0x7f0d003f // aapt resource value: 0x7f0d003f
public const int v7_preference_on = 2131558463; public const int v7_preference_on = 2131558463;
// aapt resource value: 0x7f0d0147 // aapt resource value: 0x7f0d014b
public const int version = 2131558727; public const int version = 2131558731;
// aapt resource value: 0x7f0d013a // aapt resource value: 0x7f0d011d
public const int volume = 2131558714; public const int view_less = 2131558685;
// aapt resource value: 0x7f0d0142 // aapt resource value: 0x7f0d011c
public const int white_theme = 2131558722; public const int view_more = 2131558684;
// aapt resource value: 0x7f0d0137 // aapt resource value: 0x7f0d013e
public const int yes = 2131558711; public const int volume = 2131558718;
// aapt resource value: 0x7f0d0150 // aapt resource value: 0x7f0d0146
public const int youtube_endpoint = 2131558736; public const int white_theme = 2131558726;
// aapt resource value: 0x7f0d00fc // aapt resource value: 0x7f0d013b
public const int youtube_loading_error = 2131558652; public const int yes = 2131558715;
// aapt resource value: 0x7f0d0154
public const int youtube_endpoint = 2131558740;
// aapt resource value: 0x7f0d00fd // aapt resource value: 0x7f0d00fd
public const int youtube_not_logged = 2131558653; public const int youtube_loading_error = 2131558653;
// aapt resource value: 0x7f0d00ff // aapt resource value: 0x7f0d00fe
public const int youtube_playlist_empty = 2131558655; public const int youtube_not_logged = 2131558654;
// aapt resource value: 0x7f0d00fa // aapt resource value: 0x7f0d0100
public const int youtube_playlists = 2131558650; public const int youtube_playlist_empty = 2131558656;
// aapt resource value: 0x7f0d00fb
public const int youtube_playlists = 2131558651;
// aapt resource value: 0x7f0d00b5 // aapt resource value: 0x7f0d00b5
public const int youtube_search = 2131558581; public const int youtube_search = 2131558581;
// aapt resource value: 0x7f0d011d // aapt resource value: 0x7f0d0121
public const int youtubeid = 2131558685; public const int youtubeid = 2131558689;
// aapt resource value: 0x7f0d00b0 // aapt resource value: 0x7f0d00b0
public const int yt_api_key = 2131558576; public const int yt_api_key = 2131558576;

View File

@@ -21,6 +21,7 @@
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
android:id="@+id/lineRecycler" /> android:id="@+id/lineRecycler" />
<Button <Button
android:id="@+id/viewMore" android:id="@+id/viewMore"

View File

@@ -20,6 +20,7 @@
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:textStyle="bold" android:textStyle="bold"
android:layout_toLeftOf="@id/viewMore"
android:layout_alignParentLeft="true"/> android:layout_alignParentLeft="true"/>
<Button <Button
android:id="@+id/viewMore" android:id="@+id/viewMore"
@@ -34,6 +35,7 @@
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
android:id="@+id/lineRecycler" /> android:id="@+id/lineRecycler" />
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -20,6 +20,7 @@
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:textStyle="bold" android:textStyle="bold"
android:layout_toLeftOf="@id/viewMore"
android:layout_alignParentLeft="true"/> android:layout_alignParentLeft="true"/>
<Button <Button
android:id="@+id/viewMore" android:id="@+id/viewMore"
@@ -34,6 +35,7 @@
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
android:id="@+id/lineRecycler" /> android:id="@+id/lineRecycler" />
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -67,6 +67,7 @@
<string name="more">PLUS</string> <string name="more">PLUS</string>
<string name="queue">Liste de lecture</string> <string name="queue">Liste de lecture</string>
<string name="featured">Mis en avant</string> <string name="featured">Mis en avant</string>
<string name="empty_queue">Aucune musique dans la liste de lecture,\ncommencez maintenant.</string>
<!--Browse tab--> <!--Browse tab-->
<string name="songs">Titres</string> <string name="songs">Titres</string>
@@ -129,6 +130,11 @@
<string name="create_youtube">Playlist youtube</string> <string name="create_youtube">Playlist youtube</string>
<string name="create_synced">Playlist synchronisée (disponible localement et sur youtube)</string> <string name="create_synced">Playlist synchronisée (disponible localement et sur youtube)</string>
<!--Channel Details-->
<string name="long_loading">Chargement en cours, veuillez patientez...</string>
<string name="view_more">Voir plus</string>
<string name="view_less">Voir moins</string>
<!--Edit metadata--> <!--Edit metadata-->
<string name="title">Titre</string> <string name="title">Titre</string>
<string name="artist">Artiste</string> <string name="artist">Artiste</string>

View File

@@ -67,6 +67,7 @@
<string name="more">MORE</string> <string name="more">MORE</string>
<string name="queue">Queue</string> <string name="queue">Queue</string>
<string name="featured">Featured</string> <string name="featured">Featured</string>
<string name="empty_queue">No song currently in queue,\nstart playing song now!</string>
<!--Browse tab--> <!--Browse tab-->
<string name="songs">Songs</string> <string name="songs">Songs</string>
@@ -128,6 +129,11 @@
<string name="create_local">Local playlist</string> <string name="create_local">Local playlist</string>
<string name="create_youtube">Youtube playlist</string> <string name="create_youtube">Youtube playlist</string>
<string name="create_synced">Synced playlist (both local and youtube)</string> <string name="create_synced">Synced playlist (both local and youtube)</string>
<!--Channel Details-->
<string name="long_loading">Loading, please wait...</string>
<string name="view_more">View more</string>
<string name="view_less">View less</string>
<!--Edit metadata--> <!--Edit metadata-->
<string name="title">Title</string> <string name="title">Title</string>