summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSung-jae Park <nicesj@nicesj.com>2017-08-24 07:14:43 +0900
committerSung-jae Park <nicesj@nicesj.com>2017-08-24 07:14:43 +0900
commit433bc71c5e8949cf569700ab490ecb512bca7819 (patch)
tree8f257d867db3fc337954d1f4fa04b9d3b5b53520
parent2447c04f2903b843dd27e24b276f2269afb5738e (diff)
parent66982416e5a7ce005611be4c5cb114426ead9d28 (diff)
downloadvideoplayer-433bc71c5e8949cf569700ab490ecb512bca7819.tar.gz
videoplayer-433bc71c5e8949cf569700ab490ecb512bca7819.tar.bz2
videoplayer-433bc71c5e8949cf569700ab490ecb512bca7819.zip
Merge branch 'master' into nicesj.park
-rw-r--r--NewPlayer/NewPlayer/Models/DurationConverter.cs19
-rw-r--r--NewPlayer/NewPlayer/Models/MediaItemProvider.cs2
-rw-r--r--NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs36
-rw-r--r--NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs24
-rw-r--r--NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs60
-rw-r--r--NewPlayer/NewPlayer/ViewModels/ViewModelBase.cs15
-rwxr-xr-xNewPlayer/NewPlayer/Views/ItemView.xaml6
-rw-r--r--NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs8
-rwxr-xr-xNewPlayer/NewPlayer/Views/PlayerButton.xaml2
-rwxr-xr-xNewPlayer/NewPlayer/Views/PlayerPage.xaml10
-rwxr-xr-xNewPlayer/NewPlayer/Views/PlayerPage.xaml.cs4
11 files changed, 117 insertions, 69 deletions
diff --git a/NewPlayer/NewPlayer/Models/DurationConverter.cs b/NewPlayer/NewPlayer/Models/DurationConverter.cs
new file mode 100644
index 0000000..25b0644
--- /dev/null
+++ b/NewPlayer/NewPlayer/Models/DurationConverter.cs
@@ -0,0 +1,19 @@
+using Xamarin.Forms;
+using System.Globalization;
+using System;
+
+namespace NewPlayer.Models
+{
+ public class DurationConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ return TimeSpan.FromMilliseconds((int)value).ToString("mm':'ss");
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/NewPlayer/NewPlayer/Models/MediaItemProvider.cs b/NewPlayer/NewPlayer/Models/MediaItemProvider.cs
index 2c2e98a..b5a7d3c 100644
--- a/NewPlayer/NewPlayer/Models/MediaItemProvider.cs
+++ b/NewPlayer/NewPlayer/Models/MediaItemProvider.cs
@@ -11,12 +11,12 @@ namespace NewPlayer.Models
private static IMediaContentAPIs mediaContentAPIs;
private static readonly Lazy<MediaItemProvider> lazy = new Lazy<MediaItemProvider>(() => new MediaItemProvider());
+ public static MediaItemProvider Instance { get { return lazy.Value; } }
private IEnumerable<MediaItem> itemList;
private MediaItem selectedItem;
private int selectedItemIndex;
- public static MediaItemProvider Instance { get { return lazy.Value; } }
private MediaItemProvider()
{
diff --git a/NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs b/NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs
index 46ad3e1..899cab2 100644
--- a/NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs
+++ b/NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs
@@ -5,34 +5,44 @@ using Xamarin.Forms;
namespace NewPlayer.ViewModels
{
- class ItemViewModel : INotifyPropertyChanged
+ class ItemViewModel : ViewModelBase
{
private MediaItem mediaItem;
+ public MediaItem MediaItem
+ {
+ get => mediaItem;
+ set
+ {
+ mediaItem = value;
+ OnPropertyChanged();
+ }
+ }
+
// When creating a bindable property, the property must have getter as public.
// To make a public getter, it has to be defined explicitly.
- public Command ItemSelected { get; private set; }
-
- public event PropertyChangedEventHandler PropertyChanged;
+ private Command itemSelectCommand;
- protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ public Command ItemSelectCommand
{
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ get => itemSelectCommand;
+ set
+ {
+ itemSelectCommand = value;
+ OnPropertyChanged();
+ }
}
+
public ItemViewModel(MediaItem item)
{
- mediaItem = item;
+ MediaItem = item;
- ItemSelected = new Command(() =>
+ ItemSelectCommand = new Command(() =>
{
// Which one comes first among the OnButtonClicked event and the Command?
- MediaItemProvider.Instance.SelectedItem = mediaItem;
+ MediaItemProvider.Instance.SelectedItem = MediaItem;
});
}
-
- public string Title { get => mediaItem.Title; }
-
- public string Thumbnail { get => mediaItem.Thumbnail; }
}
}
diff --git a/NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs b/NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs
index 968704e..f361e14 100644
--- a/NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs
+++ b/NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs
@@ -6,19 +6,10 @@ using Xamarin.Forms;
namespace NewPlayer.ViewModels
{
- public class LibraryPageViewModel : INotifyPropertyChanged
+ public class LibraryPageViewModel : ViewModelBase
{
private IEnumerable<MediaItem> items;
- public Command UpdateCommand { get; set; }
-
- public event PropertyChangedEventHandler PropertyChanged;
-
- protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
public IEnumerable<MediaItem> Items
{
get => items;
@@ -29,6 +20,19 @@ namespace NewPlayer.ViewModels
}
}
+ private Command updateCommand;
+
+ public Command UpdateCommand
+ {
+ get { return updateCommand; }
+ set
+ {
+ updateCommand = value;
+ OnPropertyChanged();
+ }
+ }
+
+
private async void UpdateItemList()
{
await MediaItemProvider.Instance.Update();
diff --git a/NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs b/NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs
index f1cb3c3..38a0055 100644
--- a/NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs
+++ b/NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs
@@ -6,39 +6,46 @@ using Xamarin.Forms;
namespace NewPlayer.ViewModels
{
- public class PlayerPageViewModel : INotifyPropertyChanged
+ public class PlayerPageViewModel : ViewModelBase
{
- public event PropertyChangedEventHandler PropertyChanged;
-
- public Command PlayerButton
+ private MediaItem playingItem;
+ public MediaItem PlayingItem
{
- get;
- private set;
+ get => playingItem;
+ set
+ {
+ playingItem = value;
+ OnPropertyChanged();
+ }
}
- public Command UpdateCommand
+ private Command playerButtonCommand;
+
+ public Command PlayerButtonCommand
{
- get;
- private set;
+ get => playerButtonCommand;
+ set
+ {
+ playerButtonCommand = value;
+ OnPropertyChanged();
+ }
}
- private MediaItem playingItem;
- public MediaItem PlayingItem
+ private Command updateCommand;
+
+ public Command UpdateCommand
{
- get => playingItem;
+ get => updateCommand;
set
{
- playingItem = value;
-
+ updateCommand = value;
OnPropertyChanged();
- OnPropertyChanged("Title");
- OnPropertyChanged("Duration");
}
}
public PlayerPageViewModel()
{
- PlayerButton = new Command<string>((buttonName) =>
+ PlayerButtonCommand = new Command<string>((buttonName) =>
{
if (buttonName == "Previous")
{
@@ -55,24 +62,5 @@ namespace NewPlayer.ViewModels
PlayingItem = MediaItemProvider.Instance.SelectedItem;
});
}
-
- protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
- public string Title { get => playingItem?.Title; }
-
- public string Duration {
- get
- {
- if (PlayingItem == null)
- {
- return String.Empty;
- }
-
- return TimeSpan.FromMilliseconds(PlayingItem.Duration).ToString("mm':'ss");
- }
- }
}
}
diff --git a/NewPlayer/NewPlayer/ViewModels/ViewModelBase.cs b/NewPlayer/NewPlayer/ViewModels/ViewModelBase.cs
new file mode 100644
index 0000000..aad5fcd
--- /dev/null
+++ b/NewPlayer/NewPlayer/ViewModels/ViewModelBase.cs
@@ -0,0 +1,15 @@
+using System.ComponentModel;
+using System.Runtime.CompilerServices;
+
+namespace NewPlayer.ViewModels
+{
+ public class ViewModelBase : INotifyPropertyChanged
+ {
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+}
diff --git a/NewPlayer/NewPlayer/Views/ItemView.xaml b/NewPlayer/NewPlayer/Views/ItemView.xaml
index 506986d..771249f 100755
--- a/NewPlayer/NewPlayer/Views/ItemView.xaml
+++ b/NewPlayer/NewPlayer/Views/ItemView.xaml
@@ -13,19 +13,19 @@
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Width, Factor=0.96}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Height, Factor=0.025}"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Width, Factor=0.02}"
- Source="{Binding Thumbnail}"
+ Source="{Binding MediaItem.Thumbnail}"
Aspect="AspectFill"/>
<Label x:Name="Title"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.7}"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.07}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Width, Factor=0.86}"
TextColor="Black"
- Text="{Binding Title}"
+ Text="{Binding MediaItem.Title}"
LineBreakMode="TailTruncation"/>
<Button x:Name="FocusButton"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Height, Factor=0.95}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundView, Property=Width, Factor=0.96}"
Opacity="0"
Clicked="OnItemClicked"
- Command="{Binding ItemSelected}"/>
+ Command="{Binding ItemSelectCommand}"/>
</RelativeLayout>
diff --git a/NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs b/NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs
index 2767e17..6ce7178 100644
--- a/NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs
+++ b/NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs
@@ -8,6 +8,7 @@ namespace NewPlayer.Views
{
public partial class LibraryPage : ContentPage
{
+ private bool isLoaded;
// Creating a bindable property named "Items" of type IEnumrable<MediaItem> which is owned by LibraryView and has default value null.
public static readonly BindableProperty ItemsProperty = BindableProperty.Create("Items", typeof(IEnumerable<MediaItem>), typeof(LibraryPage), null);
@@ -54,12 +55,17 @@ namespace NewPlayer.Views
protected override void OnAppearing()
{
base.OnAppearing();
- UpdateCommand.Execute(null);
+ if (!isLoaded)
+ {
+ UpdateCommand.Execute(null);
+ isLoaded = true;
+ }
}
public LibraryPage()
{
InitializeComponent();
+ isLoaded = false;
PropertyChanged += OnPropertyChanged;
}
}
diff --git a/NewPlayer/NewPlayer/Views/PlayerButton.xaml b/NewPlayer/NewPlayer/Views/PlayerButton.xaml
index 829ed62..00f59a8 100755
--- a/NewPlayer/NewPlayer/Views/PlayerButton.xaml
+++ b/NewPlayer/NewPlayer/Views/PlayerButton.xaml
@@ -27,5 +27,5 @@
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToView, ElementName=FocusBackground, Factor=1}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=FocusBackground, Factor=1}"
Opacity="0"
- Command="{Binding PlayerButton}"/>
+ Command="{Binding PlayerButtonCommand}"/>
</RelativeLayout>
diff --git a/NewPlayer/NewPlayer/Views/PlayerPage.xaml b/NewPlayer/NewPlayer/Views/PlayerPage.xaml
index 167cb1f..18a794f 100755
--- a/NewPlayer/NewPlayer/Views/PlayerPage.xaml
+++ b/NewPlayer/NewPlayer/Views/PlayerPage.xaml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+ xmlns:Models="clr-namespace:NewPlayer.Models"
xmlns:ViewModels="clr-namespace:NewPlayer.ViewModels"
xmlns:Views="clr-namespace:NewPlayer.Views"
x:Class="NewPlayer.Views.PlayerPage"
@@ -9,6 +10,11 @@
<ContentPage.BindingContext>
<ViewModels:PlayerPageViewModel/>
</ContentPage.BindingContext>
+ <ContentPage.Resources>
+ <ResourceDictionary>
+ <Models:DurationConverter x:Key="DurationConverter"/>
+ </ResourceDictionary>
+ </ContentPage.Resources>
<ContentPage.Content>
<RelativeLayout>
<Views:MediaRenderingView x:Name="RenderingView"
@@ -20,7 +26,7 @@
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.06}"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.05}"
FontSize="Medium"
- Text="{Binding Title}"/>
+ Text="{Binding PlayingItem.Title}"/>
<StackLayout RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.045}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.127}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.911}"
@@ -30,7 +36,7 @@
Text="00:00"/>
<Label Text=" / " />
<Label x:Name="Duration"
- Text="{Binding Duration}"/>
+ Text="{Binding PlayingItem.Duration, Converter={StaticResource DurationConverter}}"/>
</StackLayout>
<Grid x:Name="ControlPad"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.134}"
diff --git a/NewPlayer/NewPlayer/Views/PlayerPage.xaml.cs b/NewPlayer/NewPlayer/Views/PlayerPage.xaml.cs
index 6cbceae..cd941ae 100755
--- a/NewPlayer/NewPlayer/Views/PlayerPage.xaml.cs
+++ b/NewPlayer/NewPlayer/Views/PlayerPage.xaml.cs
@@ -80,10 +80,10 @@ namespace NewPlayer.Views
UpdateCommand.Execute(null);
}
- protected override void OnDisappearing()
+ protected override bool OnBackButtonPressed()
{
RenderingView.Stop();
- base.OnDisappearing();
+ return base.OnBackButtonPressed();
}
}
}