mirror of
https://github.com/zoriya/Opus.git
synced 2025-12-06 06:26:15 +00:00
creating the player
This commit is contained in:
@@ -11,6 +11,7 @@ using Android.Widget;
|
|||||||
using Android.Content;
|
using Android.Content;
|
||||||
|
|
||||||
using SearchView = Android.Support.V7.Widget.SearchView;
|
using SearchView = Android.Support.V7.Widget.SearchView;
|
||||||
|
using static Android.App.ActivityManager;
|
||||||
|
|
||||||
namespace MusicApp
|
namespace MusicApp
|
||||||
{
|
{
|
||||||
@@ -183,7 +184,14 @@ namespace MusicApp
|
|||||||
case Resource.Id.musicLayout:
|
case Resource.Id.musicLayout:
|
||||||
HideTabs();
|
HideTabs();
|
||||||
HideSearch();
|
HideSearch();
|
||||||
fragment = Queue.NewInstance();
|
if (MusicPlayer.isRunning)
|
||||||
|
{
|
||||||
|
fragment = Player.NewInstance();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(fragment == null)
|
||||||
|
fragment = Queue.NewInstance();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Resource.Id.browseLayout:
|
case Resource.Id.browseLayout:
|
||||||
|
|||||||
@@ -136,6 +136,9 @@
|
|||||||
<Reference Include="YoutubeExplode, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="YoutubeExplode, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\YoutubeExplode.3.2.5\lib\netstandard1.1\YoutubeExplode.dll</HintPath>
|
<HintPath>..\packages\YoutubeExplode.3.2.5\lib\netstandard1.1\YoutubeExplode.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="YoutubeExtractor, Version=0.10.11.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\YoutubeExtractor.0.10.11\lib\portable-net45+win8+wpa81+wp8\YoutubeExtractor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="YoutubeSearch, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="YoutubeSearch, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\YoutubeSearch.dll.1.1\lib\YoutubeSearch.dll</HintPath>
|
<HintPath>..\packages\YoutubeSearch.dll.1.1\lib\YoutubeSearch.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@@ -154,6 +157,7 @@
|
|||||||
<Compile Include="Resources\Portable Class\FolderBrowse.cs" />
|
<Compile Include="Resources\Portable Class\FolderBrowse.cs" />
|
||||||
<Compile Include="Resources\Portable Class\FolderTracks.cs" />
|
<Compile Include="Resources\Portable Class\FolderTracks.cs" />
|
||||||
<Compile Include="Resources\Portable Class\MusicPlayer.cs" />
|
<Compile Include="Resources\Portable Class\MusicPlayer.cs" />
|
||||||
|
<Compile Include="Resources\Portable Class\Player.cs" />
|
||||||
<Compile Include="Resources\Portable Class\Playlist.cs" />
|
<Compile Include="Resources\Portable Class\Playlist.cs" />
|
||||||
<Compile Include="Resources\Portable Class\PlaylistTracks.cs" />
|
<Compile Include="Resources\Portable Class\PlaylistTracks.cs" />
|
||||||
<Compile Include="Resources\Portable Class\Preferences.cs" />
|
<Compile Include="Resources\Portable Class\Preferences.cs" />
|
||||||
@@ -332,6 +336,12 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AndroidResource Include="Resources\layout\PreferenceToolbar.xml" />
|
<AndroidResource Include="Resources\layout\PreferenceToolbar.xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\anim\SlideInUp.xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AndroidResource Include="Resources\anim\SlideOutUp.xml" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
|||||||
@@ -2,18 +2,15 @@
|
|||||||
using Android.OS;
|
using Android.OS;
|
||||||
using Android.Views;
|
using Android.Views;
|
||||||
using Android.Widget;
|
using Android.Widget;
|
||||||
using Android.Support.V7.App;
|
|
||||||
using Android.Support.V4.App;
|
using Android.Support.V4.App;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Android.Provider;
|
|
||||||
using Android.Database;
|
|
||||||
using Android.Content.PM;
|
|
||||||
using Android.Support.Design.Widget;
|
using Android.Support.Design.Widget;
|
||||||
using Android;
|
|
||||||
using Android.Net;
|
|
||||||
using YoutubeSearch;
|
using YoutubeSearch;
|
||||||
using MusicApp.Resources.values;
|
using MusicApp.Resources.values;
|
||||||
using Android.Support.V7.Preferences;
|
using Android.Support.V7.Preferences;
|
||||||
|
using YoutubeExtractor;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace MusicApp.Resources.Portable_Class
|
namespace MusicApp.Resources.Portable_Class
|
||||||
{
|
{
|
||||||
@@ -88,10 +85,30 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, list);
|
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
private /*async*/ void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||||
{
|
{
|
||||||
Toast.MakeText(Android.App.Application.Context, "Play: comming soon", ToastLength.Short).Show();
|
//await Task.Run(() =>
|
||||||
|
//{
|
||||||
|
Toast.MakeText(Android.App.Application.Context, "Playing : " + list[e.Position].GetPath(), ToastLength.Short).Show();
|
||||||
|
IEnumerable<VideoInfo> videoInfos = DownloadUrlResolver.GetDownloadUrls(list[e.Position].GetPath(), false);
|
||||||
|
//VideoInfo video = videoInfos.Where(info => info.VideoType == VideoType.Mp4 && info.Resolution == 0).OrderByDescending(info => info.AudioBitrate).First();
|
||||||
|
VideoInfo video = videoInfos.Where(info => info.AudioBitrate > 0 && info.AdaptiveType == AdaptiveType.Audio).OrderByDescending(info => info.AudioBitrate).First();
|
||||||
|
|
||||||
|
if (video.RequiresDecryption)
|
||||||
|
{
|
||||||
|
DownloadUrlResolver.DecryptDownloadUrl(video);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.Console.WriteLine(video.DownloadUrl);
|
||||||
|
|
||||||
|
Song song = list[e.Position];
|
||||||
|
|
||||||
|
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||||
|
intent.SetAction("YTPlay");
|
||||||
|
intent.PutExtra("file", video.DownloadUrl);
|
||||||
|
intent.PutStringArrayListExtra("song", new string[] { song.GetName(), song.GetArtist(), song.GetAlbum() });
|
||||||
|
Activity.StartService(intent);
|
||||||
|
//});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ using Square.Picasso;
|
|||||||
|
|
||||||
using Uri = Android.Net.Uri;
|
using Uri = Android.Net.Uri;
|
||||||
using FileNotFoundException = System.IO.FileNotFoundException;
|
using FileNotFoundException = System.IO.FileNotFoundException;
|
||||||
|
using Android.Widget;
|
||||||
|
|
||||||
namespace MusicApp.Resources.Portable_Class
|
namespace MusicApp.Resources.Portable_Class
|
||||||
{
|
{
|
||||||
@@ -27,6 +28,7 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
public MediaSessionCompat mediaSession;
|
public MediaSessionCompat mediaSession;
|
||||||
public AudioManager audioManager;
|
public AudioManager audioManager;
|
||||||
public NotificationManager notificationManager;
|
public NotificationManager notificationManager;
|
||||||
|
public static bool isRunning = false;
|
||||||
public static string title;
|
public static string title;
|
||||||
|
|
||||||
private Notification notification;
|
private Notification notification;
|
||||||
@@ -84,6 +86,15 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
if (player.IsPlaying)
|
if (player.IsPlaying)
|
||||||
Pause();
|
Pause();
|
||||||
break;
|
break;
|
||||||
|
case "YTPlay":
|
||||||
|
string[] song = intent.GetStringArrayListExtra("song").ToArray();
|
||||||
|
Console.WriteLine(song.Length);
|
||||||
|
Console.WriteLine(song[0]);
|
||||||
|
Console.WriteLine(song[1]);
|
||||||
|
Console.WriteLine(song[2]);
|
||||||
|
|
||||||
|
PlayFromYT(file, song[0], song[1], song[2]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (intent.Action != null)
|
if (intent.Action != null)
|
||||||
@@ -120,6 +131,7 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
|
|
||||||
public async void Play(string filePath)
|
public async void Play(string filePath)
|
||||||
{
|
{
|
||||||
|
isRunning = true;
|
||||||
if (player == null)
|
if (player == null)
|
||||||
InitializeService();
|
InitializeService();
|
||||||
|
|
||||||
@@ -161,6 +173,52 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async void PlayFromYT(string url, string title, string artist, string imageURL)
|
||||||
|
{
|
||||||
|
isRunning = true;
|
||||||
|
if (player == null)
|
||||||
|
InitializeService();
|
||||||
|
|
||||||
|
if (mediaSession != null)
|
||||||
|
{
|
||||||
|
player.Reset();
|
||||||
|
InitializePlayer();
|
||||||
|
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||||
|
player.PrepareAsync();
|
||||||
|
CreateNotification(title, artist, 0, imageURL);
|
||||||
|
|
||||||
|
queue.Clear();
|
||||||
|
Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||||
|
queue.Add(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
mediaSession = new MediaSessionCompat(Application.Context, "MusicApp");
|
||||||
|
mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
|
||||||
|
PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause);
|
||||||
|
mediaSession.SetPlaybackState(builder.Build());
|
||||||
|
|
||||||
|
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||||
|
var audioFocus = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain);
|
||||||
|
if (audioFocus != AudioFocusRequest.Granted)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Can't Get Audio Focus");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
player.PrepareAsync();
|
||||||
|
CreateNotification(title, artist, 0, imageURL);
|
||||||
|
|
||||||
|
queue.Clear();
|
||||||
|
Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||||
|
queue.Add(item);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: " + ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async void RandomPlay(List<string> filePath)
|
public async void RandomPlay(List<string> filePath)
|
||||||
{
|
{
|
||||||
Random r = new Random();
|
Random r = new Random();
|
||||||
@@ -215,7 +273,7 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
{
|
{
|
||||||
player.Reset();
|
player.Reset();
|
||||||
InitializePlayer();
|
InitializePlayer();
|
||||||
await player.SetDataSourceAsync(Application.Context, Android.Net.Uri.Parse(filePath));
|
await player.SetDataSourceAsync(Application.Context, Uri.Parse(filePath));
|
||||||
player.PrepareAsync();
|
player.PrepareAsync();
|
||||||
GetTrackSong(filePath, out Song song);
|
GetTrackSong(filePath, out Song song);
|
||||||
CreateNotification(song.GetName(), song.GetArtist(), song.GetAlbumArt());
|
CreateNotification(song.GetName(), song.GetArtist(), song.GetAlbumArt());
|
||||||
@@ -281,25 +339,35 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
song = new Song(Title, Artist, Album, AlbumArt, id, path);
|
song = new Song(Title, Artist, Album, AlbumArt, id, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
async void CreateNotification(string title, string artist, long albumArt)
|
async void CreateNotification(string title, string artist, long albumArt = 0, string imageURI = "")
|
||||||
{
|
{
|
||||||
MusicPlayer.title = title;
|
MusicPlayer.title = title;
|
||||||
|
|
||||||
Uri songCover = Uri.Parse("content://media/external/audio/albumart");
|
|
||||||
Uri iconURI = ContentUris.WithAppendedId(songCover, albumArt);
|
|
||||||
Bitmap icon = null;
|
Bitmap icon = null;
|
||||||
|
|
||||||
await Task.Run(() =>
|
if (albumArt != 0)
|
||||||
{
|
{
|
||||||
try
|
Uri songCover = Uri.Parse("content://media/external/audio/albumart");
|
||||||
|
Uri iconURI = ContentUris.WithAppendedId(songCover, albumArt);
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
{
|
{
|
||||||
icon = Picasso.With(Application.Context).Load(iconURI).Error(Resource.Drawable.MusicIcon).Placeholder(Resource.Drawable.MusicIcon).NetworkPolicy(NetworkPolicy.Offline).Resize(400, 400).CenterCrop().Get();
|
try
|
||||||
}
|
{
|
||||||
catch (Exception)
|
icon = Picasso.With(Application.Context).Load(iconURI).Error(Resource.Drawable.MusicIcon).Placeholder(Resource.Drawable.MusicIcon).NetworkPolicy(NetworkPolicy.Offline).Resize(400, 400).CenterCrop().Get();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
icon = Picasso.With(Application.Context).Load(Resource.Drawable.MusicIcon).Get();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await Task.Run(() =>
|
||||||
{
|
{
|
||||||
icon = Picasso.With(Application.Context).Load(Resource.Drawable.MusicIcon).Get();
|
icon = Picasso.With(Application.Context).Load(imageURI).Get();
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
Intent tmpPreviusIntent = new Intent(Application.Context, typeof(MusicPlayer));
|
Intent tmpPreviusIntent = new Intent(Application.Context, typeof(MusicPlayer));
|
||||||
tmpPreviusIntent.SetAction("Previus");
|
tmpPreviusIntent.SetAction("Previus");
|
||||||
@@ -344,6 +412,11 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
|
|
||||||
player.Pause();
|
player.Pause();
|
||||||
StopForeground(false);
|
StopForeground(false);
|
||||||
|
|
||||||
|
if(Player.instance != null)
|
||||||
|
{
|
||||||
|
Player.instance.playerView.FindViewById<ImageButton>(Resource.Id.playButton).SetImageResource(Resource.Drawable.ic_play_arrow_black_24dp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,11 +432,17 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
|
|
||||||
player.Start();
|
player.Start();
|
||||||
StartForeground(notificationID, notification);
|
StartForeground(notificationID, notification);
|
||||||
|
|
||||||
|
if (Player.instance != null)
|
||||||
|
{
|
||||||
|
Player.instance.playerView.FindViewById<ImageButton>(Resource.Id.playButton).SetImageResource(Resource.Drawable.ic_pause_black_24dp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
|
isRunning = false;
|
||||||
if(player != null)
|
if(player != null)
|
||||||
{
|
{
|
||||||
if (player.IsPlaying)
|
if (player.IsPlaying)
|
||||||
@@ -409,6 +488,8 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
{
|
{
|
||||||
base.OnDestroy();
|
base.OnDestroy();
|
||||||
|
|
||||||
|
isRunning = false;
|
||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
player.Release();
|
player.Release();
|
||||||
}
|
}
|
||||||
|
|||||||
151
MusicApp/Resources/Portable Class/Player.cs
Normal file
151
MusicApp/Resources/Portable Class/Player.cs
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
using Android.Content;
|
||||||
|
using Android.OS;
|
||||||
|
using Android.Views;
|
||||||
|
using Android.Widget;
|
||||||
|
using MusicApp.Resources.values;
|
||||||
|
using Android.Support.V4.App;
|
||||||
|
using System;
|
||||||
|
using Square.Picasso;
|
||||||
|
using Android.Graphics;
|
||||||
|
using Android.Support.Design.Widget;
|
||||||
|
using MusicApp.Resources.Fragments;
|
||||||
|
using Android.Transitions;
|
||||||
|
using Android.Animation;
|
||||||
|
using Android.App.Job;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Threading;
|
||||||
|
using Android.Support.V7.App;
|
||||||
|
|
||||||
|
namespace MusicApp.Resources.Portable_Class
|
||||||
|
{
|
||||||
|
public class Player : Fragment
|
||||||
|
{
|
||||||
|
public static Player instance;
|
||||||
|
public View playerView;
|
||||||
|
|
||||||
|
private View view;
|
||||||
|
private ImageView imgView;
|
||||||
|
private CancellationTokenSource cancelToken;
|
||||||
|
private int[] timers = new int[] { 0, 1, 10, 30, 60, 120 };
|
||||||
|
private string[] items = new string[] { "Off", "1 minute", "10 minutes", "30 minutes", "1 hour", "2 hours" };
|
||||||
|
private int checkedItem = 0;
|
||||||
|
|
||||||
|
|
||||||
|
public override void OnActivityCreated(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
base.OnActivityCreated(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnDestroy()
|
||||||
|
{
|
||||||
|
MainActivity.instance.ToolBar.Visibility = ViewStates.Visible;
|
||||||
|
base.OnDestroy();
|
||||||
|
instance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
var useless = base.OnCreateView(inflater, container, savedInstanceState);
|
||||||
|
playerView = LayoutInflater.Inflate(Resource.Layout.player, null);
|
||||||
|
CreatePlayer();
|
||||||
|
return playerView;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Fragment NewInstance()
|
||||||
|
{
|
||||||
|
instance = new Player { Arguments = new Bundle() };
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreatePlayer()
|
||||||
|
{
|
||||||
|
MainActivity.instance.ToolBar.Visibility = ViewStates.Gone;
|
||||||
|
MainActivity.instance.FindViewById<BottomNavigationView>(Resource.Id.bottomView).Visibility = ViewStates.Gone;
|
||||||
|
TextView title = playerView.FindViewById<TextView>(Resource.Id.playerTitle);
|
||||||
|
TextView artist = playerView.FindViewById<TextView>(Resource.Id.playerArtist);
|
||||||
|
imgView = playerView.FindViewById<ImageView>(Resource.Id.playerAlbum);
|
||||||
|
playerView.FindViewById<ImageButton>(Resource.Id.playerSleep).Click += SleepButton_Click;
|
||||||
|
playerView.FindViewById<ImageButton>(Resource.Id.lastButton).Click += Last_Click;
|
||||||
|
playerView.FindViewById<ImageButton>(Resource.Id.playButton).Click += Play_Click;
|
||||||
|
playerView.FindViewById<ImageButton>(Resource.Id.nextButton).Click += Next_Click;
|
||||||
|
playerView.FindViewById<FloatingActionButton>(Resource.Id.downFAB).Click += Fab_Click;
|
||||||
|
|
||||||
|
|
||||||
|
Song current = MusicPlayer.queue[MusicPlayer.CurentID()];
|
||||||
|
|
||||||
|
title.Text = current.GetName();
|
||||||
|
artist.Text = current.GetArtist();
|
||||||
|
title.Selected = true;
|
||||||
|
title.SetMarqueeRepeatLimit(3);
|
||||||
|
artist.Selected = true;
|
||||||
|
artist.SetMarqueeRepeatLimit(3);
|
||||||
|
|
||||||
|
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
|
||||||
|
var songAlbumArtUri = ContentUris.WithAppendedId(songCover, current.GetAlbumArt());
|
||||||
|
|
||||||
|
Picasso.With(Android.App.Application.Context).Load(songAlbumArtUri).Placeholder(Resource.Drawable.MusicIcon).Into(imgView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Fab_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Activity.SupportFragmentManager.BeginTransaction()./*SetCustomAnimations(Resource.Animation.SlideInUp, Resource.Animation.SlideOutUp)/*/Replace(Resource.Id.contentView, Queue.NewInstance()).Commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Last_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||||
|
intent.SetAction("Previus");
|
||||||
|
Activity.StartService(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Play_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||||
|
intent.SetAction("Pause");
|
||||||
|
Activity.StartService(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Next_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||||
|
intent.SetAction("Next");
|
||||||
|
Activity.StartService(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SleepButton_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.AppCompatAlertDialogStyle);
|
||||||
|
builder.SetTitle("Sleep in :");
|
||||||
|
builder.SetSingleChoiceItems(items, checkedItem, ((senders, eventargs) => { checkedItem = eventargs.Which; }));
|
||||||
|
builder.SetPositiveButton("Ok", ((senders, args) => { Sleep(timers[checkedItem]); }));
|
||||||
|
builder.SetNegativeButton("Cancel", ((senders, args) => { }));
|
||||||
|
builder.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
async void Sleep(int time)
|
||||||
|
{
|
||||||
|
cancelToken?.Cancel();
|
||||||
|
|
||||||
|
if (time == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
using (cancelToken = new CancellationTokenSource())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
Thread.Sleep(time * 60 * 1000);
|
||||||
|
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||||
|
intent.SetAction("Stop");
|
||||||
|
Activity.StartService(intent);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (TaskCanceledException)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Sleep Timer Canceled");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,23 +18,37 @@ using Android.Support.V7.App;
|
|||||||
|
|
||||||
namespace MusicApp.Resources.Portable_Class
|
namespace MusicApp.Resources.Portable_Class
|
||||||
{
|
{
|
||||||
public class Queue: ListFragment
|
public class Queue: ListFragment/*, ViewTreeObserver.IOnPreDrawListener*/
|
||||||
{
|
{
|
||||||
public static Queue instance;
|
public static Queue instance;
|
||||||
public Adapter adapter;
|
public Adapter adapter;
|
||||||
public View emptyView;
|
public View emptyView;
|
||||||
|
|
||||||
private View view;
|
private View view;
|
||||||
private ImageView imgView;
|
|
||||||
private View playerView;
|
|
||||||
private View controllerView;
|
|
||||||
private bool isEmpty = false;
|
private bool isEmpty = false;
|
||||||
private CancellationTokenSource cancelToken;
|
//private float yFraction = 0;
|
||||||
private int[] timers = new int[] { 0, 1, 10, 30, 60, 120 };
|
|
||||||
private string[] items = new string[] { "Off", "1 minute", "10 minutes", "30 minutes", "1 hour", "2 hours" };
|
|
||||||
private int checkedItem = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
//public void SetYFraction(float fraction)
|
||||||
|
//{
|
||||||
|
// yFraction = fraction;
|
||||||
|
|
||||||
|
// float translationY = View.Height * fraction;
|
||||||
|
// View.TranslationY = translationY;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public bool OnPreDraw()
|
||||||
|
//{
|
||||||
|
// if(View.Height == 0)
|
||||||
|
// SetYFraction(yFraction);
|
||||||
|
// return true;
|
||||||
|
//}
|
||||||
|
|
||||||
|
//public float GetYFraction()
|
||||||
|
//{
|
||||||
|
// return yFraction;
|
||||||
|
//}
|
||||||
|
|
||||||
public override void OnActivityCreated(Bundle savedInstanceState)
|
public override void OnActivityCreated(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
base.OnActivityCreated(savedInstanceState);
|
base.OnActivityCreated(savedInstanceState);
|
||||||
@@ -48,6 +62,7 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
public override void OnDestroy()
|
public override void OnDestroy()
|
||||||
{
|
{
|
||||||
MainActivity.instance.ToolBar.Visibility = ViewStates.Visible;
|
MainActivity.instance.ToolBar.Visibility = ViewStates.Visible;
|
||||||
|
MainActivity.instance.FindViewById<BottomNavigationView>(Resource.Id.bottomView).Visibility = ViewStates.Visible;
|
||||||
if (isEmpty)
|
if (isEmpty)
|
||||||
{
|
{
|
||||||
ViewGroup rootView = Activity.FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
ViewGroup rootView = Activity.FindViewById<ViewGroup>(Android.Resource.Id.Content);
|
||||||
@@ -61,6 +76,7 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
{
|
{
|
||||||
View view = base.OnCreateView(inflater, container, savedInstanceState);
|
View view = base.OnCreateView(inflater, container, savedInstanceState);
|
||||||
this.view = view;
|
this.view = view;
|
||||||
|
view.SetPadding(0, 100, 0, 100);
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,166 +101,6 @@ namespace MusicApp.Resources.Portable_Class
|
|||||||
isEmpty = true;
|
isEmpty = true;
|
||||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
MainActivity.instance.ToolBar.Visibility = ViewStates.Gone;
|
|
||||||
playerView = LayoutInflater.Inflate(Resource.Layout.player, null);
|
|
||||||
TextView title = playerView.FindViewById<TextView>(Resource.Id.playerTitle);
|
|
||||||
TextView artist = playerView.FindViewById<TextView>(Resource.Id.playerArtist);
|
|
||||||
imgView = playerView.FindViewById<ImageView>(Resource.Id.playerAlbum);
|
|
||||||
ImageButton sleepButton = playerView.FindViewById<ImageButton>(Resource.Id.playerSleep);
|
|
||||||
sleepButton.Click += SleepButton_Click;
|
|
||||||
|
|
||||||
|
|
||||||
Song current = MusicPlayer.queue[MusicPlayer.CurentID()];
|
|
||||||
|
|
||||||
title.Text = current.GetName();
|
|
||||||
artist.Text = current.GetArtist();
|
|
||||||
title.Selected = true;
|
|
||||||
title.SetMarqueeRepeatLimit(3);
|
|
||||||
artist.Selected = true;
|
|
||||||
artist.SetMarqueeRepeatLimit(3);
|
|
||||||
|
|
||||||
var songCover = Android.Net.Uri.Parse("content://media/external/audio/albumart");
|
|
||||||
var songAlbumArtUri = ContentUris.WithAppendedId(songCover, current.GetAlbumArt());
|
|
||||||
|
|
||||||
Picasso.With(Android.App.Application.Context).Load(songAlbumArtUri).Placeholder(Resource.Drawable.MusicIcon).Into(imgView);
|
|
||||||
|
|
||||||
ListView.AddHeaderView(playerView);
|
|
||||||
|
|
||||||
FloatingActionButton fab = playerView.FindViewById<FloatingActionButton>(Resource.Id.playFAB);
|
|
||||||
fab.Click += Fab_Click;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SleepButton_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.AppCompatAlertDialogStyle);
|
|
||||||
builder.SetTitle("Sleep in :");
|
|
||||||
builder.SetSingleChoiceItems(items, checkedItem, ((senders, eventargs) => { checkedItem = eventargs.Which; } ));
|
|
||||||
builder.SetPositiveButton("Ok", ((senders, args) => { Sleep(timers[checkedItem]); } ));
|
|
||||||
builder.SetNegativeButton("Cancel", ((senders, args) => { }));
|
|
||||||
builder.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
async void Sleep(int time)
|
|
||||||
{
|
|
||||||
cancelToken?.Cancel();
|
|
||||||
|
|
||||||
if (time == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
using (cancelToken = new CancellationTokenSource())
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await Task.Run(() =>
|
|
||||||
{
|
|
||||||
Thread.Sleep(time * 60 * 1000);
|
|
||||||
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
|
||||||
intent.SetAction("Stop");
|
|
||||||
Activity.StartService(intent);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch(TaskCanceledException)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Sleep Timer Canceled");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Fab_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
playerView.FindViewById(Resource.Id.playerTitle).Visibility = ViewStates.Gone;
|
|
||||||
playerView.FindViewById(Resource.Id.playerArtist).Visibility = ViewStates.Gone;
|
|
||||||
FloatingActionButton fab = playerView.FindViewById<FloatingActionButton>(Resource.Id.playFAB);
|
|
||||||
|
|
||||||
LinearLayout layout = playerView.FindViewById<LinearLayout>(Resource.Id.infoPanel);
|
|
||||||
layout.SetPadding(0, 15, 0, 0);
|
|
||||||
|
|
||||||
controllerView = LayoutInflater.Inflate(Resource.Layout.playerControl, layout, true);
|
|
||||||
layout.SetBackgroundColor(new Color(76, 181, 174));
|
|
||||||
|
|
||||||
controllerView.Visibility = ViewStates.Gone;
|
|
||||||
int centerX = controllerView.Top;
|
|
||||||
int centerY = controllerView.Left;
|
|
||||||
float endRadius = (float)Math.Sqrt(controllerView.Width * controllerView.Width + controllerView.Height + controllerView.Height) * 2;
|
|
||||||
|
|
||||||
Animator animator = ViewAnimationUtils.CreateCircularReveal(controllerView, centerX, centerY, 0, endRadius);
|
|
||||||
animator.SetDuration(750);
|
|
||||||
|
|
||||||
controllerView.Visibility = ViewStates.Visible;
|
|
||||||
animator.Start();
|
|
||||||
|
|
||||||
fab.Hide();
|
|
||||||
|
|
||||||
controllerView.FindViewById<ImageButton>(Resource.Id.controllerLast).Click += Last_Click;
|
|
||||||
controllerView.FindViewById<ImageButton>(Resource.Id.controllerPlay).Click += Play_Click;
|
|
||||||
controllerView.FindViewById<ImageButton>(Resource.Id.controllerNext).Click += Next_Click;
|
|
||||||
|
|
||||||
TextView text = controllerView.FindViewById<TextView>(Resource.Id.controllerTitle);
|
|
||||||
string Title = playerView.FindViewById<TextView>(Resource.Id.playerTitle).Text;
|
|
||||||
string Artist = playerView.FindViewById<TextView>(Resource.Id.playerArtist).Text;
|
|
||||||
|
|
||||||
text.Text = Title + " - " + Artist;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CloseFab()
|
|
||||||
{
|
|
||||||
FloatingActionButton fab = playerView.FindViewById<FloatingActionButton>(Resource.Id.playFAB);
|
|
||||||
|
|
||||||
LinearLayout layout = playerView.FindViewById<LinearLayout>(Resource.Id.infoPanel);
|
|
||||||
layout.SetBackgroundColor(new Color(43, 85, 104));
|
|
||||||
|
|
||||||
int centerX = layout.Top;
|
|
||||||
int centerY = layout.Left;
|
|
||||||
float endRadius = (float)Math.Sqrt(layout.Width * layout.Width + layout.Height + layout.Height) * 2;
|
|
||||||
|
|
||||||
Animator animator = ViewAnimationUtils.CreateCircularReveal(controllerView, centerX, centerY, endRadius, 0);
|
|
||||||
animator.SetDuration(750);
|
|
||||||
animator.AnimationEnd += Animator_AnimationEnd;
|
|
||||||
animator.Start();
|
|
||||||
|
|
||||||
LinearLayout controller = playerView.FindViewById<LinearLayout>(Resource.Id.playerControl);
|
|
||||||
controller.Visibility = ViewStates.Invisible;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Animator_AnimationEnd(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
FloatingActionButton fab = playerView.FindViewById<FloatingActionButton>(Resource.Id.playFAB);
|
|
||||||
fab.Show();
|
|
||||||
playerView.FindViewById(Resource.Id.playerTitle).Visibility = ViewStates.Visible;
|
|
||||||
playerView.FindViewById(Resource.Id.playerArtist).Visibility = ViewStates.Visible;
|
|
||||||
|
|
||||||
LinearLayout layout = playerView.FindViewById<LinearLayout>(Resource.Id.infoPanel);
|
|
||||||
layout.SetPadding(0, 15, 0, 20);
|
|
||||||
LinearLayout controller = playerView.FindViewById<LinearLayout>(Resource.Id.playerControl);
|
|
||||||
layout.RemoveView(controller);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Last_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
|
||||||
intent.SetAction("Previus");
|
|
||||||
Activity.StartService(intent);
|
|
||||||
CloseFab();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Play_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
|
||||||
intent.SetAction("Pause");
|
|
||||||
Activity.StartService(intent);
|
|
||||||
CloseFab();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Next_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
|
||||||
intent.SetAction("Next");
|
|
||||||
Activity.StartService(intent);
|
|
||||||
CloseFab();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||||
|
|||||||
123
MusicApp/Resources/Resource.Designer.cs
generated
123
MusicApp/Resources/Resource.Designer.cs
generated
@@ -81,6 +81,12 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f04000f
|
// aapt resource value: 0x7f04000f
|
||||||
public const int design_snackbar_out = 2130968591;
|
public const int design_snackbar_out = 2130968591;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f040010
|
||||||
|
public const int SlideInUp = 2130968592;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f040011
|
||||||
|
public const int SlideOutUp = 2130968593;
|
||||||
|
|
||||||
static Animation()
|
static Animation()
|
||||||
{
|
{
|
||||||
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
|
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
|
||||||
@@ -2452,8 +2458,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07001e
|
// aapt resource value: 0x7f07001e
|
||||||
public const int add = 2131165214;
|
public const int add = 2131165214;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b7
|
// aapt resource value: 0x7f0700ba
|
||||||
public const int albumArt = 2131165367;
|
public const int albumArt = 2131165370;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070058
|
// aapt resource value: 0x7f070058
|
||||||
public const int alertTitle = 2131165272;
|
public const int alertTitle = 2131165272;
|
||||||
@@ -2464,8 +2470,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070023
|
// aapt resource value: 0x7f070023
|
||||||
public const int always = 2131165219;
|
public const int always = 2131165219;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b8
|
// aapt resource value: 0x7f0700bb
|
||||||
public const int artist = 2131165368;
|
public const int artist = 2131165371;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07002f
|
// aapt resource value: 0x7f07002f
|
||||||
public const int auto = 2131165231;
|
public const int auto = 2131165231;
|
||||||
@@ -2479,8 +2485,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07008c
|
// aapt resource value: 0x7f07008c
|
||||||
public const int bottomView = 2131165324;
|
public const int bottomView = 2131165324;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700bd
|
// aapt resource value: 0x7f0700c0
|
||||||
public const int browseLayout = 2131165373;
|
public const int browseLayout = 2131165376;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070073
|
// aapt resource value: 0x7f070073
|
||||||
public const int browseList = 2131165299;
|
public const int browseList = 2131165299;
|
||||||
@@ -2524,17 +2530,17 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07008b
|
// aapt resource value: 0x7f07008b
|
||||||
public const int contentView = 2131165323;
|
public const int contentView = 2131165323;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700ac
|
|
||||||
public const int controllerLast = 2131165356;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700ae
|
|
||||||
public const int controllerNext = 2131165358;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700ad
|
|
||||||
public const int controllerPlay = 2131165357;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700af
|
// aapt resource value: 0x7f0700af
|
||||||
public const int controllerTitle = 2131165359;
|
public const int controllerLast = 2131165359;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700b1
|
||||||
|
public const int controllerNext = 2131165361;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700b0
|
||||||
|
public const int controllerPlay = 2131165360;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700b2
|
||||||
|
public const int controllerTitle = 2131165362;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070078
|
// aapt resource value: 0x7f070078
|
||||||
public const int coordinator = 2131165304;
|
public const int coordinator = 2131165304;
|
||||||
@@ -2569,8 +2575,11 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070012
|
// aapt resource value: 0x7f070012
|
||||||
public const int disableHome = 2131165202;
|
public const int disableHome = 2131165202;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700be
|
// aapt resource value: 0x7f0700ad
|
||||||
public const int downloadLayout = 2131165374;
|
public const int downFAB = 2131165357;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700c1
|
||||||
|
public const int downloadLayout = 2131165377;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070066
|
// aapt resource value: 0x7f070066
|
||||||
public const int edit_query = 2131165286;
|
public const int edit_query = 2131165286;
|
||||||
@@ -2629,8 +2638,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070049
|
// aapt resource value: 0x7f070049
|
||||||
public const int icon = 2131165257;
|
public const int icon = 2131165257;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b0
|
// aapt resource value: 0x7f0700b3
|
||||||
public const int icon_frame = 2131165360;
|
public const int icon_frame = 2131165363;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07009f
|
// aapt resource value: 0x7f07009f
|
||||||
public const int icon_group = 2131165343;
|
public const int icon_group = 2131165343;
|
||||||
@@ -2644,8 +2653,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07009b
|
// aapt resource value: 0x7f07009b
|
||||||
public const int info = 2131165339;
|
public const int info = 2131165339;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a7
|
// aapt resource value: 0x7f0700aa
|
||||||
public const int infoPanel = 2131165351;
|
public const int infoPanel = 2131165354;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070000
|
// aapt resource value: 0x7f070000
|
||||||
public const int item_touch_helper_previous_elevation = 2131165184;
|
public const int item_touch_helper_previous_elevation = 2131165184;
|
||||||
@@ -2653,20 +2662,23 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070076
|
// aapt resource value: 0x7f070076
|
||||||
public const int largeLabel = 2131165302;
|
public const int largeLabel = 2131165302;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700a7
|
||||||
|
public const int lastButton = 2131165351;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070034
|
// aapt resource value: 0x7f070034
|
||||||
public const int left = 2131165236;
|
public const int left = 2131165236;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a0
|
// aapt resource value: 0x7f0700a0
|
||||||
public const int line1 = 2131165344;
|
public const int line1 = 2131165344;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b9
|
// aapt resource value: 0x7f0700bc
|
||||||
public const int line2 = 2131165369;
|
public const int line2 = 2131165372;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a2
|
// aapt resource value: 0x7f0700a2
|
||||||
public const int line3 = 2131165346;
|
public const int line3 = 2131165346;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b2
|
// aapt resource value: 0x7f0700b5
|
||||||
public const int list = 2131165362;
|
public const int list = 2131165365;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07000f
|
// aapt resource value: 0x7f07000f
|
||||||
public const int listMode = 2131165199;
|
public const int listMode = 2131165199;
|
||||||
@@ -2674,8 +2686,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070048
|
// aapt resource value: 0x7f070048
|
||||||
public const int list_item = 2131165256;
|
public const int list_item = 2131165256;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700bb
|
// aapt resource value: 0x7f0700be
|
||||||
public const int masked = 2131165371;
|
public const int masked = 2131165374;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070094
|
// aapt resource value: 0x7f070094
|
||||||
public const int media_actions = 2131165332;
|
public const int media_actions = 2131165332;
|
||||||
@@ -2689,8 +2701,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070019
|
// aapt resource value: 0x7f070019
|
||||||
public const int multiply = 2131165209;
|
public const int multiply = 2131165209;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700bc
|
// aapt resource value: 0x7f0700bf
|
||||||
public const int musicLayout = 2131165372;
|
public const int musicLayout = 2131165375;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07007d
|
// aapt resource value: 0x7f07007d
|
||||||
public const int navigation_header_container = 2131165309;
|
public const int navigation_header_container = 2131165309;
|
||||||
@@ -2698,6 +2710,9 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070026
|
// aapt resource value: 0x7f070026
|
||||||
public const int never = 2131165222;
|
public const int never = 2131165222;
|
||||||
|
|
||||||
|
// aapt resource value: 0x7f0700a9
|
||||||
|
public const int nextButton = 2131165353;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07008d
|
// aapt resource value: 0x7f07008d
|
||||||
public const int noPlaylist = 2131165325;
|
public const int noPlaylist = 2131165325;
|
||||||
|
|
||||||
@@ -2728,26 +2743,26 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070038
|
// aapt resource value: 0x7f070038
|
||||||
public const int pin = 2131165240;
|
public const int pin = 2131165240;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700aa
|
// aapt resource value: 0x7f0700a8
|
||||||
public const int playFAB = 2131165354;
|
public const int playButton = 2131165352;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a5
|
// aapt resource value: 0x7f0700a5
|
||||||
public const int playerAlbum = 2131165349;
|
public const int playerAlbum = 2131165349;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a9
|
// aapt resource value: 0x7f0700ac
|
||||||
public const int playerArtist = 2131165353;
|
public const int playerArtist = 2131165356;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700ab
|
// aapt resource value: 0x7f0700ae
|
||||||
public const int playerControl = 2131165355;
|
public const int playerControl = 2131165358;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a6
|
// aapt resource value: 0x7f0700a6
|
||||||
public const int playerSleep = 2131165350;
|
public const int playerSleep = 2131165350;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700a8
|
// aapt resource value: 0x7f0700ab
|
||||||
public const int playerTitle = 2131165352;
|
public const int playerTitle = 2131165355;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700bf
|
// aapt resource value: 0x7f0700c2
|
||||||
public const int playlistLayout = 2131165375;
|
public const int playlistLayout = 2131165378;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070074
|
// aapt resource value: 0x7f070074
|
||||||
public const int playlistName = 2131165300;
|
public const int playlistName = 2131165300;
|
||||||
@@ -2788,8 +2803,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070040
|
// aapt resource value: 0x7f070040
|
||||||
public const int scrollable = 2131165248;
|
public const int scrollable = 2131165248;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b6
|
// aapt resource value: 0x7f0700b9
|
||||||
public const int search = 2131165366;
|
public const int search = 2131165369;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070068
|
// aapt resource value: 0x7f070068
|
||||||
public const int search_badge = 2131165288;
|
public const int search_badge = 2131165288;
|
||||||
@@ -2821,17 +2836,17 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f070071
|
// aapt resource value: 0x7f070071
|
||||||
public const int search_voice_btn = 2131165297;
|
public const int search_voice_btn = 2131165297;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b3
|
// aapt resource value: 0x7f0700b6
|
||||||
public const int seekbar = 2131165363;
|
public const int seekbar = 2131165366;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b4
|
// aapt resource value: 0x7f0700b7
|
||||||
public const int seekbar_value = 2131165364;
|
public const int seekbar_value = 2131165367;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070072
|
// aapt resource value: 0x7f070072
|
||||||
public const int select_dialog_listview = 2131165298;
|
public const int select_dialog_listview = 2131165298;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700c0
|
// aapt resource value: 0x7f0700c3
|
||||||
public const int settings = 2131165376;
|
public const int settings = 2131165379;
|
||||||
|
|
||||||
// aapt resource value: 0x7f07005c
|
// aapt resource value: 0x7f07005c
|
||||||
public const int shortcut = 2131165276;
|
public const int shortcut = 2131165276;
|
||||||
@@ -2860,8 +2875,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07004c
|
// aapt resource value: 0x7f07004c
|
||||||
public const int spacer = 2131165260;
|
public const int spacer = 2131165260;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b1
|
// aapt resource value: 0x7f0700b4
|
||||||
public const int spinner = 2131165361;
|
public const int spinner = 2131165364;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070008
|
// aapt resource value: 0x7f070008
|
||||||
public const int split_action_bar = 2131165192;
|
public const int split_action_bar = 2131165192;
|
||||||
@@ -2887,8 +2902,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07006f
|
// aapt resource value: 0x7f07006f
|
||||||
public const int submit_area = 2131165295;
|
public const int submit_area = 2131165295;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700b5
|
// aapt resource value: 0x7f0700b8
|
||||||
public const int switchWidget = 2131165365;
|
public const int switchWidget = 2131165368;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070011
|
// aapt resource value: 0x7f070011
|
||||||
public const int tabMode = 2131165201;
|
public const int tabMode = 2131165201;
|
||||||
@@ -2959,8 +2974,8 @@ namespace MusicApp
|
|||||||
// aapt resource value: 0x7f07000e
|
// aapt resource value: 0x7f07000e
|
||||||
public const int view_offset_helper = 2131165198;
|
public const int view_offset_helper = 2131165198;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0700ba
|
// aapt resource value: 0x7f0700bd
|
||||||
public const int visible = 2131165370;
|
public const int visible = 2131165373;
|
||||||
|
|
||||||
// aapt resource value: 0x7f070027
|
// aapt resource value: 0x7f070027
|
||||||
public const int withText = 2131165223;
|
public const int withText = 2131165223;
|
||||||
|
|||||||
8
MusicApp/Resources/anim/SlideInUp.xml
Normal file
8
MusicApp/Resources/anim/SlideInUp.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set>
|
||||||
|
<translate xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:fromXDelta="-100%"
|
||||||
|
android:toXDelta="0"
|
||||||
|
android:interpolator="@android:anim/decelerate_interpolator"
|
||||||
|
android:duration="500"/>
|
||||||
|
</set>
|
||||||
9
MusicApp/Resources/anim/SlideOutUp.xml
Normal file
9
MusicApp/Resources/anim/SlideOutUp.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<set>
|
||||||
|
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:propertyName="x"
|
||||||
|
android:valueType="floatType"
|
||||||
|
android:valueFrom="-1280"
|
||||||
|
android:valueTo="0"
|
||||||
|
android:duration="500"/>
|
||||||
|
</set>
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/playerAlbum"
|
android:id="@+id/playerAlbum"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
|
android:background="@null"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
android:adjustViewBounds="true" />
|
android:adjustViewBounds="true" />
|
||||||
@@ -24,9 +25,39 @@
|
|||||||
android:background="@drawable/ic_timer_white_24dp"
|
android:background="@drawable/ic_timer_white_24dp"
|
||||||
android:layout_width="35dp"
|
android:layout_width="35dp"
|
||||||
android:layout_height="35dp"
|
android:layout_height="35dp"
|
||||||
android:layout_gravity="top|right"
|
android:layout_gravity="top|center"
|
||||||
android:paddingTop="80dp"
|
android:paddingTop="280dp" />
|
||||||
android:paddingRight="40dp"/>
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content" >
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/lastButton"
|
||||||
|
android:background="@null"
|
||||||
|
android:tint="#ffffff"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:src="@drawable/ic_skip_previous_black_24dp"/>
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/playButton"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:layout_marginLeft="50dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:layout_marginRight="50dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:tint="#ffffff"
|
||||||
|
android:src="@drawable/ic_pause_black_24dp"/>
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/nextButton"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:background="@null"
|
||||||
|
android:tint="#ffffff"
|
||||||
|
android:src="@drawable/ic_skip_next_black_24dp"/>
|
||||||
|
</LinearLayout>
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
@@ -53,7 +84,7 @@
|
|||||||
android:textColor="#FFFFFF"
|
android:textColor="#FFFFFF"
|
||||||
android:alpha=".92"
|
android:alpha=".92"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:paddingLeft="65dp"
|
android:paddingLeft="60dp"
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
android:layout_alignParentStart="true"/>
|
android:layout_alignParentStart="true"/>
|
||||||
<TextView
|
<TextView
|
||||||
@@ -69,22 +100,21 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
android:layout_alignParentStart="true"
|
android:layout_alignParentStart="true"
|
||||||
android:paddingLeft="65dp"
|
android:paddingLeft="60dp"
|
||||||
android:alpha=".92"
|
android:alpha=".92"
|
||||||
android:textSize="20sp"
|
android:textSize="20sp"
|
||||||
android:textColor="#FFFFFF"/>
|
android:textColor="#FFFFFF"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<android.support.design.widget.FloatingActionButton
|
<android.support.design.widget.FloatingActionButton
|
||||||
android:id="@+id/playFAB"
|
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/playerAlbum"
|
app:layout_anchor="@id/infoPanel"
|
||||||
app:layout_anchorGravity="bottom|right|end"
|
app:layout_anchorGravity="bottom|center"
|
||||||
android:transitionName="playButton"
|
|
||||||
android:layout_margin="10dip"
|
android:layout_margin="10dip"
|
||||||
app:elevation="12dp"
|
app:elevation="12dp"
|
||||||
app:borderWidth="0dp"
|
app:borderWidth="0dp"
|
||||||
app:backgroundTint="#4cb5ae"
|
app:backgroundTint="#4cb5ae"
|
||||||
android:src="@drawable/ic_pause_black_24dp" />
|
android:src="@drawable/ic_expand_more_black_24dp" />
|
||||||
</android.support.design.widget.CoordinatorLayout>
|
</android.support.design.widget.CoordinatorLayout>
|
||||||
|
|||||||
@@ -73,5 +73,6 @@
|
|||||||
<package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid70" />
|
<package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid70" />
|
||||||
<package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid70" />
|
<package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid70" />
|
||||||
<package id="YoutubeExplode" version="3.2.5" targetFramework="monoandroid70" />
|
<package id="YoutubeExplode" version="3.2.5" targetFramework="monoandroid70" />
|
||||||
|
<package id="YoutubeExtractor" version="0.10.11" targetFramework="monoandroid70" />
|
||||||
<package id="YoutubeSearch.dll" version="1.1" targetFramework="monoandroid70" />
|
<package id="YoutubeSearch.dll" version="1.1" targetFramework="monoandroid70" />
|
||||||
</packages>
|
</packages>
|
||||||
Reference in New Issue
Block a user