Initial source for the MusicPlayer 99/258499/3
authoraman.jeph <aman.jeph@samsung.com>
Wed, 19 May 2021 06:26:17 +0000 (11:56 +0530)
committeraman.jeph <aman.jeph@samsung.com>
Mon, 24 May 2021 11:10:55 +0000 (16:40 +0530)
Change-Id: I947b6ce92bf38712c2879e7773074e12c6a45e2f
Signed-off-by: aman.jeph <aman.jeph@samsung.com>
13 files changed:
MediaContent/AlbumContents.cs [new file with mode: 0644]
MediaContent/ArtistContents.cs [new file with mode: 0644]
MediaContent/MediaContents.cs [new file with mode: 0755]
MediaContent/MediaDatabase.cs [new file with mode: 0755]
MediaContent/PlaylistContents.cs [new file with mode: 0644]
MediaContent/TrackContents.cs [new file with mode: 0644]
MusicPlayer.cs [new file with mode: 0755]
MusicPlayer.sln [new file with mode: 0644]
XamlPage.xaml.cs [new file with mode: 0644]
music-player.csproj [new file with mode: 0644]
res/layout/XamlPage.xaml [new file with mode: 0644]
shared/res/MusicPlayer.png [new file with mode: 0644]
tizen-manifest.xml [new file with mode: 0644]

diff --git a/MediaContent/AlbumContents.cs b/MediaContent/AlbumContents.cs
new file mode 100644 (file)
index 0000000..50ca286
--- /dev/null
@@ -0,0 +1,32 @@
+using System;\r
+using System.Collections.Specialized;\r
+using Tizen.Content.MediaContent;\r
+using System.Text;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    public static partial class Contents\r
+    {\r
+        public static OrderedDictionary GetAlbumList()\r
+        {\r
+            OrderedDictionary albumList = new OrderedDictionary();\r
+\r
+            SelectArguments arguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<Album> dataReader = albumInfo.Select(arguments);\r
+\r
+            while (dataReader.Read())\r
+            {\r
+                Album info = dataReader.Current;\r
+                albumList.Add(info.Id, info);\r
+            }\r
+            Tizen.Log.Debug("MUSIC_PLAYER", "Total album retrived from database: " + albumList.Count);\r
+            dataReader.Dispose();\r
+            return albumList;\r
+        }\r
+\r
+        public static int GetAlbumMemberCount(int albumId)\r
+        {\r
+            return albumInfo.CountMember(albumId);\r
+        }\r
+    }\r
+}\r
diff --git a/MediaContent/ArtistContents.cs b/MediaContent/ArtistContents.cs
new file mode 100644 (file)
index 0000000..4814bdb
--- /dev/null
@@ -0,0 +1,73 @@
+using System;\r
+using System.Collections.Specialized;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using Tizen.Content.MediaContent;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    public static partial class Contents\r
+    {\r
+        public static List<string> GetArtistList()\r
+        {\r
+            List<string> artistList = new List<string>();\r
+\r
+            SelectArguments arguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Artist + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<string> dataReader = mediaInfo.SelectGroupBy(MediaInfoColumnKey.Artist, arguments);\r
+\r
+            while (dataReader.Read())\r
+            {\r
+                string info = (string)dataReader.Current;\r
+                artistList.Add(info);\r
+            }\r
+            Tizen.Log.Debug("MUSIC_PLAYER", "Total artists retrived from database: " + artistList.Count);\r
+            dataReader.Dispose();\r
+            return artistList;\r
+        }\r
+\r
+        public static OrderedDictionary GetAlbumListForArtist(string artistName)\r
+        {\r
+            OrderedDictionary albumList = new OrderedDictionary();\r
+            string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + AlbumColumns.Artist + "=\"" + artistName + "\"";\r
+            SelectArguments arguments = CreateSelectArgument(expression, AlbumColumns.Name + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<Album> dataReader = albumInfo.Select(arguments);\r
+\r
+            while (dataReader.Read())\r
+            {\r
+                Album info = dataReader.Current;\r
+                albumList.Add(info.Id, info);\r
+            }\r
+            dataReader.Dispose();\r
+            return albumList;\r
+        }\r
+\r
+        public static int GetAlblumCountForArtist(string artistName)\r
+        {\r
+            string expression = MEDIA_STORAGE_TYPE_QUERY + "AND " + AlbumColumns.Artist + "=\"" + artistName+"\"";\r
+            CountArguments arguments = CreateCountArgument(expression);\r
+            int count = 0;\r
+            try\r
+            {\r
+                count = albumInfo.Count(arguments);\r
+            }\r
+            catch (ObjectDisposedException ex)\r
+            {\r
+                Tizen.Log.Error("MUSIC_PLAYER", "ObjectDisposedException: " + ex.Message);\r
+            }\r
+            catch (InvalidOperationException ex)\r
+            {\r
+                Tizen.Log.Error("MUSIC_PLAYER", "InvalidOperationException: " + ex.Message);\r
+            }\r
+            catch (MediaDatabaseException ex)\r
+            {\r
+                Tizen.Log.Error("MUSIC_PLAYER", "MediaDatabaseException: " + ex.Message);\r
+            }\r
+            catch (Exception ex)\r
+            {\r
+                Tizen.Log.Error("MUSIC_PLAYER", "Unknown Exception: " + ex.Message);\r
+            }\r
+\r
+            return count;\r
+        }\r
+    }\r
+}\r
diff --git a/MediaContent/MediaContents.cs b/MediaContent/MediaContents.cs
new file mode 100755 (executable)
index 0000000..6ae5a12
--- /dev/null
@@ -0,0 +1,106 @@
+using System;\r
+using Tizen.Content.MediaContent;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    public class MusicItemUpdateEventArgs : EventArgs\r
+    {\r
+        internal MusicItemUpdateEventArgs(int pid,\r
+            OperationType operationType, MediaType mediaType, string id, string path, string mimeType)\r
+        {\r
+            ProcessId = pid;\r
+            OperationType = operationType;\r
+            Id = id;\r
+            Path = path;\r
+            MediaType = mediaType;\r
+            MimeType = mimeType;\r
+        }\r
+        public int ProcessId { get; }\r
+\r
+        public OperationType OperationType { get; }\r
+\r
+        public string Id { get; }\r
+\r
+        public string Path { get; }\r
+\r
+        public MediaType MediaType { get; }\r
+\r
+        public string MimeType { get; }\r
+    }\r
+\r
+    public class MusicDBUpdateEventArgs : EventArgs\r
+    {\r
+        internal MusicDBUpdateEventArgs(OperationType operationType, string id, string path)\r
+        {\r
+            OperationType = operationType;\r
+            Id = id;\r
+            Path = path;\r
+        }\r
+\r
+        public OperationType OperationType { get; }\r
+\r
+        public string Id { get; }\r
+\r
+        public string Path { get; }\r
+    }\r
+\r
+    public static partial class Contents\r
+    {\r
+        private static Database database;\r
+        private static MediaInfoCommand mediaInfo;\r
+        private static AlbumCommand albumInfo;\r
+        private static PlaylistCommand playlistInfo;\r
+        private const string MEDIA_STORAGE_TYPE_QUERY = " (( MEDIA_STORAGE_TYPE IS NOT 101 ) AND (MEDIA_TYPE = 3)) ";\r
+        private const string MEDIA_SORT_ORDER_ASC = " COLLATE NOCASE ASC ";\r
+\r
+        public static event EventHandler<MusicItemUpdateEventArgs> MusicItemUpdate;\r
+        public static event EventHandler<MusicDBUpdateEventArgs> MusicDBUpdate;\r
+\r
+        static Contents()\r
+        {\r
+            database = new Database();\r
+            mediaInfo = new MediaInfoCommand(database.MediaDatabase);\r
+            albumInfo = new AlbumCommand(database.MediaDatabase);\r
+            playlistInfo = new PlaylistCommand(database.MediaDatabase);\r
+            MediaDatabase.MediaInfoUpdated += OnMediaDatabaseItemUpdate;\r
+            MediaDatabase.FolderUpdated += OnMediaDatabaseFolderUpdate;\r
+        }\r
+\r
+        private static void OnMediaDatabaseItemUpdate(object sender, MediaInfoUpdatedEventArgs e)\r
+        {\r
+            if(e.MediaType == MediaType.Music)\r
+            {\r
+                MusicItemUpdateEventArgs item = new MusicItemUpdateEventArgs(e.ProcessId, e.OperationType, e.MediaType,\r
+                    e.Id, e.Path, e.MimeType);\r
+                MusicItemUpdate?.Invoke(null, item);\r
+            }\r
+        }\r
+\r
+        private static void OnMediaDatabaseFolderUpdate(object sender, FolderUpdatedEventArgs e)\r
+        {\r
+            MusicDBUpdateEventArgs item = new MusicDBUpdateEventArgs(e.OperationType, e.Id, e.Path);\r
+            MusicDBUpdate?.Invoke(null, item);\r
+        }\r
+\r
+        private static SelectArguments CreateSelectArgument(string filterExpression, string sortOrder)\r
+        {\r
+            SelectArguments arguments = new SelectArguments();\r
+            arguments.FilterExpression = filterExpression;\r
+            arguments.SortOrder = sortOrder;\r
+            return arguments;\r
+        }\r
+\r
+        private static CountArguments CreateCountArgument(string filterExpression)\r
+        {\r
+            CountArguments arguments = new CountArguments();\r
+            arguments.FilterExpression = filterExpression;\r
+            return arguments;\r
+        }\r
+\r
+        public static void Dispose()\r
+        {\r
+            database.Dispose();\r
+        }\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/MediaContent/MediaDatabase.cs b/MediaContent/MediaDatabase.cs
new file mode 100755 (executable)
index 0000000..5e3ec37
--- /dev/null
@@ -0,0 +1,39 @@
+using System;\r
+using Tizen.Content.MediaContent;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    class Database : IDisposable\r
+    {\r
+        private MediaDatabase mediaDatabase;\r
+\r
+        public Database()\r
+        {\r
+            mediaDatabase = new MediaDatabase();\r
+            mediaDatabase.Connect();\r
+        }\r
+\r
+        private void TerminateDatabase()\r
+        {\r
+            mediaDatabase.Disconnect();\r
+            mediaDatabase.Dispose();\r
+        }\r
+\r
+        ~Database()\r
+        {\r
+            TerminateDatabase();\r
+        }\r
+\r
+        public void Dispose()\r
+        {\r
+            TerminateDatabase();\r
+            // This will informed gc to not call the finalize method as resources are already released.\r
+            GC.SuppressFinalize(this);\r
+        }\r
+\r
+        public MediaDatabase MediaDatabase\r
+        {\r
+            get { return mediaDatabase; }\r
+        }\r
+    }\r
+}\r
diff --git a/MediaContent/PlaylistContents.cs b/MediaContent/PlaylistContents.cs
new file mode 100644 (file)
index 0000000..677f574
--- /dev/null
@@ -0,0 +1,47 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using Tizen.Content.MediaContent;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    public static partial class Contents\r
+    {\r
+        public static List<Playlist> GetPlaylists()\r
+        {\r
+            List<Playlist> playlists = new List<Playlist>();\r
+            SelectArguments arguments = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, PlaylistColumns.Name + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<Playlist> dataReader = playlistInfo.Select(arguments);\r
+\r
+            while(dataReader.Read())\r
+            {\r
+                Playlist playlist = dataReader.Current;\r
+                playlists.Add(playlist);\r
+            }\r
+            Tizen.Log.Debug("MUSIC_PLAYER", "PlayLists Count : " + playlists.Count);\r
+            return playlists;\r
+        }\r
+\r
+        public static Playlist GetPlaylistByName(string name)\r
+        {\r
+            string filterExpression = MEDIA_STORAGE_TYPE_QUERY + " AND " + PlaylistColumns.Name + "=\"" + name + "\"";\r
+            SelectArguments arguments = CreateSelectArgument(filterExpression, PlaylistColumns.Name + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<Playlist> dataReader = playlistInfo.Select(arguments);\r
+\r
+            Playlist list = null;\r
+            while (dataReader.Read())\r
+            {\r
+                list = dataReader.Current;\r
+            }\r
+            return list;\r
+        }\r
+\r
+        public static Playlist GetPlaylistById(int playlistId)\r
+        {\r
+            Playlist list = null;\r
+            list = playlistInfo.Select(playlistId);\r
+            return list;\r
+        }\r
+\r
+    }\r
+}\r
diff --git a/MediaContent/TrackContents.cs b/MediaContent/TrackContents.cs
new file mode 100644 (file)
index 0000000..d9b57cf
--- /dev/null
@@ -0,0 +1,25 @@
+using System.Collections.Specialized;\r
+using Tizen.Content.MediaContent;\r
+\r
+namespace MusicPlayer.Media\r
+{\r
+    public static partial class Contents\r
+    {\r
+        public static OrderedDictionary GetTrackList()\r
+        {\r
+            OrderedDictionary mediaList = new OrderedDictionary();\r
+\r
+            SelectArguments argument = CreateSelectArgument(MEDIA_STORAGE_TYPE_QUERY, MediaInfoColumns.Title + MEDIA_SORT_ORDER_ASC);\r
+            MediaDataReader<MediaInfo> dataReader = mediaInfo.SelectMedia(argument);\r
+\r
+            while (dataReader.Read())\r
+            {\r
+                MediaInfo info = dataReader.Current;\r
+                mediaList.Add(info.Id, info);\r
+            }\r
+            Tizen.Log.Debug("MUSIC_PLAYER", "Total track retrived from database: " + mediaList.Count);\r
+            dataReader.Dispose();\r
+            return mediaList;\r
+        }\r
+    }\r
+}\r
diff --git a/MusicPlayer.cs b/MusicPlayer.cs
new file mode 100755 (executable)
index 0000000..0da2306
--- /dev/null
@@ -0,0 +1,39 @@
+using System;
+using Tizen.NUI;
+using MusicPlayer.Views;
+using MusicPlayer.Common;
+
+namespace MusicPlayer
+{
+    public class Application : NUIApplication
+    {
+        protected override void OnCreate()
+        {
+            Tizen.Log.Info("MUSIC_PLAYER", "OnCreate statrted");
+            base.OnCreate();
+            Window window = Window.Instance;
+            window.BackgroundColor = Color.White;
+            window.KeyEvent += OnKeyEvent;
+            Size2D size = window.Size;
+            Tizen.Log.Info("MUSIC_PLAYER", "Window Size: " + size.Width + "x" + size.Height);
+
+            ViewManager manager = new ViewManager(Window.Instance);
+        }
+
+        public void OnKeyEvent(object sender, Window.KeyEventArgs e)
+        {
+            if (e.Key.State == Key.StateType.Down && (e.Key.KeyPressedName == Constants.BackKeyCode || e.Key.KeyPressedName == Constants.EscapeKeyCode))
+            {
+                Exit();
+            }
+        }
+
+        static void Main(string[] args)
+        {
+            Tizen.Log.Info("MUSIC_PLAYER", "Main statrted");
+            var app = new Application();
+            app.Run(args);
+            Tizen.Log.Info("MUSIC_PLAYER", "Main finished");
+        }
+    }
+}
diff --git a/MusicPlayer.sln b/MusicPlayer.sln
new file mode 100644 (file)
index 0000000..531db1c
--- /dev/null
@@ -0,0 +1,25 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio Version 16\r
+VisualStudioVersion = 16.0.30804.86\r
+MinimumVisualStudioVersion = 10.0.40219.1\r
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "music-player", "music-player.csproj", "{18A58E69-495D-4F9C-BA77-C969BE9D8104}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Release|Any CPU = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {18A58E69-495D-4F9C-BA77-C969BE9D8104}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {18A58E69-495D-4F9C-BA77-C969BE9D8104}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {18A58E69-495D-4F9C-BA77-C969BE9D8104}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {18A58E69-495D-4F9C-BA77-C969BE9D8104}.Release|Any CPU.Build.0 = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+       GlobalSection(ExtensibilityGlobals) = postSolution\r
+               SolutionGuid = {7072B878-F218-47CE-84F8-FC9AC39798C6}\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/XamlPage.xaml.cs b/XamlPage.xaml.cs
new file mode 100644 (file)
index 0000000..8a08eb7
--- /dev/null
@@ -0,0 +1,14 @@
+using System;\r
+using Tizen.NUI;\r
+using Tizen.NUI.BaseComponents;\r
+\r
+namespace MusicPlayer\r
+{\r
+    public partial class XamlPage : View\r
+    {\r
+        public XamlPage()\r
+        {\r
+            InitializeComponent();\r
+        }\r
+    }\r
+}\r
diff --git a/music-player.csproj b/music-player.csproj
new file mode 100644 (file)
index 0000000..6209aa5
--- /dev/null
@@ -0,0 +1,34 @@
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+  <PropertyGroup>\r
+    <OutputType>Exe</OutputType>\r
+    <TargetFramework>netcoreapp3.1</TargetFramework>\r
+    <TargetFrameworkIdentifier>Tizen</TargetFrameworkIdentifier>\r
+      <AssemblyName>MusicPlayer</AssemblyName>\r
+  </PropertyGroup>\r
+\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugType>portable</DebugType>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>None</DebugType>\r
+  </PropertyGroup>\r
+\r
+  <ItemGroup>\r
+    <Folder Include="lib\" />\r
+    <Folder Include="res\images\" />\r
+  </ItemGroup>\r
+  \r
+    <ItemGroup>\r
+    <EmbeddedResource Include="res\layout\XamlPage.xaml">\r
+      <Generator>MSBuild:Compile</Generator>\r
+    </EmbeddedResource>\r
+  </ItemGroup>\r
+  \r
+    <ItemGroup>\r
+      <PackageReference Include="Tizen.NET" Version="9.0.0.16239" />\r
+      <PackageReference Include="Tizen.NET.Sdk" Version="1.0.1" />\r
+      <PackageReference Include="Tizen.NUI.XamlBuild" Version="1.0.11" />\r
+    </ItemGroup>\r
+\r
+</Project>\r
diff --git a/res/layout/XamlPage.xaml b/res/layout/XamlPage.xaml
new file mode 100644 (file)
index 0000000..7a54808
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" ?>\r
+<b:View x:Class="MusicPlayer.XamlPage"\r
+  xmlns="http://tizen.org/Tizen.NUI/2018/XAML"\r
+  xmlns:b="clr-namespace:Tizen.NUI.BaseComponents;assembly=Tizen.NUI"\r
+  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">\r
+\r
+    <b:TextLabel x:Name="text"  Text="Hello, NUI XAML APP!" PositionUsesPivotPoint="True" ParentOrigin="Center" PivotPoint="Center" Size="700,300,0" PointSize="17" TextColor="Yellow"/>\r
+\r
+</b:View>\r
diff --git a/shared/res/MusicPlayer.png b/shared/res/MusicPlayer.png
new file mode 100644 (file)
index 0000000..9f3cb98
Binary files /dev/null and b/shared/res/MusicPlayer.png differ
diff --git a/tizen-manifest.xml b/tizen-manifest.xml
new file mode 100644 (file)
index 0000000..03c8036
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<manifest package="org.tizen.MusicPlayer" version="1.0.0" api-version="5.5" xmlns="http://tizen.org/ns/packages">\r
+    <profile name="common" />\r
+    <ui-application appid="org.tizen.MusicPlayer" exec="MusicPlayer.dll" multiple="false" nodisplay="false" taskmanage="true" type="dotnet" launch_mode="single">\r
+        <label>MusicPlayer</label>\r
+        <icon>MusicPlayer.png</icon>\r
+        <metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />\r
+        <splash-screens />\r
+               <background-category value="system"/>\r
+    </ui-application>\r
+    <shortcut-list />\r
+    <dependencies />\r
+    <provides-appdefined-privileges />\r
+</manifest>\r