Resuming after an audio focus lose was disabled.

This commit is contained in:
Anonymous Raccoon
2018-06-06 15:20:07 +02:00
parent 391b8dcd34
commit 6af1af7db1
7 changed files with 1235 additions and 1009 deletions
+15 -4
View File
@@ -318,6 +318,14 @@ namespace MusicApp
{
pagerRefresh.SetEnabled(e.FirstVisibleItem == 0);
contentRefresh.SetEnabled(e.FirstVisibleItem == 0);
if(PlaylistTracks.instance != null)
{
if (e.FirstVisibleItem + e.VisibleItemCount == e.TotalItemCount)
PlaylistTracks.instance.lastVisible = true;
else
PlaylistTracks.instance.lastVisible = false;
}
}
public void Scroll(object sender, View.ScrollChangeEventArgs e)
@@ -1286,15 +1294,18 @@ namespace MusicApp
result.Add(videoInfo);
}
Song current = MusicPlayer.queue[MusicPlayer.CurrentID()];
current.queueSlot = 0;
MusicPlayer.queue.Clear();
MusicPlayer.queue.Add(current);
MusicPlayer.currentID = 0;
Random r = new Random();
result = result.OrderBy(x => r.Next()).ToList();
Player.instance?.UpdateNext();
foreach (Song song in result)
{
MusicPlayer.instance.AddToQueue(song);
await Task.Delay(5);
}
Player.instance?.UpdateNext();
parseProgress.Visibility = ViewStates.Gone;
}
+24 -24
View File
@@ -77,38 +77,38 @@
<Reference Include="DiscreteSeekBar, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Karamunting.Android.AnderWeb.DiscreteSeekBar.1.0.1\lib\monoandroid80\DiscreteSeekBar.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.2.7.3\lib\monoandroid81\ExoPlayer.dll</HintPath>
<Reference Include="ExoPlayer, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.2.8.3\lib\monoandroid81\ExoPlayer.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer.Core, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Core.2.7.3\lib\monoandroid81\ExoPlayer.Core.dll</HintPath>
<Reference Include="ExoPlayer.Core, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Core.2.8.3\lib\monoandroid81\ExoPlayer.Core.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer.Dash, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Dash.2.7.3\lib\monoandroid81\ExoPlayer.Dash.dll</HintPath>
<Reference Include="ExoPlayer.Dash, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Dash.2.8.3\lib\monoandroid81\ExoPlayer.Dash.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer.Hls, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Hls.2.7.3\lib\monoandroid81\ExoPlayer.Hls.dll</HintPath>
<Reference Include="ExoPlayer.Hls, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.Hls.2.8.3\lib\monoandroid81\ExoPlayer.Hls.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer.SmoothStreaming, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.SmoothStreaming.2.7.3\lib\monoandroid81\ExoPlayer.SmoothStreaming.dll</HintPath>
<Reference Include="ExoPlayer.SmoothStreaming, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.SmoothStreaming.2.8.3\lib\monoandroid81\ExoPlayer.SmoothStreaming.dll</HintPath>
</Reference>
<Reference Include="ExoPlayer.UI, Version=2.7.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.UI.2.7.3\lib\monoandroid81\ExoPlayer.UI.dll</HintPath>
<Reference Include="ExoPlayer.UI, Version=2.8.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Xam.Plugins.Android.ExoPlayer.UI.2.8.3\lib\monoandroid81\ExoPlayer.UI.dll</HintPath>
</Reference>
<Reference Include="Google.Apis, Version=1.33.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.1.33.1\lib\netstandard1.3\Google.Apis.dll</HintPath>
<Reference Include="Google.Apis, Version=1.34.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.1.34.0\lib\netstandard1.3\Google.Apis.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth, Version=1.33.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.33.1\lib\netstandard1.3\Google.Apis.Auth.dll</HintPath>
<Reference Include="Google.Apis.Auth, Version=1.34.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.34.0\lib\netstandard1.3\Google.Apis.Auth.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.33.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.33.1\lib\netstandard1.3\Google.Apis.Auth.PlatformServices.dll</HintPath>
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.34.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Auth.1.34.0\lib\netstandard1.3\Google.Apis.Auth.PlatformServices.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.Core, Version=1.33.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Core.1.33.1\lib\netstandard1.3\Google.Apis.Core.dll</HintPath>
<Reference Include="Google.Apis.Core, Version=1.34.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.Core.1.34.0\lib\netstandard1.3\Google.Apis.Core.dll</HintPath>
</Reference>
<Reference Include="Google.Apis.YouTube.v3, Version=1.33.1.1226, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.YouTube.v3.1.33.1.1226\lib\netstandard1.3\Google.Apis.YouTube.v3.dll</HintPath>
<Reference Include="Google.Apis.YouTube.v3, Version=1.34.0.1226, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Apis.YouTube.v3.1.34.0.1226\lib\netstandard1.3\Google.Apis.YouTube.v3.dll</HintPath>
</Reference>
<Reference Include="Java.Interop" />
<Reference Include="Microsoft.CSharp" />
@@ -144,8 +144,8 @@
<Reference Include="System.Json" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Runtime" />
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.4.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
@@ -18,6 +18,8 @@ namespace MusicApp.Resources.Portable_Class
private LayoutInflater inflater;
private int resource;
public override int Count => songList.Count;
public Adapter(Context context, int resource, List<Song> songList) : base(context, resource, songList)
{
this.context = context;
@@ -25,6 +27,12 @@ namespace MusicApp.Resources.Portable_Class
this.songList = songList;
}
public void AddData(Song[] items)
{
songList.AddRange(items);
NotifyDataSetChanged();
}
public void Remove(Song item)
{
songList.Remove(item);
@@ -802,7 +802,7 @@ namespace MusicApp.Resources.Portable_Class
CoordinatorLayout smallPlayer = MainActivity.instance.FindViewById<CoordinatorLayout>(Resource.Id.smallPlayer);
smallPlayer.FindViewById<ImageButton>(Resource.Id.spPlay).SetImageResource(Resource.Drawable.ic_play_arrow_black_24dp);
Player.instance?.playerView.FindViewById<ImageButton>(Resource.Id.playButton).SetImageResource(Resource.Drawable.ic_play_arrow_black_24dp);
Player.instance?.playerView?.FindViewById<ImageButton>(Resource.Id.playButton).SetImageResource(Resource.Drawable.ic_play_arrow_black_24dp);
Queue.instance?.RefreshCurrent();
}
}
@@ -831,6 +831,42 @@ namespace MusicApp.Resources.Portable_Class
}
Queue.instance?.RefreshCurrent();
AudioAttributes attributes = new AudioAttributes.Builder()
.SetUsage(AudioUsageKind.Media)
.SetContentType(AudioContentType.Music)
.Build();
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
AudioFocusRequestClass focusRequest = new AudioFocusRequestClass.Builder(AudioFocus.Gain)
.SetAudioAttributes(attributes)
.SetAcceptsDelayedFocusGain(true)
.SetOnAudioFocusChangeListener(this)
.Build();
AudioFocusRequest audioFocus = audioManager.RequestAudioFocus(focusRequest);
if (audioFocus != AudioFocusRequest.Granted)
{
Console.WriteLine("Can't Get Audio Focus");
return;
}
}
else
{
#pragma warning disable CS0618 // Type or member is obsolete
AudioManager am = (AudioManager)MainActivity.instance.GetSystemService(AudioService);
AudioFocusRequest audioFocus = am.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain);
if (audioFocus != AudioFocusRequest.Granted)
{
Console.WriteLine("Can't Get Audio Focus");
return;
}
#pragma warning restore CS0618
}
}
else
{
@@ -901,8 +937,7 @@ namespace MusicApp.Resources.Portable_Class
break;
case AudioFocus.LossTransientCanDuck:
if (isRunning)
player.Volume = prefManager.GetInt("volumeMultiplier", 100) / 100 * 0.2f;
Pause();
break;
default:
@@ -24,7 +24,9 @@ namespace MusicApp.Resources.Portable_Class
public long playlistId = 0;
public string ytID = "";
private bool hasWriteAcess;
private string nextPageToken = null;
public bool isEmpty = false;
public bool lastVisible = false;
private List<Song> tracks = new List<Song>();
private List<string> ytTracksIDs = new List<string>();
@@ -38,6 +40,7 @@ namespace MusicApp.Resources.Portable_Class
emptyView = LayoutInflater.Inflate(Resource.Layout.NoPlaylist, null);
ListView.EmptyView = emptyView;
ListView.Scroll += MainActivity.instance.Scroll;
ListView.ScrollStateChanged += ListView_ScrollStateChanged;
MainActivity.instance.contentRefresh.Refresh += OnRefresh;
MainActivity.instance.OnPaddingChanged += OnPaddingChanged;
MainActivity.instance.DisplaySearch(1);
@@ -45,6 +48,15 @@ namespace MusicApp.Resources.Portable_Class
PopulateList();
}
private void ListView_ScrollStateChanged(object sender, AbsListView.ScrollStateChangedEventArgs e)
{
if (lastVisible && e.ScrollState == ScrollState.Idle)
{
lastVisible = false;
LoadMore();
}
}
public void OnPaddingChanged(object sender, PaddingChange e)
{
if (MainActivity.paddingBot > e.oldPadding)
@@ -147,26 +159,20 @@ namespace MusicApp.Resources.Portable_Class
else if (ytID != null)
{
tracks = new List<Song>();
string nextPageToken = "";
while (nextPageToken != null)
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet, contentDetails");
ytPlaylistRequest.PlaylistId = ytID;
ytPlaylistRequest.MaxResults = 50;
var ytPlaylist = await ytPlaylistRequest.ExecuteAsync();
foreach (var item in ytPlaylist.Items)
{
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet, contentDetails");
ytPlaylistRequest.PlaylistId = ytID;
ytPlaylistRequest.MaxResults = 50;
ytPlaylistRequest.PageToken = nextPageToken;
var ytPlaylist = await ytPlaylistRequest.ExecuteAsync();
foreach (var item in ytPlaylist.Items)
{
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, item.ContentDetails.VideoId, -1, -1, item.ContentDetails.VideoId, true, false);
tracks.Add(song);
ytTracksIDs.Add(item.Id);
}
nextPageToken = ytPlaylist.NextPageToken;
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, item.ContentDetails.VideoId, -1, -1, item.ContentDetails.VideoId, true, false);
tracks.Add(song);
ytTracksIDs.Add(item.Id);
}
nextPageToken = ytPlaylist.NextPageToken;
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, tracks)
{
listPadding = MainActivity.paddingBot - MainActivity.defaultPaddingBot
@@ -191,6 +197,32 @@ namespace MusicApp.Resources.Portable_Class
MainActivity.instance.contentRefresh.Refreshing = false;
}
public async void LoadMore()
{
if (nextPageToken == null)
return;
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet, contentDetails");
ytPlaylistRequest.PlaylistId = ytID;
ytPlaylistRequest.MaxResults = 50;
ytPlaylistRequest.PageToken = nextPageToken;
var ytPlaylist = await ytPlaylistRequest.ExecuteAsync();
if (instance == null)
return;
foreach (var item in ytPlaylist.Items)
{
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, item.ContentDetails.VideoId, -1, -1, item.ContentDetails.VideoId, true, false);
tracks.Add(song);
ytTracksIDs.Add(item.Id);
}
nextPageToken = ytPlaylist.NextPageToken;
adapter.NotifyDataSetChanged();
}
public void Search(string search)
{
result = new List<Song>();
@@ -214,9 +246,9 @@ namespace MusicApp.Resources.Portable_Class
private async void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
List<Song> songs = tracks.GetRange(e.Position + 1, tracks.Count - e.Position - 1);
List<Song> songs = tracks.GetRange(e.Position, tracks.Count - e.Position);
if (result != null && result.Count - 1 >= e.Position)
songs = result.GetRange(e.Position + 1, result.Count - e.Position - 1);
songs = result.GetRange(e.Position, result.Count - e.Position);
if (MusicPlayer.isRunning)
MusicPlayer.queue.Clear();
+1084 -944
View File
File diff suppressed because it is too large Load Diff
+15 -15
View File
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AngleSharp" version="0.9.9.2" targetFramework="monoandroid81" />
<package id="Google.Apis" version="1.33.1" targetFramework="monoandroid81" />
<package id="Google.Apis.Auth" version="1.33.1" targetFramework="monoandroid81" />
<package id="Google.Apis.Core" version="1.33.1" targetFramework="monoandroid81" />
<package id="Google.Apis.YouTube.v3" version="1.33.1.1226" targetFramework="monoandroid81" />
<package id="Google.Apis" version="1.34.0" targetFramework="monoandroid81" />
<package id="Google.Apis.Auth" version="1.34.0" targetFramework="monoandroid81" />
<package id="Google.Apis.Core" version="1.34.0" targetFramework="monoandroid81" />
<package id="Google.Apis.YouTube.v3" version="1.34.0.1226" targetFramework="monoandroid81" />
<package id="Karamunting.Android.AnderWeb.DiscreteSeekBar" version="1.0.1" targetFramework="monoandroid81" />
<package id="Microsoft.CSharp" version="4.4.1" targetFramework="monoandroid81" />
<package id="Microsoft.NETCore.Platforms" version="2.0.2" targetFramework="monoandroid81" />
<package id="Microsoft.CSharp" version="4.5.0" targetFramework="monoandroid81" />
<package id="Microsoft.NETCore.Platforms" version="2.1.0" targetFramework="monoandroid81" />
<package id="NETStandard.Library" version="2.0.3" targetFramework="monoandroid81" />
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="monoandroid81" />
<package id="PCLCrypto" version="2.0.147" targetFramework="monoandroid81" />
@@ -28,7 +28,7 @@
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Json" version="4.4.0" targetFramework="monoandroid81" />
<package id="System.Json" version="4.5.0" targetFramework="monoandroid81" />
<package id="System.Linq" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Net.Http" version="4.3.3" targetFramework="monoandroid81" />
@@ -39,10 +39,10 @@
<package id="System.Reflection" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Reflection.TypeExtensions" version="4.4.0" targetFramework="monoandroid81" />
<package id="System.Reflection.TypeExtensions" version="4.5.0" targetFramework="monoandroid81" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Runtime" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.4.0" targetFramework="monoandroid81" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.0" targetFramework="monoandroid81" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="monoandroid81" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="monoandroid81" />
@@ -64,12 +64,12 @@
<package id="System.Xml.XmlDocument" version="4.3.0" targetFramework="monoandroid81" />
<package id="TagLib.Portable" version="1.0.4" targetFramework="monoandroid81" />
<package id="Validation" version="2.4.18" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Core" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Dash" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Hls" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.SmoothStreaming" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.UI" version="2.7.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Core" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Dash" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.Hls" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.SmoothStreaming" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xam.Plugins.Android.ExoPlayer.UI" version="2.8.3" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Arch.Core.Common" version="1.0.0" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Arch.Lifecycle.Common" version="1.0.3" targetFramework="monoandroid81" />
<package id="Xamarin.Android.Arch.Lifecycle.Runtime" version="1.0.3" targetFramework="monoandroid81" />