--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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");
+ }
+ }
+}
--- /dev/null
+\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
--- /dev/null
+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
--- /dev/null
+<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
--- /dev/null
+<?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
--- /dev/null
+<?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