diff --git a/MusicApp/MainActivity.cs b/MusicApp/MainActivity.cs index 4e5da7e..2a9ccf8 100644 --- a/MusicApp/MainActivity.cs +++ b/MusicApp/MainActivity.cs @@ -2,6 +2,7 @@ using Android.App; using Android.Content; using Android.Content.PM; +using Android.Graphics.Drawables; using Android.OS; using Android.Runtime; using Android.Support.Design.Widget; @@ -10,6 +11,7 @@ using Android.Support.V4.Widget; using Android.Support.V7.App; using Android.Support.V7.Preferences; using Android.Views; +using Android.Views.Animations; using Android.Widget; using Google.Apis.Auth.OAuth2; using Google.Apis.Auth.OAuth2.Flows; @@ -32,15 +34,22 @@ namespace MusicApp public class MainActivity : AppCompatActivity, ViewPager.IOnPageChangeListener { public static MainActivity instance; + public static int paddingBot = 0; + public Android.Support.V7.Widget.Toolbar ToolBar; public IMenu menu; public SwipeRefreshLayout contentRefresh; public SwipeRefreshLayout pagerRefresh; public bool usePager; + public View quickPlayLayout; private Handler handler = new Handler(); private ProgressBar bar; private bool prepared = false; + private bool searchDisplayed; + private bool canSwitch = true; + private string tab; + private bool QuickPlayOpenned = false; private const int RequestCode = 8539; @@ -48,9 +57,51 @@ namespace MusicApp public static YouTubeService youtubeService; public static OAuth2Authenticator auth; public static string refreshToken; - private bool searchDisplayed; - private bool canSwitch = true; - private string tab; + + public event EventHandler OnPaddingChanged; + + public virtual void PaddingHasChanged(PaddingChange e) + { + paddingBot = (((FrameLayout)instance.FindViewById(Resource.Id.smallPlayer).Parent).Visibility == ViewStates.Gone) + ? FindViewById(Resource.Id.bottomView).Height + : FindViewById(Resource.Id.bottomView).Height + ((FrameLayout)instance.FindViewById(Resource.Id.smallPlayer).Parent).Height; + + OnPaddingChanged?.Invoke(this, e); + } + + protected override void OnCreate(Bundle savedInstanceState) + { + base.OnCreate(savedInstanceState); + + SetContentView(Resource.Layout.Main); + + instance = this; + + var bottomNavigation = FindViewById(Resource.Id.bottomView); + bottomNavigation.NavigationItemSelected += PreNavigate; + + ToolBar = (Android.Support.V7.Widget.Toolbar) FindViewById(Resource.Id.toolbar); + SetSupportActionBar(ToolBar); + SupportActionBar.Title = "MusicApp"; + + pagerRefresh = FindViewById(Resource.Id.pagerRefresh); + contentRefresh = FindViewById(Resource.Id.contentRefresh); + + if (MusicPlayer.queue.Count > 0) + ReCreateSmallPlayer(); + else + PrepareApp(); + + if (Intent?.Action == "Player") + ActionPlayer(); + } + + async void PrepareApp() + { + await Task.Delay(100); + paddingBot = FindViewById(Resource.Id.bottomView).Height; + Navigate(Resource.Id.musicLayout); + } public void Login() { @@ -164,26 +215,6 @@ namespace MusicApp }); } - - public static int paddingBot - { - get - { - if (((FrameLayout)instance.FindViewById(Resource.Id.smallPlayer).Parent).Visibility == ViewStates.Gone) - return instance.FindViewById(Resource.Id.bottomView).Height; - else - return instance.FindViewById(Resource.Id.bottomView).Height + ((FrameLayout)instance.FindViewById(Resource.Id.smallPlayer).Parent).Height; - } - } - - public static int paddinTop - { - get - { - return 0/*instance.SupportActionBar.Height*/; - } - } - public void Scroll(object sender, AbsListView.ScrollEventArgs e) { if (usePager) @@ -192,34 +223,6 @@ namespace MusicApp contentRefresh.SetEnabled(e.FirstVisibleItem == 0); } - - protected override void OnCreate(Bundle savedInstanceState) - { - base.OnCreate(savedInstanceState); - - SetContentView(Resource.Layout.Main); - - instance = this; - - var bottomNavigation = FindViewById(Resource.Id.bottomView); - bottomNavigation.NavigationItemSelected += PreNavigate; - - ToolBar = (Android.Support.V7.Widget.Toolbar) FindViewById(Resource.Id.toolbar); - SetSupportActionBar(ToolBar); - SupportActionBar.Title = "MusicApp"; - - pagerRefresh = FindViewById(Resource.Id.pagerRefresh); - contentRefresh = FindViewById(Resource.Id.contentRefresh); - - if (MusicPlayer.queue.Count > 0) - ReCreateSmallPlayer(); - else - Navigate(Resource.Id.musicLayout); - - if (Intent?.Action == "Player") - ActionPlayer(); - } - private async void ActionPlayer() { await Task.Delay(100); @@ -251,8 +254,7 @@ namespace MusicApp { if (PlaylistTracks.instance != null) { - var item2 = menu.FindItem(Resource.Id.search); - item2.SetVisible(false); + HideSearch(); if (PlaylistTracks.instance.isEmpty) { ViewGroup rootView = FindViewById(Android.Resource.Id.Content); @@ -266,8 +268,7 @@ namespace MusicApp } if (FolderTracks.instance != null) { - var item2 = menu.FindItem(Resource.Id.search); - item2.SetVisible(false); + HideSearch(); if (FolderTracks.instance.isEmpty) { ViewGroup rootView = FindViewById(Android.Resource.Id.Content); @@ -402,6 +403,7 @@ namespace MusicApp tab = "Queue"; HideTabs(); HideSearch(); + ShowQuickPlay(); fragment = Queue.NewInstance(); break; @@ -415,6 +417,7 @@ namespace MusicApp tab = "Browse"; SetBrowseTabs(); DisplaySearch(); + HideQuickPlay(); break; case Resource.Id.downloadLayout: @@ -429,6 +432,7 @@ namespace MusicApp tab = "Youtube"; HideTabs(); DisplaySearch(); + HideQuickPlay(); fragment = YoutubeEngine.NewInstance(); break; @@ -442,6 +446,7 @@ namespace MusicApp tab = "Playlist"; SetYtTabs(); HideSearch(); + HideQuickPlay(); break; } @@ -492,8 +497,6 @@ namespace MusicApp tabs.AddTab(tabs.NewTab().SetText("Songs")); tabs.AddTab(tabs.NewTab().SetText("Folders")); - pager.SetPadding(0, (int)Math.Round(paddinTop * 1.90f), 0, 0); - ViewPagerAdapter adapter = new ViewPagerAdapter(SupportFragmentManager); adapter.AddFragment(Browse.NewInstance(), "Songs"); adapter.AddFragment(FolderBrowse.NewInstance(), "Folders"); @@ -503,6 +506,7 @@ namespace MusicApp pager.AddOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs)); tabs.SetupWithViewPager(pager); + tabs.TabReselected += OnTabReselected; } pager.CurrentItem = selectedTab; @@ -553,8 +557,6 @@ namespace MusicApp tabs.AddTab(tabs.NewTab().SetText("Playlists")); tabs.AddTab(tabs.NewTab().SetText("Youtube playlists")); - pager.SetPadding(0, (int)Math.Round(paddinTop * 1.90f), 0, 0); - ViewPagerAdapter adapter = new ViewPagerAdapter(SupportFragmentManager); adapter.AddFragment(Playlist.NewInstance(), "Playlists"); adapter.AddFragment(YtPlaylist.NewInstance(), "Youtube playlists"); @@ -563,6 +565,7 @@ namespace MusicApp pager.AddOnPageChangeListener(this); pager.AddOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs)); tabs.SetupWithViewPager(pager); + tabs.TabReselected += OnTabReselected; } pager.CurrentItem = selectedTab; @@ -571,6 +574,24 @@ namespace MusicApp CanSwitchDelay(); } + private void OnTabReselected(object sender, TabLayout.TabReselectedEventArgs e) + { + if (Browse.instance != null) + { + if (Browse.instance.focused) + Browse.instance.ListView.SmoothScrollToPosition(0); + else + FolderBrowse.instance.ListView.SmoothScrollToPosition(0); + } + else if (Playlist.instance != null) + { + if (Playlist.instance.focused) + Playlist.instance.ListView.SmoothScrollToPosition(0); + else + YtPlaylist.instance.ListView.SmoothScrollToPosition(0); + } + } + async void CanSwitchDelay() { await Task.Delay(350); @@ -597,6 +618,8 @@ namespace MusicApp Playlist.instance.focused = true; YtPlaylist.instance.focused = false; + + Playlist.instance.ListView.SmoothScrollToPosition(0); } if (position == 1) { @@ -607,6 +630,8 @@ namespace MusicApp Playlist.instance.focused = false; YtPlaylist.instance.focused = true; + + YtPlaylist.instance.ListView.SmoothScrollToPosition(0); } } @@ -619,11 +644,15 @@ namespace MusicApp { Browse.instance.focused = true; FolderBrowse.instance.focused = false; + DisplaySearch(); + Browse.instance.ListView.SmoothScrollToPosition(0); } if(position == 1) { Browse.instance.focused = false; FolderBrowse.instance.focused = true; + HideSearch(); + Browse.instance.ListView.SmoothScrollToPosition(0); } } } @@ -689,14 +718,6 @@ namespace MusicApp } } - public void ShowSmallPlayer() - { - RelativeLayout smallPlayer = FindViewById(Resource.Id.smallPlayer); - FrameLayout parent = (FrameLayout)smallPlayer.Parent; - parent.Visibility = ViewStates.Visible; - smallPlayer.Visibility = ViewStates.Visible; - } - private void Last_Click(object sender, EventArgs e) { Intent intent = new Intent(Application.Context, typeof(MusicPlayer)); @@ -725,6 +746,46 @@ namespace MusicApp SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Player.NewInstance()).Commit(); } + public void GetStoragePermission() + { + const string permission = Manifest.Permission.ReadExternalStorage; + if (Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, permission) == (int)Permission.Granted) + { + PremissionAuthorized(); + return; + } + string[] permissions = new string[] { permission }; + RequestPermissions(permissions, RequestCode); + } + + public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) + { + if (requestCode == RequestCode) + { + if (grantResults.Length > 0) + { + if (grantResults[0] == Permission.Granted) + PremissionAuthorized(); + else + Snackbar.Make(FindViewById(Resource.Id.contentView), "Permission denied, can't list musics.", Snackbar.LengthShort).Show(); + } + } + } + + void PremissionAuthorized() + { + Browse.instance?.PopulateList(); + Playlist.instance?.PopulateView(); + } + + public void Transition(int Resource, Android.Support.V4.App.Fragment fragment, bool backStack) + { + if (backStack) + SupportFragmentManager.BeginTransaction().Replace(Resource, fragment).AddToBackStack(null).Commit(); + else + SupportFragmentManager.BeginTransaction().Replace(Resource, fragment).Commit(); + } + void SetSmallPlayerProgressBar() { bar = FindViewById(Resource.Id.spProgress); @@ -745,51 +806,88 @@ namespace MusicApp handler.PostDelayed(UpdateProgressBar, 1000); } - public void HideSmallPlayer() + public async void HideSmallPlayer() { RelativeLayout smallPlayer = FindViewById(Resource.Id.smallPlayer); FrameLayout parent = (FrameLayout)smallPlayer.Parent; + bool hasChanged = parent.Visibility != ViewStates.Gone; parent.Visibility = ViewStates.Gone; + + await Task.Delay(75); + if (hasChanged) + PaddingHasChanged(new PaddingChange(paddingBot)); } - public void GetStoragePermission() + public async void ShowSmallPlayer() { - const string permission = Manifest.Permission.ReadExternalStorage; - if (Android.Support.V4.Content.ContextCompat.CheckSelfPermission(this, permission) == (int)Permission.Granted) + RelativeLayout smallPlayer = FindViewById(Resource.Id.smallPlayer); + FrameLayout parent = (FrameLayout)smallPlayer.Parent; + bool hasChanged = parent.Visibility == ViewStates.Gone; + parent.Visibility = ViewStates.Visible; + smallPlayer.Visibility = ViewStates.Visible; + + await Task.Delay(75); + if (hasChanged) + PaddingHasChanged(new PaddingChange(paddingBot)); + } + + public void ShowQuickPlay() + { + if(quickPlayLayout != null) { - PremissionAuthorized(); + quickPlayLayout.Visibility = ViewStates.Visible; + FloatingActionButton fab = quickPlayLayout.FindViewById(Resource.Id.quickPlay); + fab.Animate().Alpha(1); return; } - string[] permissions = new string[] { permission }; - RequestPermissions(permissions, RequestCode); + quickPlayLayout = LayoutInflater.Inflate(Resource.Layout.QuickPlayLayout, null); + ViewGroup rootView = FindViewById(Android.Resource.Id.Content); + AddContentView(quickPlayLayout, rootView.LayoutParameters); + Console.WriteLine("&Starting padding bot: " + paddingBot); + quickPlayLayout.SetPadding(0, 0, 0, paddingBot + PxToDp(6)); + FloatingActionButton QuickPlayFAB = quickPlayLayout.FindViewById(Resource.Id.quickPlay); + QuickPlayFAB.Click += QuickPlay; + OnPaddingChanged += QuickPlayChangePosition; } - public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) + public void HideQuickPlay() { - if (requestCode == RequestCode) + FloatingActionButton QuickPlayFAB = quickPlayLayout.FindViewById(Resource.Id.quickPlay); + QuickPlayFAB.Animate().Alpha(0); + } + + private void QuickPlayChangePosition(object sender, PaddingChange e) + { + Console.WriteLine("&Padding bot: " + paddingBot); + FloatingActionButton QuickPlayFab = quickPlayLayout.FindViewById(Resource.Id.quickPlay); + QuickPlayFab.Animate().TranslationYBy(-(paddingBot - e.oldPadding)); + } + + public async void QuickPlay(object sender, EventArgs e) + { + FloatingActionButton quickPlay = FindViewById(Resource.Id.quickPlay); + if (QuickPlayOpenned) { - if(grantResults.Length > 0) - { - if (grantResults[0] == Permission.Granted) - PremissionAuthorized(); - else - Snackbar.Make(FindViewById(Resource.Id.contentView), "Permission denied, can't list musics.", Snackbar.LengthShort).Show(); - } + Drawable icon = quickPlay.Drawable; + ((AnimatedVectorDrawable)icon).Start(); + QuickPlayOpenned = false; + await Task.Delay(200); + quickPlay.SetImageResource(Resource.Drawable.PlayToCross); + } + else + { + Drawable icon = quickPlay.Drawable; + ((AnimatedVectorDrawable)icon).Start(); + QuickPlayOpenned = true; + await Task.Delay(200); + quickPlay.SetImageResource(Resource.Drawable.CrossToPlay); } } - void PremissionAuthorized() + int PxToDp(int px) { - Browse.instance?.PopulateList(); - Playlist.instance?.PopulateView(); - } - - public void Transition(int Resource, Android.Support.V4.App.Fragment fragment, bool backStack) - { - if(backStack) - SupportFragmentManager.BeginTransaction().Replace(Resource, fragment).AddToBackStack(null).Commit(); - else - SupportFragmentManager.BeginTransaction().Replace(Resource, fragment).Commit(); + float scale = Resources.DisplayMetrics.Density; + return (int) (px * scale + 0.5f); } } } \ No newline at end of file diff --git a/MusicApp/MusicApp.csproj b/MusicApp/MusicApp.csproj index 1c3d805..237d8dc 100644 --- a/MusicApp/MusicApp.csproj +++ b/MusicApp/MusicApp.csproj @@ -254,9 +254,11 @@ + + @@ -459,6 +461,17 @@ Designer + + + Designer + + + + + + + + diff --git a/MusicApp/Resources/Portable Class/Downloader.cs b/MusicApp/Resources/Portable Class/Downloader.cs index ddbd2ab..f41a15e 100644 --- a/MusicApp/Resources/Portable Class/Downloader.cs +++ b/MusicApp/Resources/Portable Class/Downloader.cs @@ -3,22 +3,26 @@ using Android.Content; using Android.OS; using Android.Provider; using Android.Support.V4.App; -using System.IO; +using MusicApp.Resources.values; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Threading.Tasks; using YoutubeExplode; using YoutubeExplode.Models; using YoutubeExplode.Models.MediaStreams; -using Console = System.Console; using File = System.IO.File; -using MusicApp.Resources.values; -using System.Threading.Tasks; namespace MusicApp.Resources.Portable_Class { [Service] public class Downloader : Service { + public static Downloader instance; + public string downloadPath; + + private static List queue = new List(); + private int currentStrike = 0; private static bool isDownloading = false; private NotificationCompat.Builder notification; private int notificationID = 1001; @@ -34,26 +38,38 @@ namespace MusicApp.Resources.Portable_Class base.OnCreate(); } + public override void OnDestroy() + { + instance = null; + } + public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) { - Console.WriteLine("Downloader service started"); - string videoID = intent.GetStringExtra("videoID"); - string path = intent.GetStringExtra("path"); - string name = intent.GetStringExtra("name"); - DownloadAudio(videoID, path, name); + instance = this; return StartCommandResult.Sticky; } - private async void DownloadAudio(string videoID, string path, string name) + public void Download(DownloadFile file) + { + queue.Add(file); + if (!isDownloading) + DownloadAudio(file, downloadPath); + else + SetNotificationCount(); + } + + private async void DownloadAudio(DownloadFile file, string path) { while (isDownloading) await Task.Delay(1000); isDownloading = true; - CreateNotification("Downloading: ", name); + queue.Remove(file); + currentStrike++; + CreateNotification(file.name); YoutubeClient client = new YoutubeClient(); - Video videoInfo = await client.GetVideoAsync(videoID); + Video videoInfo = await client.GetVideoAsync(file.videoID); AudioStreamInfo streamInfo = videoInfo.AudioStreamInfos.OrderBy(s => s.Bitrate).Last(); string fileExtension = streamInfo.Container.GetFileExtension(); @@ -66,15 +82,15 @@ namespace MusicApp.Resources.Portable_Class FileStream output = File.Create(filePath); await input.CopyToAsync(output); output.Dispose(); + SetMetaData(filePath, videoInfo.Title, videoInfo.Author.Name, videoInfo.Thumbnails.HighResUrl); isDownloading = false; - SetMetaData(filePath, videoInfo.Title, videoInfo.Author.Name, videoInfo.Thumbnails.HighResUrl); + if (queue.Count != 0) + DownloadAudio(queue[0], path); } private void SetMetaData(string filePath, string title, string artist, string album) { - EditNotification("Retriving meta-data"); - ContentResolver resolver = MainActivity.instance.ContentResolver; ContentValues value = new ContentValues(); value.Put(MediaStore.Audio.Media.InterfaceConsts.Title, title); @@ -86,19 +102,22 @@ namespace MusicApp.Resources.Portable_Class StopForeground(true); } - void CreateNotification(string title, string artist) + void CreateNotification(string title) { notification = new NotificationCompat.Builder(Application.Context) .SetVisibility(NotificationCompat.VisibilityPublic) .SetSmallIcon(Resource.Drawable.MusicIcon) - .SetContentTitle(title) - .SetContentText(artist); + .SetContentTitle("Downloading: ") + .SetContentText(title); + if(queue.Count > 1) + notification.SetSubText(currentStrike + "/" + queue.Count); + StartForeground(notificationID, notification.Build()); } - void EditNotification(string title) + void SetNotificationCount() { - notification.SetContentTitle(title); + notification.SetSubText(currentStrike + "/" + queue.Count); StartForeground(notificationID, notification.Build()); } } diff --git a/MusicApp/Resources/Portable Class/FolderTracks.cs b/MusicApp/Resources/Portable Class/FolderTracks.cs index 717f525..8419844 100644 --- a/MusicApp/Resources/Portable Class/FolderTracks.cs +++ b/MusicApp/Resources/Portable Class/FolderTracks.cs @@ -47,7 +47,7 @@ namespace MusicApp.Resources.Portable_Class public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = base.OnCreateView(inflater, container, savedInstanceState); - view.SetPadding(0, MainActivity.paddinTop, 0, MainActivity.paddingBot); + view.SetPadding(0, 0, 0, MainActivity.paddingBot); return view; } diff --git a/MusicApp/Resources/Portable Class/MusicPlayer.cs b/MusicApp/Resources/Portable Class/MusicPlayer.cs index 6a751fd..6dee4e9 100644 --- a/MusicApp/Resources/Portable Class/MusicPlayer.cs +++ b/MusicApp/Resources/Portable Class/MusicPlayer.cs @@ -178,7 +178,6 @@ namespace MusicApp.Resources.Portable_Class if(song.queueSlot == -1) song.queueSlot = CurrentID() + 1; - Console.WriteLine("QueueSlot: " + song.queueSlot); currentID = song.queueSlot; CreateNotification(song.GetName(), song.GetArtist(), song.GetAlbumArt(), song.GetAlbum()); @@ -217,7 +216,7 @@ namespace MusicApp.Resources.Portable_Class if (song.queueSlot == -1) song.queueSlot = CurrentID() + 1; - Console.WriteLine(song.GetName() + " : " + song.queueSlot); + currentID = song.queueSlot; if (addToQueue) diff --git a/MusicApp/Resources/Portable Class/Player.cs b/MusicApp/Resources/Portable Class/Player.cs index 3e66ab3..d9b50cd 100644 --- a/MusicApp/Resources/Portable Class/Player.cs +++ b/MusicApp/Resources/Portable Class/Player.cs @@ -65,6 +65,7 @@ namespace MusicApp.Resources.Portable_Class while (MusicPlayer.CurrentID() == -1) await Task.Delay(100); + MainActivity.instance.ShowQuickPlay(); MainActivity.instance.ToolBar.Visibility = ViewStates.Gone; MainActivity.instance.FindViewById(Resource.Id.bottomView).Visibility = ViewStates.Gone; TextView title = playerView.FindViewById(Resource.Id.playerTitle); diff --git a/MusicApp/Resources/Portable Class/PlaylistTracks.cs b/MusicApp/Resources/Portable Class/PlaylistTracks.cs index b9c07ab..bf12ad6 100644 --- a/MusicApp/Resources/Portable Class/PlaylistTracks.cs +++ b/MusicApp/Resources/Portable Class/PlaylistTracks.cs @@ -51,7 +51,7 @@ namespace MusicApp.Resources.Portable_Class public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = base.OnCreateView(inflater, container, savedInstanceState); - view.SetPadding(0, MainActivity.paddinTop, 0, MainActivity.paddingBot); + view.SetPadding(0, 0, 0, MainActivity.paddingBot); return view; } diff --git a/MusicApp/Resources/Portable Class/Queue.cs b/MusicApp/Resources/Portable Class/Queue.cs index 003cf91..87fdeb2 100644 --- a/MusicApp/Resources/Portable Class/Queue.cs +++ b/MusicApp/Resources/Portable Class/Queue.cs @@ -1,4 +1,5 @@ using Android.OS; +using Android.Support.Design.Widget; using Android.Support.V4.App; using Android.Views; using Android.Widget; @@ -43,7 +44,7 @@ namespace MusicApp.Resources.Portable_Class { View view = base.OnCreateView(inflater, container, savedInstanceState); this.view = view; - view.SetPadding(0, MainActivity.paddinTop, 0, MainActivity.paddingBot); + view.SetPadding(0, 0, 0, MainActivity.paddingBot); return view; } @@ -82,6 +83,8 @@ namespace MusicApp.Resources.Portable_Class if (adapter == null || adapter.Count == 0) { + if (isEmpty) + return; isEmpty = true; Activity.AddContentView(emptyView, View.LayoutParameters); } diff --git a/MusicApp/Resources/Portable Class/YoutubeEngine.cs b/MusicApp/Resources/Portable Class/YoutubeEngine.cs index 4b0afcc..59cbac6 100644 --- a/MusicApp/Resources/Portable Class/YoutubeEngine.cs +++ b/MusicApp/Resources/Portable Class/YoutubeEngine.cs @@ -70,7 +70,7 @@ namespace MusicApp.Resources.Portable_Class public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = base.OnCreateView(inflater, container, savedInstanceState); - view.SetPadding(0, MainActivity.paddinTop, 0, MainActivity.paddingBot); + view.SetPadding(0, 0, 0, MainActivity.paddingBot); return view; } @@ -268,7 +268,7 @@ namespace MusicApp.Resources.Portable_Class parseProgress.Visibility = ViewStates.Gone; } - public static void Download(string name, string videoID) + public async static void Download(string name, string videoID) { ISharedPreferences prefManager = PreferenceManager.GetDefaultSharedPreferences(Android.App.Application.Context); if (prefManager.GetString("downloadPath", null) != null) @@ -276,10 +276,13 @@ namespace MusicApp.Resources.Portable_Class Toast.MakeText(Android.App.Application.Context, "Downloading...", ToastLength.Short).Show(); Context context = Android.App.Application.Context; Intent intent = new Intent(context, typeof(Downloader)); - intent.PutExtra("videoID", videoID); - intent.PutExtra("path", prefManager.GetString("downloadPath", null)); - intent.PutExtra("name", name); context.StartService(intent); + + while (Downloader.instance == null) + await Task.Delay(10); + + Downloader.instance.downloadPath = prefManager.GetString("downloadPath", null); + Downloader.instance.Download(new DownloadFile(name, videoID)); } else { @@ -298,15 +301,16 @@ namespace MusicApp.Resources.Portable_Class { Toast.MakeText(Android.App.Application.Context, "Downloading...", ToastLength.Short).Show(); Context context = Android.App.Application.Context; + Intent intent = new Intent(context, typeof(Downloader)); + context.StartService(intent); + + while (Downloader.instance == null) + await Task.Delay(10); + + Downloader.instance.downloadPath = prefManager.GetString("downloadPath", null); + for(int i = 0; i < names.Length; i++) - { - Intent intent = new Intent(context, typeof(Downloader)); - intent.PutExtra("videoID", videoIDs[i]); - intent.PutExtra("path", prefManager.GetString("downloadPath", null)); - intent.PutExtra("name", names[i]); - context.StartService(intent); - await Task.Delay(10000); - } + Downloader.instance.Download(new DownloadFile(names[i], videoIDs[i])); } else { diff --git a/MusicApp/Resources/Resource.Designer.cs b/MusicApp/Resources/Resource.Designer.cs index 3071e78..41a0515 100644 --- a/MusicApp/Resources/Resource.Designer.cs +++ b/MusicApp/Resources/Resource.Designer.cs @@ -2360,170 +2360,188 @@ namespace MusicApp // aapt resource value: 0x7f020053 public const int avd_hide_password = 2130837587; - // aapt resource value: 0x7f020085 - public const int avd_hide_password_1 = 2130837637; - - // aapt resource value: 0x7f020086 - public const int avd_hide_password_2 = 2130837638; - // aapt resource value: 0x7f020087 - public const int avd_hide_password_3 = 2130837639; + public const int avd_hide_password_1 = 2130837639; + + // aapt resource value: 0x7f020088 + public const int avd_hide_password_2 = 2130837640; + + // aapt resource value: 0x7f020089 + public const int avd_hide_password_3 = 2130837641; // aapt resource value: 0x7f020054 public const int avd_show_password = 2130837588; - // aapt resource value: 0x7f020088 - public const int avd_show_password_1 = 2130837640; - - // aapt resource value: 0x7f020089 - public const int avd_show_password_2 = 2130837641; - // aapt resource value: 0x7f02008a - public const int avd_show_password_3 = 2130837642; + public const int avd_show_password_1 = 2130837642; + + // aapt resource value: 0x7f02008b + public const int avd_show_password_2 = 2130837643; + + // aapt resource value: 0x7f02008c + public const int avd_show_password_3 = 2130837644; // aapt resource value: 0x7f020055 - public const int design_bottom_navigation_item_background = 2130837589; + public const int CrossToPlay = 2130837589; + + // aapt resource value: 0x7f02008d + public const int crosstoplay_1 = 2130837645; + + // aapt resource value: 0x7f02008e + public const int crosstoplay_2 = 2130837646; // aapt resource value: 0x7f020056 - public const int design_fab_background = 2130837590; + public const int design_bottom_navigation_item_background = 2130837590; // aapt resource value: 0x7f020057 - public const int design_ic_visibility = 2130837591; + public const int design_fab_background = 2130837591; // aapt resource value: 0x7f020058 - public const int design_ic_visibility_off = 2130837592; + public const int design_ic_visibility = 2130837592; // aapt resource value: 0x7f020059 - public const int design_password_eye = 2130837593; + public const int design_ic_visibility_off = 2130837593; // aapt resource value: 0x7f02005a - public const int design_snackbar_background = 2130837594; + public const int design_password_eye = 2130837594; // aapt resource value: 0x7f02005b - public const int DownloadIcon = 2130837595; + public const int design_snackbar_background = 2130837595; // aapt resource value: 0x7f02005c - public const int exo_controls_fastforward = 2130837596; + public const int DownloadIcon = 2130837596; // aapt resource value: 0x7f02005d - public const int exo_controls_next = 2130837597; + public const int exo_controls_fastforward = 2130837597; // aapt resource value: 0x7f02005e - public const int exo_controls_pause = 2130837598; + public const int exo_controls_next = 2130837598; // aapt resource value: 0x7f02005f - public const int exo_controls_play = 2130837599; + public const int exo_controls_pause = 2130837599; // aapt resource value: 0x7f020060 - public const int exo_controls_previous = 2130837600; + public const int exo_controls_play = 2130837600; // aapt resource value: 0x7f020061 - public const int exo_controls_repeat_all = 2130837601; + public const int exo_controls_previous = 2130837601; // aapt resource value: 0x7f020062 - public const int exo_controls_repeat_off = 2130837602; + public const int exo_controls_repeat_all = 2130837602; // aapt resource value: 0x7f020063 - public const int exo_controls_repeat_one = 2130837603; + public const int exo_controls_repeat_off = 2130837603; // aapt resource value: 0x7f020064 - public const int exo_controls_rewind = 2130837604; + public const int exo_controls_repeat_one = 2130837604; // aapt resource value: 0x7f020065 - public const int exo_edit_mode_logo = 2130837605; + public const int exo_controls_rewind = 2130837605; // aapt resource value: 0x7f020066 - public const int folderIcon = 2130837606; + public const int exo_edit_mode_logo = 2130837606; // aapt resource value: 0x7f020067 - public const int ic_arrow_back = 2130837607; + public const int folderIcon = 2130837607; // aapt resource value: 0x7f020068 - public const int ic_expand_less_black_24dp = 2130837608; + public const int ic_arrow_back = 2130837608; // aapt resource value: 0x7f020069 - public const int ic_expand_more_black_24dp = 2130837609; + public const int ic_expand_less_black_24dp = 2130837609; // aapt resource value: 0x7f02006a - public const int ic_more_vert_black_24dp = 2130837610; + public const int ic_expand_more_black_24dp = 2130837610; // aapt resource value: 0x7f02006b - public const int ic_pause_black_24dp = 2130837611; + public const int ic_more_vert_black_24dp = 2130837611; // aapt resource value: 0x7f02006c - public const int ic_play_arrow_black_24dp = 2130837612; + public const int ic_pause_black_24dp = 2130837612; // aapt resource value: 0x7f02006d - public const int ic_playlist_add_white_24dp = 2130837613; + public const int ic_play_arrow_black_24dp = 2130837613; // aapt resource value: 0x7f02006e - public const int ic_query_builder_black_24dp = 2130837614; + public const int ic_playlist_add_white_24dp = 2130837614; // aapt resource value: 0x7f02006f - public const int ic_skip_next_black_24dp = 2130837615; + public const int ic_query_builder_black_24dp = 2130837615; // aapt resource value: 0x7f020070 - public const int ic_skip_previous_black_24dp = 2130837616; + public const int ic_skip_next_black_24dp = 2130837616; // aapt resource value: 0x7f020071 - public const int ic_timer_white_24dp = 2130837617; + public const int ic_skip_previous_black_24dp = 2130837617; // aapt resource value: 0x7f020072 - public const int MusicIcon = 2130837618; + public const int ic_timer_white_24dp = 2130837618; // aapt resource value: 0x7f020073 - public const int navigation_empty_icon = 2130837619; + public const int MusicIcon = 2130837619; // aapt resource value: 0x7f020074 - public const int noAlbum = 2130837620; + public const int navigation_empty_icon = 2130837620; // aapt resource value: 0x7f020075 - public const int notification_action_background = 2130837621; + public const int noAlbum = 2130837621; // aapt resource value: 0x7f020076 - public const int notification_bg = 2130837622; + public const int notification_action_background = 2130837622; // aapt resource value: 0x7f020077 - public const int notification_bg_low = 2130837623; + public const int notification_bg = 2130837623; // aapt resource value: 0x7f020078 - public const int notification_bg_low_normal = 2130837624; + public const int notification_bg_low = 2130837624; // aapt resource value: 0x7f020079 - public const int notification_bg_low_pressed = 2130837625; + public const int notification_bg_low_normal = 2130837625; // aapt resource value: 0x7f02007a - public const int notification_bg_normal = 2130837626; + public const int notification_bg_low_pressed = 2130837626; // aapt resource value: 0x7f02007b - public const int notification_bg_normal_pressed = 2130837627; + public const int notification_bg_normal = 2130837627; // aapt resource value: 0x7f02007c - public const int notification_icon_background = 2130837628; - - // aapt resource value: 0x7f020083 - public const int notification_template_icon_bg = 2130837635; - - // aapt resource value: 0x7f020084 - public const int notification_template_icon_low_bg = 2130837636; + public const int notification_bg_normal_pressed = 2130837628; // aapt resource value: 0x7f02007d - public const int notification_tile_bg = 2130837629; + public const int notification_icon_background = 2130837629; + + // aapt resource value: 0x7f020085 + public const int notification_template_icon_bg = 2130837637; + + // aapt resource value: 0x7f020086 + public const int notification_template_icon_low_bg = 2130837638; // aapt resource value: 0x7f02007e - public const int notify_panel_notification_icon_bg = 2130837630; + public const int notification_tile_bg = 2130837630; // aapt resource value: 0x7f02007f - public const int PlaylistPlay = 2130837631; + public const int notify_panel_notification_icon_bg = 2130837631; // aapt resource value: 0x7f020080 - public const int PlaylistPlayIcon = 2130837632; + public const int PlaylistPlay = 2130837632; // aapt resource value: 0x7f020081 - public const int search = 2130837633; + public const int PlaylistPlayIcon = 2130837633; // aapt resource value: 0x7f020082 - public const int settings = 2130837634; + public const int PlayToCross = 2130837634; + + // aapt resource value: 0x7f02008f + public const int playtocross_1 = 2130837647; + + // aapt resource value: 0x7f020090 + public const int playtocross_2 = 2130837648; + + // aapt resource value: 0x7f020083 + public const int search = 2130837635; + + // aapt resource value: 0x7f020084 + public const int settings = 2130837636; static Drawable() { @@ -2601,8 +2619,8 @@ namespace MusicApp // aapt resource value: 0x7f08002f public const int add = 2131230767; - // aapt resource value: 0x7f0800e0 - public const int albumArt = 2131230944; + // aapt resource value: 0x7f0800e1 + public const int albumArt = 2131230945; // aapt resource value: 0x7f08006f public const int alertTitle = 2131230831; @@ -2613,8 +2631,8 @@ namespace MusicApp // aapt resource value: 0x7f080034 public const int always = 2131230772; - // aapt resource value: 0x7f0800e1 - public const int artist = 2131230945; + // aapt resource value: 0x7f0800e2 + public const int artist = 2131230946; // aapt resource value: 0x7f080040 public const int auto = 2131230784; @@ -2628,8 +2646,8 @@ namespace MusicApp // aapt resource value: 0x7f0800a8 public const int bottomView = 2131230888; - // aapt resource value: 0x7f0800e7 - public const int browseLayout = 2131230951; + // aapt resource value: 0x7f0800e8 + public const int browseLayout = 2131230952; // aapt resource value: 0x7f08008b public const int browseList = 2131230859; @@ -2712,8 +2730,8 @@ namespace MusicApp // aapt resource value: 0x7f0800d0 public const int downFAB = 2131230928; - // aapt resource value: 0x7f0800e8 - public const int downloadLayout = 2131230952; + // aapt resource value: 0x7f0800e9 + public const int downloadLayout = 2131230953; // aapt resource value: 0x7f08007d public const int edit_query = 2131230845; @@ -2868,8 +2886,8 @@ namespace MusicApp // aapt resource value: 0x7f0800bd public const int line1 = 2131230909; - // aapt resource value: 0x7f0800e3 - public const int line2 = 2131230947; + // aapt resource value: 0x7f0800e4 + public const int line2 = 2131230948; // aapt resource value: 0x7f0800bf public const int line3 = 2131230911; @@ -2883,8 +2901,8 @@ namespace MusicApp // aapt resource value: 0x7f08005f public const int list_item = 2131230815; - // aapt resource value: 0x7f0800e5 - public const int masked = 2131230949; + // aapt resource value: 0x7f0800e6 + public const int masked = 2131230950; // aapt resource value: 0x7f0800b1 public const int media_actions = 2131230897; @@ -2895,14 +2913,14 @@ namespace MusicApp // aapt resource value: 0x7f08004f public const int mini = 2131230799; - // aapt resource value: 0x7f0800e2 - public const int moreButton = 2131230946; + // aapt resource value: 0x7f0800e3 + public const int moreButton = 2131230947; // aapt resource value: 0x7f08002a public const int multiply = 2131230762; - // aapt resource value: 0x7f0800e6 - public const int musicLayout = 2131230950; + // aapt resource value: 0x7f0800e7 + public const int musicLayout = 2131230951; // aapt resource value: 0x7f080095 public const int navigation_header_container = 2131230869; @@ -2979,8 +2997,8 @@ namespace MusicApp // aapt resource value: 0x7f0800c9 public const int playerTitle = 2131230921; - // aapt resource value: 0x7f0800e9 - public const int playlistLayout = 2131230953; + // aapt resource value: 0x7f0800ea + public const int playlistLayout = 2131230954; // aapt resource value: 0x7f08008c public const int playlistName = 2131230860; @@ -2991,6 +3009,9 @@ namespace MusicApp // aapt resource value: 0x7f080007 public const int progress_horizontal = 2131230727; + // aapt resource value: 0x7f0800d7 + public const int quickPlay = 2131230935; + // aapt resource value: 0x7f080074 public const int radio = 2131230836; @@ -3021,8 +3042,8 @@ namespace MusicApp // aapt resource value: 0x7f080051 public const int scrollable = 2131230801; - // aapt resource value: 0x7f0800d7 - public const int search = 2131230935; + // aapt resource value: 0x7f0800d8 + public const int search = 2131230936; // aapt resource value: 0x7f08007f public const int search_badge = 2131230847; @@ -3063,8 +3084,8 @@ namespace MusicApp // aapt resource value: 0x7f080089 public const int select_dialog_listview = 2131230857; - // aapt resource value: 0x7f0800ea - public const int settings = 2131230954; + // aapt resource value: 0x7f0800eb + public const int settings = 2131230955; // aapt resource value: 0x7f080073 public const int shortcut = 2131230835; @@ -3096,29 +3117,29 @@ namespace MusicApp // aapt resource value: 0x7f0800cf public const int songTimer = 2131230927; - // aapt resource value: 0x7f0800d9 - public const int spArt = 2131230937; - - // aapt resource value: 0x7f0800db - public const int spArtist = 2131230939; - - // aapt resource value: 0x7f0800d8 - public const int spContainer = 2131230936; - - // aapt resource value: 0x7f0800de - public const int spLast = 2131230942; + // aapt resource value: 0x7f0800da + public const int spArt = 2131230938; // aapt resource value: 0x7f0800dc - public const int spNext = 2131230940; + public const int spArtist = 2131230940; - // aapt resource value: 0x7f0800dd - public const int spPlay = 2131230941; + // aapt resource value: 0x7f0800d9 + public const int spContainer = 2131230937; // aapt resource value: 0x7f0800df - public const int spProgress = 2131230943; + public const int spLast = 2131230943; - // aapt resource value: 0x7f0800da - public const int spTitle = 2131230938; + // aapt resource value: 0x7f0800dd + public const int spNext = 2131230941; + + // aapt resource value: 0x7f0800de + public const int spPlay = 2131230942; + + // aapt resource value: 0x7f0800e0 + public const int spProgress = 2131230944; + + // aapt resource value: 0x7f0800db + public const int spTitle = 2131230939; // aapt resource value: 0x7f080063 public const int spacer = 2131230819; @@ -3228,8 +3249,8 @@ namespace MusicApp // aapt resource value: 0x7f08000e public const int view_offset_helper = 2131230734; - // aapt resource value: 0x7f0800e4 - public const int visible = 2131230948; + // aapt resource value: 0x7f0800e5 + public const int visible = 2131230949; // aapt resource value: 0x7f08008a public const int webview = 2131230858; @@ -3552,37 +3573,40 @@ namespace MusicApp public const int PreferenceToolbar = 2130903124; // aapt resource value: 0x7f030055 - public const int search_layout = 2130903125; + public const int QuickPlayLayout = 2130903125; // aapt resource value: 0x7f030056 - public const int select_dialog_item_material = 2130903126; + public const int search_layout = 2130903126; // aapt resource value: 0x7f030057 - public const int select_dialog_multichoice_material = 2130903127; + public const int select_dialog_item_material = 2130903127; // aapt resource value: 0x7f030058 - public const int select_dialog_singlechoice_material = 2130903128; + public const int select_dialog_multichoice_material = 2130903128; // aapt resource value: 0x7f030059 - public const int SmallPlayer = 2130903129; + public const int select_dialog_singlechoice_material = 2130903129; // aapt resource value: 0x7f03005a - public const int SongList = 2130903130; + public const int SmallPlayer = 2130903130; // aapt resource value: 0x7f03005b - public const int support_simple_spinner_dropdown_item = 2130903131; + public const int SongList = 2130903131; // aapt resource value: 0x7f03005c - public const int tabs = 2130903132; + public const int support_simple_spinner_dropdown_item = 2130903132; // aapt resource value: 0x7f03005d - public const int TimerLayout = 2130903133; + public const int tabs = 2130903133; // aapt resource value: 0x7f03005e - public const int TwoLineLayout = 2130903134; + public const int TimerLayout = 2130903134; // aapt resource value: 0x7f03005f - public const int YtList = 2130903135; + public const int TwoLineLayout = 2130903135; + + // aapt resource value: 0x7f030060 + public const int YtList = 2130903136; static Layout() { diff --git a/MusicApp/Resources/drawable/CrossToPlay.xml b/MusicApp/Resources/drawable/CrossToPlay.xml new file mode 100644 index 0000000..e55aed1 --- /dev/null +++ b/MusicApp/Resources/drawable/CrossToPlay.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/MusicApp/Resources/drawable/PlayToCross.xml b/MusicApp/Resources/drawable/PlayToCross.xml new file mode 100644 index 0000000..32ccf16 --- /dev/null +++ b/MusicApp/Resources/drawable/PlayToCross.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/MusicApp/Resources/layout/QuickPlayLayout.xml b/MusicApp/Resources/layout/QuickPlayLayout.xml new file mode 100644 index 0000000..a5f96ba --- /dev/null +++ b/MusicApp/Resources/layout/QuickPlayLayout.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/MusicApp/Resources/values/DownloadFile.cs b/MusicApp/Resources/values/DownloadFile.cs new file mode 100644 index 0000000..e298de2 --- /dev/null +++ b/MusicApp/Resources/values/DownloadFile.cs @@ -0,0 +1,15 @@ +namespace MusicApp.Resources.values +{ + [System.Serializable] + public class DownloadFile + { + public string name; + public string videoID; + + public DownloadFile(string name, string videoID) + { + this.name = name; + this.videoID = videoID; + } + } +} \ No newline at end of file diff --git a/MusicApp/Resources/values/PaddingChange.cs b/MusicApp/Resources/values/PaddingChange.cs new file mode 100644 index 0000000..3226aeb --- /dev/null +++ b/MusicApp/Resources/values/PaddingChange.cs @@ -0,0 +1,14 @@ +using System; + +namespace MusicApp.Resources.values +{ + public class PaddingChange : EventArgs + { + public int oldPadding; + + public PaddingChange(int oldPadding) + { + this.oldPadding = oldPadding; + } + } +} \ No newline at end of file