Adding headphones control for play/pause.

Solving bugs.
This commit is contained in:
Anonymous Raccoon
2018-05-10 14:45:28 +02:00
parent e41067217d
commit 444ffaf218
12 changed files with 166 additions and 47 deletions
+21 -17
View File
@@ -346,7 +346,6 @@ namespace MusicApp
await Task.Delay(100);
HideTabs();
HideSearch();
SaveInstance();
SupportFragmentManager.BeginTransaction().Replace(Resource.Id.contentView, Player.NewInstance()).Commit();
}
@@ -444,9 +443,7 @@ namespace MusicApp
SetYtTabs(YoutubeEngine.searchKeyWorld, selectedTab);
YoutubeEngine.instances[selectedTab].focused = true;
YoutubeEngine.instances[selectedTab].OnFocus();
//YoutubeEngine.instances[selectedTab].ListView.GetLayoutManager().OnRestoreInstanceState(youtubeParcel);
youtubeInstanceSave = null;
youtubeParcel = null;
YoutubeEngine.instances[selectedTab].ResumeListView();
}
else
{
@@ -953,8 +950,11 @@ namespace MusicApp
{
YoutubeEngine instance = null;
foreach (YoutubeEngine inst in YoutubeEngine.instances)
if (instance.focused)
{
Console.WriteLine(inst);
if (inst.focused)
instance = inst;
}
youtubeParcel = instance.ListView.GetLayoutManager().OnSaveInstanceState();
MainActivity.instance.youtubeInstanceSave = "YoutubeEngine" + "-" + instance.querryType;
@@ -1316,11 +1316,11 @@ namespace MusicApp
parcelableSender = "Home";
parcelable = Home.instance.ListView.GetLayoutManager().OnSaveInstanceState();
}
else if (Queue.instance != null)
{
parcelableSender = "Queue";
parcelable = Queue.instance.ListView.GetLayoutManager().OnSaveInstanceState();
}
//else if (Queue.instance != null)
//{
// parcelableSender = "Queue";
// parcelable = Queue.instance.ListView.GetLayoutManager().OnSaveInstanceState();
//}
else if (Browse.instance != null && Browse.instance.focused)
{
parcelableSender = "Browse";
@@ -1357,21 +1357,25 @@ namespace MusicApp
switch (parcelableSender)
{
case "Home":
Navigate(Resource.Id.musicLayout, true);
break;
case "Queue":
Transition(Resource.Id.contentView, Queue.instance, false, true);
//Navigate(Resource.Id.musicLayout, true);
FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.musicLayout;
break;
//case "Queue":
// Transition(Resource.Id.contentView, Queue.instance, false, true);
// break;
case "Browse":
Navigate(Resource.Id.browseLayout, true);
//Navigate(Resource.Id.browseLayout, true);
FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.browseLayout;
break;
case "FolderBrowse":
Navigate(Resource.Id.browseLayout, true);
//Navigate(Resource.Id.browseLayout, true);
FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.browseLayout;
FindViewById<ViewPager>(Resource.Id.pager).CurrentItem = 1;
FindViewById<TabLayout>(Resource.Id.tabs).SetScrollPosition(1, 0f, true);
break;
case "Playlist":
Navigate(Resource.Id.playlistLayout, true);
//Navigate(Resource.Id.playlistLayout, true);
FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.playlistLayout;
break;
case "YoutubeEngine-All":
SetYtTabs(YoutubeEngine.searchKeyWorld, 0);
+2
View File
@@ -227,6 +227,7 @@
<Compile Include="Resources\Fragments\EmptyFragment.cs" />
<Compile Include="Resources\Portable Class\AccountPreference.cs" />
<Compile Include="Resources\Portable Class\Adapter.cs" />
<Compile Include="Resources\Portable Class\AudioStopper.cs" />
<Compile Include="Resources\Portable Class\Browse.cs" />
<Compile Include="Resources\Portable Class\ChannelAdapter.cs" />
<Compile Include="Resources\Portable Class\CircleTransformation.cs" />
@@ -236,6 +237,7 @@
<Compile Include="Resources\Portable Class\FolderAdapter.cs" />
<Compile Include="Resources\Portable Class\FolderBrowse.cs" />
<Compile Include="Resources\Portable Class\FolderTracks.cs" />
<Compile Include="Resources\Portable Class\HeadphonesActions.cs" />
<Compile Include="Resources\Portable Class\Home.cs" />
<Compile Include="Resources\Portable Class\HomeAdapter.cs" />
<Compile Include="Resources\Portable Class\HomeHolder.cs" />
@@ -0,0 +1,20 @@
using Android.App;
using Android.Content;
using Android.Media;
namespace MusicApp.Resources.Portable_Class
{
[IntentFilter(new[] { AudioManager.ActionAudioBecomingNoisy })]
public class AudioStopper : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
if (intent.Action != AudioManager.ActionAudioBecomingNoisy)
return;
Intent musicIntent = new Intent(Application.Context, typeof(MusicPlayer));
musicIntent.SetAction("ForcePause");
Application.Context.StartService(musicIntent);
}
}
}
@@ -292,6 +292,8 @@ namespace MusicApp.Resources.Portable_Class
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
}
}
@@ -225,6 +225,7 @@ namespace MusicApp.Resources.Portable_Class
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
}
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
@@ -243,12 +244,31 @@ namespace MusicApp.Resources.Portable_Class
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, MainActivity.dialogTheme);
builder.SetTitle("Pick an action");
builder.SetItems(actions, (senderAlert, args) =>
builder.SetItems(actions, async (senderAlert, args) =>
{
switch (args.Which)
{
case 0:
Browse.act = Activity;
int Position = tracks.IndexOf(item);
List<Song> queue = tracks.GetRange(Position + 1, tracks.Count - Position - 1);
if (result != null)
{
queue = result.GetRange(Position + 1, result.Count - Position - 1);
}
queue.Reverse();
Browse.Play(item);
while (MusicPlayer.instance == null)
await Task.Delay(10);
foreach (Song song in queue)
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
break;
case 1:
Browse.PlayNext(item);
@@ -0,0 +1,27 @@
using Android.Content;
using Android.Support.V4.Media.Session;
namespace MusicApp.Resources.Portable_Class
{
public class HeadphonesActions : MediaSessionCompat.Callback
{
public override void OnPlay()
{
base.OnPlay();
PlayPause();
}
public override void OnPause()
{
base.OnPause();
PlayPause();
}
void PlayPause()
{
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
intent.SetAction("Pause");
Android.App.Application.Context.StartService(intent);
}
}
}
@@ -76,6 +76,11 @@ namespace MusicApp.Resources.Portable_Class
Resume();
break;
case "ForcePause":
if (isRunning)
Pause();
break;
case "Next":
PlayNext();
break;
@@ -165,6 +170,7 @@ namespace MusicApp.Resources.Portable_Class
mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause);
mediaSession.SetPlaybackState(builder.Build());
mediaSession.SetCallback(new HeadphonesActions());
}
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(Application.Context, "MusicApp");
@@ -241,6 +247,7 @@ namespace MusicApp.Resources.Portable_Class
mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause);
mediaSession.SetPlaybackState(builder.Build());
mediaSession.SetCallback(new HeadphonesActions());
}
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(Application.Context, "MusicApp");
@@ -595,9 +602,9 @@ namespace MusicApp.Resources.Portable_Class
tmpDefaultIntent.SetAction("Player");
PendingIntent defaultIntent = PendingIntent.GetActivity(Application.Context, 0, tmpDefaultIntent, PendingIntentFlags.UpdateCurrent);
Intent tmpCancelIntent = new Intent(Application.Context, typeof(MainActivity));
tmpCancelIntent.SetAction("Stop");
PendingIntent cancelIntent = PendingIntent.GetActivity(Application.Context, 0, tmpCancelIntent, PendingIntentFlags.UpdateCurrent);
//Intent tmpCancelIntent = new Intent(Application.Context, typeof(MainActivity));
//tmpCancelIntent.SetAction("Stop");
//PendingIntent cancelIntent = PendingIntent.GetActivity(Application.Context, 0, tmpCancelIntent, PendingIntentFlags.UpdateCurrent);
notification = new NotificationCompat.Builder(Application.Context, "MusicApp.Channel")
.SetVisibility(NotificationCompat.VisibilityPublic)
@@ -610,14 +617,14 @@ namespace MusicApp.Resources.Portable_Class
.SetStyle(new MediaStyle()
.SetShowActionsInCompactView(1)
.SetShowCancelButton(true)
.SetCancelButtonIntent(cancelIntent)
//.SetCancelButtonIntent(cancelIntent)
.SetMediaSession(mediaSession.SessionToken))
.SetColor(ContextCompat.GetColor(Application.Context, Resource.Color.notification_icon_bg_color))
.SetContentTitle(title)
.SetContentText(artist)
.SetLargeIcon(icon)
.SetContentIntent(defaultIntent)
.SetDeleteIntent(cancelIntent)
//.SetDeleteIntent(cancelIntent)
.Build();
ContextCompat.StartForegroundService(Application.Context, new Intent(Application.Context, typeof(MusicPlayer)));
StartForeground(notificationID, notification);
+16 -16
View File
@@ -1,21 +1,16 @@
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Support.Design.Widget;
using Android.Support.V4.App;
using Android.Support.V4.Widget;
using Android.Views;
using Android.Widget;
using MusicApp.Resources.values;
using System;
using Square.Picasso;
using Android.Support.Design.Widget;
using System;
using System.Threading.Tasks;
using Android.Support.V4.App;
using Java.Util;
using AlarmManager = Android.App.AlarmManager;
using PendingIntent = Android.App.PendingIntent;
using Android.Graphics;
using System.Threading;
using Android.Support.V4.Widget;
using Android.Graphics.Drawables;
namespace MusicApp.Resources.Portable_Class
{
@@ -27,8 +22,8 @@ namespace MusicApp.Resources.Portable_Class
private SeekBar bar;
private ImageView imgView;
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 readonly int[] timers = new int[] { 0, 1, 10, 30, 60, 120 };
private readonly string[] items = new string[] { "Off", "1 minute", "10 minutes", "30 minutes", "1 hour", "2 hours" };
private int checkedItem = 0;
@@ -164,12 +159,15 @@ namespace MusicApp.Resources.Portable_Class
Picasso.With(Android.App.Application.Context).Load(Resource.Drawable.noAlbum).Placeholder(Resource.Drawable.MusicIcon).Resize(400, 400).CenterCrop().Into(nextArt);
}
while (MusicPlayer.player == null)
while (MusicPlayer.player == null || MusicPlayer.player.Duration == 0)
await Task.Delay(100);
bar = playerView.FindViewById<SeekBar>(Resource.Id.songTimer);
MusicPlayer.SetSeekBar(bar);
handler.PostDelayed(UpdateSeekBar, 1000);
await Task.Delay(1000);
MusicPlayer.SetSeekBar(bar);
}
public async void RefreshPlayer()
@@ -296,7 +294,7 @@ namespace MusicApp.Resources.Portable_Class
handler.PostDelayed(UpdateSeekBar, 1000);
}
private void Fab_Click(object sender, EventArgs e)
private async void Fab_Click(object sender, EventArgs e)
{
MainActivity.instance.SupportFragmentManager.PopBackStack();
if (MainActivity.instance.youtubeInstanceSave != null)
@@ -319,10 +317,11 @@ namespace MusicApp.Resources.Portable_Class
default:
break;
}
await Task.Delay(750);
MainActivity.instance.SetYtTabs(YoutubeEngine.searchKeyWorld, selectedTab);
YoutubeEngine.instances[selectedTab].focused = true;
YoutubeEngine.instances[selectedTab].OnFocus();
YoutubeEngine.instances[selectedTab].ListView.GetLayoutManager().OnRestoreInstanceState(MainActivity.instance.youtubeParcel);
YoutubeEngine.instances[selectedTab].ResumeListView();
}
else
{
@@ -369,6 +368,7 @@ namespace MusicApp.Resources.Portable_Class
void Sleep(int time)
{
Console.WriteLine("&Going to sleep in " + time + ", slected item is the " + checkedItem + " one.");
Intent intent = new Intent(Activity, typeof(Sleeper));
intent.PutExtra("time", time);
Activity.StartService(intent);
@@ -322,6 +322,7 @@ namespace MusicApp.Resources.Portable_Class
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
}
}
@@ -357,6 +358,7 @@ namespace MusicApp.Resources.Portable_Class
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
}
public static void RandomPlay(long playlistID, Context context)
@@ -84,7 +84,6 @@ namespace MusicApp.Resources.Portable_Class
async void PopulateList()
{
System.Console.WriteLine("&Populating playlist tracks with ydID = " + ytID);
if (playlistId == 0 && ytID == "")
return;
@@ -308,12 +307,13 @@ namespace MusicApp.Resources.Portable_Class
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
}
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
{
Song item = tracks[e.Position];
if (result != null)
if (result != null && result.Count > e.Position)
item = result[e.Position];
More(item, e.Position);
@@ -336,15 +336,38 @@ namespace MusicApp.Resources.Portable_Class
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, MainActivity.dialogTheme);
builder.SetTitle("Pick an action");
builder.SetItems(action.ToArray(), (senderAlert, args) =>
builder.SetItems(action.ToArray(), async (senderAlert, args) =>
{
switch (args.Which)
{
case 0:
int Position = tracks.IndexOf(item);
List<Song> queue = tracks.GetRange(Position + 1, tracks.Count - Position - 1);
if (result != null && result.Count - 1 >= Position)
{
item = result[Position];
queue = result.GetRange(Position + 1, result.Count - Position - 1);
}
queue.Reverse();
if (!item.IsYt)
{
Browse.act = Activity;
Browse.Play(item);
}
else
YoutubeEngine.Play(item.GetPath(), item.GetName(), item.GetArtist(), item.GetAlbum());
{
YoutubeEngine.Play(item.youtubeID, item.GetName(), item.GetArtist(), item.GetAlbum());
}
while (MusicPlayer.instance == null)
await Task.Delay(10);
foreach (Song song in queue)
{
MusicPlayer.instance.AddToQueue(song);
}
Player.instance.UpdateNext();
break;
case 1:
+1 -1
View File
@@ -23,7 +23,6 @@ namespace MusicApp.Resources.Portable_Class
public override void OnCreate()
{
base.OnCreate();
instance = this;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
@@ -74,6 +73,7 @@ namespace MusicApp.Resources.Portable_Class
musicIntent.SetAction("SleepPause");
MainActivity.instance.StartService(musicIntent);
notificationManager.Cancel(1001);
instance = null;
}
}
}
@@ -37,7 +37,7 @@ namespace MusicApp.Resources.Portable_Class
public View emptyView;
public static View loadingView;
private bool searching;
private string[] actions = new string[] { "Play", "Play Next", "Play Last", "Add To Playlist", "Download" };
private readonly string[] actions = new string[] { "Play", "Play Next", "Play Last", "Add To Playlist", "Download" };
public override void OnActivityCreated(Bundle savedInstanceState)
{
@@ -76,6 +76,16 @@ namespace MusicApp.Resources.Portable_Class
}
}
public async void ResumeListView()
{
while (ListView == null || ListView.GetLayoutManager() == null)
await Task.Delay(10);
ListView.GetLayoutManager().OnRestoreInstanceState(MainActivity.instance.youtubeParcel);
MainActivity.instance.youtubeInstanceSave = null;
MainActivity.instance.youtubeParcel = null;
}
public static Fragment[] NewInstances(string searchQuery)
{
searchKeyWorld = searchQuery;
@@ -151,11 +161,13 @@ namespace MusicApp.Resources.Portable_Class
}
searchResult.MaxResults = 20;
System.Console.WriteLine("&Search created");
var searchReponse = await searchResult.ExecuteAsync();
System.Console.WriteLine("&Search waited");
result = new List<YtFile>();
foreach(var video in searchReponse.Items)
foreach (var video in searchReponse.Items)
{
Song videoInfo = new Song(video.Snippet.Title, video.Snippet.ChannelTitle, video.Snippet.Thumbnails.Default__.Url, video.Id.VideoId ?? video.Id.PlaylistId, -1, -1, video.Id.VideoId ?? video.Id.PlaylistId, true);
YtKind kind = YtKind.Null;
@@ -245,7 +257,7 @@ namespace MusicApp.Resources.Portable_Class
MainActivity.instance.SupportActionBar.Title = item.GetName();
MainActivity.instance.HideTabs();
instances = null;
//MainActivity.instance.youtubeParcel = ListView.GetLayoutManager().OnSaveInstanceState();
MainActivity.instance.youtubeParcel = ListView.GetLayoutManager().OnSaveInstanceState();
MainActivity.instance.youtubeInstanceSave = "YoutubeEngine" + "-" + querryType;
MainActivity.instance.Transition(Resource.Id.contentView, PlaylistTracks.NewInstance(item.youtubeID, item.GetName()), true);
break;