diff options
author | 조규호/Tizen Platform Lab(S/W센터)/Senior Engineer/삼성전자 <kyuho.jo@samsung.com> | 2017-08-23 10:59:03 +0900 |
---|---|---|
committer | GitHub Enterprise <noreply-CODE@samsung.com> | 2017-08-23 10:59:03 +0900 |
commit | 66982416e5a7ce005611be4c5cb114426ead9d28 (patch) | |
tree | 661727a8d49e3af50f29de037b774eece01e3500 | |
parent | 5a4e8bb7642bae280086fc311687a0ff4badf644 (diff) | |
parent | f732e6e5e06e5f4d27b8601455769a5effe019ca (diff) | |
download | videoplayer-66982416e5a7ce005611be4c5cb114426ead9d28.tar.gz videoplayer-66982416e5a7ce005611be4c5cb114426ead9d28.tar.bz2 videoplayer-66982416e5a7ce005611be4c5cb114426ead9d28.zip |
Merge pull request #66 from RS7-TizenReferenceSampleApplication/heonjae.jang
Fix issue
-rw-r--r-- | NewPlayer/NewPlayer/Models/DurationConverter.cs | 19 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/Models/MediaItemProvider.cs | 2 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/ViewModels/ItemViewModel.cs | 36 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/ViewModels/LibraryPageViewModel.cs | 24 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/ViewModels/PlayerPageViewModel.cs | 60 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/ViewModels/ViewModelBase.cs | 15 | ||||
-rwxr-xr-x | NewPlayer/NewPlayer/Views/ItemView.xaml | 6 | ||||
-rw-r--r-- | NewPlayer/NewPlayer/Views/LibraryPage.xaml.cs | 8 | ||||
-rwxr-xr-x | NewPlayer/NewPlayer/Views/PlayerButton.xaml | 2 | ||||
-rwxr-xr-x | NewPlayer/NewPlayer/Views/PlayerPage.xaml | 10 | ||||
-rwxr-xr-x | NewPlayer/NewPlayer/Views/PlayerPage.xaml.cs | 4 |
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(); } } } |