diff --git a/MPfm/MPfm.Android/Classes/Activities/MainActivity.cs b/MPfm/MPfm.Android/Classes/Activities/MainActivity.cs index 98ee2af9..374375e9 100644 --- a/MPfm/MPfm.Android/Classes/Activities/MainActivity.cs +++ b/MPfm/MPfm.Android/Classes/Activities/MainActivity.cs @@ -23,21 +23,14 @@ using Android.Content; using Android.Content.PM; using Android.Graphics; -using Android.Net.Wifi.P2p; -using Android.Support.V4.App; -using Android.Support.V4.View; using Android.Views; using Android.OS; using Android.Views.Animations; using Android.Widget; using Java.Lang; -using MPfm.Android.Classes.Adapters; using MPfm.Android.Classes.Cache; using MPfm.Android.Classes.Fragments; -using MPfm.Android.Classes.Listeners; using MPfm.Android.Classes.Navigation; -using MPfm.Android.Classes.Receivers; -using MPfm.Android.Classes.Services; using MPfm.MVP.Bootstrap; using MPfm.MVP.Messages; using MPfm.MVP.Navigation; @@ -48,7 +41,6 @@ using DialogFragment = Android.App.DialogFragment; using Fragment = Android.App.Fragment; using FragmentTransaction = Android.App.FragmentTransaction; -using TaskStackBuilder = Android.Support.V4.App.TaskStackBuilder; namespace MPfm.Android { @@ -70,21 +62,12 @@ public class MainActivity : BaseActivity, IMobileOptionsMenuView, View.IOnTouchL private ImageButton _btnPlayPause; private ImageButton _btnNext; private ImageButton _btnPlaylist; - private ImageButton _btnPlayer; + private ImageButton _btnLeft; + private ImageButton _btnRight; private bool _isPlaying; private ArrayAdapter _spinnerAdapter; private Fragment _fragment; - //private IntentFilter _intentFilter; - //private WifiP2pManager _wifiManager; - //private WifiP2pManager.Channel _wifiChannel; - //private WifiDirectReceiver _wifiDirectReceiver; - //private ActionListener _actionListener; - - //#if __ANDROID_16__ - //private AndroidDiscoveryService _discoveryService; - //#endif - public BitmapCache BitmapCache { get; private set; } protected override void OnCreate(Bundle bundle) @@ -109,26 +92,30 @@ protected override void OnCreate(Bundle bundle) _btnPrevious = FindViewById(Resource.Id.main_miniplayer_btnPrevious); _btnPlayPause = FindViewById(Resource.Id.main_miniplayer_btnPlayPause); _btnNext = FindViewById(Resource.Id.main_miniplayer_btnNext); - _btnPlaylist = FindViewById(Resource.Id.main_miniplayer_btnPlaylist); - _btnPlayer = FindViewById(Resource.Id.main_miniplaylist_btnPlayer); + _btnPlaylist = FindViewById(Resource.Id.main_miniplaylist_btnPlaylist); + _btnLeft = FindViewById(Resource.Id.main_miniplaylist_btnLeft); + _btnRight = FindViewById(Resource.Id.main_miniplayer_btnRight); _imageAlbum = FindViewById(Resource.Id.main_miniplayer_imageAlbum); - _miniPlayer.Visibility = ViewStates.Gone; _miniPlayer.Click += (sender, args) => { //Console.WriteLine("MainActivity - Mini player click - Showing player view..."); _messengerHub.PublishAsync(new MobileNavigationManagerCommandMessage(this, MobileNavigationManagerCommandMessageType.ShowPlayerView)); }; + _btnLeft.SetOnTouchListener(this); + _btnRight.SetOnTouchListener(this); _btnPrevious.SetOnTouchListener(this); _btnPlayPause.SetOnTouchListener(this); _btnNext.SetOnTouchListener(this); + _btnPlaylist.SetOnTouchListener(this); _btnPrevious.Click += BtnPreviousOnClick; _btnPlayPause.Click += BtnPlayPauseOnClick; _btnNext.Click += BtnNextOnClick; _btnPlaylist.Click += BtnPlaylistOnClick; - _btnPlayer.Click += BtnPlayerOnClick; + _btnLeft.Click += BtnLeftOnClick; + _btnRight.Click += BtnRightOnClick; // Set initial view flipper item - int index = _viewFlipper.IndexOfChild(_miniPlayer); - _viewFlipper.DisplayedChild = index; + int realIndex = _viewFlipper.IndexOfChild(_miniPlayer); + _viewFlipper.DisplayedChild = realIndex; // Create bitmap cache Point size = new Point(); @@ -168,20 +155,14 @@ protected override void OnCreate(Bundle bundle) _isPlaying = message.Status == PlayerStatusType.Playing; //Console.WriteLine("MainActivity - PlayerStatusMessage - Status=" + message.Status.ToString()); RunOnUiThread(() => { - if (message.Status == PlayerStatusType.Stopped || message.Status == PlayerStatusType.Initialized) - { - //Animation anim = AnimationUtils.LoadAnimation(this, Resource.Animation.slide_out_right); - //anim.AnimationEnd += (sender, args) => { - // _miniPlayer.Visibility = ViewStates.Gone; - //}; - //_miniPlayer.StartAnimation(anim); - } - if(hasStartedPlaying) { - //_miniPlayer.Visibility = ViewStates.Visible; - //Animation anim = AnimationUtils.LoadAnimation(this, Resource.Animation.slide_in_left); - //_miniPlayer.StartAnimation(anim); + //Console.WriteLine("MainActivity - PlayerStatusMessage - HasStartedPlaying"); + if (_viewFlipper.Visibility == ViewStates.Gone) + { + //Console.WriteLine("MainActivity - PlayerStatusMessage - Showing view flipper"); + _viewFlipper.Visibility = ViewStates.Visible; + } } switch (message.Status) @@ -196,13 +177,6 @@ protected override void OnCreate(Bundle bundle) }); }); -//#if __ANDROID_16__ -// if (((int)global::Android.OS.Build.VERSION.SdkInt) >= 16) { -// _discoveryService = new AndroidDiscoveryService(); -// _discoveryService.StartDiscovery(); -// } -//#endif - Console.WriteLine("MainActivity - OnCreate - Starting navigation manager..."); _navigationManager = (AndroidNavigationManager) Bootstrapper.GetContainer().Resolve(); _navigationManager.MainActivity = this; // TODO: Is this OK? Shouldn't the reference be cleared when MainActivity is destroyed? Can lead to memory leaks. @@ -210,23 +184,6 @@ protected override void OnCreate(Bundle bundle) _navigationManager.Start(); } - //private void SetupWifiDirect() - //{ - // _intentFilter = new IntentFilter(); - // _intentFilter.AddAction(WifiP2pManager.WifiP2pStateChangedAction); - // _intentFilter.AddAction(WifiP2pManager.WifiP2pPeersChangedAction); - // _intentFilter.AddAction(WifiP2pManager.WifiP2pConnectionChangedAction); - // _intentFilter.AddAction(WifiP2pManager.WifiP2pThisDeviceChangedAction); - - // _actionListener = new ActionListener(); - // _wifiManager = (WifiP2pManager) GetSystemService(Context.WifiP2pService); - // _wifiChannel = _wifiManager.Initialize(this, MainLooper, null); - // _wifiDirectReceiver = new WifiDirectReceiver(); - // RegisterReceiver(_wifiDirectReceiver, _intentFilter); - - // _wifiManager.DiscoverPeers(_wifiChannel, _actionListener); - //} - public bool OnNavigationItemSelected(int itemPosition, long itemId) { Console.WriteLine("MainActivity - OnNavigationItemSelected - itemPosition: {0} - itemId: {1}", itemPosition, itemId); @@ -235,9 +192,6 @@ public bool OnNavigationItemSelected(int itemPosition, long itemId) { Console.WriteLine("MainActivity - OnNavigationItemSelected - Updating fragment - itemPosition: {0} - itemId: {1}", itemPosition, itemId); _navigationManager.ChangeMobileLibraryBrowserType(MobileNavigationTabType.Artists, (MobileLibraryBrowserType)itemPosition); - - // var mobileLibraryBrowserFragment = (MobileLibraryBrowserFragment) _fragment; - // mobileLibraryBrowserFragment.OnChangeBrowserType((MobileLibraryBrowserType)itemPosition); } return true; } @@ -355,6 +309,7 @@ public override bool OnCreateOptionsMenu(IMenu menu) { Console.WriteLine("MainActivity - OnCreateOptionsMenu"); + // Crashed on all Samsung devices when using the options menu //MenuInflater.Inflate(Resource.Menu.main_menu, menu); //var menuItem = menu.Add(new Java.Lang.String("Test")); //var menuItem2 = menu.Add(new Java.Lang.String("Test2")); @@ -418,20 +373,20 @@ private void BtnNextOnClick(object sender, EventArgs eventArgs) private void BtnPlaylistOnClick(object sender, EventArgs eventArgs) { - _viewFlipper.SetInAnimation(this, Resource.Animation.flipper_slide_in); - _viewFlipper.SetOutAnimation(this, Resource.Animation.flipper_slide_out); - - int index = _viewFlipper.IndexOfChild(_miniPlaylist); - _viewFlipper.DisplayedChild = index; } - private void BtnPlayerOnClick(object sender, EventArgs eventArgs) + private void BtnLeftOnClick(object sender, EventArgs eventArgs) { _viewFlipper.SetInAnimation(this, Resource.Animation.flipper_back_slide_in); _viewFlipper.SetOutAnimation(this, Resource.Animation.flipper_back_slide_out); + ShowMiniPlayerSlide(0); + } - int index = _viewFlipper.IndexOfChild(_miniPlayer); - _viewFlipper.DisplayedChild = index; + private void BtnRightOnClick(object sender, EventArgs eventArgs) + { + _viewFlipper.SetInAnimation(this, Resource.Animation.flipper_slide_in); + _viewFlipper.SetOutAnimation(this, Resource.Animation.flipper_slide_out); + ShowMiniPlayerSlide(1); } public bool OnTouch(View v, MotionEvent e) @@ -453,6 +408,15 @@ public bool OnTouch(View v, MotionEvent e) case Resource.Id.main_miniplayer_btnNext: _btnNext.SetImageResource(Resource.Drawable.player_next_on); break; + case Resource.Id.main_miniplaylist_btnPlaylist: + _btnPlaylist.SetImageResource(Resource.Drawable.player_playlist_on); + break; + case Resource.Id.main_miniplaylist_btnLeft: + _btnLeft.SetImageResource(Resource.Drawable.miniplayer_chevronleft_on); + break; + case Resource.Id.main_miniplayer_btnRight: + _btnRight.SetImageResource(Resource.Drawable.miniplayer_chevronright_on); + break; } break; case MotionEventActions.Up: @@ -470,6 +434,15 @@ public bool OnTouch(View v, MotionEvent e) case Resource.Id.main_miniplayer_btnNext: _btnNext.SetImageResource(Resource.Drawable.player_next); break; + case Resource.Id.main_miniplaylist_btnPlaylist: + _btnPlaylist.SetImageResource(Resource.Drawable.player_playlist); + break; + case Resource.Id.main_miniplaylist_btnLeft: + _btnLeft.SetImageResource(Resource.Drawable.miniplayer_chevronleft); + break; + case Resource.Id.main_miniplayer_btnRight: + _btnRight.SetImageResource(Resource.Drawable.miniplayer_chevronright); + break; } break; } @@ -490,6 +463,18 @@ public void HideSplash() _splashFragment.Dialog.Dismiss(); } + public void ShowMiniPlayerSlide(int index) + { + // Refresh new index (if the same index, prevent animation) + int realIndex = _viewFlipper.IndexOfChild(index == 0 ? _miniPlayer : _miniPlaylist); + if(_viewFlipper.DisplayedChild != realIndex) + _viewFlipper.DisplayedChild = realIndex; + + // Make sure view flipper is visible + if (_viewFlipper.Visibility == ViewStates.Gone) + _viewFlipper.Visibility = ViewStates.Visible; + } + #region IMobileOptionsMenuView implementation public Action OnItemClick { get; set; } diff --git a/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserGridAdapter.cs b/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserGridAdapter.cs index face8e02..e9d66834 100644 --- a/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserGridAdapter.cs +++ b/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserGridAdapter.cs @@ -307,6 +307,7 @@ public void OnClick(View v) { case Resource.Id.albumCell_btnAddToPlaylist: Console.WriteLine("MLBGA - ADD - position: {0}", position); + _fragment.OnAddItemToPlaylist(position); break; case Resource.Id.albumCell_btnPlay: Console.WriteLine("MLBGA - PLAY - position: {0}", position); @@ -325,6 +326,8 @@ public void OnClick(View v) ad.Show(); break; } + + ResetEditingRow(); } public void OnMovedToScrapHeap(View view) diff --git a/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserListAdapter.cs b/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserListAdapter.cs index 2f22bc00..ef3e61b1 100644 --- a/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserListAdapter.cs +++ b/MPfm/MPfm.Android/Classes/Adapters/MobileLibraryBrowserListAdapter.cs @@ -163,6 +163,33 @@ public void SetNowPlayingRow(int position, AudioFile audioFile) } } + public void ResetEditingRow() + { + int visibleCellIndex = _editingRowPosition - _listView.FirstVisiblePosition; + var view = _listView.GetChildAt(visibleCellIndex); + if (view == null) + return; + + var imageAdd = view.FindViewById(Resource.Id.mobileLibraryBrowserCell_imageAdd); + var imagePlay = view.FindViewById(Resource.Id.mobileLibraryBrowserCell_imagePlay); + var imageDelete = view.FindViewById(Resource.Id.mobileLibraryBrowserCell_imageDelete); + + // Fade out the controls + Animation anim = AnimationUtils.LoadAnimation(_context, Resource.Animation.listviewoptions_fade_out); + anim.AnimationEnd += (sender, args) => + { + imageAdd.Visibility = ViewStates.Gone; + imagePlay.Visibility = ViewStates.Gone; + imageDelete.Visibility = ViewStates.Gone; + }; + imageAdd.StartAnimation(anim); + imagePlay.StartAnimation(anim); + imageDelete.StartAnimation(anim); + + _editingRowPosition = -1; + IsEditingRow = false; + } + public void SetEditingRow(int position) { int visibleCellIndex = position - _listView.FirstVisiblePosition; @@ -179,20 +206,7 @@ public void SetEditingRow(int position) if(IsEditingRow && oldPosition == position) { - // Fade out the controls - Animation anim = AnimationUtils.LoadAnimation(_context, Resource.Animation.listviewoptions_fade_out); - anim.AnimationEnd += (sender, args) => - { - imageAdd.Visibility = ViewStates.Gone; - imagePlay.Visibility = ViewStates.Gone; - imageDelete.Visibility = ViewStates.Gone; - }; - imageAdd.StartAnimation(anim); - imagePlay.StartAnimation(anim); - imageDelete.StartAnimation(anim); - - _editingRowPosition = -1; - IsEditingRow = false; + ResetEditingRow(); } else if (IsEditingRow && oldPosition >= 0) { @@ -250,7 +264,8 @@ public void OnClick(View v) switch(v.Id) { case Resource.Id.mobileLibraryBrowserCell_imageAdd: - Console.WriteLine("MLBLA - ADD - position: {0}", position); + Console.WriteLine("MLBLA - ADD - position: {0}", position); + _fragment.OnAddItemToPlaylist(position); break; case Resource.Id.mobileLibraryBrowserCell_imagePlay: Console.WriteLine("MLBLA - PLAY - position: {0}", position); @@ -269,6 +284,8 @@ public void OnClick(View v) ad.Show(); break; } + + ResetEditingRow(); } } } diff --git a/MPfm/MPfm.Android/Classes/Application.cs b/MPfm/MPfm.Android/Classes/Application.cs index 8a9d4c0e..ebb697a5 100644 --- a/MPfm/MPfm.Android/Classes/Application.cs +++ b/MPfm/MPfm.Android/Classes/Application.cs @@ -42,6 +42,12 @@ public class MPfmApplication : Application ConnectionChangeReceiver _connectionChangeReceiver; private LockReceiver _lockReceiver; + //private IntentFilter _intentFilter; + //private WifiP2pManager _wifiManager; + //private WifiP2pManager.Channel _wifiChannel; + //private WifiDirectReceiver _wifiDirectReceiver; + //private ActionListener _actionListener; + #if __ANDROID_16__ private AndroidDiscoveryService _discoveryService; #endif @@ -143,6 +149,22 @@ public override void OnTerminate() //#endif } + //private void SetupWifiDirect() + //{ + // _intentFilter = new IntentFilter(); + // _intentFilter.AddAction(WifiP2pManager.WifiP2pStateChangedAction); + // _intentFilter.AddAction(WifiP2pManager.WifiP2pPeersChangedAction); + // _intentFilter.AddAction(WifiP2pManager.WifiP2pConnectionChangedAction); + // _intentFilter.AddAction(WifiP2pManager.WifiP2pThisDeviceChangedAction); + + // _actionListener = new ActionListener(); + // _wifiManager = (WifiP2pManager) GetSystemService(Context.WifiP2pService); + // _wifiChannel = _wifiManager.Initialize(this, MainLooper, null); + // _wifiDirectReceiver = new WifiDirectReceiver(); + // RegisterReceiver(_wifiDirectReceiver, _intentFilter); + + // _wifiManager.DiscoverPeers(_wifiChannel, _actionListener); + //} public static Context GetApplicationContext() { return _context; diff --git a/MPfm/MPfm.Android/Classes/Fragments/MobileLibraryBrowserFragment.cs b/MPfm/MPfm.Android/Classes/Fragments/MobileLibraryBrowserFragment.cs index f254698b..26349aac 100644 --- a/MPfm/MPfm.Android/Classes/Fragments/MobileLibraryBrowserFragment.cs +++ b/MPfm/MPfm.Android/Classes/Fragments/MobileLibraryBrowserFragment.cs @@ -207,6 +207,7 @@ public override void OnDestroyView() public Action OnItemClick { get; set; } public Action OnDeleteItem { get; set; } public Action OnPlayItem { get; set; } + public Action OnAddItemToPlaylist { get; set; } public Action OnRequestAlbumArt { get; set; } public Func OnRequestAlbumArtSynchronously { get; set; } @@ -348,6 +349,17 @@ public void RefreshAlbumArtCell(string artistName, string albumTitle, byte[] alb }); } + public void NotifyNewPlaylistItems(string text) + { + Activity.RunOnUiThread(() => + { + var mainActivity = (MainActivity) Activity; + mainActivity.ShowMiniPlayerSlide(1); + Toast toast = Toast.MakeText(Activity, text, ToastLength.Short); + toast.Show(); + }); + } + #endregion } diff --git a/MPfm/MPfm.Android/MPfm.Android.csproj b/MPfm/MPfm.Android/MPfm.Android.csproj index 3da7d3b2..6e448244 100644 --- a/MPfm/MPfm.Android/MPfm.Android.csproj +++ b/MPfm/MPfm.Android/MPfm.Android.csproj @@ -253,6 +253,9 @@ Designer + + Designer + @@ -523,6 +526,15 @@ + + + + + + + + + diff --git a/MPfm/MPfm.Android/Resources/Drawable/miniplayerchevron_selector.xml b/MPfm/MPfm.Android/Resources/Drawable/miniplayerchevron_selector.xml new file mode 100644 index 00000000..6ae19350 --- /dev/null +++ b/MPfm/MPfm.Android/Resources/Drawable/miniplayerchevron_selector.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MPfm/MPfm.Android/Resources/Layout/Loops.axml b/MPfm/MPfm.Android/Resources/Layout/Loops.axml index 90ff9e9a..a761c953 100644 --- a/MPfm/MPfm.Android/Resources/Layout/Loops.axml +++ b/MPfm/MPfm.Android/Resources/Layout/Loops.axml @@ -15,11 +15,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:padding="6dip" /> + android:padding="12dp" />