Reworking the player.

This commit is contained in:
Tristan Roux
2019-02-11 01:00:17 +01:00
parent 6c6c2d1928
commit ddf6a0db64
10 changed files with 1266 additions and 1377 deletions

View File

@@ -137,7 +137,7 @@ namespace MusicApp
if (intent.Action == "Sleep") if (intent.Action == "Sleep")
{ {
ShowPlayer(); ShowPlayer();
Player.instance.SleepButton_Click("", null); Player.instance.SleepDialog();
} }
else if (intent.Action == "Player") else if (intent.Action == "Player")
{ {
@@ -188,18 +188,22 @@ namespace MusicApp
} }
public void Login(bool canAsk = true, bool skipSilentLog = false) public void Login(bool canAsk = true, bool skipSilentLog = false, bool skipLastSigned = false)
{ {
waitingForYoutube = true; waitingForYoutube = true;
if(account == null) if (!skipLastSigned)
account = GoogleSignIn.GetLastSignedInAccount(this);
if (account != null)
{ {
CreateYoutube(); Console.WriteLine("&Checking for last signed in account");
return; if (account == null)
account = GoogleSignIn.GetLastSignedInAccount(this);
if (account != null)
{
CreateYoutube();
return;
}
} }
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn) GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
@@ -294,7 +298,7 @@ namespace MusicApp
if(account.ServerAuthCode == null) if(account.ServerAuthCode == null)
{ {
Login(true); Login(true, false, true);
return; return;
} }

View File

@@ -587,9 +587,6 @@
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\drawable\GradientShape.xml" /> <AndroidResource Include="Resources\drawable\GradientShape.xml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\OpenInYoutube.png" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\layout\PlaylistHeader.xml" /> <AndroidResource Include="Resources\layout\PlaylistHeader.xml" />
</ItemGroup> </ItemGroup>
@@ -866,6 +863,12 @@
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\values-es\strings.xml" /> <AndroidResource Include="Resources\values-es\strings.xml" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\darkCircle.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\darkLinear.xml" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" /> <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.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')" /> <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

@@ -3,6 +3,7 @@ using Android.App;
using Android.Content; using Android.Content;
using Android.Content.PM; using Android.Content.PM;
using Android.Content.Res; using Android.Content.Res;
using Android.Gms.Cast.Framework;
using Android.Graphics; using Android.Graphics;
using Android.Graphics.Drawables; using Android.Graphics.Drawables;
using Android.OS; using Android.OS;
@@ -10,6 +11,8 @@ using Android.Runtime;
using Android.Support.Design.Widget; using Android.Support.Design.Widget;
using Android.Support.V4.Widget; using Android.Support.V4.Widget;
using Android.Support.V7.Graphics; using Android.Support.V7.Graphics;
using Android.Text;
using Android.Text.Style;
using Android.Util; using Android.Util;
using Android.Views; using Android.Views;
using Android.Widget; using Android.Widget;
@@ -20,6 +23,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaRouteButton = Android.Support.V7.App.MediaRouteButton;
namespace MusicApp namespace MusicApp
{ {
@@ -34,7 +38,7 @@ namespace MusicApp
private SeekBar bar; private SeekBar bar;
private ProgressBar spBar; private ProgressBar spBar;
private TextView timerStart; private TextView timer;
private ImageView imgView; private ImageView imgView;
private bool prepared = false; private bool prepared = false;
private readonly int[] timers = new int[] { 0, 2, 10, 30, 60, 120 }; private readonly int[] timers = new int[] { 0, 2, 10, 30, 60, 120 };
@@ -58,27 +62,20 @@ namespace MusicApp
await Task.Delay(700); await Task.Delay(700);
CastButtonFactory.SetUpMediaRouteButton(MainActivity.instance, MainActivity.instance.FindViewById<MediaRouteButton>(Resource.Id.castButton));
MainActivity.instance.PrepareSmallPlayer(); MainActivity.instance.PrepareSmallPlayer();
TextView title = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle); TextView title = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle);
TextView artist = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist); TextView artist = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist);
imgView = MainActivity.instance.FindViewById<ImageView>(Resource.Id.playerAlbum); imgView = MainActivity.instance.FindViewById<ImageView>(Resource.Id.playerAlbum);
TextView NextTitle = MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle);
TextView NextAlbum = MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist);
Button ShowQueue = MainActivity.instance.FindViewById<Button>(Resource.Id.showQueue);
ImageButton smallQueue = MainActivity.instance.FindViewById<ImageButton>(Resource.Id.smallQueue);
if (!MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playButton).HasOnClickListeners) if (!MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playButton).HasOnClickListeners)
{ {
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.downButton).Click += Down_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.showQueue).Click += ShowQueue_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.lastButton).Click += Last_Click; MainActivity.instance.FindViewById<ImageButton>(Resource.Id.lastButton).Click += Last_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playButton).Click += Play_Click; MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playButton).Click += Play_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.nextButton).Click += Next_Click; MainActivity.instance.FindViewById<ImageButton>(Resource.Id.nextButton).Click += Next_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerSleep).Click += SleepButton_Click; MainActivity.instance.FindViewById<ImageButton>(Resource.Id.moreButton).Click += More;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerPlaylistAdd).Click += AddToPlaylist_Click;
MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).Click += Fab_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerDownload).Click += Download_Click;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerYoutube).Click += Youtube_Click;
ShowQueue.Click += ShowQueue_Click;
smallQueue.Click += ShowQueue_Click;
} }
title.Selected = true; title.Selected = true;
@@ -86,36 +83,13 @@ namespace MusicApp
artist.Selected = true; artist.Selected = true;
artist.SetMarqueeRepeatLimit(3); artist.SetMarqueeRepeatLimit(3);
((GradientDrawable)ShowQueue.Background).SetStroke(5, ColorStateList.ValueOf(Color.Argb(255, 21, 183, 237))); timer = MainActivity.instance.FindViewById<TextView>(Resource.Id.timer);
ShowQueue.SetTextColor(Color.Argb(255, 21, 183, 237));
((GradientDrawable)smallQueue.Background).SetStroke(5, ColorStateList.ValueOf(Color.Argb(255, 21, 183, 237)));
if (MainActivity.Theme == 1)
{
NextTitle.SetTextColor(Color.White);
NextAlbum.SetTextColor(Color.White);
NextAlbum.Alpha = 0.7f;
smallQueue.ImageTintList = ColorStateList.ValueOf(Color.Argb(255, 255, 255, 255));
}
else
{
smallQueue.ImageTintList = ColorStateList.ValueOf(Color.Argb(255, 0, 0, 0));
}
if (ShowQueue.Height < 100)
{
smallQueue.Visibility = ViewStates.Visible;
ShowQueue.Visibility = ViewStates.Gone;
}
bar = MainActivity.instance.FindViewById<SeekBar>(Resource.Id.songTimer); bar = MainActivity.instance.FindViewById<SeekBar>(Resource.Id.songTimer);
bar.ProgressChanged += (sender, e) => bar.ProgressChanged += (sender, e) =>
{ {
if(!MusicPlayer.isLiveStream) if(!MusicPlayer.isLiveStream)
timerStart.Text = DurationToTimer(e.Progress); timer.Text = string.Format("{0} | {1}", DurationToTimer(e.Progress), DurationToTimer((int)MusicPlayer.Duration));
}; };
timerStart = MainActivity.instance.FindViewById<TextView>(Resource.Id.timerStart);
spBar = MainActivity.instance.FindViewById<ProgressBar>(Resource.Id.spProgress); spBar = MainActivity.instance.FindViewById<ProgressBar>(Resource.Id.spProgress);
} }
@@ -126,7 +100,7 @@ namespace MusicApp
await Task.Delay(100); await Task.Delay(100);
Song current = await MusicPlayer.GetItem(); Song current = await MusicPlayer.GetItem();
FrameLayout smallPlayer = MainActivity.instance.FindViewById<FrameLayout>(Resource.Id.smallPlayer); FrameLayout smallPlayer = MainActivity.instance.FindViewById<FrameLayout>(Resource.Id.smallPlayer);
smallPlayer.FindViewById<TextView>(Resource.Id.spTitle).Text = current.Title; smallPlayer.FindViewById<TextView>(Resource.Id.spTitle).Text = current.Title;
smallPlayer.FindViewById<TextView>(Resource.Id.spArtist).Text = current.Artist; smallPlayer.FindViewById<TextView>(Resource.Id.spArtist).Text = current.Artist;
@@ -148,8 +122,12 @@ namespace MusicApp
TextView title = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle); TextView title = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle);
TextView artist = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist); TextView artist = MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist);
imgView = MainActivity.instance.FindViewById<ImageView>(Resource.Id.playerAlbum); imgView = MainActivity.instance.FindViewById<ImageView>(Resource.Id.playerAlbum);
title.Text = current.Title; SpannableString titleText = new SpannableString(current.Title);
artist.Text = current.Artist; titleText.SetSpan(new BackgroundColorSpan(Color.ParseColor("#BF000000")), 0, current.Title.Length, SpanTypes.InclusiveInclusive);
title.TextFormatted = titleText;
SpannableString artistText = new SpannableString(current.Artist);
artistText.SetSpan(new BackgroundColorSpan(Color.ParseColor("#BF000000")), 0, current.Artist.Length, SpanTypes.InclusiveInclusive);
artist.TextFormatted = artistText;
if (!errorState) if (!errorState)
{ {
@@ -201,19 +179,6 @@ namespace MusicApp
imgView.SetImageBitmap(icon); imgView.SetImageBitmap(icon);
Palette.From(icon).MaximumColorCount(28).Generate(this); Palette.From(icon).MaximumColorCount(28).Generate(this);
if (current.IsYt)
{
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerDownload).Visibility = ViewStates.Visible;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerYoutube).Visibility = ViewStates.Visible;
}
else
{
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerDownload).Visibility = ViewStates.Gone;
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.playerYoutube).Visibility = ViewStates.Gone;
}
UpdateNext();
if (bar != null) if (bar != null)
{ {
while (MusicPlayer.Duration < 2) while (MusicPlayer.Duration < 2)
@@ -225,15 +190,13 @@ namespace MusicApp
bar.Progress = 1; bar.Progress = 1;
spBar.Max = 1; spBar.Max = 1;
spBar.Progress = 1; spBar.Progress = 1;
timerStart.Text = ""; timer.Text = "🔴 LIVE";
MainActivity.instance.FindViewById<TextView>(Resource.Id.timerEnd).Text = "🔴 LIVE";
} }
else else
{ {
bar.Max = (int)MusicPlayer.Duration; bar.Max = (int)MusicPlayer.Duration;
MusicPlayer.SetSeekBar(bar); MusicPlayer.SetSeekBar(bar);
timerStart.Text = DurationToTimer((int)MusicPlayer.CurrentPosition); timer.Text = string.Format("{0} | {1}", DurationToTimer((int)MusicPlayer.CurrentPosition), DurationToTimer((int)MusicPlayer.Duration));
MainActivity.instance.FindViewById<TextView>(Resource.Id.timerEnd).Text = DurationToTimer((int)MusicPlayer.Duration);
spBar.Max = (int)MusicPlayer.Duration; spBar.Max = (int)MusicPlayer.Duration;
spBar.Progress = (int)MusicPlayer.CurrentPosition; spBar.Progress = (int)MusicPlayer.CurrentPosition;
@@ -245,82 +208,82 @@ namespace MusicApp
public async void UpdateNext() public async void UpdateNext()
{ {
await Task.Delay(10); await Task.Delay(10);
bool asNext = MusicPlayer.queue.Count > MusicPlayer.CurrentID() + 1; //bool asNext = MusicPlayer.queue.Count > MusicPlayer.CurrentID() + 1;
if (asNext) //if (asNext)
{ //{
Song next = await MusicPlayer.GetItem(MusicPlayer.CurrentID() + 1); // Song next = await MusicPlayer.GetItem(MusicPlayer.CurrentID() + 1);
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next);
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title; // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title;
ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt); // ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt);
if (next.Album == null) // if (next.Album == null)
{ // {
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart"); // var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt); // var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt);
Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt); // Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt);
} // }
else // else
{ // {
Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt); // Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt);
} // }
} //}
else if (MusicPlayer.useAutoPlay) //else if (MusicPlayer.useAutoPlay)
{ //{
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next);
ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt); // ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt);
Song next = await MusicPlayer.GetItem(MusicPlayer.CurrentID() + 1); // Song next = await MusicPlayer.GetItem(MusicPlayer.CurrentID() + 1);
if(next != null) // if(next != null)
{ // {
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title; // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title;
if (next.Album == null) // if (next.Album == null)
{ // {
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart"); // var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt); // var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt);
Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt); // Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt);
} // }
else // else
{ // {
Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt); // Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt);
} // }
} // }
else // else
{ // {
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = Resources.GetString(Resource.String.next_loading); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = Resources.GetString(Resource.String.next_loading);
Picasso.With(MainActivity.instance).Load(Resource.Drawable.noAlbum).Into(nextArt); // Picasso.With(MainActivity.instance).Load(Resource.Drawable.noAlbum).Into(nextArt);
MusicPlayer.instance?.GenerateAutoPlay(false); // MusicPlayer.instance?.GenerateAutoPlay(false);
} // }
} //}
else if (MusicPlayer.repeat) //else if (MusicPlayer.repeat)
{ //{
Song next = await MusicPlayer.GetItem(0); // Song next = await MusicPlayer.GetItem(0);
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next);
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title; // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = next.Title;
ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt); // ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt);
if (next.Album == null) // if (next.Album == null)
{ // {
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart"); // var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt); // var nextAlbumArtUri = ContentUris.WithAppendedId(songCover, next.AlbumArt);
Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt); // Picasso.With(MainActivity.instance).Load(nextAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt);
} // }
else // else
{ // {
Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt); // Picasso.With(MainActivity.instance).Load(next.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(nextArt);
} // }
} //}
else //else
{ //{
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextTitle).Text = Resources.GetString(Resource.String.up_next);
MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = Resources.GetString(Resource.String.nothing); // MainActivity.instance.FindViewById<TextView>(Resource.Id.nextArtist).Text = Resources.GetString(Resource.String.nothing);
ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt); // ImageView nextArt = MainActivity.instance.FindViewById<ImageView>(Resource.Id.nextArt);
Picasso.With(MainActivity.instance).Load(Resource.Drawable.noAlbum).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt); // Picasso.With(MainActivity.instance).Load(Resource.Drawable.noAlbum).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(nextArt);
} //}
} }
public void Buffering() public void Buffering()
@@ -374,29 +337,12 @@ namespace MusicApp
} }
private void Download_Click(object sender, EventArgs e)
{
Song song = MusicPlayer.queue[MusicPlayer.CurrentID()];
YoutubeEngine.Download(song.Title, song.YoutubeID);
}
private void Youtube_Click(object sender, EventArgs e)
{
Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("vnd.youtube://" + MusicPlayer.queue[MusicPlayer.CurrentID()].YoutubeID));
StartActivity(intent);
}
public void Stoped() public void Stoped()
{ {
MainActivity.instance.ShowSmallPlayer(); MainActivity.instance.ShowSmallPlayer();
MainActivity.instance.SheetBehavior.State = BottomSheetBehavior.StateCollapsed; MainActivity.instance.SheetBehavior.State = BottomSheetBehavior.StateCollapsed;
} }
private void AddToPlaylist_Click(object sender, EventArgs e)
{
Browse.GetPlaylist(MusicPlayer.queue[MusicPlayer.CurrentID()]);
}
public void UpdateSeekBar() public void UpdateSeekBar()
{ {
if (!MusicPlayer.isRunning) if (!MusicPlayer.isRunning)
@@ -407,7 +353,7 @@ namespace MusicApp
if(MusicPlayer.autoUpdateSeekBar) if(MusicPlayer.autoUpdateSeekBar)
{ {
bar.Progress = (int)MusicPlayer.CurrentPosition; bar.Progress = (int)MusicPlayer.CurrentPosition;
timerStart.Text = DurationToTimer((int)MusicPlayer.CurrentPosition); timer.Text = string.Format("{0} | {1}", DurationToTimer((int)MusicPlayer.CurrentPosition), DurationToTimer((int)MusicPlayer.Duration));
} }
spBar.Progress = (int)MusicPlayer.CurrentPosition; spBar.Progress = (int)MusicPlayer.CurrentPosition;
handler.PostDelayed(UpdateSeekBar, 1000); handler.PostDelayed(UpdateSeekBar, 1000);
@@ -432,7 +378,7 @@ namespace MusicApp
return (hours == 0) ? (min + ":" + sec) : (hour + ":" + min + ":" + sec); return (hours == 0) ? (min + ":" + sec) : (hour + ":" + min + ":" + sec);
} }
private void Fab_Click(object sender, EventArgs e) private void Down_Click(object sender, EventArgs e)
{ {
MainActivity.instance.ShowSmallPlayer(); MainActivity.instance.ShowSmallPlayer();
MainActivity.instance.SheetBehavior.State = BottomSheetBehavior.StateCollapsed; MainActivity.instance.SheetBehavior.State = BottomSheetBehavior.StateCollapsed;
@@ -472,7 +418,69 @@ namespace MusicApp
MainActivity.instance.StartService(intent); MainActivity.instance.StartService(intent);
} }
public void SleepButton_Click(object sender, EventArgs e) private async void More(object s, EventArgs e)
{
Song item = await MusicPlayer.GetItem();
BottomSheetDialog bottomSheet = new BottomSheetDialog(MainActivity.instance);
View bottomView = MainActivity.instance.LayoutInflater.Inflate(Resource.Layout.BottomSheet, null);
bottomView.FindViewById<TextView>(Resource.Id.bsTitle).Text = item.Title;
bottomView.FindViewById<TextView>(Resource.Id.bsArtist).Text = item.Artist;
if (item.Album == null)
{
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
var songAlbumArtUri = ContentUris.WithAppendedId(songCover, item.AlbumArt);
Picasso.With(MainActivity.instance).Load(songAlbumArtUri).Placeholder(Resource.Drawable.noAlbum).Resize(400, 400).CenterCrop().Into(bottomView.FindViewById<ImageView>(Resource.Id.bsArt));
}
else
{
Picasso.With(MainActivity.instance).Load(item.Album).Placeholder(Resource.Drawable.noAlbum).Transform(new RemoveBlackBorder(true)).Into(bottomView.FindViewById<ImageView>(Resource.Id.bsArt));
}
bottomSheet.SetContentView(bottomView);
List<BottomSheetAction> actions = new List<BottomSheetAction>
{
new BottomSheetAction(Resource.Drawable.Timer, Resources.GetString(Resource.String.timer), (sender, eventArg) => { SleepDialog(); bottomSheet.Dismiss(); }),
new BottomSheetAction(Resource.Drawable.PlaylistAdd, Resources.GetString(Resource.String.add_to_playlist), (sender, eventArg) => { Browse.GetPlaylist(item); bottomSheet.Dismiss(); })
};
if (item.IsYt)
{
actions.AddRange(new BottomSheetAction[]
{
new BottomSheetAction(Resource.Drawable.PlayCircle, Resources.GetString(Resource.String.create_mix_from_song), (sender, eventArg) =>
{
YoutubeEngine.CreateMix(item);
bottomSheet.Dismiss();
}),
new BottomSheetAction(Resource.Drawable.Download, Resources.GetString(Resource.String.download), (sender, eventArg) =>
{
YoutubeEngine.Download(item.Title, item.YoutubeID);
bottomSheet.Dismiss();
}),
new BottomSheetAction(Resource.Drawable.OpenInBrowser, Resources.GetString(Resource.String.open_youtube), (sender, eventArg) =>
{
Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("vnd.youtube://" + MusicPlayer.queue[MusicPlayer.CurrentID()].YoutubeID));
StartActivity(intent);
bottomSheet.Dismiss();
})
});
}
else
{
actions.Add(new BottomSheetAction(Resource.Drawable.Edit, Resources.GetString(Resource.String.edit_metadata), (sender, eventArg) =>
{
Browse.EditMetadata(item);
bottomSheet.Dismiss();
}));
}
bottomSheet.FindViewById<ListView>(Resource.Id.bsItems).Adapter = new BottomSheetAdapter(MainActivity.instance, Resource.Layout.BottomSheetText, actions);
bottomSheet.Show();
}
public void SleepDialog()
{ {
string minutes = GetString(Resource.String.minutes); string minutes = GetString(Resource.String.minutes);
Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(MainActivity.instance, MainActivity.dialogTheme); Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(MainActivity.instance, MainActivity.dialogTheme);
@@ -533,61 +541,61 @@ namespace MusicApp
Color text = Color.Argb(Color.GetAlphaComponent(swatch.BodyTextColor), Color.GetRedComponent(swatch.BodyTextColor), Color.GetGreenComponent(swatch.BodyTextColor), Color.GetBlueComponent(swatch.BodyTextColor)); Color text = Color.Argb(Color.GetAlphaComponent(swatch.BodyTextColor), Color.GetRedComponent(swatch.BodyTextColor), Color.GetGreenComponent(swatch.BodyTextColor), Color.GetBlueComponent(swatch.BodyTextColor));
Color background = Color.Argb(Color.GetAlphaComponent(swatch.Rgb), Color.GetRedComponent(swatch.Rgb), Color.GetGreenComponent(swatch.Rgb), Color.GetBlueComponent(swatch.Rgb)); Color background = Color.Argb(Color.GetAlphaComponent(swatch.Rgb), Color.GetRedComponent(swatch.Rgb), Color.GetGreenComponent(swatch.Rgb), Color.GetBlueComponent(swatch.Rgb));
Color accentColor = Color.Argb(Color.GetAlphaComponent(accent.Rgb), Color.GetRedComponent(accent.Rgb), Color.GetGreenComponent(accent.Rgb), Color.GetBlueComponent(accent.Rgb)); Color accentColor = Color.Argb(Color.GetAlphaComponent(accent.Rgb), Color.GetRedComponent(accent.Rgb), Color.GetGreenComponent(accent.Rgb), Color.GetBlueComponent(accent.Rgb));
MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle).SetTextColor(text); //MainActivity.instance.FindViewById<TextView>(Resource.Id.playerTitle).SetTextColor(text);
MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist).SetTextColor(text); //MainActivity.instance.FindViewById<TextView>(Resource.Id.playerArtist).SetTextColor(text);
MainActivity.instance.FindViewById<TextView>(Resource.Id.spTitle).SetTextColor(text); MainActivity.instance.FindViewById<TextView>(Resource.Id.spTitle).SetTextColor(text);
MainActivity.instance.FindViewById<TextView>(Resource.Id.spArtist).SetTextColor(text); MainActivity.instance.FindViewById<TextView>(Resource.Id.spArtist).SetTextColor(text);
MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).BackgroundTintList = ColorStateList.ValueOf(accentColor); //MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).BackgroundTintList = ColorStateList.ValueOf(accentColor);
MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).RippleColor = accent.Rgb; //MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).RippleColor = accent.Rgb;
//float multiplier = 0.4f; ////float multiplier = 0.4f;
////if(Build.VERSION.SdkInt >= BuildVersionCodes.M && IsColorDark(accentColor)) //////if(Build.VERSION.SdkInt >= BuildVersionCodes.M && IsColorDark(accentColor))
//// multiplier = 1.6f; ////// multiplier = 1.6f;
//int red = (int)(Color.GetRedComponent(accentColor.ToArgb()) * multiplier); ////int red = (int)(Color.GetRedComponent(accentColor.ToArgb()) * multiplier);
//int green = (int)(Color.GetGreenComponent(accentColor.ToArgb()) * multiplier); ////int green = (int)(Color.GetGreenComponent(accentColor.ToArgb()) * multiplier);
//int blue = (int)(Color.GetBlueComponent(accentColor.ToArgb()) * multiplier); ////int blue = (int)(Color.GetBlueComponent(accentColor.ToArgb()) * multiplier);
//Color toolbar = Color.Rgb(red, green, blue); ////Color toolbar = Color.Rgb(red, green, blue);
//MainActivity.instance.FindViewById(Resource.Id.playerStatus).SetBackgroundColor(toolbar); ////MainActivity.instance.FindViewById(Resource.Id.playerStatus).SetBackgroundColor(toolbar);
////if (Build.VERSION.SdkInt >= BuildVersionCodes.M) //////if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
////{ //////{
//// int statusBar = (int)MainActivity.instance.Window.DecorView.SystemUiVisibility; ////// int statusBar = (int)MainActivity.instance.Window.DecorView.SystemUiVisibility;
//// if (!IsColorDark(toolbar)) ////// if (!IsColorDark(toolbar))
//// statusBar |= (int)SystemUiFlags.LightStatusBar; ////// statusBar |= (int)SystemUiFlags.LightStatusBar;
//// else ////// else
//// statusBar ^= (int)SystemUiFlags.LightStatusBar; ////// statusBar ^= (int)SystemUiFlags.LightStatusBar;
//// MainActivity.instance.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)statusBar; ////// MainActivity.instance.Window.DecorView.SystemUiVisibility = (StatusBarVisibility)statusBar;
////} //////}
//Reveal for the player ////Reveal for the player
View reveal = MainActivity.instance.FindViewById<View>(Resource.Id.reveal); //View reveal = MainActivity.instance.FindViewById<View>(Resource.Id.reveal);
int centerX, centerY; //int centerX, centerY;
float endRadius; //float endRadius;
if (playNext == true) //if (playNext == true)
{ //{
centerX = 0; // centerX = 0;
centerY = reveal.Height / 2; // centerY = reveal.Height / 2;
endRadius = reveal.Width * 1.3f; // endRadius = reveal.Width * 1.3f;
} //}
else if(playNext == null) //else if(playNext == null)
{ //{
centerX = reveal.Width / 2; // centerX = reveal.Width / 2;
centerY = reveal.Height; // centerY = reveal.Height;
endRadius = reveal.Width / 1.5f; // endRadius = reveal.Width / 1.5f;
} //}
else //else
{ //{
centerX = reveal.Width; // centerX = reveal.Width;
centerY = reveal.Height / 2; // centerY = reveal.Height / 2;
endRadius = reveal.Width * 1.3f; // endRadius = reveal.Width * 1.3f;
} //}
Animator anim = ViewAnimationUtils.CreateCircularReveal(reveal, centerX, centerY, 0, endRadius); //Animator anim = ViewAnimationUtils.CreateCircularReveal(reveal, centerX, centerY, 0, endRadius);
anim.AnimationStart += (sender, e) => { reveal.SetBackgroundColor(background); }; //anim.AnimationStart += (sender, e) => { reveal.SetBackgroundColor(background); };
anim.AnimationEnd += (sender, e) => { MainActivity.instance?.FindViewById<RelativeLayout>(Resource.Id.infoPanel).SetBackgroundColor(background); }; //anim.AnimationEnd += (sender, e) => { MainActivity.instance?.FindViewById<RelativeLayout>(Resource.Id.infoPanel).SetBackgroundColor(background); };
anim.SetDuration(500); //anim.SetDuration(500);
anim.StartDelay = 200; //anim.StartDelay = 200;
anim.Start(); //anim.Start();
//Reveal for the smallPlayer //Reveal for the smallPlayer
if (prepared) if (prepared)
@@ -610,7 +618,7 @@ namespace MusicApp
if (bar == null) if (bar == null)
bar = MainActivity.instance.FindViewById<SeekBar>(Resource.Id.songTimer); bar = MainActivity.instance.FindViewById<SeekBar>(Resource.Id.songTimer);
if(spBar == null) if (spBar == null)
spBar = MainActivity.instance.FindViewById<ProgressBar>(Resource.Id.spProgress); spBar = MainActivity.instance.FindViewById<ProgressBar>(Resource.Id.spProgress);
bar.ProgressTintList = ColorStateList.ValueOf(accentColor); bar.ProgressTintList = ColorStateList.ValueOf(accentColor);
@@ -621,7 +629,7 @@ namespace MusicApp
if (IsColorDark(accent.Rgb)) if (IsColorDark(accent.Rgb))
{ {
MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).ImageTintList = ColorStateList.ValueOf(Color.White); //MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).ImageTintList = ColorStateList.ValueOf(Color.White);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spNext).ImageTintList = ColorStateList.ValueOf(Color.White); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spNext).ImageTintList = ColorStateList.ValueOf(Color.White);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spPlay).ImageTintList = ColorStateList.ValueOf(Color.White); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spPlay).ImageTintList = ColorStateList.ValueOf(Color.White);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spLast).ImageTintList = ColorStateList.ValueOf(Color.White); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spLast).ImageTintList = ColorStateList.ValueOf(Color.White);
@@ -629,7 +637,7 @@ namespace MusicApp
} }
else else
{ {
MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).ImageTintList = ColorStateList.ValueOf(Color.Black); //MainActivity.instance.FindViewById<FloatingActionButton>(Resource.Id.downFAB).ImageTintList = ColorStateList.ValueOf(Color.Black);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spNext).ImageTintList = ColorStateList.ValueOf(Color.Black); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spNext).ImageTintList = ColorStateList.ValueOf(Color.Black);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spPlay).ImageTintList = ColorStateList.ValueOf(Color.Black); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spPlay).ImageTintList = ColorStateList.ValueOf(Color.Black);
MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spLast).ImageTintList = ColorStateList.ValueOf(Color.Black); MainActivity.instance.FindViewById<ImageButton>(Resource.Id.spLast).ImageTintList = ColorStateList.ValueOf(Color.Black);

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 B

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="#BF000000"/>
<size android:width="40dp" android:height="40dp"/>
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="56dp"
android:color="#BF000000" />
<corners
android:radius="40dp"/>
<size
android:width="116dp"
android:height="56dp" />
</shape>

View File

@@ -1,275 +1,150 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:id="@+id/playerView" android:id="@+id/playerView" >
android:background="?android:colorBackground"> <ImageView
android:id="@+id/playerAlbum"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
android:scaleType="centerCrop"
android:src="@drawable/noAlbum" />
<LinearLayout <LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<FrameLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/playerAlbum"
android:layout_width="fill_parent"
android:background="@null"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:src="@drawable/noAlbum"
android:transitionName="albumArt"
android:adjustViewBounds="true" />
<LinearLayout
android:gravity="center"
android:layout_gravity="center"
android:orientation="vertical"
android:paddingBottom="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:gravity="center"
android:layout_gravity="center"
android:layout_height="wrap_content" >
<ImageButton
android:id="@+id/lastButton"
android:tint="#ffffff"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="20dp"
android:src="@drawable/SkipPrevious"
android:background="@drawable/GradientShape" />
<ImageButton
android:id="@+id/playButton"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="20dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:layout_gravity="center"
android:tint="#ffffff"
android:src="@drawable/Pause"
android:background="@drawable/GradientShape" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"
android:id="@+id/playerBuffer"
android:padding="20dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"/>
<ImageButton
android:id="@+id/nextButton"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="20dp"
android:tint="#ffffff"
android:src="@drawable/SkipNext"
android:background="@drawable/GradientShape" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:paddingTop="10dp"
android:gravity="center"
android:layout_gravity="center"
android:layout_height="wrap_content" >
<ImageButton
android:id="@+id/playerSleep"
android:src="@drawable/Timer"
android:background="@drawable/GradientShape"
android:layout_width="80dp"
android:layout_height="80dp"
android:tint="#ffffff"
android:padding="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"/>
<ImageButton
android:id="@+id/playerPlaylistAdd"
android:src="@drawable/PlaylistAdd"
android:background="@drawable/GradientShape"
android:layout_width="80dp"
android:layout_height="80dp"
android:tint="#ffffff"
android:padding="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
<ImageButton
android:id="@+id/playerDownload"
android:src="@drawable/Download"
android:background="@drawable/GradientShape"
android:visibility="gone"
android:tint="#ffffff"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
<ImageButton
android:id="@+id/playerYoutube"
android:src="@drawable/OpenInBrowser"
android:background="@drawable/GradientShape"
android:visibility="gone"
android:tint="#ffffff"
android:layout_width="80dp"
android:layout_height="80dp"
android:padding="20dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
</LinearLayout>
</LinearLayout>
<ImageView
android:src="@drawable/darkRectangle"
android:layout_width="fill_parent"
android:layout_height="256px"
android:adjustViewBounds="true"
android:id="@+id/playerDark"
android:layout_gravity="bottom" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:id="@+id/timerStart"
android:textColor="#ffffff"
android:layout_gravity="bottom|left"
android:padding="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="\??:??"
android:id="@+id/timerEnd"
android:textColor="#ffffff"
android:layout_gravity="bottom|right"
android:padding="10dp" />
</FrameLayout>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/infoPanel"
android:background="#2b5568" >
<View
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/playerTitle"
android:layout_alignBottom="@+id/playerArtist"
android:id="@+id/reveal" />
<TextView
android:text="Title"
android:id="@+id/playerTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:paddingTop="15dp"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit ="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:textSize="34sp"
android:textColor="#FFFFFF"
android:alpha="1"
android:textStyle="bold"
android:paddingLeft="60dp" />
<TextView
android:text="Artist"
android:id="@+id/playerArtist"
android:singleLine="true"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:paddingBottom="20dp"
android:marqueeRepeatLimit ="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="60dp"
android:alpha=".92"
android:layout_below="@id/playerTitle"
android:textSize="20sp"
android:textColor="#FFFFFF"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/nextSong"
android:padding="8dp">
<ImageView
android:id="@+id/nextArt"
android:layout_width="90dp"
android:layout_height="90dp"
android:padding="5dp"
android:src="@drawable/MusicIcon"
android:layout_alignParentLeft="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/FlatButtonBorder"
android:id="@+id/smallQueue"
android:visibility="gone"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:padding="5dp"
android:src="@drawable/Queue" />
<LinearLayout
android:orientation="vertical"
android:paddingTop="14dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/smallQueue"
android:layout_alignParentLeft="true"
android:paddingLeft="100dp">
<TextView
android:id="@+id/nextTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="16dip"
android:textStyle="bold" />
<TextView
android:id="@+id/nextArtist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14dip"
android:textColor="#000" />
</LinearLayout>
</RelativeLayout>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:background="@drawable/FlatButtonBorder"
android:id="@+id/showQueue"
android:text="@string/show_queue" />
</LinearLayout>
<SeekBar
android:id="@+id/songTimer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:layout_anchor="@id/playerAlbum"
app:elevation="6dp"
android:padding="0dp"
app:layout_anchorGravity="bottom|center" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/downFAB"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_anchor="@id/infoPanel" android:orientation="horizontal"
app:layout_anchorGravity="bottom|center" android:layout_alignParentRight="true"
android:layout_margin="10dip" android:paddingTop="40dp"
app:elevation="12dp" android:paddingRight="5dp"
app:fabSize="mini" android:id="@+id/buttonsRight"
app:borderWidth="0dp" android:background="@drawable/darkLinear" >
android:paddingTop="20dp" <android.support.v7.app.MediaRouteButton
app:backgroundTint="#4cb5ae" android:id="@+id/castButton"
android:src="@drawable/arrowdown" /> android:layout_width="56dp"
</android.support.design.widget.CoordinatorLayout> android:layout_height="56dp"
android:background="@null" />
<ImageButton
android:layout_width="56dp"
android:layout_height="56dp"
android:tint="#ffffff"
android:src="@drawable/arrowdown"
android:background="@null"
android:id="@+id/downButton" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_toLeftOf="@id/buttonsRight"
android:paddingTop="40dp"
android:paddingLeft="15dp" >
<TextView
android:text="Title"
android:id="@+id/playerTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:maxLines="2"
android:textSize="20sp"
android:textColor="#ffffff" />
<TextView
android:text="Artist"
android:layout_marginTop="7dp"
android:id="@+id/playerArtist"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit ="marquee_forever"
android:padding="3dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:alpha=".92"
android:textSize="15sp"
android:textColor="#FFFFFF" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentBottom="true"
android:layout_marginBottom="25dp">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp" >
<SeekBar
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/songTimer"
app:elevation="6dp"
android:padding="0dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00 | ??:??"
android:id="@+id/timer"
android:textColor="#ffffff"
android:background="#BF000000"
android:layout_centerHorizontal="true"
android:padding="3dp" />
</RelativeLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal" >
<ImageButton
android:id="@+id/showQueue"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:tint="#ffffff"
android:background="@drawable/darkCircle"
android:src="@drawable/queue" />
<ImageButton
android:id="@+id/lastButton"
android:tint="#ffffff"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:background="@drawable/darkCircle"
android:src="@drawable/SkipPrevious" />
<ImageButton
android:id="@+id/playButton"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"
android:tint="#ffffff"
android:background="@drawable/darkCircle"
android:src="@drawable/Pause" />
<ProgressBar
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:visibility="gone"
android:id="@+id/playerBuffer"
android:layout_marginLeft="50dp"
android:layout_marginRight="50dp"/>
<ImageButton
android:id="@+id/nextButton"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:tint="#ffffff"
android:background="@drawable/darkCircle"
android:src="@drawable/SkipNext" />
<ImageButton
android:id="@+id/moreButton"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_margin="12dp"
android:tint="#ffffff"
android:background="@drawable/darkCircle"
android:src="@drawable/more" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>

View File

@@ -17,7 +17,7 @@
<string name="up_next">À suivre :</string> <string name="up_next">À suivre :</string>
<string name="nothing">Rien.</string> <string name="nothing">Rien.</string>
<string name="next_loading">Chargement en cours, veuillez patienter.</string> <string name="next_loading">Chargement en cours, veuillez patienter.</string>
<string name="sleep_timer">Arreter la musique dans</string> <string name="sleep_timer">Arrêter la musique dans</string>
<string name="off">Off</string> <string name="off">Off</string>
<string name="minute">minute</string> <string name="minute">minute</string>
<string name="minutes">minutes</string> <string name="minutes">minutes</string>
@@ -31,7 +31,7 @@
<!--Autoplay--> <!--Autoplay-->
<string name="autoplay">Lecture automatique</string> <string name="autoplay">Lecture automatique</string>
<string name="autoplay_desc">Ajoute automatiquement des musiques similaire</string> <string name="autoplay_desc">Ajoute automatiquement des musiques similaires</string>
<string name="create_mix">CRÉER UN MIX</string> <string name="create_mix">CRÉER UN MIX</string>
<!--More menu (long clicks)--> <!--More menu (long clicks)-->
@@ -40,7 +40,7 @@
<string name="play_last">Ajouter a la fin de la liste de lecture</string> <string name="play_last">Ajouter a la fin de la liste de lecture</string>
<string name="create_mix_from_song">Créer un mix</string> <string name="create_mix_from_song">Créer un mix</string>
<string name="add_to_playlist">Ajouter a une playlist</string> <string name="add_to_playlist">Ajouter a une playlist</string>
<string name="edit_metadata">Modifier les metadata</string> <string name="edit_metadata">Modifier les metadatas</string>
<string name="download">Télécharger</string> <string name="download">Télécharger</string>
<string name="remove_from_queue">Enlever de la liste de lecture</string> <string name="remove_from_queue">Enlever de la liste de lecture</string>
<string name="remove_from_playlist">Enlever de la playlist</string> <string name="remove_from_playlist">Enlever de la playlist</string>
@@ -48,17 +48,17 @@
<string name="list_songs">Lister les titres</string> <string name="list_songs">Lister les titres</string>
<string name="play_in_order">Lire dans l\'ordre</string> <string name="play_in_order">Lire dans l\'ordre</string>
<string name="random_play">Lecture aléatoire</string> <string name="random_play">Lecture aléatoire</string>
<string name="add_to_queue">Ajouter a la liste de lecture</string> <string name="add_to_queue">Ajouter à la liste de lecture</string>
<string name="rename">Renommer</string> <string name="rename">Renommer</string>
<string name="delete">Supprimer</string> <string name="delete">Supprimer</string>
<string name="sync">Synchronizer la playlist</string> <string name="sync">Synchroniser la playlist</string>
<string name="sync_now">Synchronizer maintenant</string> <string name="sync_now">Synchroniser maintenant</string>
<string name="stop_sync">Arreter de synchronizer</string> <string name="stop_sync">Arreter de synchroniser</string>
<string name="add_to_library">Sauvegarder la playlist</string> <string name="add_to_library">Sauvegarder la playlist</string>
<string name="unfork">Enlever la playlist de la bibliothèque</string> <string name="unfork">Enlever la playlist de la bibliothèque</string>
<!--Home screen--> <!--Home screen-->
<string name="shuffle_all">TOUS LIRE ALÉATOIREMENT</string> <string name="shuffle_all">TOUT LIRE ALÉATOIREMENT</string>
<string name="shuffle">Lecture aléatoire</string> <string name="shuffle">Lecture aléatoire</string>
<string name="more">PLUS</string> <string name="more">PLUS</string>
<string name="queue">Liste de lecture</string> <string name="queue">Liste de lecture</string>
@@ -76,15 +76,15 @@
<string name="playlists">Playlists</string> <string name="playlists">Playlists</string>
<string name="lives">Lives</string> <string name="lives">Lives</string>
<string name="channels">Chaines</string> <string name="channels">Chaines</string>
<string name="download_path_not_set">Le dossier de téléchargement n\'a pas été définie, celui par défault va être utilisé.</string> <string name="download_path_not_set">Le dossier de téléchargement n\'a pas été défini, celui par défault va être utilisé.</string>
<string name="download_path_error">Le dossier de téléchargement n\'existe plus, veuillez le changer dans les paramètres.</string> <string name="download_path_error">Le dossier de téléchargement n\'existe plus, veuillez le changer dans les paramètres.</string>
<string name="set_path">Definir le dossier</string> <string name="set_path">Definir le dossier</string>
<string name="downloading">Téléchargement en cours...</string> <string name="downloading">Téléchargement en cours...</string>
<string name="syncing">Synchronisation en cours...</string> <string name="syncing">Synchronisation en cours...</string>
<string name="cant_delete">Impossible de supprimer ce fichier pour le moment, veuillez réesseyer plus tard.</string> <string name="cant_delete">Impossible de supprimer ce fichier pour le moment, veuillez réessayer plus tard.</string>
<string name="no_result">Aucun résultat pour </string> <string name="no_result">Aucun résultat pour </string>
<string name="no_track">Aucun titre pour </string> <string name="no_track">Aucun titre pour </string>
<string name="no_playlist">Aucunne playlist pour </string> <string name="no_playlist">Aucune playlist pour </string>
<string name="no_lives">Aucun lives pour </string> <string name="no_lives">Aucun lives pour </string>
<string name="no_channel">Aucune chaine pour </string> <string name="no_channel">Aucune chaine pour </string>
<string name="remove_search">Supprimer de l\'historique de recherche ?</string> <string name="remove_search">Supprimer de l\'historique de recherche ?</string>
@@ -94,19 +94,19 @@
<string name="local_playlists">Playlists locales</string> <string name="local_playlists">Playlists locales</string>
<string name="youtube_playlists">Playlists youtubes</string> <string name="youtube_playlists">Playlists youtubes</string>
<string name="add_playlist">AJOUTER UNE PLAYLIST</string> <string name="add_playlist">AJOUTER UNE PLAYLIST</string>
<string name="youtube_loading_error">Erreur de chargement. \nVerifiez avoir séléctionné un compte et votre connection internet.</string> <string name="youtube_loading_error">Erreur de chargement. \nVérifiez avoir séléctionné un compte et votre connection internet.</string>
<string name="local_playlist_empty">Vous n\'avez aucune playlist sur cet appareil.</string> <string name="local_playlist_empty">Vous n\'avez aucune playlist sur cet appareil.</string>
<string name="youtube_playlist_empty">Vous n\'avez aucune playlist sur ce compte youtube \nAttention : Seulement les playlists présentes sur votre compte google sont affichées.</string> <string name="youtube_playlist_empty">Vous n\'avez aucune playlist sur ce compte youtube \nAttention : seulement les playlists présentes sur votre compte google sont affichées.</string>
<string name="element">titre</string> <string name="element">titre</string>
<string name="elements">titres</string> <string name="elements">titres</string>
<string name="playlist_empty">Cette playlist est vide.</string> <string name="playlist_empty">Cette playlist est vide.</string>
<string name="remove_from_playlist">Enlever %1$s de la playlist ?</string> <!--%1$s will be replaced by the song name--> <string name="remove_from_playlist">Enlever %1$s de la playlist ?</string> <!--%1$s will be replaced by the song name-->
<string name="removed_from_playlist"> a été enlevé de la playlist.</string> <string name="removed_from_playlist"> a été enlevé de la playlist.</string>
<string name="playlist_already_saved">Cette playlist a déja été ajouté a votre bibliothèque.</string> <string name="playlist_already_saved">Cette playlist a déja été ajoutée à votre bibliothèque.</string>
<string name="playlist_not_found">Aucune playlist n\'existe avec cet id ou cet url.</string> <string name="playlist_not_found">Aucune playlist n\'existe avec cet id ou cette url.</string>
<string name="playlist_add_song_not_found">Musique non trouvée sur youtube, impossible de l\'ajouter à une playlist youtube.</string> <string name="playlist_add_song_not_found">Musique non trouvée sur youtube, impossible de l\'ajouter à une playlist youtube.</string>
<string name="delete_playlist">Voulez vous supprimer la playlist \"%1$s\" ?</string> <!--%1$s will be replaced by the playlist name--> <string name="delete_playlist">Voulez vous supprimer la playlist \"%1$s\" ?</string> <!--%1$s will be replaced by the playlist name-->
<string name="rename_playlist">Choissisez un nouveau nom pour cette playlist</string> <string name="rename_playlist">Choisissez un nouveau nom pour cette playlist</string>
<string name="stop_syncing">Voulez vous arreter de synchroniser la playlist \"%1s$\" ?</string> <!--%1$s will be replaced by the playlist name--> <string name="stop_syncing">Voulez vous arreter de synchroniser la playlist \"%1s$\" ?</string> <!--%1$s will be replaced by the playlist name-->
<string name="unfork_playlist">Voulez vous supprimer la playlist \"%1$s"\" de votre bibliothèque ?</string> <!--%1$s will be replaced by the playlist name--> <string name="unfork_playlist">Voulez vous supprimer la playlist \"%1$s"\" de votre bibliothèque ?</string> <!--%1$s will be replaced by the playlist name-->
<string name="add_playlist_msg">Entrer l\'url ou l\'id de la playlist que vous voulez ajouter</string> <!--%1$s will be replaced by the playlist name--> <string name="add_playlist_msg">Entrer l\'url ou l\'id de la playlist que vous voulez ajouter</string> <!--%1$s will be replaced by the playlist name-->
@@ -128,10 +128,10 @@
<string name="change_albumart">Changer d\'image d\'album</string> <string name="change_albumart">Changer d\'image d\'album</string>
<string name="pick_album_local">Choisir une image depuis le stockage interne</string> <string name="pick_album_local">Choisir une image depuis le stockage interne</string>
<string name="download_albumart">Télécharger la couverture depuis youtube</string> <string name="download_albumart">Télécharger la couverture depuis youtube</string>
<string name="download_meta">Télécharger les metadata depuis youtube</string> <string name="download_meta">Télécharger les metadatas depuis youtube</string>
<string name="undo_change">Annuler les modifications</string> <string name="undo_change">Annuler les modifications</string>
<string name="changes_saved">Changement sauvegardé.</string> <string name="changes_saved">Changement sauvegardé.</string>
<string name="metdata_error_noid">Impossible de télécharger les metadatas depuis youtube, l\'id youtube n\'est pas défnit.</string> <string name="metdata_error_noid">Impossible de télécharger les metadatas depuis youtube, l\'id youtube n\'est pas défni.</string>
<!--Download Queue--> <!--Download Queue-->
<string name="download_queue">Liste de téléchargement</string> <string name="download_queue">Liste de téléchargement</string>
@@ -139,12 +139,12 @@
<string name="initialization">Initialisation</string> <string name="initialization">Initialisation</string>
<string name="metadata">Metadata</string> <string name="metadata">Metadata</string>
<string name="downloading_status">Téléchargement</string> <string name="downloading_status">Téléchargement</string>
<string name="up_to_date_status">Déja a jour</string> <string name="up_to_date_status">Déjà à jour</string>
<string name="completed">Completé</string> <string name="completed">Completé</string>
<!--Chromecast--> <!--Chromecast-->
<string name="cast_queue_push">Votre liste de lecture est envoyée au chromecast, veuillez patienter...</string> <string name="cast_queue_push">Votre liste de lecture est envoyée au chromecast, veuillez patienter...</string>
<string name="cast_queue_pushed">Finis, la musique va commencer sous peu.</string> <string name="cast_queue_pushed">Finis, la musique va bientôt commencer.</string>
<!--Settings--> <!--Settings-->
<string name="apply">Appliquer</string> <string name="apply">Appliquer</string>
@@ -159,12 +159,12 @@
<string name="volume">Volume</string> <string name="volume">Volume</string>
<string name="download">Téléchargement</string> <string name="download">Téléchargement</string>
<string name="download_directory">Dossier de téléchargement</string> <string name="download_directory">Dossier de téléchargement</string>
<string name="max_download">Nombre maximum de téléchargement simultané</string> <string name="max_download">Nombre maximum de téléchargements simultanés</string>
<string name="max_download_dialog">Combiens de musiques peuvent-elle être téléchargées en même temps ?</string> <string name="max_download_dialog">Combien de musiques peuvent-elle être téléchargées en même temps ?</string>
<string name="sync_remove">Supprimer les musiques enlevée d\'une playlist synchronisée.</string> <string name="sync_remove">Supprimer les musiques enlevées d\'une playlist synchronisée.</string>
<string name="appearances">Apparence</string> <string name="appearances">Apparence</string>
<string name="theme">Thème</string> <string name="theme">Thème</string>
<string name="theme_dialog">Choissisez un thème</string> <string name="theme_dialog">Choisissez un thème</string>
<string name="white_theme">Thème clair</string> <string name="white_theme">Thème clair</string>
<string name="dark_theme">Thème sombre</string> <string name="dark_theme">Thème sombre</string>
<string name="others">Autres</string> <string name="others">Autres</string>
@@ -178,21 +178,21 @@
<!--Snackbars and others--> <!--Snackbars and others-->
<string name="undo">Annuler</string> <string name="undo">Annuler</string>
<string name="no_permission">Permission refusée, impossible de completer cette action.</string> <string name="no_permission">Permission refusée, impossible de compléter cette action.</string>
<string name="no_song_mix">Aucune musique trouvée, impossible de créer un mix.</string> <string name="no_song_mix">Aucune musique trouvée, impossible de créer un mix.</string>
<string name="youtube_endpoint">L\'algorithme youtube a changé, l\'application ne peut plus lire cette vidéo. Attendez la prochaine mise a jour.</string> <string name="youtube_endpoint">L\'algorithme youtube a changé, l\'application ne peut plus lire cette vidéo. Attendez la prochaine mise a jour.</string>
<string name="timout">Timout, vérifier votre connection internet.</string> <string name="timout">Timout, vérifier votre connection internet.</string>
<string name="unknow">Une erreur inconue est survenue.</string> <string name="unknow">Une erreur inconnue est survenue.</string>
<string name="not_streamable"> ne peut pas être lu, l\'audio n\'est pas disponible.</string> <!--//A song title will be placed before this sentence--> <string name="not_streamable"> ne peut pas être lu, l\'audio n\'est pas disponible.</string> <!--//A song title will be placed before this sentence-->
<string name="update_no_internet">Vous n\'êtes pas connecté a internet, impossible de verifier si des mises a jours existent.</string> <string name="update_no_internet">Vous n\'êtes pas connecté a internet, impossible de verifier si des mises à jour existent.</string>
<string name="update">La version %1$s est disponible</string> <!--//%1$s will be replaced with the version number--> <string name="update">La version %1$s est disponible</string> <!--//%1$s will be replaced with the version number-->
<string name="update_message">Une mise a jour est disponible, voulez vous l\'installer maintenant ?</string> <string name="update_message">Une mise à jour est disponible, voulez vous l\'installer maintenant ?</string>
<string name="up_to_date">Aucune mise a jour disponible.</string> <string name="up_to_date">Aucune mise à jour disponible.</string>
<string name="beta_available">Une version beta est disponible.</string> <string name="beta_available">Une version beta est disponible.</string>
<string name="downloading_update">Téléchargement en cours, vous serez informer lorsque l\'installation sera prète.</string> <string name="downloading_update">Téléchargement en cours, vous serez informer lorsque l\'installation sera prète.</string>
<string name="updating">Mise a jour en cours...</string> <string name="updating">Mise à jour en cours...</string>
<string name="cant_play_non_youtube">Impossible de lire ce type de vidéo.</string> <string name="cant_play_non_youtube">Impossible de lire ce type de vidéo.</string>
<string name="sleep_timer">La musique va s\'arreter dans :</string> <string name="sleep_timer">La musique va s\'arrêter dans :</string>
<string name="downloading_notification">Téléchargement :</string> <string name="downloading_notification">Téléchargement :</string>
<string name="tap_details">Tappez pour plus de détails</string> <string name="tap_details">Tappez pour plus de détails</string>
<string name="cancelling">Annulation en cours...</string> <string name="cancelling">Annulation en cours...</string>

View File

@@ -23,6 +23,8 @@
<string name="minutes">minutes</string> <string name="minutes">minutes</string>
<string name="hour">hour</string> <string name="hour">hour</string>
<string name="hours">hours</string> <string name="hours">hours</string>
<string name="timer">Sleep timer</string>
<string name="open_youtube">Open in the youtube app</string>
<!--Queue--> <!--Queue-->
<string name="playing">Playing</string> <string name="playing">Playing</string>