Making downloader follow playlist sort order. Reworking playlist track header's more menu.

This commit is contained in:
Anonymus Raccoon
2019-06-13 02:33:28 +02:00
parent c0852ea8c3
commit 4f9d536654
18 changed files with 223 additions and 227 deletions

View File

@@ -355,15 +355,16 @@ namespace Opus.Api
/// <param name="playList">The name of the playlist</param>
/// <param name="LocalID">The id of the local playlist or -1 if you want to add this song to a playlist that will be created after.</param>
/// <param name="saveAsSynced">Used only if you want to create a playlist with this method. True if the newly created playlist should be synced on youtube.</param>
public async static void AddToPlaylist(Song[] items, string playList, long LocalID, bool saveAsSynced = false)
/// <param name="position">If you want to add the first song to a specific position (should only be used if you know the exact position that you want). Experimental Feature.</param>
public async static void AddToPlaylist(Song[] items, string playList, long LocalID, bool saveAsSynced = false, int position = -1)
{
if (LocalID == -1)
{
LocalID = await PlaylistManager.GetPlaylistID(playList);
if (LocalID == -1)
PlaylistManager.CreateLocalPlaylist(playList, items, saveAsSynced);
PlaylistManager.CreateLocalPlaylist(playList, items, saveAsSynced, position);
else
AddToPlaylist(items, playList, LocalID);
AddToPlaylist(items, playList, LocalID, saveAsSynced, position);
}
else
{
@@ -381,7 +382,13 @@ namespace Opus.Api
{
ContentValues value = new ContentValues();
value.Put(MediaStore.Audio.Playlists.Members.AudioId, item.LocalID);
value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, playlistCount + i + 1);
if(position != -1)
{
value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, position);
position = -1;
}
else
value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, playlistCount + i + 1);
values.Add(value);
}
}

View File

@@ -880,7 +880,8 @@ namespace Opus.Api
/// <param name="name">The name of the playlist</param>
/// <param name="items">The array of songs you want to add. Can be local one or youtube one, it will download them and add them after.</param>
/// <param name="syncedPlaylist">True if you want the playlist to be created and synced on youtube too</param>
public async static void CreateLocalPlaylist(string name, Song[] items, bool syncedPlaylist = false)
/// <param name="position">Property used only for the downloader, see the LocalManager's AddToPlaylist method to see what it does.</param>
public async static void CreateLocalPlaylist(string name, Song[] items, bool syncedPlaylist = false, int position = -1)
{
if (!await MainActivity.instance.GetWritePermission())
return;
@@ -894,7 +895,7 @@ namespace Opus.Api
if (items != null && items.Length > 0)
{
LocalManager.AddToPlaylist(items, name, playlistID); //Will only add files already downloaded
LocalManager.AddToPlaylist(items, name, playlistID, false, position); //Will only add files already downloaded
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
YoutubeManager.DownloadFiles(items.ToList().ConvertAll(x => DownloadFile.From(x, name))); //Will download missing files and add them (if there was youtube songs in the items array.
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed

View File

@@ -151,13 +151,13 @@ namespace Opus.Api.Services
downloadCount++;
currentStrike++;
CreateNotification(queue[position].name);
CreateNotification(queue[position].Name);
try
{
YoutubeClient client = new YoutubeClient();
Video video = await client.GetVideoAsync(queue[position].videoID);
MediaStreamInfoSet mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(queue[position].videoID);
Video video = await client.GetVideoAsync(queue[position].YoutubeID);
MediaStreamInfoSet mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(queue[position].YoutubeID);
MediaStreamInfo streamInfo;
if (mediaStreamInfo.Audio.Count > 0)
@@ -187,9 +187,9 @@ namespace Opus.Api.Services
string outpath = path;
if (queue[position].playlist != null)
if (queue[position].PlaylistName != null)
{
outpath = Path.Combine(path, queue[position].playlist);
outpath = Path.Combine(path, queue[position].PlaylistName);
Directory.CreateDirectory(outpath);
}
@@ -209,7 +209,7 @@ namespace Opus.Api.Services
MediaStream input = await client.GetMediaStreamAsync(streamInfo);
queue[position].path = filePath;
queue[position].Path = filePath;
files.Add(filePath);
FileStream output = File.Create(filePath);
@@ -229,7 +229,7 @@ namespace Opus.Api.Services
if (queue.Count == 1)
SetNotificationProgress(100, true);
SetMetaData(position, filePath, video.Title, video.Author, new string[] { video.Thumbnails.MaxResUrl, video.Thumbnails.StandardResUrl, video.Thumbnails.HighResUrl }, queue[position].videoID, queue[position].playlist);
SetMetaData(position, video.Title, video.Author, new string[] { video.Thumbnails.MaxResUrl, video.Thumbnails.StandardResUrl, video.Thumbnails.HighResUrl });
files.Remove(filePath);
downloadCount--;
@@ -256,8 +256,10 @@ namespace Opus.Api.Services
}
}
private async void SetMetaData(int position, string filePath, string title, string artist, string[] thumbnails, string youtubeID, string playlist)
private async void SetMetaData(int position, string title, string artist, string[] thumbnails)
{
string filePath = queue[position].Path;
await Task.Run(async () =>
{
Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
@@ -266,7 +268,7 @@ namespace Opus.Api.Services
meta.Tag.Title = title;
meta.Tag.Performers = new string[] { artist };
meta.Tag.Album = title + " - " + artist;
meta.Tag.Comment = youtubeID;
meta.Tag.Comment = queue[position].YoutubeID;
IPicture[] pictures = new IPicture[1];
Bitmap bitmap = Picasso.With(Application.Context).Load(await YoutubeManager.GetBestThumb(thumbnails)).Transform(new RemoveBlackBorder(true)).Get();
byte[] data;
@@ -285,9 +287,12 @@ namespace Opus.Api.Services
MediaScannerConnection.ScanFile(this, new string[] { filePath }, null, this);
queue[position].State = DownloadState.Completed;
if (queue[position].PlaylistName == null)
queue[position].State = DownloadState.Completed;
else
queue[position].State = DownloadState.Playlist;
if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData))
if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.Playlist))
{
StopForeground(true);
DownloadQueue.instance?.Finish();
@@ -297,20 +302,36 @@ namespace Opus.Api.Services
UpdateList(position);
}
public void OnScanCompleted(string path, Uri uri)
public async void OnScanCompleted(string path, Uri uri)
{
Android.Util.Log.Debug("MusisApp", "Scan Completed with path = " + path + " and uri = " + uri.ToString());
string playlist = path.Substring(downloadPath.Length + 1);
System.Console.WriteLine("&Scan Completed with path = " + path + " and uri = " + uri.ToString());
if (playlist.IndexOf('/') != -1)
int position = queue.FindIndex(x => x.Path == path && x.State == DownloadState.Playlist);
if (position != -1)
{
playlist = playlist.Substring(0, playlist.IndexOf('/'));
Handler handler = new Handler(MainActivity.instance.MainLooper);
handler.Post(async () =>
LocalManager.AddToPlaylist(new[] { await LocalManager.GetSong(path) }, queue[position].PlaylistName, -1, true, position);
queue[position].State = DownloadState.Completed;
if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.Playlist))
{
LocalManager.AddToPlaylist(new[] { await LocalManager.GetSong(path) }, playlist, -1, true);
});
StopForeground(true);
DownloadQueue.instance?.Finish();
queue.Clear();
}
else
UpdateList(position);
}
//if (playlist.IndexOf('/') != -1)
//{
// playlist = playlist.Substring(0, playlist.IndexOf('/'));
// Handler handler = new Handler(MainActivity.instance.MainLooper);
// handler.Post(async () =>
// {
// });
//}
}
#endregion
@@ -329,7 +350,7 @@ namespace Opus.Api.Services
for (int i = 0; i < files.Count; i++)
{
Song song = songs.Find(x => x.YoutubeID == files[i].videoID);
Song song = songs.Find(x => x.YoutubeID == files[i].YoutubeID);
if (song != null)
{
//Video is already downloaded:

View File

@@ -3,19 +3,19 @@
[System.Serializable]
public class DownloadFile
{
public string name;
public string videoID;
public string playlist;
public string Name;
public string YoutubeID;
public string PlaylistName;
public DownloadState State = DownloadState.None;
public int progress = 0;
public string path;
public string Path;
public bool skipCheck = false;
public DownloadFile(string name, string videoID, string playlist)
{
this.name = name;
this.videoID = videoID;
this.playlist = playlist;
this.Name = name;
this.YoutubeID = videoID;
this.PlaylistName = playlist;
}
public static DownloadFile From(Song song, string playlistName)
@@ -33,6 +33,7 @@
Canceled,
UpToDate,
None,
Error
Error,
Playlist
}
}

View File

@@ -5,6 +5,7 @@ using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using Newtonsoft.Json;
using Opus.Fragments;
using SQLite;
using System;
@@ -57,7 +58,9 @@ namespace Opus.DataStructure
int albumID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Album);
int thisID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Id);
int pathID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Data);
int playOrderID = cursor.GetColumnIndex(MediaStore.Audio.Playlists.Members.PlayOrder);
string playOrder = PlaylistTracks.instance != null ? cursor.GetString(playOrderID) : "";
string Artist = cursor.GetString(artistID);
string Title = cursor.GetString(titleID);
string Album = cursor.GetString(albumID);
@@ -72,7 +75,7 @@ namespace Opus.DataStructure
if (Album == null)
Album = "Unknow Album";
return new Song(Title, Artist, Album, null, AlbumArt, id, path);
return new Song(Title, playOrder, Album, null, AlbumArt, id, path);
}

View File

@@ -17,7 +17,7 @@ namespace Opus.Adapter
public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
{
DownloadHolder holder = (DownloadHolder)viewHolder;
holder.Title.Text = Downloader.queue[position].name;
holder.Title.Text = Downloader.queue[position].Name;
switch (Downloader.queue[position].State)
{
@@ -43,6 +43,17 @@ namespace Opus.Adapter
else
holder.Title.SetTextColor(Color.Black);
break;
case DownloadState.Playlist:
holder.Status.Text = Downloader.instance.GetString(Resource.String.downloader_playlist);
holder.Status.Visibility = ViewStates.Visible;
holder.Progress.Visibility = ViewStates.Visible;
holder.Progress.Indeterminate = true;
holder.Title.Alpha = 1f;
if (MainActivity.Theme == 1)
holder.Title.SetTextColor(Color.White);
else
holder.Title.SetTextColor(Color.Black);
break;
case DownloadState.Downloading:
holder.Status.Text = Downloader.instance.GetString(Resource.String.downloading_status);
holder.Status.Visibility = ViewStates.Visible;

View File

@@ -176,7 +176,7 @@ namespace Opus.Adapter
else
holder.edit.Visibility = ViewStates.Gone;
if (playlist.SyncState == SyncState.Loading || Downloader.queue.Find(x => x.playlist == playlist.Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) != null)
if (playlist.SyncState == SyncState.Loading || Downloader.queue.Find(x => x.PlaylistName == playlist.Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) != null)
{
holder.sync.Visibility = ViewStates.Gone;
holder.SyncLoading.Visibility = ViewStates.Visible;

View File

@@ -76,13 +76,13 @@ namespace Opus.Fragments
case Resource.Id.delete:
if(Downloader.queue[morePosition].State == DownloadState.Completed)
{
System.IO.File.Delete(Downloader.queue[morePosition].path);
Downloader.queue[morePosition].name = GetString(Resource.String.deleted_file);
System.IO.File.Delete(Downloader.queue[morePosition].Path);
Downloader.queue[morePosition].Name = GetString(Resource.String.deleted_file);
Downloader.queue[morePosition].State = DownloadState.Canceled;
}
else if(Downloader.queue[morePosition].State == DownloadState.None)
{
Downloader.queue[morePosition].name = GetString(Resource.String.deleted_file);
Downloader.queue[morePosition].Name = GetString(Resource.String.deleted_file);
Downloader.queue[morePosition].State = DownloadState.Canceled;
}
else

View File

@@ -508,7 +508,7 @@ namespace Opus.Fragments
{
for (int i = 1; i < YoutubePlaylists.Count; i++)
{
if (YoutubePlaylists[i].SyncState != SyncState.False && YoutubePlaylists[i].SyncState != SyncState.Error && Downloader.queue.Find(x => x.playlist == YoutubePlaylists[i].Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) == null)
if (YoutubePlaylists[i].SyncState != SyncState.False && YoutubePlaylists[i].SyncState != SyncState.Error && Downloader.queue.Find(x => x.PlaylistName == YoutubePlaylists[i].Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) == null)
{
YoutubePlaylists[i].SyncState = SyncState.True;
PlaylistHolder holder = (PlaylistHolder)ListView.GetChildViewHolder(ListView.GetChildAt(LocalPlaylists.Count + i));

View File

@@ -192,7 +192,7 @@ namespace Opus.Fragments
SongManager.AddToQueue(adapter.tracks);
break;
case Resource.Id.rename:
case Resource.Id.name:
PlaylistManager.Rename(item, () =>
{
MainActivity.instance.FindViewById<TextView>(Resource.Id.headerTitle).Text = item.Name;
@@ -219,20 +219,30 @@ namespace Opus.Fragments
void PlaylistMore(object sender, System.EventArgs eventArgs)
{
PopupMenu menu = new PopupMenu(MainActivity.instance, MainActivity.instance.FindViewById<ImageButton>(Resource.Id.headerMore));
if (item.LocalID == -1 && item.HasWritePermission)
menu.Inflate(Resource.Menu.ytplaylist_header_more);
else if (item.LocalID == -1 && isForked)
menu.Inflate(Resource.Menu.ytplaylistnowrite_forked_header_more);
else if (item.LocalID == -1)
menu.Inflate(Resource.Menu.ytplaylistnowrite_header_more);
else
menu.Inflate(Resource.Menu.playlist_header_more);
menu.Inflate(Resource.Menu.playlist_header_more); //Contains "add to queue"
if (item.SyncState == SyncState.True)
{
menu.Menu.GetItem(0).SetTitle("Sync Now");
menu.Menu.Add(Menu.None, Resource.Id.sync, menu.Menu.Size() - 3, "Stop Syncing");
menu.Menu.Add(Menu.None, Resource.Id.download, 1, MainActivity.instance.GetString(Resource.String.sync_now));
menu.Menu.Add(Menu.None, Resource.Id.sync, 5, MainActivity.instance.GetString(Resource.String.stop_sync));
}
else if(item.YoutubeID != null)
{
menu.Menu.Add(Menu.None, Resource.Id.download, 1, MainActivity.instance.GetString(Resource.String.sync));
}
if(item.YoutubeID != null)
{
if(isForked)
menu.Menu.Add(Menu.None, Resource.Id.fork, 2, MainActivity.instance.GetString(Resource.String.unfork));
else
menu.Menu.Add(Menu.None, Resource.Id.fork, 2, MainActivity.instance.GetString(Resource.String.add_to_library));
}
if(item.HasWritePermission)
menu.Menu.Add(Menu.None, Resource.Id.name, 3, MainActivity.instance.GetString(Resource.String.rename));
menu.Menu.Add(Menu.None, Resource.Id.delete, 4, MainActivity.instance.GetString(Resource.String.delete));
menu.SetOnMenuItemClickListener(this);
menu.Show();
}

View File

@@ -586,12 +586,6 @@
<ItemGroup>
<AndroidResource Include="Resources\menu\playlist_header_more.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\menu\ytplaylist_header_more.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\menu\ytplaylistnowrite_header_more.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\layout\LineSongs.xml" />
</ItemGroup>
@@ -892,12 +886,6 @@
<SubType>Designer</SubType>
</AndroidResource>
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\menu\ytplaylistnowrite_forked_header_more.xml">
<Generator>MSBuild:UpdateGeneratedFiles</Generator>
<SubType>Designer</SubType>
</AndroidResource>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<Import Project="..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets" Condition="Exists('..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.targets')" />
<Import Project="..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets" Condition="Exists('..\packages\Xamarin.Android.Support.v7.Preference.25.4.0.2\build\MonoAndroid70\Xamarin.Android.Support.v7.Preference.targets')" />

View File

@@ -5357,8 +5357,8 @@ namespace Opus
// aapt resource value: 0x7f0b0192
public const int downButton = 2131427730;
// aapt resource value: 0x7f0b01d8
public const int download = 2131427800;
// aapt resource value: 0x7f0b01d7
public const int download = 2131427799;
// aapt resource value: 0x7f0b01d0
public const int downloadMDfromYT = 2131427792;
@@ -5489,8 +5489,8 @@ namespace Opus
// aapt resource value: 0x7f0b0087
public const int filled = 2131427463;
// aapt resource value: 0x7f0b01d5
public const int filter = 2131427797;
// aapt resource value: 0x7f0b01d4
public const int filter = 2131427796;
// aapt resource value: 0x7f0b0092
public const int fit = 2131427474;
@@ -5657,8 +5657,8 @@ namespace Opus
// aapt resource value: 0x7f0b017f
public const int media_actions = 2131427711;
// aapt resource value: 0x7f0b01d6
public const int media_route_menu_item = 2131427798;
// aapt resource value: 0x7f0b01d5
public const int media_route_menu_item = 2131427797;
// aapt resource value: 0x7f0b00cb
public const int message = 2131427531;
@@ -5996,8 +5996,8 @@ namespace Opus
// aapt resource value: 0x7f0b01c7
public const int refine = 2131427783;
// aapt resource value: 0x7f0b01d3
public const int rename = 2131427795;
// aapt resource value: 0x7f0b01d8
public const int rename = 2131427800;
// aapt resource value: 0x7f0b01c5
public const int reorder = 2131427781;
@@ -6020,8 +6020,8 @@ namespace Opus
// aapt resource value: 0x7f0b0183
public const int right_side = 2131427715;
// aapt resource value: 0x7f0b01d4
public const int saveAsPlaylist = 2131427796;
// aapt resource value: 0x7f0b01d3
public const int saveAsPlaylist = 2131427795;
// aapt resource value: 0x7f0b0019
public const int save_image_matrix = 2131427353;
@@ -6104,8 +6104,8 @@ namespace Opus
// aapt resource value: 0x7f0b0077
public const int selected = 2131427447;
// aapt resource value: 0x7f0b01d7
public const int settings = 2131427799;
// aapt resource value: 0x7f0b01d6
public const int settings = 2131427798;
// aapt resource value: 0x7f0b00b2
public const int shortcut = 2131427506;
@@ -7186,8 +7186,8 @@ namespace Opus
// aapt resource value: 0x7f0d0072
public const int abc_toolbar_collapse_description = 2131558514;
// aapt resource value: 0x7f0d0133
public const int add = 2131558707;
// aapt resource value: 0x7f0d0134
public const int add = 2131558708;
// aapt resource value: 0x7f0d00fa
public const int add_playlist = 2131558650;
@@ -7213,11 +7213,11 @@ namespace Opus
// aapt resource value: 0x7f0d0080
public const int appbar_scrolling_view_behavior = 2131558528;
// aapt resource value: 0x7f0d013d
public const int appearances = 2131558717;
// aapt resource value: 0x7f0d013e
public const int appearances = 2131558718;
// aapt resource value: 0x7f0d0130
public const int apply = 2131558704;
// aapt resource value: 0x7f0d0131
public const int apply = 2131558705;
// aapt resource value: 0x7f0d011a
public const int artist = 2131558682;
@@ -7231,11 +7231,11 @@ namespace Opus
// aapt resource value: 0x7f0d0110
public const int badplaylisturl = 2131558672;
// aapt resource value: 0x7f0d0137
public const int behavior = 2131558711;
// aapt resource value: 0x7f0d0138
public const int behavior = 2131558712;
// aapt resource value: 0x7f0d0156
public const int beta_available = 2131558742;
// aapt resource value: 0x7f0d0157
public const int beta_available = 2131558743;
// aapt resource value: 0x7f0d0081
public const int bottom_sheet_behavior = 2131558529;
@@ -7243,17 +7243,17 @@ namespace Opus
// aapt resource value: 0x7f0d00b2
public const int browse = 2131558578;
// aapt resource value: 0x7f0d0131
public const int cancel = 2131558705;
// aapt resource value: 0x7f0d0132
public const int cancel = 2131558706;
// aapt resource value: 0x7f0d015c
public const int cancelling = 2131558748;
// aapt resource value: 0x7f0d015d
public const int cancelling = 2131558749;
// aapt resource value: 0x7f0d00f0
public const int cant_delete = 2131558640;
// aapt resource value: 0x7f0d0159
public const int cant_play_non_youtube = 2131558745;
// aapt resource value: 0x7f0d015a
public const int cant_play_non_youtube = 2131558746;
// aapt resource value: 0x7f0d00b7
public const int cast = 2131558583;
@@ -7336,11 +7336,11 @@ namespace Opus
// aapt resource value: 0x7f0d0015
public const int cast_play = 2131558421;
// aapt resource value: 0x7f0d012e
public const int cast_queue_push = 2131558702;
// aapt resource value: 0x7f0d012f
public const int cast_queue_pushed = 2131558703;
public const int cast_queue_push = 2131558703;
// aapt resource value: 0x7f0d0130
public const int cast_queue_pushed = 2131558704;
// aapt resource value: 0x7f0d0016
public const int cast_rewind = 2131558422;
@@ -7405,8 +7405,8 @@ namespace Opus
// aapt resource value: 0x7f0d0083
public const int character_counter_pattern = 2131558531;
// aapt resource value: 0x7f0d0143
public const int check_updates = 2131558723;
// aapt resource value: 0x7f0d0144
public const int check_updates = 2131558724;
// aapt resource value: 0x7f0d002b
public const int common_google_play_services_enable_button = 2131558443;
@@ -7462,11 +7462,11 @@ namespace Opus
// aapt resource value: 0x7f0d003b
public const int common_signin_button_text_long = 2131558459;
// aapt resource value: 0x7f0d012d
public const int completed = 2131558701;
// aapt resource value: 0x7f0d012e
public const int completed = 2131558702;
// aapt resource value: 0x7f0d0150
public const int country_blocked = 2131558736;
// aapt resource value: 0x7f0d0151
public const int country_blocked = 2131558737;
// aapt resource value: 0x7f0d0116
public const int create_local = 2131558678;
@@ -7486,8 +7486,8 @@ namespace Opus
// aapt resource value: 0x7f0d0117
public const int create_youtube = 2131558679;
// aapt resource value: 0x7f0d0141
public const int dark_theme = 2131558721;
// aapt resource value: 0x7f0d0142
public const int dark_theme = 2131558722;
// aapt resource value: 0x7f0d00da
public const int delete = 2131558618;
@@ -7504,8 +7504,8 @@ namespace Opus
// aapt resource value: 0x7f0d011f
public const int download_albumart = 2131558687;
// aapt resource value: 0x7f0d0139
public const int download_directory = 2131558713;
// aapt resource value: 0x7f0d013a
public const int download_directory = 2131558714;
// aapt resource value: 0x7f0d0120
public const int download_meta = 2131558688;
@@ -7519,17 +7519,20 @@ namespace Opus
// aapt resource value: 0x7f0d0127
public const int download_queue = 2131558695;
// aapt resource value: 0x7f0d012b
public const int downloader_playlist = 2131558699;
// aapt resource value: 0x7f0d00ee
public const int downloading = 2131558638;
// aapt resource value: 0x7f0d015a
public const int downloading_notification = 2131558746;
// aapt resource value: 0x7f0d015b
public const int downloading_notification = 2131558747;
// aapt resource value: 0x7f0d012b
public const int downloading_status = 2131558699;
// aapt resource value: 0x7f0d012c
public const int downloading_status = 2131558700;
// aapt resource value: 0x7f0d0157
public const int downloading_update = 2131558743;
// aapt resource value: 0x7f0d0158
public const int downloading_update = 2131558744;
// aapt resource value: 0x7f0d00d1
public const int edit_metadata = 2131558609;
@@ -7672,8 +7675,8 @@ namespace Opus
// aapt resource value: 0x7f0d0129
public const int initialization = 2131558697;
// aapt resource value: 0x7f0d0134
public const int later = 2131558708;
// aapt resource value: 0x7f0d0135
public const int later = 2131558709;
// aapt resource value: 0x7f0d00d5
public const int list_songs = 2131558613;
@@ -7690,23 +7693,23 @@ namespace Opus
// aapt resource value: 0x7f0d00ff
public const int localpl_noperm = 2131558655;
// aapt resource value: 0x7f0d0147
public const int log_in = 2131558727;
// aapt resource value: 0x7f0d0148
public const int log_out = 2131558728;
// aapt resource value: 0x7f0d0146
public const int logged_in = 2131558726;
public const int log_in = 2131558728;
// aapt resource value: 0x7f0d0149
public const int login_disabled = 2131558729;
public const int log_out = 2131558729;
// aapt resource value: 0x7f0d013a
public const int max_download = 2131558714;
// aapt resource value: 0x7f0d0147
public const int logged_in = 2131558727;
// aapt resource value: 0x7f0d014a
public const int login_disabled = 2131558730;
// aapt resource value: 0x7f0d013b
public const int max_download_dialog = 2131558715;
public const int max_download = 2131558715;
// aapt resource value: 0x7f0d013c
public const int max_download_dialog = 2131558716;
// aapt resource value: 0x7f0d012a
public const int metadata = 2131558698;
@@ -7810,8 +7813,8 @@ namespace Opus
// aapt resource value: 0x7f0d00bc
public const int next_loading = 2131558588;
// aapt resource value: 0x7f0d0136
public const int no = 2131558710;
// aapt resource value: 0x7f0d0137
public const int no = 2131558711;
// aapt resource value: 0x7f0d00f5
public const int no_channel = 2131558645;
@@ -7819,8 +7822,8 @@ namespace Opus
// aapt resource value: 0x7f0d00f4
public const int no_lives = 2131558644;
// aapt resource value: 0x7f0d014b
public const int no_permission = 2131558731;
// aapt resource value: 0x7f0d014c
public const int no_permission = 2131558732;
// aapt resource value: 0x7f0d00f3
public const int no_playlist = 2131558643;
@@ -7831,17 +7834,17 @@ namespace Opus
// aapt resource value: 0x7f0d00e7
public const int no_song = 2131558631;
// aapt resource value: 0x7f0d014c
public const int no_song_mix = 2131558732;
// aapt resource value: 0x7f0d014d
public const int no_song_mix = 2131558733;
// aapt resource value: 0x7f0d00f2
public const int no_track = 2131558642;
// aapt resource value: 0x7f0d0145
public const int not_log = 2131558725;
// aapt resource value: 0x7f0d0146
public const int not_log = 2131558726;
// aapt resource value: 0x7f0d0151
public const int not_streamable = 2131558737;
// aapt resource value: 0x7f0d0152
public const int not_streamable = 2131558738;
// aapt resource value: 0x7f0d00bb
public const int nothing = 2131558587;
@@ -7849,14 +7852,14 @@ namespace Opus
// aapt resource value: 0x7f0d00be
public const int off = 2131558590;
// aapt resource value: 0x7f0d0132
public const int ok = 2131558706;
// aapt resource value: 0x7f0d0133
public const int ok = 2131558707;
// aapt resource value: 0x7f0d00c4
public const int open_youtube = 2131558596;
// aapt resource value: 0x7f0d0142
public const int others = 2131558722;
// aapt resource value: 0x7f0d0143
public const int others = 2131558723;
// aapt resource value: 0x7f0d0088
public const int password_toggle_content_description = 2131558536;
@@ -8008,32 +8011,32 @@ namespace Opus
// aapt resource value: 0x7f0d00dc
public const int sync_now = 2131558620;
// aapt resource value: 0x7f0d013c
public const int sync_remove = 2131558716;
// aapt resource value: 0x7f0d013d
public const int sync_remove = 2131558717;
// aapt resource value: 0x7f0d00ef
public const int syncing = 2131558639;
// aapt resource value: 0x7f0d015b
public const int tap_details = 2131558747;
// aapt resource value: 0x7f0d013e
public const int theme = 2131558718;
// aapt resource value: 0x7f0d015c
public const int tap_details = 2131558748;
// aapt resource value: 0x7f0d013f
public const int theme_dialog = 2131558719;
public const int theme = 2131558719;
// aapt resource value: 0x7f0d0140
public const int theme_dialog = 2131558720;
// aapt resource value: 0x7f0d00c3
public const int timer = 2131558595;
// aapt resource value: 0x7f0d014e
public const int timout = 2131558734;
// aapt resource value: 0x7f0d014f
public const int timout = 2131558735;
// aapt resource value: 0x7f0d0119
public const int title = 2131558681;
// aapt resource value: 0x7f0d014a
public const int undo = 2131558730;
// aapt resource value: 0x7f0d014b
public const int undo = 2131558731;
// aapt resource value: 0x7f0d0121
public const int undo_change = 2131558689;
@@ -8044,29 +8047,29 @@ namespace Opus
// aapt resource value: 0x7f0d010d
public const int unfork_playlist = 2131558669;
// aapt resource value: 0x7f0d014f
public const int unknow = 2131558735;
// aapt resource value: 0x7f0d0150
public const int unknow = 2131558736;
// aapt resource value: 0x7f0d00ba
public const int up_next = 2131558586;
// aapt resource value: 0x7f0d0155
public const int up_to_date = 2131558741;
// aapt resource value: 0x7f0d0156
public const int up_to_date = 2131558742;
// aapt resource value: 0x7f0d012c
public const int up_to_date_status = 2131558700;
// aapt resource value: 0x7f0d0153
public const int update = 2131558739;
// aapt resource value: 0x7f0d012d
public const int up_to_date_status = 2131558701;
// aapt resource value: 0x7f0d0154
public const int update_message = 2131558740;
public const int update = 2131558740;
// aapt resource value: 0x7f0d0152
public const int update_no_internet = 2131558738;
// aapt resource value: 0x7f0d0155
public const int update_message = 2131558741;
// aapt resource value: 0x7f0d0158
public const int updating = 2131558744;
// aapt resource value: 0x7f0d0153
public const int update_no_internet = 2131558739;
// aapt resource value: 0x7f0d0159
public const int updating = 2131558745;
// aapt resource value: 0x7f0d003e
public const int v7_preference_off = 2131558462;
@@ -8074,20 +8077,20 @@ namespace Opus
// aapt resource value: 0x7f0d003f
public const int v7_preference_on = 2131558463;
// aapt resource value: 0x7f0d0144
public const int version = 2131558724;
// aapt resource value: 0x7f0d0145
public const int version = 2131558725;
// aapt resource value: 0x7f0d0138
public const int volume = 2131558712;
// aapt resource value: 0x7f0d0139
public const int volume = 2131558713;
// aapt resource value: 0x7f0d0140
public const int white_theme = 2131558720;
// aapt resource value: 0x7f0d0141
public const int white_theme = 2131558721;
// aapt resource value: 0x7f0d0135
public const int yes = 2131558709;
// aapt resource value: 0x7f0d0136
public const int yes = 2131558710;
// aapt resource value: 0x7f0d014d
public const int youtube_endpoint = 2131558733;
// aapt resource value: 0x7f0d014e
public const int youtube_endpoint = 2131558734;
// aapt resource value: 0x7f0d00fb
public const int youtube_loading_error = 2131558651;

View File

@@ -3,10 +3,4 @@
<item
android:id="@+id/addToQueue"
android:title="@string/add_to_queue" />
<item
android:id="@+id/rename"
android:title="@string/rename" />
<item
android:id="@+id/delete"
android:title="@string/delete" />
</menu>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/download"
android:title="@string/sync" />
<item
android:id="@+id/addToQueue"
android:title="@string/add_to_queue" />
<item
android:id="@+id/rename"
android:title="@string/rename" />
<item
android:id="@+id/delete"
android:title="@string/delete" />
</menu>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/download"
android:title="@string/sync" />
<item
android:id="@+id/fork"
android:title="@string/unfork" />
<item
android:id="@+id/addToQueue"
android:title="@string/add_to_queue" />
<item
android:id="@+id/delete"
android:title="@string/delete" />
</menu>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/download"
android:title="@string/sync" />
<item
android:id="@+id/fork"
android:title="@string/add_to_library" />
<item
android:id="@+id/addToQueue"
android:title="@string/add_to_queue" />
<item
android:id="@+id/delete"
android:title="@string/delete" />
</menu>

View File

@@ -149,6 +149,7 @@
<string name="deleted_file">Fichier supprimé</string>
<string name="initialization">Initialisation</string>
<string name="metadata">Metadata</string>
<string name="downloader_playlist">Playlist</string>
<string name="downloading_status">Téléchargement</string>
<string name="up_to_date_status">Déjà à jour</string>
<string name="completed">Completé</string>

View File

@@ -149,6 +149,7 @@
<string name="deleted_file">Deleted file</string>
<string name="initialization">Initialization</string>
<string name="metadata">Metadata</string>
<string name="downloader_playlist">Playlist</string>
<string name="downloading_status">Downloading</string>
<string name="up_to_date_status">Up to date</string>
<string name="completed">Completed</string>