From 9b1ee03dd09020c74c8ae523c22c1036dcd13a6f Mon Sep 17 00:00:00 2001 From: JongTae Date: Fri, 8 Nov 2013 14:05:12 +0900 Subject: [PATCH] Applied latest source code Change-Id: Idf360d2ea5ee59968d93a5454f9b894c84ae59cc --- CMakeLists.txt | 32 + LICENSE.Flora | 206 ++ NOTICE | 3 + inc/MpAlbumContentListForm.h | 101 + inc/MpAlbumContentPickerPanel.h | 77 + inc/MpAlbumListEditorPanel.h | 76 + inc/MpAlbumListPanel.h | 92 + inc/MpAlbumListPresentationModel.h | 62 + inc/MpAlbumPickerPanel.h | 49 + inc/MpAllContentPickerPanel.h | 47 + inc/MpAllListEditorPanel.h | 84 + inc/MpAllListPanel.h | 106 + inc/MpAllListPresentationModel.h | 61 + inc/MpArtistAlbumListEditorForm.h | 85 + inc/MpArtistAlbumListForm.h | 100 + inc/MpArtistAllSongListForm.h | 94 + inc/MpArtistContentListForm.h | 131 + inc/MpArtistContentPickerPanel.h | 77 + inc/MpArtistListEditorPanel.h | 82 + inc/MpArtistListPanel.h | 90 + inc/MpArtistListPresentationModel.h | 73 + inc/MpArtistPickerPanel.h | 47 + inc/MpBaseForm.h | 36 + inc/MpBasePanel.h | 36 + inc/MpCommonUtil.h | 152 + inc/MpComposerContentListForm.h | 78 + inc/MpComposerContentPickerPanel.h | 78 + inc/MpComposerListEditorPanel.h | 91 + inc/MpComposerListPanel.h | 99 + inc/MpComposerListPresentationModel.h | 59 + inc/MpComposerPickerPanel.h | 47 + inc/MpContentDetailForm.h | 62 + inc/MpContentEditPanel.h | 86 + inc/MpContentForm.h | 59 + inc/MpContentInformationStruct.h | 42 + inc/MpContentLibaryPanel.h | 100 + inc/MpContentListForm.h | 164 + inc/MpContentPanel.h | 92 + inc/MpFolderContentListForm.h | 106 + inc/MpFolderContentPickerPanel.h | 77 + inc/MpFolderListEditorPanel.h | 87 + inc/MpFolderListPanel.h | 82 + inc/MpFolderListPresentationModel.h | 64 + inc/MpFolderPickerPanel.h | 42 + inc/MpFormFactory.h | 79 + inc/MpGenreContentListForm.h | 82 + inc/MpGenreContentPickerPanel.h | 77 + inc/MpGenreListEditorPanel.h | 95 + inc/MpGenreListPanel.h | 104 + inc/MpGenreListPresentationModel.h | 60 + inc/MpGenrePickerPanel.h | 47 + inc/MpIFontChangeEventListener.h | 32 + inc/MpIMusicContentUpdateEventListner.h | 37 + inc/MpIMusicPlayerEventListener.h | 42 + inc/MpIMusicSettingEventListener.h | 35 + inc/MpIThumbnailProviderHandler.h | 40 + inc/MpMainFrame.h | 51 + inc/MpMiniPlayer.h | 104 + inc/MpMusicPlayerApp.h | 100 + inc/MpMusicPlayerForm.h | 246 ++ inc/MpMusicPlayerPresentationModel.h | 165 + inc/MpNotificationTicker.h | 75 + inc/MpNowPlayContentPanel.h | 68 + inc/MpPanelFactory.h | 70 + inc/MpPlaylistContentListForm.h | 108 + inc/MpPlaylistCreatorForm.h | 76 + inc/MpPlaylistDB.h | 43 + inc/MpPlaylistEditorPresentationModel.h | 59 + inc/MpPlaylistListEditorPanel.h | 88 + inc/MpPlaylistListPanel.h | 99 + inc/MpPlaylistListPresentationModel.h | 69 + inc/MpPlaylistPickerPopup.h | 111 + inc/MpPlaylistReNameForm.h | 78 + inc/MpResourceManager.h | 43 + inc/MpSceneRegister.h | 100 + inc/MpSearchForm.h | 127 + inc/MpSearchListItem.h | 49 + inc/MpSearchPresentationModel.h | 56 + inc/MpSetAsPopup.h | 109 + inc/MpSettingForm.h | 91 + inc/MpSettingPresentationModel.h | 58 + inc/MpSharePopup.h | 104 + inc/MpSoundPathPopup.h | 79 + inc/MpTableviewItemTag.h | 42 + inc/MpThumbnailBase.h | 62 + inc/MpThumbnailEvent.h | 40 + inc/MpThumbnailEventArg.h | 41 + inc/MpThumbnailEventListener.h | 35 + inc/MpThumbnailInfo.h | 51 + inc/MpThumbnailJob.h | 55 + inc/MpThumbnailProvider.h | 81 + inc/MpTypes.h | 744 +++++ inc/MpUserPlaylistContentListForm.h | 101 + inc/MpYearContentListForm.h | 80 + inc/MpYearContentPickerPanel.h | 77 + inc/MpYearListEditorPanel.h | 91 + inc/MpYearListPanel.h | 106 + inc/MpYearListPresentationModel.h | 60 + inc/MpYearPickerPanel.h | 47 + manifest.xml | 107 + packaging/apps.MusicPlayer.spec | 77 + res/ara-AE.xml | 221 ++ res/aze-AZ.xml | 221 ++ res/bul-BG.xml | 221 ++ res/cat-ES.xml | 221 ++ res/ces-CZ.xml | 221 ++ res/dan-DK.xml | 221 ++ res/deu-DE.xml | 221 ++ res/ell-GR.xml | 221 ++ res/eng-GB.xml | 222 ++ res/eng-PH.xml | 221 ++ res/eng-US.xml | 221 ++ res/est-EE.xml | 221 ++ res/eus-ES.xml | 221 ++ res/fas-AF.xml | 221 ++ res/fin-FI.xml | 221 ++ res/fra-CA.xml | 221 ++ res/fra-FR.xml | 221 ++ res/gle-IE.xml | 221 ++ res/glg-ES.xml | 221 ++ res/hin-IN.xml | 221 ++ res/hrv-HR.xml | 221 ++ res/hun-HU.xml | 222 ++ res/hye-AM.xml | 221 ++ res/isl-IS.xml | 221 ++ res/ita-IT.xml | 221 ++ res/jpn-JP.xml | 222 ++ res/kat-GE.xml | 221 ++ res/kaz-KZ.xml | 221 ++ res/kor-KR.xml | 221 ++ res/lav-LV.xml | 221 ++ res/lit-LT.xml | 221 ++ res/mkd-MK.xml | 221 ++ res/nld-NL.xml | 221 ++ res/nob-NO.xml | 221 ++ res/pol-PL.xml | 221 ++ res/por-BR.xml | 221 ++ res/por-PT.xml | 221 ++ res/ron-RO.xml | 221 ++ res/rus-RU.xml | 221 ++ .../00_btn_circle_bg_normal.png | Bin 0 -> 5130 bytes .../00_btn_circle_bg_press.png | Bin 0 -> 5141 bytes .../00_button_expand_closed.png | Bin 0 -> 3280 bytes .../00_button_expand_opened.png | Bin 0 -> 3276 bytes .../00_button_rename_normal.png | Bin 0 -> 3186 bytes .../00_button_rename_press.png | Bin 0 -> 3186 bytes res/screen-density-xhigh/00_check_bg.png | Bin 0 -> 4703 bytes res/screen-density-xhigh/00_check_bg_dim.png | Bin 0 -> 4629 bytes res/screen-density-xhigh/00_check_bg_press.png | Bin 0 -> 4740 bytes res/screen-density-xhigh/00_check_checking.png | Bin 0 -> 3217 bytes .../00_icon_Back_02_press_web.png | Bin 0 -> 4681 bytes res/screen-density-xhigh/00_icon_Back_02_web.png | Bin 0 -> 4449 bytes res/screen-density-xhigh/00_icon_edit.png | Bin 0 -> 3603 bytes res/screen-density-xhigh/00_icon_edit_ef.png | Bin 0 -> 4474 bytes res/screen-density-xhigh/00_icon_more.png | Bin 0 -> 3069 bytes res/screen-density-xhigh/00_icon_more_dim_web.png | Bin 0 -> 3535 bytes res/screen-density-xhigh/00_icon_more_ef.png | Bin 0 -> 3314 bytes .../00_icon_more_press_web.png | Bin 0 -> 3675 bytes res/screen-density-xhigh/00_icon_more_web.png | Bin 0 -> 3581 bytes .../00_icon_select_all_dim_web.png | Bin 0 -> 4336 bytes .../00_icon_select_all_press_web.png | Bin 0 -> 4556 bytes .../00_icon_select_all_web.png | Bin 0 -> 4410 bytes res/screen-density-xhigh/34_mostplayed.png | Bin 0 -> 16212 bytes .../34_player_list_thum_noitems.png | Bin 0 -> 106098 bytes res/screen-density-xhigh/34_recentlyadded.png | Bin 0 -> 15251 bytes res/screen-density-xhigh/34_recentlyplayed.png | Bin 0 -> 17078 bytes res/screen-density-xhigh/34_thumb_07.png | Bin 0 -> 136235 bytes .../T02_Album_art_image_Shadow.png | Bin 0 -> 3937 bytes res/screen-density-xhigh/T02_Play_btn_focus.png | Bin 0 -> 3046 bytes res/screen-density-xhigh/T02_Play_btn_next.png | Bin 0 -> 3297 bytes .../T02_Play_btn_next_focus.png | Bin 0 -> 4723 bytes .../T02_Play_btn_next_press.png | Bin 0 -> 3297 bytes res/screen-density-xhigh/T02_Play_btn_pause.png | Bin 0 -> 2943 bytes .../T02_Play_btn_pause_focus.png | Bin 0 -> 3495 bytes .../T02_Play_btn_pause_press.png | Bin 0 -> 2943 bytes res/screen-density-xhigh/T02_Play_btn_play.png | Bin 0 -> 3149 bytes .../T02_Play_btn_play_focus.png | Bin 0 -> 3771 bytes .../T02_Play_btn_play_press.png | Bin 0 -> 3149 bytes res/screen-density-xhigh/T02_Play_btn_press.png | Bin 0 -> 2914 bytes res/screen-density-xhigh/T02_Play_btn_previous.png | Bin 0 -> 3283 bytes .../T02_Play_btn_previous_focus.png | Bin 0 -> 4834 bytes .../T02_Play_btn_previous_press.png | Bin 0 -> 3283 bytes res/screen-density-xhigh/T02_Play_btn_stop.png | Bin 0 -> 2924 bytes .../T02_Play_btn_stop_focus.png | Bin 0 -> 3197 bytes .../T02_Play_btn_stop_press.png | Bin 0 -> 2924 bytes res/screen-density-xhigh/T02_album_bg.png | Bin 0 -> 2865 bytes .../T02_album_thumbnail_bg.png | Bin 0 -> 6267 bytes .../T02_album_thumbnail_h_bg.PNG | Bin 0 -> 5163 bytes res/screen-density-xhigh/T02_album_turn_table.png | Bin 0 -> 129082 bytes .../T02_album_turn_table_h.PNG | Bin 0 -> 93054 bytes .../T02_control_circle_button_01.png | Bin 0 -> 16356 bytes .../T02_control_circle_button_01_press.png | Bin 0 -> 19526 bytes .../T02_control_circle_button_02.png | Bin 0 -> 13641 bytes .../T02_control_circle_button_02_press.png | Bin 0 -> 14538 bytes .../T02_control_circle_button_03.png | Bin 0 -> 9785 bytes .../T02_control_circle_button_03_press.png | Bin 0 -> 10104 bytes .../T02_control_circle_icon_next.png | Bin 0 -> 3707 bytes .../T02_control_circle_icon_next_dim.png | Bin 0 -> 3690 bytes .../T02_control_circle_icon_next_press.png | Bin 0 -> 3792 bytes .../T02_control_circle_icon_pause.png | Bin 0 -> 3271 bytes .../T02_control_circle_icon_pause_dim.png | Bin 0 -> 3264 bytes .../T02_control_circle_icon_pause_press.png | Bin 0 -> 3269 bytes .../T02_control_circle_icon_play.png | Bin 0 -> 4057 bytes .../T02_control_circle_icon_play_dim.png | Bin 0 -> 4041 bytes .../T02_control_circle_icon_play_press.png | Bin 0 -> 4265 bytes .../T02_control_circle_icon_previous.png | Bin 0 -> 3716 bytes .../T02_control_circle_icon_previous_dim.png | Bin 0 -> 3705 bytes .../T02_control_circle_icon_previous_press.png | Bin 0 -> 3753 bytes .../T02_control_progress_handle.png | Bin 0 -> 4819 bytes .../T02_controlbar_icon_add.png | Bin 0 -> 3137 bytes .../T02_controlbar_icon_add_to_playlist.png | Bin 0 -> 3417 bytes .../T02_controlbar_icon_all.png | Bin 0 -> 3599 bytes .../T02_controlbar_icon_all_press.png | Bin 0 -> 1728 bytes .../T02_controlbar_icon_artist.png | Bin 0 -> 3412 bytes .../T02_controlbar_icon_artist_press.png | Bin 0 -> 1549 bytes .../T02_controlbar_icon_cancel.png | Bin 0 -> 3314 bytes .../T02_controlbar_icon_composer.png | Bin 0 -> 3550 bytes .../T02_controlbar_icon_composer_press.png | Bin 0 -> 1670 bytes .../T02_controlbar_icon_delete.png | Bin 0 -> 3250 bytes .../T02_controlbar_icon_edit.png | Bin 0 -> 3531 bytes .../T02_controlbar_icon_folders.png | Bin 0 -> 3112 bytes .../T02_controlbar_icon_folders_press.png | Bin 0 -> 1256 bytes .../T02_controlbar_icon_genres.png | Bin 0 -> 3344 bytes .../T02_controlbar_icon_genres_press.png | Bin 0 -> 3345 bytes .../T02_controlbar_icon_more.png | Bin 0 -> 3170 bytes .../T02_controlbar_icon_more_press.png | Bin 0 -> 3182 bytes .../T02_controlbar_icon_music_albums.png | Bin 0 -> 3225 bytes .../T02_controlbar_icon_music_albums_press.png | Bin 0 -> 1368 bytes .../T02_controlbar_icon_playlists.png | Bin 0 -> 3528 bytes .../T02_controlbar_icon_playlists_press.png | Bin 0 -> 1652 bytes .../T02_controlbar_icon_search.png | Bin 0 -> 3732 bytes .../T02_controlbar_icon_share.png | Bin 0 -> 1486 bytes .../T02_controlbar_icon_years.png | Bin 0 -> 3647 bytes .../T02_controlbar_icon_years_press.png | Bin 0 -> 3640 bytes .../T02_controller_btn_focus.png | Bin 0 -> 3044 bytes .../T02_controller_btn_press.png | Bin 0 -> 2912 bytes .../T02_controller_icon_back.png | Bin 0 -> 1367 bytes .../T02_controller_icon_back_focus.png | Bin 0 -> 4412 bytes .../T02_controller_icon_back_press.png | Bin 0 -> 1367 bytes .../T02_controller_icon_volume.png | Bin 0 -> 1497 bytes .../T02_controller_icon_volume_focus.png | Bin 0 -> 5044 bytes .../T02_controller_icon_volume_press.png | Bin 0 -> 1497 bytes .../T02_external_storage_01.png | Bin 0 -> 3625 bytes .../T02_external_storage_02.png | Bin 0 -> 3435 bytes .../T02_folder_storage_icon_inner_memory.png | Bin 0 -> 1494 bytes .../T02_folder_storage_icon_inner_memory_press.png | Bin 0 -> 3168 bytes .../T02_folder_storage_icon_memory.png | Bin 0 -> 1606 bytes .../T02_folder_storage_icon_memory_press.png | Bin 0 -> 3283 bytes .../T02_function_icon_details.png | Bin 0 -> 2140 bytes res/screen-density-xhigh/T02_function_icon_set.png | Bin 0 -> 2374 bytes .../T02_function_icon_settings.png | Bin 0 -> 2830 bytes .../T02_function_icon_share.png | Bin 0 -> 2321 bytes .../T02_function_icon_sound_path.png | Bin 0 -> 2399 bytes res/screen-density-xhigh/T02_icon_play_list.png | Bin 0 -> 6481 bytes .../T02_icon_play_list_web.png | Bin 0 -> 6035 bytes .../T02_icon_play_list_web_dim.png | Bin 0 -> 5765 bytes .../T02_icon_play_list_web_press.png | Bin 0 -> 6257 bytes res/screen-density-xhigh/T02_icon_search.png | Bin 0 -> 5674 bytes res/screen-density-xhigh/T02_icon_search__.png | Bin 0 -> 5691 bytes res/screen-density-xhigh/T02_icon_search_press.png | Bin 0 -> 5453 bytes res/screen-density-xhigh/T02_icon_search_web.png | Bin 0 -> 5171 bytes .../T02_icon_search_web_dim.png | Bin 0 -> 5088 bytes .../T02_icon_search_web_press.png | Bin 0 -> 5438 bytes res/screen-density-xhigh/T02_memory_card_01.png | Bin 0 -> 3323 bytes res/screen-density-xhigh/T02_memory_card_02.png | Bin 0 -> 3156 bytes .../T02_mini_control_circle_button_01.png | Bin 0 -> 9088 bytes .../T02_mini_control_circle_button_01_press.png | Bin 0 -> 9168 bytes .../T02_mini_control_circle_button_02.png | Bin 0 -> 11474 bytes .../T02_mini_control_circle_button_02_press.png | Bin 0 -> 12128 bytes .../T02_mini_control_circle_icon_next.png | Bin 0 -> 3441 bytes .../T02_mini_control_circle_icon_next_dim.png | Bin 0 -> 3423 bytes .../T02_mini_control_circle_icon_next_press.png | Bin 0 -> 3461 bytes .../T02_mini_control_circle_icon_pause.png | Bin 0 -> 3139 bytes .../T02_mini_control_circle_icon_pause_dim.png | Bin 0 -> 3130 bytes .../T02_mini_control_circle_icon_pause_press.png | Bin 0 -> 3146 bytes .../T02_mini_control_circle_icon_play.png | Bin 0 -> 3605 bytes .../T02_mini_control_circle_icon_play_dim.png | Bin 0 -> 3562 bytes .../T02_mini_control_circle_icon_play_press.png | Bin 0 -> 3651 bytes .../T02_mini_control_circle_icon_previous.png | Bin 0 -> 3384 bytes .../T02_mini_control_circle_icon_previous_dim.png | Bin 0 -> 3369 bytes ...T02_mini_control_circle_icon_previous_press.png | Bin 0 -> 3411 bytes res/screen-density-xhigh/T02_mini_eq_ani_01.png | Bin 0 -> 2862 bytes res/screen-density-xhigh/T02_mini_eq_ani_02.png | Bin 0 -> 2902 bytes res/screen-density-xhigh/T02_mini_eq_ani_03.png | Bin 0 -> 2932 bytes res/screen-density-xhigh/T02_mini_eq_ani_04.png | Bin 0 -> 2934 bytes res/screen-density-xhigh/T02_mini_eq_ani_05.png | Bin 0 -> 2936 bytes res/screen-density-xhigh/T02_mini_eq_ani_06.png | Bin 0 -> 2959 bytes res/screen-density-xhigh/T02_mini_eq_ani_07.png | Bin 0 -> 2962 bytes res/screen-density-xhigh/T02_mini_eq_ani_08.png | Bin 0 -> 2962 bytes .../T02_mini_icon_now_playing.png | Bin 0 -> 3166 bytes res/screen-density-xhigh/T02_mini_player_bg.png | Bin 0 -> 2877 bytes res/screen-density-xhigh/T02_mini_progress_bar.png | Bin 0 -> 2913 bytes res/screen-density-xhigh/T02_music_line.png | Bin 0 -> 433 bytes .../T02_music_player_image_shadow.png | Bin 0 -> 14792 bytes res/screen-density-xhigh/T02_nocomposers.png | Bin 0 -> 8089 bytes res/screen-density-xhigh/T02_now_playing_bar.png | Bin 0 -> 2806 bytes .../T02_now_playing_icon_pause.png | Bin 0 -> 3810 bytes .../T02_now_playing_icon_play.png | Bin 0 -> 4194 bytes res/screen-density-xhigh/T02_option_SA.png | Bin 0 -> 5589 bytes res/screen-density-xhigh/T02_option_SA_dim.png | Bin 0 -> 5369 bytes res/screen-density-xhigh/T02_option_SA_press.png | Bin 0 -> 5270 bytes .../T02_option_add_playlist.png | Bin 0 -> 3306 bytes .../T02_option_add_playlist_focus.png | Bin 0 -> 2733 bytes .../T02_option_add_playlist_press.png | Bin 0 -> 1494 bytes res/screen-density-xhigh/T02_option_btn_focus.png | Bin 0 -> 3041 bytes res/screen-density-xhigh/T02_option_btn_press.png | Bin 0 -> 2909 bytes res/screen-density-xhigh/T02_option_rep_1.png | Bin 0 -> 4005 bytes res/screen-density-xhigh/T02_option_rep_1_dim.png | Bin 0 -> 3987 bytes .../T02_option_rep_1_focus.png | Bin 0 -> 5332 bytes .../T02_option_rep_1_press.png | Bin 0 -> 3924 bytes res/screen-density-xhigh/T02_option_rep_A.png | Bin 0 -> 4259 bytes res/screen-density-xhigh/T02_option_rep_A_dim.png | Bin 0 -> 4224 bytes .../T02_option_rep_A_focus.png | Bin 0 -> 4986 bytes .../T02_option_rep_A_press.png | Bin 0 -> 4160 bytes res/screen-density-xhigh/T02_option_rep_all.png | Bin 0 -> 4295 bytes .../T02_option_rep_all_dim.png | Bin 0 -> 4256 bytes .../T02_option_rep_all_focus.png | Bin 0 -> 5754 bytes .../T02_option_rep_all_press.png | Bin 0 -> 4209 bytes .../T02_option_rep_section copy.png | Bin 0 -> 4306 bytes .../T02_option_rep_section copy_dim.png | Bin 0 -> 4242 bytes .../T02_option_rep_section copy_press.png | Bin 0 -> 4247 bytes .../T02_option_shuffle_off.png | Bin 0 -> 1590 bytes res/screen-density-xhigh/T02_option_shuffle_on.png | Bin 0 -> 4296 bytes .../T02_option_shuffle_on_dim.png | Bin 0 -> 4278 bytes .../T02_option_shuffle_on_focus.png | Bin 0 -> 5522 bytes .../T02_option_shuffle_on_press.png | Bin 0 -> 4200 bytes res/screen-density-xhigh/T02_option_volume.png | Bin 0 -> 4828 bytes res/screen-density-xhigh/T02_option_volume_dim.png | Bin 0 -> 4640 bytes .../T02_option_volume_press.png | Bin 0 -> 4633 bytes res/screen-density-xhigh/T02_phone_01.png | Bin 0 -> 3198 bytes res/screen-density-xhigh/T02_phone_02.png | Bin 0 -> 3094 bytes res/screen-density-xhigh/T02_player_line.png | Bin 0 -> 2801 bytes .../T02_player_progress_bar.png | Bin 0 -> 2808 bytes .../T02_player_progress_bg.png | Bin 0 -> 2803 bytes .../T02_player_progress_handle.png | Bin 0 -> 1078 bytes .../T02_player_progress_handle_press.png | Bin 0 -> 1083 bytes res/screen-density-xhigh/T02_title_icon_option.png | Bin 0 -> 3900 bytes res/screen-density-xhigh/T02_volume_icon_01.png | Bin 0 -> 3685 bytes res/screen-density-xhigh/T02_volume_icon_02.png | Bin 0 -> 5201 bytes res/screen-density-xhigh/T02_volume_icon_Mute.png | Bin 0 -> 3217 bytes res/screen-density-xhigh/T02_volume_popup_bg.png | Bin 0 -> 5520 bytes .../T02_volume_popup_progress_bar.png | Bin 0 -> 3438 bytes .../T02_volume_popup_progress_bg.png | Bin 0 -> 3667 bytes .../T02_volume_popup_progress_handle.png | Bin 0 -> 4661 bytes .../T10_controlbar_icon_Create_Playlist.png | Bin 0 -> 3602 bytes .../blank_normal_background.png | Bin 0 -> 178 bytes .../blank_pressed_background.png | Bin 0 -> 194 bytes res/screen-density-xhigh/music_btn_back.png | Bin 0 -> 4814 bytes res/screen-density-xhigh/music_btn_back_dim.png | Bin 0 -> 4720 bytes res/screen-density-xhigh/music_btn_back_press.png | Bin 0 -> 5143 bytes .../music_play_grid_thumb_loading.png | Bin 0 -> 1145 bytes .../IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT.xml | 22 + ...BUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT.xml | 22 + ...LBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE.xml | 22 + ...BUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE.xml | 22 + ...BUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL.xml | 22 + .../IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT.xml | 22 + ...DL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT.xml | 22 + ...IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE.xml | 22 + ...DL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE.xml | 22 + ...DL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL.xml | 22 + res/screen-size-normal/IDL_ALBUM_INFO_PANEL.xml | 37 + ...L_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT.xml | 27 + ...TS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 27 + ...NTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 27 + ...TS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 27 + ...TS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 27 + .../IDL_CONTENTS_DELETE_POPUP.xml | 27 + .../IDL_CONTENTS_DETAIL_FORM.xml | 87 + ...DL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT.xml | 37 + ...NTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT.xml | 37 + ...ENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE.xml | 37 + ...NTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE.xml | 37 + ...NTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL.xml | 37 + ...L_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT.xml | 32 + ...TS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...NTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...TS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ...TS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + .../IDL_CONTENTS_LIBARY_EDITOR_PANEL.xml | 37 + .../IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT.xml | 32 + ..._CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...L_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE.xml | 34 + ..._CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ..._CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL.xml | 34 + ..._CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT.xml | 34 + ...S_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT.xml | 34 + ...TS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE.xml | 34 + ...S_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE.xml | 34 + ...S_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL.xml | 34 + ...CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT.xml | 32 + ..._PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...S_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ..._PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ..._PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + .../IDL_CONTENTS_UPDATE_POPUP.xml | 18 + res/screen-size-normal/IDL_CONTENT_FORM.xml | 22 + .../IDL_CONTENT_LIBARY_ALL_LIST_PANEL.xml | 37 + .../IDL_CONTENT_LIBARY_COMMON_PANEL.xml | 37 + ...ENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml | 32 + ...RY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...ARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...RY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ...RY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + ...DL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT.xml | 32 + ...NT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...ENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...NT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ...NT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + .../IDL_CONTENT_LIST_ALBUM_INFO_PANEL.xml | 42 + ..._CONTENT_LIST_ARTIST_EDITOR_GROUPITEM_PANEL.xml | 32 + .../IDL_CONTENT_LIST_ARTIST_FORM.xml | 46 + .../IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL.xml | 27 + ...NTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml | 32 + ...ST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...IST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...ST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ...ST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + .../IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT.xml | 32 + ...TENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ...NTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...TENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + ...TENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml | 32 + res/screen-size-normal/IDL_CONTENT_LIST_FORM.xml | 51 + ...NTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT.xml | 24 + ...THUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml | 22 + ...OTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml | 24 + ...THUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml | 24 + ...THUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml | 24 + .../IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT.xml | 24 + ...TENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT.xml | 24 + ...NTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE.xml | 24 + ...TENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE.xml | 24 + ...TENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL.xml | 24 + .../IDL_CONTEXT_ITEM_PLAYALL_ADDTO.xml | 22 + .../IDL_CREATE_PLAYLIST_POPUP.xml | 27 + .../IDL_GROUPEDTABLEVIEW_ITEM_PANEL.xml | 22 + res/screen-size-normal/IDL_MINI_PLYAER_PANEL.xml | 57 + .../IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL.xml | 27 + .../IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL.xml | 17 + res/screen-size-normal/IDL_MUSIC_PLAYER_FORM.xml | 94 + .../IDL_NOTIFICATION_TICKER_PANEL.xml | 17 + .../IDL_PLAYLIST_CREATOR_FORM.xml | 29 + .../IDL_PLAYLIST_RENAME_FORM.xml | 29 + res/screen-size-normal/IDL_SETTING_FORM.xml | 22 + .../IDL_SETTING_OFF_SET_ITEM_PANEL.xml | 27 + .../IDL_SETTING_PLAYLIST_SET_ITEM_PANEL.xml | 32 + res/screen-size-normal/IDL_SET_AS_POPUP.xml | 22 + res/screen-size-normal/IDL_SHARE_VIA_POPUP.xml | 22 + .../IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT.xml | 22 + ...IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT.xml | 22 + .../IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE.xml | 22 + ...IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE.xml | 22 + .../IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT.xml | 22 + ...IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT.xml | 22 + .../IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE.xml | 22 + ...IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE.xml | 22 + .../IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT.xml | 32 + ...SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT.xml | 32 + ..._SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE.xml | 32 + ...SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE.xml | 32 + .../IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT.xml | 17 + ...EP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT.xml | 17 + ...EEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE.xml | 17 + ...EP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE.xml | 17 + res/slk-SK.xml | 221 ++ res/slv-SI.xml | 221 ++ res/spa-ES.xml | 221 ++ res/spa-MX.xml | 221 ++ res/srp-RS.xml | 221 ++ res/swe-SE.xml | 221 ++ res/tha-TH.xml | 221 ++ res/tur-TR.xml | 221 ++ res/ukr-UA.xml | 221 ++ res/urd-IN.xml | 222 ++ res/uzb-UZ.xml | 221 ++ res/zho-CN.xml | 221 ++ res/zho-HK.xml | 221 ++ res/zho-SG.xml | 221 ++ res/zho-TW.xml | 221 ++ shared/data/nofile.dummy | 0 shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 57662 bytes shared/trusted/nofile.dummy | 0 src/MpAlbumContentListForm.cpp | 892 ++++++ src/MpAlbumContentPickerPanel.cpp | 342 +++ src/MpAlbumListEditorPanel.cpp | 511 ++++ src/MpAlbumListPanel.cpp | 523 ++++ src/MpAlbumListPresentationModel.cpp | 423 +++ src/MpAlbumPickerPanel.cpp | 103 + src/MpAllContentPickerPanel.cpp | 200 ++ src/MpAllListEditorPanel.cpp | 574 ++++ src/MpAllListPanel.cpp | 843 ++++++ src/MpAllListPresentationModel.cpp | 291 ++ src/MpArtistAlbumListEditorForm.cpp | 399 +++ src/MpArtistAlbumListForm.cpp | 502 ++++ src/MpArtistAllSongListForm.cpp | 388 +++ src/MpArtistContentListForm.cpp | 1433 +++++++++ src/MpArtistContentPickerPanel.cpp | 347 +++ src/MpArtistListEditorPanel.cpp | 505 ++++ src/MpArtistListPanel.cpp | 553 ++++ src/MpArtistListPresentationModel.cpp | 672 +++++ src/MpArtistPickerPanel.cpp | 113 + src/MpCommonUtil.cpp | 2397 +++++++++++++++ src/MpComposerContentListForm.cpp | 918 ++++++ src/MpComposerContentPickerPanel.cpp | 343 +++ src/MpComposerListEditorPanel.cpp | 423 +++ src/MpComposerListPanel.cpp | 488 +++ src/MpComposerListPresentationModel.cpp | 298 ++ src/MpComposerPickerPanel.cpp | 111 + src/MpContentDetailForm.cpp | 352 +++ src/MpContentEditPanel.cpp | 467 +++ src/MpContentForm.cpp | 190 ++ src/MpContentListForm.cpp | 937 ++++++ src/MpContentListPanel.cpp | 578 ++++ src/MpContentPanel.cpp | 361 +++ src/MpFolderContentListForm.cpp | 1105 +++++++ src/MpFolderContentPickerPanel.cpp | 340 +++ src/MpFolderListEditorPanel.cpp | 542 ++++ src/MpFolderListPanel.cpp | 472 +++ src/MpFolderListPresentationModel.cpp | 484 +++ src/MpFolderPickerPanel.cpp | 104 + src/MpFormFactory.cpp | 308 ++ src/MpGenreContentListForm.cpp | 916 ++++++ src/MpGenreContentPickerPanel.cpp | 345 +++ src/MpGenreListEditorPanel.cpp | 419 +++ src/MpGenreListPanel.cpp | 495 +++ src/MpGenreListPresentationModel.cpp | 304 ++ src/MpGenrePickerPanel.cpp | 115 + src/MpMainFrame.cpp | 144 + src/MpMiniPlayer.cpp | 871 ++++++ src/MpMusicPlayerApp.cpp | 692 +++++ src/MpMusicPlayerEntry.cpp | 80 + src/MpMusicPlayerForm.cpp | 3156 ++++++++++++++++++++ src/MpMusicPlayerPresentationModel.cpp | 2288 ++++++++++++++ src/MpNotificationTicker.cpp | 282 ++ src/MpNowPlayContentPanel.cpp | 375 +++ src/MpPanelFactory.cpp | 379 +++ src/MpPlaylistContentListForm.cpp | 921 ++++++ src/MpPlaylistCreatorForm.cpp | 528 ++++ src/MpPlaylistDB.cpp | 420 +++ src/MpPlaylistEditorPresentationModel.cpp | 271 ++ src/MpPlaylistListEditorPanel.cpp | 566 ++++ src/MpPlaylistListPanel.cpp | 886 ++++++ src/MpPlaylistListPresentationModel.cpp | 663 ++++ src/MpPlaylistPickerPopup.cpp | 381 +++ src/MpPlaylistReNameForm.cpp | 284 ++ src/MpResourceManager.cpp | 64 + src/MpSceneRegister.cpp | 174 ++ src/MpSearchForm.cpp | 806 +++++ src/MpSearchListItem.cpp | 139 + src/MpSearchPresentationModel.cpp | 302 ++ src/MpSetAsPopup.cpp | 498 +++ src/MpSettingForm.cpp | 769 +++++ src/MpSettingPresentationModel.cpp | 251 ++ src/MpSharePopup.cpp | 395 +++ src/MpSoundPathPopup.cpp | 741 +++++ src/MpTableviewItemTag.cpp | 37 + src/MpThumbnailBase.cpp | 176 ++ src/MpThumbnailEvent.cpp | 44 + src/MpThumbnailEventArg.cpp | 58 + src/MpThumbnailInfo.cpp | 100 + src/MpThumbnailJob.cpp | 89 + src/MpThumbnailProvider.cpp | 462 +++ src/MpTypes.cpp | 287 ++ src/MpUserPlaylistContentListForm.cpp | 829 +++++ src/MpYearContentListForm.cpp | 920 ++++++ src/MpYearContentPickerPanel.cpp | 342 +++ src/MpYearListEditorPanel.cpp | 423 +++ src/MpYearListPanel.cpp | 500 ++++ src/MpYearListPresentationModel.cpp | 295 ++ src/MpYearPickerPanel.cpp | 112 + 571 files changed, 69341 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 LICENSE.Flora create mode 100644 NOTICE create mode 100644 inc/MpAlbumContentListForm.h create mode 100644 inc/MpAlbumContentPickerPanel.h create mode 100644 inc/MpAlbumListEditorPanel.h create mode 100644 inc/MpAlbumListPanel.h create mode 100644 inc/MpAlbumListPresentationModel.h create mode 100644 inc/MpAlbumPickerPanel.h create mode 100644 inc/MpAllContentPickerPanel.h create mode 100644 inc/MpAllListEditorPanel.h create mode 100644 inc/MpAllListPanel.h create mode 100644 inc/MpAllListPresentationModel.h create mode 100644 inc/MpArtistAlbumListEditorForm.h create mode 100644 inc/MpArtistAlbumListForm.h create mode 100644 inc/MpArtistAllSongListForm.h create mode 100644 inc/MpArtistContentListForm.h create mode 100644 inc/MpArtistContentPickerPanel.h create mode 100644 inc/MpArtistListEditorPanel.h create mode 100644 inc/MpArtistListPanel.h create mode 100644 inc/MpArtistListPresentationModel.h create mode 100644 inc/MpArtistPickerPanel.h create mode 100644 inc/MpBaseForm.h create mode 100644 inc/MpBasePanel.h create mode 100644 inc/MpCommonUtil.h create mode 100644 inc/MpComposerContentListForm.h create mode 100644 inc/MpComposerContentPickerPanel.h create mode 100644 inc/MpComposerListEditorPanel.h create mode 100644 inc/MpComposerListPanel.h create mode 100644 inc/MpComposerListPresentationModel.h create mode 100644 inc/MpComposerPickerPanel.h create mode 100644 inc/MpContentDetailForm.h create mode 100644 inc/MpContentEditPanel.h create mode 100644 inc/MpContentForm.h create mode 100644 inc/MpContentInformationStruct.h create mode 100644 inc/MpContentLibaryPanel.h create mode 100644 inc/MpContentListForm.h create mode 100644 inc/MpContentPanel.h create mode 100644 inc/MpFolderContentListForm.h create mode 100644 inc/MpFolderContentPickerPanel.h create mode 100644 inc/MpFolderListEditorPanel.h create mode 100644 inc/MpFolderListPanel.h create mode 100644 inc/MpFolderListPresentationModel.h create mode 100644 inc/MpFolderPickerPanel.h create mode 100644 inc/MpFormFactory.h create mode 100644 inc/MpGenreContentListForm.h create mode 100644 inc/MpGenreContentPickerPanel.h create mode 100644 inc/MpGenreListEditorPanel.h create mode 100644 inc/MpGenreListPanel.h create mode 100644 inc/MpGenreListPresentationModel.h create mode 100644 inc/MpGenrePickerPanel.h create mode 100644 inc/MpIFontChangeEventListener.h create mode 100644 inc/MpIMusicContentUpdateEventListner.h create mode 100644 inc/MpIMusicPlayerEventListener.h create mode 100644 inc/MpIMusicSettingEventListener.h create mode 100644 inc/MpIThumbnailProviderHandler.h create mode 100644 inc/MpMainFrame.h create mode 100644 inc/MpMiniPlayer.h create mode 100644 inc/MpMusicPlayerApp.h create mode 100644 inc/MpMusicPlayerForm.h create mode 100644 inc/MpMusicPlayerPresentationModel.h create mode 100644 inc/MpNotificationTicker.h create mode 100644 inc/MpNowPlayContentPanel.h create mode 100644 inc/MpPanelFactory.h create mode 100644 inc/MpPlaylistContentListForm.h create mode 100644 inc/MpPlaylistCreatorForm.h create mode 100644 inc/MpPlaylistDB.h create mode 100644 inc/MpPlaylistEditorPresentationModel.h create mode 100644 inc/MpPlaylistListEditorPanel.h create mode 100644 inc/MpPlaylistListPanel.h create mode 100644 inc/MpPlaylistListPresentationModel.h create mode 100644 inc/MpPlaylistPickerPopup.h create mode 100644 inc/MpPlaylistReNameForm.h create mode 100644 inc/MpResourceManager.h create mode 100644 inc/MpSceneRegister.h create mode 100644 inc/MpSearchForm.h create mode 100644 inc/MpSearchListItem.h create mode 100644 inc/MpSearchPresentationModel.h create mode 100644 inc/MpSetAsPopup.h create mode 100644 inc/MpSettingForm.h create mode 100644 inc/MpSettingPresentationModel.h create mode 100644 inc/MpSharePopup.h create mode 100644 inc/MpSoundPathPopup.h create mode 100644 inc/MpTableviewItemTag.h create mode 100644 inc/MpThumbnailBase.h create mode 100644 inc/MpThumbnailEvent.h create mode 100644 inc/MpThumbnailEventArg.h create mode 100644 inc/MpThumbnailEventListener.h create mode 100644 inc/MpThumbnailInfo.h create mode 100644 inc/MpThumbnailJob.h create mode 100644 inc/MpThumbnailProvider.h create mode 100644 inc/MpTypes.h create mode 100644 inc/MpUserPlaylistContentListForm.h create mode 100644 inc/MpYearContentListForm.h create mode 100644 inc/MpYearContentPickerPanel.h create mode 100644 inc/MpYearListEditorPanel.h create mode 100644 inc/MpYearListPanel.h create mode 100644 inc/MpYearListPresentationModel.h create mode 100644 inc/MpYearPickerPanel.h create mode 100644 manifest.xml create mode 100755 packaging/apps.MusicPlayer.spec create mode 100644 res/ara-AE.xml create mode 100644 res/aze-AZ.xml create mode 100644 res/bul-BG.xml create mode 100644 res/cat-ES.xml create mode 100644 res/ces-CZ.xml create mode 100644 res/dan-DK.xml create mode 100644 res/deu-DE.xml create mode 100644 res/ell-GR.xml create mode 100644 res/eng-GB.xml create mode 100644 res/eng-PH.xml create mode 100644 res/eng-US.xml create mode 100644 res/est-EE.xml create mode 100644 res/eus-ES.xml create mode 100644 res/fas-AF.xml create mode 100644 res/fin-FI.xml create mode 100644 res/fra-CA.xml create mode 100644 res/fra-FR.xml create mode 100644 res/gle-IE.xml create mode 100644 res/glg-ES.xml create mode 100644 res/hin-IN.xml create mode 100644 res/hrv-HR.xml create mode 100644 res/hun-HU.xml create mode 100644 res/hye-AM.xml create mode 100644 res/isl-IS.xml create mode 100644 res/ita-IT.xml create mode 100644 res/jpn-JP.xml create mode 100644 res/kat-GE.xml create mode 100644 res/kaz-KZ.xml create mode 100644 res/kor-KR.xml create mode 100644 res/lav-LV.xml create mode 100644 res/lit-LT.xml create mode 100644 res/mkd-MK.xml create mode 100644 res/nld-NL.xml create mode 100644 res/nob-NO.xml create mode 100644 res/pol-PL.xml create mode 100644 res/por-BR.xml create mode 100644 res/por-PT.xml create mode 100644 res/ron-RO.xml create mode 100644 res/rus-RU.xml create mode 100644 res/screen-density-xhigh/00_btn_circle_bg_normal.png create mode 100644 res/screen-density-xhigh/00_btn_circle_bg_press.png create mode 100644 res/screen-density-xhigh/00_button_expand_closed.png create mode 100644 res/screen-density-xhigh/00_button_expand_opened.png create mode 100644 res/screen-density-xhigh/00_button_rename_normal.png create mode 100644 res/screen-density-xhigh/00_button_rename_press.png create mode 100644 res/screen-density-xhigh/00_check_bg.png create mode 100644 res/screen-density-xhigh/00_check_bg_dim.png create mode 100644 res/screen-density-xhigh/00_check_bg_press.png create mode 100644 res/screen-density-xhigh/00_check_checking.png create mode 100644 res/screen-density-xhigh/00_icon_Back_02_press_web.png create mode 100644 res/screen-density-xhigh/00_icon_Back_02_web.png create mode 100644 res/screen-density-xhigh/00_icon_edit.png create mode 100644 res/screen-density-xhigh/00_icon_edit_ef.png create mode 100644 res/screen-density-xhigh/00_icon_more.png create mode 100644 res/screen-density-xhigh/00_icon_more_dim_web.png create mode 100644 res/screen-density-xhigh/00_icon_more_ef.png create mode 100644 res/screen-density-xhigh/00_icon_more_press_web.png create mode 100644 res/screen-density-xhigh/00_icon_more_web.png create mode 100644 res/screen-density-xhigh/00_icon_select_all_dim_web.png create mode 100644 res/screen-density-xhigh/00_icon_select_all_press_web.png create mode 100644 res/screen-density-xhigh/00_icon_select_all_web.png create mode 100755 res/screen-density-xhigh/34_mostplayed.png create mode 100755 res/screen-density-xhigh/34_player_list_thum_noitems.png create mode 100755 res/screen-density-xhigh/34_recentlyadded.png create mode 100755 res/screen-density-xhigh/34_recentlyplayed.png create mode 100755 res/screen-density-xhigh/34_thumb_07.png create mode 100755 res/screen-density-xhigh/T02_Album_art_image_Shadow.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_next.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_next_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_next_press.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_pause.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_pause_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_pause_press.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_play.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_play_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_play_press.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_press.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_previous.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_previous_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_previous_press.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_stop.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_stop_focus.png create mode 100755 res/screen-density-xhigh/T02_Play_btn_stop_press.png create mode 100644 res/screen-density-xhigh/T02_album_bg.png create mode 100644 res/screen-density-xhigh/T02_album_thumbnail_bg.png create mode 100644 res/screen-density-xhigh/T02_album_thumbnail_h_bg.PNG create mode 100644 res/screen-density-xhigh/T02_album_turn_table.png create mode 100644 res/screen-density-xhigh/T02_album_turn_table_h.PNG create mode 100644 res/screen-density-xhigh/T02_control_circle_button_01.png create mode 100644 res/screen-density-xhigh/T02_control_circle_button_01_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_button_02.png create mode 100644 res/screen-density-xhigh/T02_control_circle_button_02_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_button_03.png create mode 100644 res/screen-density-xhigh/T02_control_circle_button_03_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_next.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_next_dim.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_next_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_pause.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_pause_dim.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_pause_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_play.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_play_dim.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_play_press.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_previous.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_previous_dim.png create mode 100644 res/screen-density-xhigh/T02_control_circle_icon_previous_press.png create mode 100644 res/screen-density-xhigh/T02_control_progress_handle.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_add.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_add_to_playlist.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_all.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_all_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_artist.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_artist_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_cancel.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_composer.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_composer_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_delete.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_edit.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_folders.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_folders_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_genres.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_genres_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_more.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_more_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_music_albums.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_music_albums_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_playlists.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_playlists_press.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_search.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_share.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_years.png create mode 100755 res/screen-density-xhigh/T02_controlbar_icon_years_press.png create mode 100755 res/screen-density-xhigh/T02_controller_btn_focus.png create mode 100755 res/screen-density-xhigh/T02_controller_btn_press.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_back.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_back_focus.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_back_press.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_volume.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_volume_focus.png create mode 100755 res/screen-density-xhigh/T02_controller_icon_volume_press.png create mode 100755 res/screen-density-xhigh/T02_external_storage_01.png create mode 100755 res/screen-density-xhigh/T02_external_storage_02.png create mode 100644 res/screen-density-xhigh/T02_folder_storage_icon_inner_memory.png create mode 100644 res/screen-density-xhigh/T02_folder_storage_icon_inner_memory_press.png create mode 100644 res/screen-density-xhigh/T02_folder_storage_icon_memory.png create mode 100644 res/screen-density-xhigh/T02_folder_storage_icon_memory_press.png create mode 100755 res/screen-density-xhigh/T02_function_icon_details.png create mode 100755 res/screen-density-xhigh/T02_function_icon_set.png create mode 100755 res/screen-density-xhigh/T02_function_icon_settings.png create mode 100755 res/screen-density-xhigh/T02_function_icon_share.png create mode 100755 res/screen-density-xhigh/T02_function_icon_sound_path.png create mode 100644 res/screen-density-xhigh/T02_icon_play_list.png create mode 100644 res/screen-density-xhigh/T02_icon_play_list_web.png create mode 100644 res/screen-density-xhigh/T02_icon_play_list_web_dim.png create mode 100644 res/screen-density-xhigh/T02_icon_play_list_web_press.png create mode 100644 res/screen-density-xhigh/T02_icon_search.png create mode 100644 res/screen-density-xhigh/T02_icon_search__.png create mode 100644 res/screen-density-xhigh/T02_icon_search_press.png create mode 100644 res/screen-density-xhigh/T02_icon_search_web.png create mode 100644 res/screen-density-xhigh/T02_icon_search_web_dim.png create mode 100644 res/screen-density-xhigh/T02_icon_search_web_press.png create mode 100755 res/screen-density-xhigh/T02_memory_card_01.png create mode 100755 res/screen-density-xhigh/T02_memory_card_02.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_button_01.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_button_01_press.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_button_02.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_button_02_press.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_next.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_next_dim.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_next_press.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_pause.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_pause_dim.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_pause_press.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_play.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_play_dim.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_play_press.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_previous.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_previous_dim.png create mode 100644 res/screen-density-xhigh/T02_mini_control_circle_icon_previous_press.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_01.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_02.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_03.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_04.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_05.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_06.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_07.png create mode 100644 res/screen-density-xhigh/T02_mini_eq_ani_08.png create mode 100644 res/screen-density-xhigh/T02_mini_icon_now_playing.png create mode 100644 res/screen-density-xhigh/T02_mini_player_bg.png create mode 100644 res/screen-density-xhigh/T02_mini_progress_bar.png create mode 100644 res/screen-density-xhigh/T02_music_line.png create mode 100755 res/screen-density-xhigh/T02_music_player_image_shadow.png create mode 100755 res/screen-density-xhigh/T02_nocomposers.png create mode 100755 res/screen-density-xhigh/T02_now_playing_bar.png create mode 100755 res/screen-density-xhigh/T02_now_playing_icon_pause.png create mode 100755 res/screen-density-xhigh/T02_now_playing_icon_play.png create mode 100644 res/screen-density-xhigh/T02_option_SA.png create mode 100644 res/screen-density-xhigh/T02_option_SA_dim.png create mode 100644 res/screen-density-xhigh/T02_option_SA_press.png create mode 100755 res/screen-density-xhigh/T02_option_add_playlist.png create mode 100755 res/screen-density-xhigh/T02_option_add_playlist_focus.png create mode 100755 res/screen-density-xhigh/T02_option_add_playlist_press.png create mode 100755 res/screen-density-xhigh/T02_option_btn_focus.png create mode 100755 res/screen-density-xhigh/T02_option_btn_press.png create mode 100644 res/screen-density-xhigh/T02_option_rep_1.png create mode 100644 res/screen-density-xhigh/T02_option_rep_1_dim.png create mode 100755 res/screen-density-xhigh/T02_option_rep_1_focus.png create mode 100644 res/screen-density-xhigh/T02_option_rep_1_press.png create mode 100644 res/screen-density-xhigh/T02_option_rep_A.png create mode 100644 res/screen-density-xhigh/T02_option_rep_A_dim.png create mode 100755 res/screen-density-xhigh/T02_option_rep_A_focus.png create mode 100644 res/screen-density-xhigh/T02_option_rep_A_press.png create mode 100644 res/screen-density-xhigh/T02_option_rep_all.png create mode 100644 res/screen-density-xhigh/T02_option_rep_all_dim.png create mode 100755 res/screen-density-xhigh/T02_option_rep_all_focus.png create mode 100644 res/screen-density-xhigh/T02_option_rep_all_press.png create mode 100644 res/screen-density-xhigh/T02_option_rep_section copy.png create mode 100644 res/screen-density-xhigh/T02_option_rep_section copy_dim.png create mode 100644 res/screen-density-xhigh/T02_option_rep_section copy_press.png create mode 100755 res/screen-density-xhigh/T02_option_shuffle_off.png create mode 100644 res/screen-density-xhigh/T02_option_shuffle_on.png create mode 100644 res/screen-density-xhigh/T02_option_shuffle_on_dim.png create mode 100755 res/screen-density-xhigh/T02_option_shuffle_on_focus.png create mode 100644 res/screen-density-xhigh/T02_option_shuffle_on_press.png create mode 100644 res/screen-density-xhigh/T02_option_volume.png create mode 100644 res/screen-density-xhigh/T02_option_volume_dim.png create mode 100644 res/screen-density-xhigh/T02_option_volume_press.png create mode 100755 res/screen-density-xhigh/T02_phone_01.png create mode 100755 res/screen-density-xhigh/T02_phone_02.png create mode 100755 res/screen-density-xhigh/T02_player_line.png create mode 100755 res/screen-density-xhigh/T02_player_progress_bar.png create mode 100755 res/screen-density-xhigh/T02_player_progress_bg.png create mode 100755 res/screen-density-xhigh/T02_player_progress_handle.png create mode 100755 res/screen-density-xhigh/T02_player_progress_handle_press.png create mode 100755 res/screen-density-xhigh/T02_title_icon_option.png create mode 100755 res/screen-density-xhigh/T02_volume_icon_01.png create mode 100755 res/screen-density-xhigh/T02_volume_icon_02.png create mode 100755 res/screen-density-xhigh/T02_volume_icon_Mute.png create mode 100644 res/screen-density-xhigh/T02_volume_popup_bg.png create mode 100644 res/screen-density-xhigh/T02_volume_popup_progress_bar.png create mode 100644 res/screen-density-xhigh/T02_volume_popup_progress_bg.png create mode 100644 res/screen-density-xhigh/T02_volume_popup_progress_handle.png create mode 100755 res/screen-density-xhigh/T10_controlbar_icon_Create_Playlist.png create mode 100755 res/screen-density-xhigh/blank_normal_background.png create mode 100755 res/screen-density-xhigh/blank_pressed_background.png create mode 100644 res/screen-density-xhigh/music_btn_back.png create mode 100644 res/screen-density-xhigh/music_btn_back_dim.png create mode 100644 res/screen-density-xhigh/music_btn_back_press.png create mode 100755 res/screen-density-xhigh/music_play_grid_thumb_loading.png create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_ALBUM_INFO_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_DELETE_POPUP.xml create mode 100755 res/screen-size-normal/IDL_CONTENTS_DETAIL_FORM.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENTS_UPDATE_POPUP.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_FORM.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_ALL_LIST_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_COMMON_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_ALBUM_INFO_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_EDITOR_GROUPITEM_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_FORM.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_LIST_FORM.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT.xml create mode 100755 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL.xml create mode 100644 res/screen-size-normal/IDL_CONTEXT_ITEM_PLAYALL_ADDTO.xml create mode 100755 res/screen-size-normal/IDL_CREATE_PLAYLIST_POPUP.xml create mode 100644 res/screen-size-normal/IDL_GROUPEDTABLEVIEW_ITEM_PANEL.xml create mode 100644 res/screen-size-normal/IDL_MINI_PLYAER_PANEL.xml create mode 100644 res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL.xml create mode 100644 res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL.xml create mode 100644 res/screen-size-normal/IDL_MUSIC_PLAYER_FORM.xml create mode 100644 res/screen-size-normal/IDL_NOTIFICATION_TICKER_PANEL.xml create mode 100644 res/screen-size-normal/IDL_PLAYLIST_CREATOR_FORM.xml create mode 100644 res/screen-size-normal/IDL_PLAYLIST_RENAME_FORM.xml create mode 100644 res/screen-size-normal/IDL_SETTING_FORM.xml create mode 100644 res/screen-size-normal/IDL_SETTING_OFF_SET_ITEM_PANEL.xml create mode 100644 res/screen-size-normal/IDL_SETTING_PLAYLIST_SET_ITEM_PANEL.xml create mode 100755 res/screen-size-normal/IDL_SET_AS_POPUP.xml create mode 100644 res/screen-size-normal/IDL_SHARE_VIA_POPUP.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE.xml create mode 100644 res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE.xml create mode 100644 res/slk-SK.xml create mode 100644 res/slv-SI.xml create mode 100644 res/spa-ES.xml create mode 100644 res/spa-MX.xml create mode 100644 res/srp-RS.xml create mode 100644 res/swe-SE.xml create mode 100644 res/tha-TH.xml create mode 100644 res/tur-TR.xml create mode 100644 res/ukr-UA.xml create mode 100644 res/urd-IN.xml create mode 100644 res/uzb-UZ.xml create mode 100644 res/zho-CN.xml create mode 100644 res/zho-HK.xml create mode 100644 res/zho-SG.xml create mode 100644 res/zho-TW.xml create mode 100644 shared/data/nofile.dummy create mode 100644 shared/res/screen-density-xhigh/mainmenu.png create mode 100644 shared/trusted/nofile.dummy create mode 100644 src/MpAlbumContentListForm.cpp create mode 100644 src/MpAlbumContentPickerPanel.cpp create mode 100644 src/MpAlbumListEditorPanel.cpp create mode 100644 src/MpAlbumListPanel.cpp create mode 100644 src/MpAlbumListPresentationModel.cpp create mode 100644 src/MpAlbumPickerPanel.cpp create mode 100644 src/MpAllContentPickerPanel.cpp create mode 100644 src/MpAllListEditorPanel.cpp create mode 100644 src/MpAllListPanel.cpp create mode 100644 src/MpAllListPresentationModel.cpp create mode 100644 src/MpArtistAlbumListEditorForm.cpp create mode 100644 src/MpArtistAlbumListForm.cpp create mode 100644 src/MpArtistAllSongListForm.cpp create mode 100644 src/MpArtistContentListForm.cpp create mode 100644 src/MpArtistContentPickerPanel.cpp create mode 100644 src/MpArtistListEditorPanel.cpp create mode 100644 src/MpArtistListPanel.cpp create mode 100644 src/MpArtistListPresentationModel.cpp create mode 100644 src/MpArtistPickerPanel.cpp create mode 100644 src/MpCommonUtil.cpp create mode 100644 src/MpComposerContentListForm.cpp create mode 100644 src/MpComposerContentPickerPanel.cpp create mode 100644 src/MpComposerListEditorPanel.cpp create mode 100644 src/MpComposerListPanel.cpp create mode 100644 src/MpComposerListPresentationModel.cpp create mode 100644 src/MpComposerPickerPanel.cpp create mode 100644 src/MpContentDetailForm.cpp create mode 100644 src/MpContentEditPanel.cpp create mode 100644 src/MpContentForm.cpp create mode 100644 src/MpContentListForm.cpp create mode 100644 src/MpContentListPanel.cpp create mode 100644 src/MpContentPanel.cpp create mode 100644 src/MpFolderContentListForm.cpp create mode 100644 src/MpFolderContentPickerPanel.cpp create mode 100644 src/MpFolderListEditorPanel.cpp create mode 100644 src/MpFolderListPanel.cpp create mode 100644 src/MpFolderListPresentationModel.cpp create mode 100644 src/MpFolderPickerPanel.cpp create mode 100644 src/MpFormFactory.cpp create mode 100644 src/MpGenreContentListForm.cpp create mode 100644 src/MpGenreContentPickerPanel.cpp create mode 100644 src/MpGenreListEditorPanel.cpp create mode 100644 src/MpGenreListPanel.cpp create mode 100644 src/MpGenreListPresentationModel.cpp create mode 100644 src/MpGenrePickerPanel.cpp create mode 100644 src/MpMainFrame.cpp create mode 100644 src/MpMiniPlayer.cpp create mode 100644 src/MpMusicPlayerApp.cpp create mode 100644 src/MpMusicPlayerEntry.cpp create mode 100644 src/MpMusicPlayerForm.cpp create mode 100644 src/MpMusicPlayerPresentationModel.cpp create mode 100644 src/MpNotificationTicker.cpp create mode 100644 src/MpNowPlayContentPanel.cpp create mode 100644 src/MpPanelFactory.cpp create mode 100644 src/MpPlaylistContentListForm.cpp create mode 100644 src/MpPlaylistCreatorForm.cpp create mode 100644 src/MpPlaylistDB.cpp create mode 100644 src/MpPlaylistEditorPresentationModel.cpp create mode 100644 src/MpPlaylistListEditorPanel.cpp create mode 100644 src/MpPlaylistListPanel.cpp create mode 100644 src/MpPlaylistListPresentationModel.cpp create mode 100644 src/MpPlaylistPickerPopup.cpp create mode 100644 src/MpPlaylistReNameForm.cpp create mode 100644 src/MpResourceManager.cpp create mode 100644 src/MpSceneRegister.cpp create mode 100644 src/MpSearchForm.cpp create mode 100644 src/MpSearchListItem.cpp create mode 100644 src/MpSearchPresentationModel.cpp create mode 100644 src/MpSetAsPopup.cpp create mode 100644 src/MpSettingForm.cpp create mode 100644 src/MpSettingPresentationModel.cpp create mode 100644 src/MpSharePopup.cpp create mode 100644 src/MpSoundPathPopup.cpp create mode 100644 src/MpTableviewItemTag.cpp create mode 100644 src/MpThumbnailBase.cpp create mode 100644 src/MpThumbnailEvent.cpp create mode 100644 src/MpThumbnailEventArg.cpp create mode 100644 src/MpThumbnailInfo.cpp create mode 100644 src/MpThumbnailJob.cpp create mode 100644 src/MpThumbnailProvider.cpp create mode 100644 src/MpTypes.cpp create mode 100644 src/MpUserPlaylistContentListForm.cpp create mode 100644 src/MpYearContentListForm.cpp create mode 100644 src/MpYearContentPickerPanel.cpp create mode 100644 src/MpYearListEditorPanel.cpp create mode 100644 src/MpYearListPanel.cpp create mode 100644 src/MpYearListPresentationModel.cpp create mode 100644 src/MpYearPickerPanel.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..876e5a3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +# Target name and AppID +## TODO : set application name and ID +SET(this_target MusicPlayer) +SET(PKG_ID dhrul6qzj3) + +# include directory +INCLUDE_DIRECTORIES( + /usr/include/osp + inc + ) + +# Source files +FILE(GLOB ${this_target}_SOURCE_FILES src/*.cpp) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE") + +# Create executable +SET(CMAKE_EXECUTABLE_SUFFIX ".exe") +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +# Set link libraries and link options +## TODO : add more link libraries and options +TARGET_LINK_LIBRARIES(${this_target} -L/usr/lib/osp osp-appfw osp-uifw osp-media osp-content osp-image osp-social osp-bluetooth osp-telephony pthread) +TARGET_LINK_LIBRARIES(${this_target} -Xlinker --allow-shlib-undefined -pthread -pie) + +# Copy info, data, res, and icons directories +INSTALL(TARGETS ${this_target} DESTINATION ../usr/apps/${PKG_ID}/bin) + +# Copy resource +INSTALL(FILES ${CMAKE_SOURCE_DIR}/manifest.xml DESTINATION ../usr/apps/${PKG_ID}/info) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res DESTINATION ../usr/apps/${PKG_ID}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/shared DESTINATION ../usr/apps/${PKG_ID}) diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100644 index 0000000..8843d10 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum + to the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. You may add Your own + copyright statement to Your modifications and may provide additional or + different license terms and conditions for use, reproduction, or + distribution of Your modifications, or for any such Derivative Works + as a whole, provided Your use, reproduction, and distribution of + the Work otherwise complies with the conditions stated in this License + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..6153e53 --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Flora License, Version 1.1 +Please, see the LICENSE.Flora file for Flora License, Version 1.1 terms and conditions. \ No newline at end of file diff --git a/inc/MpAlbumContentListForm.h b/inc/MpAlbumContentListForm.h new file mode 100644 index 0000000..8c99068 --- /dev/null +++ b/inc/MpAlbumContentListForm.h @@ -0,0 +1,101 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumContentListForm.h + * @brief This is the header file for AlbumContentListForm class. + */ + +#ifndef _MP_ALBUM_CONTENT_LIST_FORM_H_ +#define _MP_ALBUM_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class AlbumListPresentationModel; + +class AlbumContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + AlbumContentListForm(void); + ~AlbumContentListForm(void); + + virtual result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual bool IsEmptyContentList(void); + virtual result SetHeader(void); + virtual void SetItemCheckedAll(bool isChecked); + virtual int GetCheckedItemCount(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateExtraInformaionArea(void); + virtual void UpdateTableView(void); + virtual void UpdateContentList(void); + +private: + result Construct(void); + result CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void RemoveCheckedTableviewItem(bool itemRemove); + void SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status); + +private: + Tizen::Ui::Controls::TableView* __pContentListTableView; + Tizen::Graphics::Bitmap* __pThumbnail; + AlbumListPresentationModel* __pPresentationModel; + + int __checkedItemCount; + int __currentAlbumIndex; + int __activatedStateContextItem; +}; + +#endif // _MP_ALBUM_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpAlbumContentPickerPanel.h b/inc/MpAlbumContentPickerPanel.h new file mode 100644 index 0000000..8afa29a --- /dev/null +++ b/inc/MpAlbumContentPickerPanel.h @@ -0,0 +1,77 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumContentPickerPanel.h + * @brief This is the header file for AlbumContentPickerPanel class. + */ + +#ifndef _MP_ALBUM_CONTENT_PICKER_PANEL_H_ +#define _MP_ALBUM_CONTENT_PICKER_PANEL_H_ + +#include "MpAlbumListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpTypes.h" + +class AlbumContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + AlbumContentPickerPanel(void); + ~AlbumContentPickerPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + AlbumListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_ALBUM_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAlbumListEditorPanel.h b/inc/MpAlbumListEditorPanel.h new file mode 100644 index 0000000..20f8634 --- /dev/null +++ b/inc/MpAlbumListEditorPanel.h @@ -0,0 +1,76 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListEditorPanel.h + * @brief This is the header file for AlbumListEditorPanel class. + */ + +#ifndef _MP_ALBUM_LIST_EDITOR_PANEL_H_ +#define _MP_ALBUM_LIST_EDITOR_PANEL_H_ + +#include "MpAlbumListPresentationModel.h" +#include "MpContentEditPanel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class AlbumListEditorPanel + : public ContentEditPanel + , public ThumbnailBase +{ +public: + AlbumListEditorPanel(void); + virtual ~AlbumListEditorPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + + void SetEditHeaderStyle(void); + +private: + AlbumListPresentationModel* __pPresentationModel; + Tizen::Graphics::Bitmap* __pThumbnail; +}; + +#endif // _MP_ALBUM_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAlbumListPanel.h b/inc/MpAlbumListPanel.h new file mode 100644 index 0000000..171ac02 --- /dev/null +++ b/inc/MpAlbumListPanel.h @@ -0,0 +1,92 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListPanel.h + * @brief This is the header file for AlbumListPanel class. + */ + +#ifndef _MP_ALBUM_LIST_PANEL_H_ +#define _MP_ALBUM_LIST_PANEL_H_ + +#include "MpAlbumListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpContentLibaryPanel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class AlbumListPanel + : public ContentLibaryPanel + , public ThumbnailBase + , public Tizen::Base::Runtime::ITimerEventListener +{ +public: + AlbumListPanel(void); + virtual ~AlbumListPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFontSizeChanged(void); + +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct, + const int contentTotalCount); + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + +protected: + int __itemIndex; + Tizen::Base::Runtime::Timer* __pLaunchPlayerTimer; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + AlbumListPresentationModel* __pPresentationModel; + Tizen::Graphics::Bitmap* __pThumbnail; +}; + +#endif // _MP_ALBUM_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAlbumListPresentationModel.h b/inc/MpAlbumListPresentationModel.h new file mode 100644 index 0000000..5915dfc --- /dev/null +++ b/inc/MpAlbumListPresentationModel.h @@ -0,0 +1,62 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListPresentationModel.h + * @brief This is the header file for AlbumListPresentationModel class. + */ + +#ifndef _MP_ALBUM_LIST_PRESENTATION_MODEL_H_ +#define _MP_ALBUM_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class AlbumListPresentationModel +{ +public: + static AlbumListPresentationModel* GetInstance(void); + int GetContentCount(int albumIndex); + int GetAllAlbumCount(void); + ContentInformation* GetAlbumInfoN(int albumIndex); + void InitializeContentList(int albumIndex); + ContentInformation* GetContentInfoN(int contentIndex); + void RemoveAlbumList(int albumIndex); + Tizen::Base::String* GetAlbumName(int albumIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int albumIndex); + void RefreshContentList(int albumIndex); + int GetCurrentAlbumIndex(void); + + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateAlbumList(void); + int SearchAlbumIndex(Tizen::Base::String& albumName); + +private: + AlbumListPresentationModel(void); + AlbumListPresentationModel(const AlbumListPresentationModel& albumListPresentationModel); + const AlbumListPresentationModel& operator = (const AlbumListPresentationModel& albumListPresentationModel); + ~AlbumListPresentationModel(void); + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pAlbumList; + Tizen::Base::Collection::IList* __pContentList; + static AlbumListPresentationModel* pAlbumListPresentationModelInstance; + int __currentAlbumIndex; +}; + +#endif // _MP_ALBUM_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpAlbumPickerPanel.h b/inc/MpAlbumPickerPanel.h new file mode 100644 index 0000000..c24914d --- /dev/null +++ b/inc/MpAlbumPickerPanel.h @@ -0,0 +1,49 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumPickerPanel.h + * @brief This is the header file for AlbumPickerPanel class. + */ + +#ifndef _MP_ALBUM_PICKER_PANEL_H_ +#define _MP_ALBUM_PICKER_PANEL_H_ + +#include "MpAlbumListPanel.h" +#include "MpBasePanel.h" +#include "MpCommonUtil.h" + +class NowPlayContentPanel; + +class AlbumPickerPanel + : public AlbumListPanel +{ +public: + AlbumPickerPanel(void); + ~AlbumPickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_ALBUM_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAllContentPickerPanel.h b/inc/MpAllContentPickerPanel.h new file mode 100644 index 0000000..d7a49b0 --- /dev/null +++ b/inc/MpAllContentPickerPanel.h @@ -0,0 +1,47 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllContentPickerPanel.h + * @brief This is the header file for AllContentPickerPanel class. + */ + +#ifndef _MP_ALL_CONTENT_PICKER_PANEL_H_ +#define _MP_ALL_CONTENT_PICKER_PANEL_H_ + +#include "MpAllListEditorPanel.h" +#include "MpContentForm.h" +#include "MpTypes.h" + +class AllContentPickerPanel + : public AllListEditorPanel +{ +public: + AllContentPickerPanel(void); + ~AllContentPickerPanel(void); + + void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + +private: + void SetAddHeaderStyle(void); +}; + +#endif // _MP_ALL_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAllListEditorPanel.h b/inc/MpAllListEditorPanel.h new file mode 100644 index 0000000..db17f68 --- /dev/null +++ b/inc/MpAllListEditorPanel.h @@ -0,0 +1,84 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListEditorPanel.h + * @brief This is the header file for AllListEditorPanel class. + */ + +#ifndef _MP_ALL_LIST_EDITOR_PANEL_H_ +#define _MP_ALL_LIST_EDITOR_PANEL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "MpAllListPresentationModel.h" +#include "MpContentEditPanel.h" +#include "MpCommonUtil.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class AllListEditorPanel + : public ContentEditPanel + , public ThumbnailBase +{ +public: + AllListEditorPanel(void); + virtual ~AllListEditorPanel(void); + + result OnInitializing(void); + result OnTerminating(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); + +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + void SetEditHeaderStyle(void); + +protected: + AllListPresentationModel* __pPresentationModel; + Tizen::Graphics::Bitmap* __pThumbnail; + int __editType; +}; + +#endif // _MP_ALL_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpAllListPanel.h b/inc/MpAllListPanel.h new file mode 100644 index 0000000..76350ef --- /dev/null +++ b/inc/MpAllListPanel.h @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListPanel.h + * @brief This is the header file for AllListPanel class. + */ + +#ifndef _MP_ALL_LIST_PANEL_H_ +#define _MP_ALL_LIST_PANEL_H_ + +#include "MpAllListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpContentLibaryPanel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class AllListPanel + : public ContentLibaryPanel + , public ThumbnailBase + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::App::IAppControlResponseListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + AllListPanel(void); + virtual ~AllListPanel(void); + + virtual bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetItemCount(void); + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + +private: + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + Tizen::Ui::Controls::Popup* __pDeletePopup; + Tizen::Graphics::Bitmap* __pThumbnail; + AllListPresentationModel* __pPresentationModel; + + int __itemIndex; +}; + +#endif // _MP_ALL_LIST_PANEL_H_ diff --git a/inc/MpAllListPresentationModel.h b/inc/MpAllListPresentationModel.h new file mode 100644 index 0000000..a0b87a7 --- /dev/null +++ b/inc/MpAllListPresentationModel.h @@ -0,0 +1,61 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListPresentationModel.h + * @brief This is the header file for AllListPresentationModel class. + */ + +#ifndef _MP_ALL_LIST_PRESENTATION_MODEL_H_ +#define _MP_ALL_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class AllListPresentationModel + : public Tizen::Base::Runtime::ITimerEventListener +{ +public: + static AllListPresentationModel* GetInstance(void); + int GetTotalCount(void); + result SetCallRingtone(int index); + Tizen::Base::String GetContentName(int index); + Tizen::Base::Collection::ArrayList* GetContentListN(void); + Tizen::Base::String* GetCheckedContent(int index); + ContentInformation* GetContentInfoN(int index); + result RemoveContent(int index); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateContentList(void); + result StartAutoOffTimer(int autoOffValue); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + +private: + AllListPresentationModel(void); + AllListPresentationModel(AllListPresentationModel& allListPresentationModel); + const AllListPresentationModel& operator = (const AllListPresentationModel& allListPresentationModel); + ~AllListPresentationModel(void); + result Construct(void); + void CreateContentIndexList(void); + +private: + Tizen::Base::Collection::IList* __pContentList; + static AllListPresentationModel* pAllListPresentationModelInstance; + Tizen::Base::Runtime::Timer* __pAutoOffTimer; +}; + +#endif // _MP_ALL_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpArtistAlbumListEditorForm.h b/inc/MpArtistAlbumListEditorForm.h new file mode 100644 index 0000000..4bb2ea6 --- /dev/null +++ b/inc/MpArtistAlbumListEditorForm.h @@ -0,0 +1,85 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAlbumListEditorForm.h + * @brief This is the header file for ArtistAlbumListEditorForm class. + */ + +#ifndef _MP_ARTIST_ALBUM_LIST_EDITOR_FORM_H_ +#define _MP_ARTIST_ALBUM_LIST_EDITOR_FORM_H_ + +#include "MpArtistListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; + +class ArtistAlbumListEditorForm + : public ThumbnailBase + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ArtistAlbumListEditorForm(void); + virtual ~ArtistAlbumListEditorForm(void); + + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Graphics::Bitmap* __pThumbnail; + int __checkedItemCount; + PlayListPickerPopup* __pPlayListPickerPopup; + ArtistListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_ARTIST_ALBUM_LIST_EDITOR_FORM_H_ \ No newline at end of file diff --git a/inc/MpArtistAlbumListForm.h b/inc/MpArtistAlbumListForm.h new file mode 100644 index 0000000..6ed4806 --- /dev/null +++ b/inc/MpArtistAlbumListForm.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAlbumListForm.h + * @brief This is the header file for ArtistAlbumListForm class. + */ + +#ifndef _MP_ARTIST_ALBUM_LIST_FORM_H_ +#define _MP_ARTIST_ALBUM_LIST_FORM_H_ + +#include "MpArtistListPresentationModel.h" +#include "MpIFontChangeEventListener.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; +class NowPlayContentPanel; + +class ArtistAlbumListForm + : public ThumbnailBase + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IFontChangeEventListner +{ +public: + ArtistAlbumListForm(void); + virtual ~ArtistAlbumListForm(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnFontSizeChanged(void); +private: + result AllSongCreateTableViewItem(Tizen::Ui::Container& parent, int totalCount); + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + +private: + int __itemIndex; + bool __deleteItem; + Tizen::Base::String* __pKeyword; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + PlayListPickerPopup* __pPlayListPickerPopup; + Tizen::Ui::Controls::Label* __pNoContentImageLabel; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + ArtistListPresentationModel* __pPresentationModel; + + Tizen::Base::String __fontSizeValue; + int __itemHeight; + int __fontSize; +}; + +#endif // _MP_ARTIST_ALBUM_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpArtistAllSongListForm.h b/inc/MpArtistAllSongListForm.h new file mode 100644 index 0000000..9003286 --- /dev/null +++ b/inc/MpArtistAllSongListForm.h @@ -0,0 +1,94 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAllSongListForm.h + * @brief This is the header file for ArtistAllSongListForm class. + */ + +#ifndef _MP_ARTIST_ALL_SONG_LIST_FORM_H_ +#define _MP_ARTIST_ALL_SONG_LIST_FORM_H_ + +#include "MpArtistListPresentationModel.h" +#include "MpIFontChangeEventListener.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class NowPlayContentPanel; +class PlayListPickerPopup; + +class ArtistAllSongListForm + : public ThumbnailBase + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ArtistAllSongListForm(void); + virtual ~ArtistAllSongListForm(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct); + +private: + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Graphics::Bitmap* __pThumbnail; + ArtistListPresentationModel* __pPresentationModel; + PlayListPickerPopup* __pPlayListPickerPopup; + Tizen::Base::String __fontSizeValue; + int __fontSize; + int __itemHeight; +}; + +#endif // _MP_ARTIST_ALL_SONG_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpArtistContentListForm.h b/inc/MpArtistContentListForm.h new file mode 100644 index 0000000..4e30a20 --- /dev/null +++ b/inc/MpArtistContentListForm.h @@ -0,0 +1,131 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistContentListForm.h + * @brief This is the header file for ArtistContentListForm class. + */ + +#ifndef _MP_ARTIST_CONTENT_LIST_FORM_H_ +#define _MP_ARTIST_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpTableviewItemTag.h" +#include "MpThumbnailBase.h" + +class ArtistListPresentationModel; + +class ArtistContentListForm + : public ContentListForm + , public ThumbnailBase + , public Tizen::Ui::Controls::IGroupedTableViewItemProvider + , public Tizen::Ui::Controls::IGroupedTableViewItemEventListener + , public Tizen::App::IAppControlResponseListener +{ +public: + ArtistContentListForm(void); + ~ArtistContentListForm(void); + + result Initialize(void); + +private: + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnGroupedTableViewGroupItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, + Tizen::Ui::Controls::TableViewGroupItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, + int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual int GetGroupCount(void); + virtual int GetItemCount(int groupIndex); + virtual Tizen::Ui::Controls::TableViewGroupItem* CreateGroupItem(int groupIndex, int itemWidth); + virtual bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual void UpdateGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(int groupIndex, int itemIndex, int itemWidth); + virtual bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + virtual int GetDefaultGroupItemHeight(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); + +protected: + virtual int GetCheckedItemCount(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + + virtual bool IsEmptyContentList(void); + + virtual result SetHeader(void); + virtual void SetItemCheckedAll(bool isChecked); + + virtual void UpdateTableView(void); + virtual void UpdateContentList(void); + virtual void RemoveCheckedTableviewItem(bool itemRemove); +private: + result Construct(void); + result CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo); + result CreateTableViewGroupItem(Tizen::Ui::Controls::TableViewGroupItem& parent, const ContentInformation& contentInfo); + + ContentInformation* GetContentInformationActivatedStateContextItem(void); + + result InitCheckedItemMultiHashMap(void); + void RemoveCheckedItemMultiHashMap(void); + + result AddCheckedItem(int groupIndex, int itemIndex); + result RemoveCheckedItem(int groupIndex, int itemIndex); + result SetItemChecked(int groupIndex, int itemIndex, bool check); + void SetItemCheckedAt(int groupIndex, bool check); + void SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status, int groupIndex, int itemIndex); + + int GetCheckedItemCountAt(int groupIndex); + int GetTotalItemCount(void); + int GetOffsetContentIndex(const int groupIndex); + + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int albumIndex, int startIndex); + result RemoveConentCheckedAll(void); + + result EventHandlerContextMenuItemCaller(void); + result EventHandlerContextMenuItemCall(ContentInformation& contentInfo); + result EventHandlerContextMenuItemMessageEmail(ContentInformation& contentInfo, Tizen::Base::String providerId); + +private: + Tizen::Ui::Controls::GroupedTableView* __pContentGroupedTableView; + Tizen::Ui::Controls::TableViewContextItem* __pTableViewContextItem; + Tizen::Base::Collection::MultiHashMapT* __pCheckedItemCountMultiHashMap; + Tizen::Base::String __artistName; + Tizen::Graphics::Bitmap* __pThumbnail; + + TableviewItemTag __activatedStateContextItem; + ArtistListPresentationModel* __pPresentationModel; + + int __currentContentIndex; +}; + +#endif // _MP_ARTIST_CONTENT_LIST_FORM_H_ diff --git a/inc/MpArtistContentPickerPanel.h b/inc/MpArtistContentPickerPanel.h new file mode 100644 index 0000000..c3007e1 --- /dev/null +++ b/inc/MpArtistContentPickerPanel.h @@ -0,0 +1,77 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistContentPickerPanel.h + * @brief This is the header file for ArtistContentPickerPanel class. + */ + +#ifndef _MP_ARTIST_CONTENT_PICKER_PANEL_H_ +#define _MP_ARTIST_CONTENT_PICKER_PANEL_H_ + +#include "MpArtistListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpTypes.h" + +class ArtistContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ArtistContentPickerPanel(void); + ~ArtistContentPickerPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + ArtistListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_ARTIST_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpArtistListEditorPanel.h b/inc/MpArtistListEditorPanel.h new file mode 100644 index 0000000..ada2179 --- /dev/null +++ b/inc/MpArtistListEditorPanel.h @@ -0,0 +1,82 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListEditorPanel.h + * @brief This is the header file for ArtistListEditorPanel class. + */ + +#ifndef _MP_ARTIST_LIST_EDITOR_PANEL_H_ +#define _MP_ARTIST_LIST_EDITOR_PANEL_H_ + +#include +#include +#include +#include +#include +#include "MpArtistListPresentationModel.h" +#include "MpContentEditPanel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class ArtistListEditorPanel + : public ContentEditPanel + , public ThumbnailBase +{ +public: + ArtistListEditorPanel(void); + virtual ~ArtistListEditorPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, + int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + void SetEditHeaderStyle(void); + +protected: + Tizen::Graphics::Bitmap* __pThumbnail; + ArtistListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_ARTIST_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpArtistListPanel.h b/inc/MpArtistListPanel.h new file mode 100644 index 0000000..1a85dea --- /dev/null +++ b/inc/MpArtistListPanel.h @@ -0,0 +1,90 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListPanel.h + * @brief This is the header file for ArtistPanel class. + */ + +#ifndef _MP_ARTIST_LIST_PANEL_H_ +#define _MP_ARTIST_LIST_PANEL_H_ + +#include "MpArtistListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpContentLibaryPanel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class ArtistListPanel + : public ContentLibaryPanel + , public ThumbnailBase + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::Controls::IFastScrollListener +{ +public: + ArtistListPanel(void); + virtual ~ArtistListPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, + int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFontSizeChanged(void); +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct, const int contentTotalCount); + +protected: + int __itemIndex; + Tizen::Base::Runtime::Timer* __pLaunchPlayerTimer; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + Tizen::Graphics::Bitmap* __pThumbnail; + ArtistListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_ARTIST_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpArtistListPresentationModel.h b/inc/MpArtistListPresentationModel.h new file mode 100644 index 0000000..78a4292 --- /dev/null +++ b/inc/MpArtistListPresentationModel.h @@ -0,0 +1,73 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListPresentationModel.h + * @brief This is the header file for ArtistListPresentationModel class. + */ + +#ifndef _MP_ARTIST_LIST_PRESENTATION_MODEL_H_ +#define _MP_ARTIST_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class ArtistListPresentationModel +{ +public: + static ArtistListPresentationModel* GetInstance(void); + + int GetArtistContentCount(int artistIndex); + int GetArtistListCount(void); + int GetArtistAlbumContentCount(int albumIndex); + int GetArtistAlbumListCount(void); + int GetArtistContentListCount(void); + void InitializeArtistAlbumList(Tizen::Base::String& keyWord); + void InitializeContentList(int albumIndex); + void DeleteArtistAlbum(void); + ContentInformation* GetArtistnIfoN(int artistIndex); + ContentInformation* GetArtistAlbumInfoN(int albumIndex); + ContentInformation* GetArtistContentInfoN(int contentIndex); + ContentInformation* GetArtistAlbumContentInfoN(int contentIndex); + void RemoveArtistList(int artistIndex); + Tizen::Base::String* GetArtistName(int artistIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int index, SearchMode mode = SEARCH_MODE_ARTIST); + Tizen::Base::Collection::ArrayList* GetAllContentPathListN(void); + void RefreshContentList(int albumIndex); + int GetCurrentArtistAlbumIndex(void); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateArtistList(void); + +private: + ArtistListPresentationModel(void); + ArtistListPresentationModel(const ArtistListPresentationModel& artistListPresentationModel); + const ArtistListPresentationModel& operator = (const ArtistListPresentationModel& artistListPresentationModel); + ~ArtistListPresentationModel(void); + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pArtistList; + Tizen::Base::Collection::IList* __pArtistContentList; + Tizen::Base::Collection::IList* __pArtistAlbumContentList; + Tizen::Base::Collection::ArrayList* __pArtistAlbumList; + Tizen::Base::String __keyWord; + + static ArtistListPresentationModel* pArtistListPresentationModelInstance; + int __currentArtistAlbumIndex; +}; + +#endif // _MP_ARTIST_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpArtistPickerPanel.h b/inc/MpArtistPickerPanel.h new file mode 100644 index 0000000..5845813 --- /dev/null +++ b/inc/MpArtistPickerPanel.h @@ -0,0 +1,47 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistPickerPanel.h + * @brief This is the header file for ArtistPickerPanel class. + */ + +#ifndef _MP_ARTIST_PICKER_PANEL_H_ +#define _MP_ARTIST_PICKER_PANEL_H_ + +#include "MpArtistListPanel.h" + +class NowPlayContentPanel; + +class ArtistPickerPanel + : public ArtistListPanel +{ +public: + ArtistPickerPanel(void); + ~ArtistPickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_ARTIST_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpBaseForm.h b/inc/MpBaseForm.h new file mode 100644 index 0000000..e879415 --- /dev/null +++ b/inc/MpBaseForm.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpBaseForm.h + * @brief This is the header file for BaseForm class. + */ + +#include + +#ifndef _MP_BASE_FORM_H_ +#define _MP_BASE_FORM_H_ + +class BaseForm + : public Tizen::Ui::Controls::Form +{ +public: + virtual ~BaseForm(void){} + virtual void OnMusicContentUpdateCompleted(void){} + virtual void OnChangedContentList(Tizen::Base::Collection::IList* pArgs){} +}; + +#endif // _MP_BASE_FORM_H_ \ No newline at end of file diff --git a/inc/MpBasePanel.h b/inc/MpBasePanel.h new file mode 100644 index 0000000..7be23b9 --- /dev/null +++ b/inc/MpBasePanel.h @@ -0,0 +1,36 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpBasePanel.h + * @brief This is the header file for BasePanel class. + */ + + +#include + +#ifndef _MP_BASE_PANEL_H_ +#define _MP_BASE_PANEL_H_ + +class BasePanel + : public Tizen::Ui::Controls::Panel +{ +public: + virtual ~BasePanel(void){} + virtual void OnMusicContentUpdateCompleted(void) = 0; +}; + +#endif // _MP_BASE_PANEL_H_ \ No newline at end of file diff --git a/inc/MpCommonUtil.h b/inc/MpCommonUtil.h new file mode 100644 index 0000000..f7488e2 --- /dev/null +++ b/inc/MpCommonUtil.h @@ -0,0 +1,152 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpCommonUtil.h + * @brief This is the header file for CommonUtil class. + */ + +#ifndef _MP_COMMON_UTIL_H_ +#define _MP_COMMON_UTIL_H_ + +#include +#include +#include +#include +#include +#include +#include "MpContentInformationStruct.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +class CommonUtil +{ +public: + static Tizen::Graphics::Bitmap* GetContentAlbumArtN(Tizen::Base::String& path); + static Tizen::Content::AudioContentInfo* GetAudioContentInfoN(const Tizen::Base::String& filePath); + static Tizen::Content::ContentId GetContentId(const Tizen::Base::String& filePath); + static Tizen::Content::ContentInfo* GetContentInfoN(const Tizen::Content::ContentId& contentId); + static Tizen::Base::Collection::IList* ContentSearchResultListN(const Tizen::Base::String& contentFileName, + const Tizen::Base::String& ColumnName, + const Tizen::Base::String& sortColumn, + Tizen::Base::SortOrder sortOrder = Tizen::Base::SORT_ORDER_ASCENDING); + static Tizen::Base::Collection::IList* SearchContentList(const Tizen::Base::String& whereExpr, + const Tizen::Base::String& sortColumn, + Tizen::Base::SortOrder sortOrder = Tizen::Base::SORT_ORDER_ASCENDING); + static Tizen::Base::Collection::IList* SearchContentList(const Tizen::Base::String& columnName); + static Tizen::Base::String FilePathToContentFileName(const Tizen::Base::String& filePath); + static result StringToContentId(const Tizen::Base::String& contentIdString, Tizen::Content::ContentId& outContentId); + static Tizen::Base::String GetFormatDate(long dateValue); + static Tizen::Base::String SpecialReplaceChange(const Tizen::Base::String& text); + static Tizen::Base::String MakeQuery(const Tizen::Base::String& ColumnName, + const Tizen::Base::String& SerachName); + static Tizen::Base::String GetContentInfo(const ContentInformation& contentInfoStruct, + const Tizen::Base::String& SceneId); + static Tizen::Base::String SetSongsString(const int songTotalCount); + static int GetValue(const Tizen::Base::String& entryName); + static result SetValue(const Tizen::Base::String& entryName, const int value); + static void ShowNowPlayPanel(Tizen::Ui::Controls::TableView& tableView, bool playStatus, Tizen::Graphics::Rectangle clientBounds); + static void ShowCheckedCountLabel(Tizen::Ui::Controls::Label& checkCountLabel, int itemCount, + Tizen::Ui::Controls::TableView& tableView, + const Tizen::Ui::Controls::Form& form); + static void ShowSelectAllCheckButton(Tizen::Ui::Controls::CheckButton& checkButton); + static void SetAllCheckState(bool state, Tizen::Ui::Controls::TableView& tableView, int totalCount); + + static result SetFastScrollIndex(Tizen::Ui::Controls::TableView& tableview); + static void SetLayoutFitToContainer(const Tizen::Ui::Container& container, Tizen::Ui::Control& childControl); + static void SetFooterItemEnabled(Tizen::Ui::Controls::Footer& pFooter, bool enable); + + //<-- fixed + static void SetTabHeaderStyle(Tizen::Ui::Controls::Header& pHeader); + static void SetEditHeaderStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText); + static void SetSimpleTitleStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText); + static void SetTitleWithSearchIconStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, const Tizen::Base::String& descriptionText, int actionId); + static void SetTitleDescriptionStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, const Tizen::Base::String& descriptionText); + static void SetTitleDescriptionWithIconStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, + Tizen::Base::String& descriptionText, int actionId, Tizen::Graphics::Bitmap* icon); + //<--fixed + static void SetButtonItemUnCheckedIcon(Tizen::Ui::Controls::Header& header); + static void SetButtonItemCheckedIcon(Tizen::Ui::Controls::Header& header); + static void SetItemCheckedAll(bool isChecked, Tizen::Ui::Controls::TableView& tableView); + + //<--fixed + static Tizen::Ui::Controls::ContextMenu* CreateContextMenuN(const Tizen::Ui::Control& source, Tizen::Ui::IActionEventListener& listener); + static Tizen::Ui::Controls::OptionMenu* CreateOptionMenuN(const Tizen::Ui::Control& source, Tizen::Ui::IActionEventListener& listener); + static void AddContextMenuItem(Tizen::Ui::Controls::ContextMenu& contextMenu, unsigned int contextMenuItemStyle); + static void AddOptionMenuItem(Tizen::Ui::Controls::OptionMenu& OptionMenu, unsigned int OptionMenuItemStyle); + static void ShowContextMenu(Tizen::Ui::Controls::ContextMenu& contextMenu, bool isShow); + static void ShowOptionMenu(Tizen::Ui::Controls::OptionMenu& optionMenu, bool isShow); + static bool IsVaildContextMenuItemActionId(int actionId); + static bool IsVaildCommonPopupActionId(int actionId); + static void SetVariableHeightSizeControl(Tizen::Ui::Control& control, int controlHeight); + static result SetShowStateVariableHeightSizeControl(Tizen::Ui::Control& control, int controlHeight = 0, bool isShow = false); + static result SetShowStateControl(Tizen::Ui::Control& control, bool isShow); + static Tizen::Base::String SetHighDepthToEllipsisPath(const Tizen::Base::String& fullFilePath); + static void SetNoContentImage(Tizen::Ui::Controls::Label& source, Tizen::Base::String& resourceName, Tizen::Base::String& text); + //-->fixed + + static Tizen::Ui::Controls::Popup* CreateContentDeletePopup(Tizen::Ui::IActionEventListener& listener, int deleteActionId, int cancelActionId); + static Tizen::Ui::Controls::Panel* CreateFlickMenuN(Tizen::Ui::IActionEventListener& listener, FlickMenuStyle menuStyle); + static Tizen::Ui::Controls::TableViewContextItem* CreateTableViewContextItemN(Tizen::Ui::IActionEventListener& listener, int itemWidth, FlickMenuStyle menuStyle); + static Tizen::Base::String GetStringItemSelected(int itemCount); + + static Tizen::Ui::Controls::Footer* CreateContentListFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreatePlaylistEditFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateDefaultPlaylistContentListFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateUserPlaylistContentListFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateAddtoPlaylistPickerFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateAddtoPlaylistFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateEditContentListFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateEditFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateDeleteFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateCancelFooter(const Tizen::Ui::Controls::Form& form); + static Tizen::Ui::Controls::Footer* CreateBackButtonStyleFooter(const Tizen::Ui::Controls::Form& form, FooterButtonStyle style); + + static void SetBackButtonStyleFooter(Tizen::Ui::Controls::Footer& footer, FooterButtonStyle style); + static ContentInformation* GetContentInformationN(const Tizen::Content::AudioContentInfo& audioContentInfo); + + static void CreateTableViewItem(Tizen::Ui::Container& parent, + const Tizen::Graphics::Bitmap& thumbnail, + const Tizen::Base::String& itemName, + int contentTotalCount); + static result CreateTableViewContextItem(Tizen::Ui::Controls::TableViewContextItem& parent, Tizen::Ui::IActionEventListener& listener); + static result CreateEditListTableViewItem(Tizen::Ui::Container& parent, + const Tizen::Graphics::Bitmap& thumbnail, + const Tizen::Base::String& itemName, + int contentTotalCount); + static result CreateContentPikerTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const Tizen::Base::String& songName, const Tizen::Base::String& songTime); + static Tizen::Ui::Controls::TableView* CreateEditorTableView(int width, int height); + static Tizen::Ui::Controls::TableView* CreateTableView(int width, int height); + static Tizen::Ui::Controls::CheckButton* CreateSelectAllCheckedButton(int width); + static Tizen::Ui::Controls::Label* CreateCheckedCountLabel(int width, int height); + + static void SetAddtoPlaylistState(bool state); + static bool GetAddtoPlaylistState(void); + + static void SetAddtoPlaylistName(const Tizen::Base::String& addToPlayName); + static Tizen::Base::String GetAddtoPlaylistName(void); + + static void SetButtonEnabled(const Tizen::Ui::Controls::Form& form, int checkedItemCount, int actionId); + static void SetButtonEnabled(const Tizen::Ui::Controls::Form& form, int checkedItemCount); + + static Tizen::Graphics::Bitmap* GetColorizedBitmapN(const Tizen::Graphics::Bitmap& bitmap, const Tizen::Graphics::Color& color); + static Tizen::Base::String GetFontSizeValue(void); + static int GetItemHeight(const Tizen::Base::String& fontSizeValue); + static int GetFontSize(const Tizen::Base::String& fontSizeValue); +}; + +#endif // _MP_COMMON_UTIL_H_ \ No newline at end of file diff --git a/inc/MpComposerContentListForm.h b/inc/MpComposerContentListForm.h new file mode 100644 index 0000000..950a38e --- /dev/null +++ b/inc/MpComposerContentListForm.h @@ -0,0 +1,78 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef _MP_COMPOSER_CONTENT_LIST_FORM_H_ +#define _MP_COMPOSER_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class ComposerListPresentationModel; + +class ComposerContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + ComposerContentListForm(void); + ~ComposerContentListForm(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: +// result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void ToggleViewMode(bool editMode); + +private: + ComposerListPresentationModel* __pPresentationModel; + Tizen::Graphics::Bitmap* __pThumbnail; +}; + +#endif // _MP_COMPOSER_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpComposerContentPickerPanel.h b/inc/MpComposerContentPickerPanel.h new file mode 100644 index 0000000..87b60b9 --- /dev/null +++ b/inc/MpComposerContentPickerPanel.h @@ -0,0 +1,78 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerContentPickerPanel.h + * @brief This is the header file for ComposerContentPickerPanel class. + */ + +#ifndef _MP_COMPOSER_CONTENT_PICKER_PANEL_H_ +#define _MP_COMPOSER_CONTENT_PICKER_PANEL_H_ + +#include "MpCommonUtil.h" +#include "MpComposerListPresentationModel.h" +#include "MpTypes.h" + +class ComposerContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ComposerContentPickerPanel(void); + ~ComposerContentPickerPanel(void); + + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + ComposerListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_COMPOSER_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpComposerListEditorPanel.h b/inc/MpComposerListEditorPanel.h new file mode 100644 index 0000000..40ea22a --- /dev/null +++ b/inc/MpComposerListEditorPanel.h @@ -0,0 +1,91 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListEditorPanel.h + * @brief This is the header file for ComposerListEditorPanel class. + */ + +#ifndef _MP_COMPOSER_LIST_EDITOR_PANEL_H_ +#define _MP_COMPOSER_LIST_EDITOR_PANEL_H_ + +#include "MpBasePanel.h" +#include "MpComposerListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; + +class ComposerListEditorPanel + : public Tizen::Ui::Controls::Panel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ComposerListEditorPanel(void); + virtual ~ComposerListEditorPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + void UpdateContentList(void); + +protected: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + PlayListPickerPopup* __pPlayListPickerPopup; + ComposerListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_COMPOSER_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpComposerListPanel.h b/inc/MpComposerListPanel.h new file mode 100644 index 0000000..3cf10ac --- /dev/null +++ b/inc/MpComposerListPanel.h @@ -0,0 +1,99 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListPanel.h + * @brief This is the header file for ComposerListPanel class. + */ + +#ifndef _MP_COMPOSER_LIST_PANEL_H_ +#define _MP_COMPOSER_LIST_PANEL_H_ + +#include "MpBasePanel.h" +#include "MpComposerListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; +class NowPlayContentPanel; + +class ComposerListPanel + : public BasePanel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ComposerListPanel(void); + virtual ~ComposerListPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + void UpdateContentList(void); + +protected: + int __itemIndex; + NowPlayContentPanel* __pNowPlayContentPanel; + PlayListPickerPopup* __pPlayListPickerPopup; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::Label* __pNoContentImageLabel; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + ComposerListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_COMPOSER_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpComposerListPresentationModel.h b/inc/MpComposerListPresentationModel.h new file mode 100644 index 0000000..b215fe8 --- /dev/null +++ b/inc/MpComposerListPresentationModel.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListPresentationModel.h + * @brief This is the header file for ComposerListPresentationModel class. + */ + +#ifndef _MP_COMPOSER_LIST_PRESENTATION_MODEL_H_ +#define _MP_COMPOSER_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class ComposerListPresentationModel +{ +public: + static ComposerListPresentationModel* GetInstance(void); + int GetContentCount(int composerIndex); + int GetAllComposerCount(void); + ContentInformation* GetComposerInfoN(int composerIndex); + void InitializeContentList(int composerIndex); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Base::String* GetComposerName(int composerIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int composerIndex); + void RefreshContentList(int composerIndex); + int GetCurrentComposerIndex(void); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateComposerList(void); + +private: + ComposerListPresentationModel(void); + ComposerListPresentationModel(const ComposerListPresentationModel& composerListPresentationModel); + const ComposerListPresentationModel& operator = (const ComposerListPresentationModel& composerListPresentationModel); + ~ComposerListPresentationModel(void); + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pComposerList; + Tizen::Base::Collection::IList* __pContentList; + static ComposerListPresentationModel* pComposerListPresentationModelInstance; + int __currentComposerIndex; +}; + +#endif // _MP_YEARS_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpComposerPickerPanel.h b/inc/MpComposerPickerPanel.h new file mode 100644 index 0000000..8092bf2 --- /dev/null +++ b/inc/MpComposerPickerPanel.h @@ -0,0 +1,47 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerPickerPanel.h + * @brief This is the header file for ComposerPickerPanel class. + */ + +#ifndef _MP_COMPOSER_PICKER_PANEL_H_ +#define _MP_COMPOSER_PICKER_PANEL_H_ + +#include "MpComposerListPanel.h" + +class NowPlayContentPanel; + +class ComposerPickerPanel + : public ComposerListPanel +{ +public: + ComposerPickerPanel(void); + ~ComposerPickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_COMPOSER_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpContentDetailForm.h b/inc/MpContentDetailForm.h new file mode 100644 index 0000000..7e040a4 --- /dev/null +++ b/inc/MpContentDetailForm.h @@ -0,0 +1,62 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentDetailForm.h + * @brief This is the header file for ContentDetailForm class. + */ + +#ifndef _MP_CONTENT_DETAIL_FORM_H_ +#define _MP_CONTENT_DETAIL_FORM_H_ + +#include +#include +#include +#include +#include +#include +#include + +class PlayerPresentationModel; + +class ContentDetailForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ContentDetailForm(void); + ~ContentDetailForm(void); + bool Initialize(void); + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + +private: + PlayerPresentationModel* __pPlayerPresentationModel; +}; + +#endif // _MP_CONTENT_DETAIL_FORM_H_ diff --git a/inc/MpContentEditPanel.h b/inc/MpContentEditPanel.h new file mode 100644 index 0000000..c2ca346 --- /dev/null +++ b/inc/MpContentEditPanel.h @@ -0,0 +1,86 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentEditPanel.h + * @brief This is the header file for ContentEditPanel class. + */ + +#ifndef _MP_CONTENT_EDIT_PANEL_H_ +#define _MP_CONTENT_EDIT_PANEL_H_ + +#include "MpContentPanel.h" +#include "MpIMusicContentUpdateEventListner.h" + +class ContentForm; +class SharePopup; +class PlayListPickerPopup; + +class ContentEditPanel + : public ContentPanel + , public IMusicContentUpdateEventListner + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + ContentEditPanel(void); + virtual ~ContentEditPanel(void); + + virtual bool Initialize(void); + + virtual result OnTerminating(void); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + void ShowCommonDeletePopup(Tizen::Ui::IActionEventListener* actionListener); + void HideCommonDeletePopup(const bool isToDelete); +protected: + result LanucherPicker(PickerType pickerType, PickerArgumentType argumentType = PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL); + + void SetCheckedCountBallonTooltip(unsigned int checkedItemCount); + void SetContentEditHeader(void); + void SetItemCheckedAll(bool isChecked); + void UpdateContentEditScreenState(void); + + virtual Tizen::Base::String GetNoContentText(void); + virtual bool IsEmptyContentList(void) = 0; + virtual void OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus); + virtual void UpdateContentList(void) = 0; + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + +private: + result Construct(void); + result SetShowStateBalloonTooltip(bool isShow); + result ShowPlayListPicker(Tizen::Base::Collection::IList* pIList); + result ShowSharePicker(Tizen::Base::Collection::IList* pIList); + + void SetNoContentSongs(bool isNoContents); + void RemovePlayListPicker(const bool deleteInstance = true); + void RemoveSharePicker(const bool deleteInstance = true); + +protected: + int __checkedItemCount; + +private: + PlayListPickerPopup* __pPlayListPicker; + SharePopup* __pSharePicker; + Tizen::Ui::Controls::Label* __pBallonTooltip; + Tizen::Ui::Controls::Popup* __pDeletePopup; +}; + +#endif // _MP_CONTENT_EDIT_PANEL_H_ diff --git a/inc/MpContentForm.h b/inc/MpContentForm.h new file mode 100644 index 0000000..80fc42b --- /dev/null +++ b/inc/MpContentForm.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentForm.h + * @brief This is the header file for ContentForm class. + */ + +#ifndef _MP_CONTENTS_FORM_H_ +#define _MP_CONTENTS_FORM_H_ + +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpIMusicSettingEventListener.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +class SettingPresentationModel; + +class ContentForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public IMusicSettingEventListener + , public Tizen::Ui::IOrientationEventListener +{ +public: + ContentForm(void); + virtual ~ContentForm(void); + bool Initialize(void); + +private: + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnAutoOffTimeChanged(int autoOffTime){} + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); +}; + +#endif // _MP_CONTENTS_FORM_H_ \ No newline at end of file diff --git a/inc/MpContentInformationStruct.h b/inc/MpContentInformationStruct.h new file mode 100644 index 0000000..9289e8e --- /dev/null +++ b/inc/MpContentInformationStruct.h @@ -0,0 +1,42 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentInformationStruct.h + * @brief This is the header file for ContentInformationStruct class. + */ + +#ifndef _MP_CONTENT_INFORMATION_STRUCT_H_ +#define _MP_CONTENT_INFORMATION_STRUCT_H_ + +#include + +struct ContentInformation +{ + Tizen::Base::String GenreName; + Tizen::Base::String ArtistName; + Tizen::Base::String ComposerName; + Tizen::Base::String AlbumName; + Tizen::Base::String TitleName; + Tizen::Base::String ContentFilePath; + int ReleaseYear; + long Duration; + Tizen::Base::UuId contentId; + int playedCount; + Tizen::Base::String playedDate; +}; + +#endif // _MP_CONTENT_INFORMATION_STRUCT_H_ \ No newline at end of file diff --git a/inc/MpContentLibaryPanel.h b/inc/MpContentLibaryPanel.h new file mode 100644 index 0000000..ae15d81 --- /dev/null +++ b/inc/MpContentLibaryPanel.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentLibaryPanel.h + * @brief This is the header file for ContentLibaryPanel class. + */ +#ifndef _MP_CONTENT_LIBARY_PANEL_H_ +#define _MP_CONTENT_LIBARY_PANEL_H_ + +#include "MpContentPanel.h" +#include "MpIMusicContentUpdateEventListner.h" +#include "MpIFontChangeEventListener.h" + +class PlayListPickerPopup; +class SharePopup; +class NotificationTicker; + +class ContentLibaryPanel + : public ContentPanel + , public IMusicContentUpdateEventListner + , public IFontChangeEventListner + +{ +public: + ContentLibaryPanel(void); + virtual ~ContentLibaryPanel(void); + + virtual bool Initialize(void); + + virtual result OnTerminating(void); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + + virtual void OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + +protected: + result LanucherPicker(PickerType pickerType, PickerArgumentType argumentType = PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL); + result SetMiniPlayer(Tizen::Ui::Control& control); + result ReSizingMiniPlayerRegisterBar(void); + + void RemoveMiniPlayer(void); + bool IsExistMiniPlayer(void); + void TryRegisterMiniPlayer(void); + + result CreateContextMenuN(const Tizen::Ui::Control& source); + result CreateOptionMenuN(const Tizen::Ui::Control& source); + result SetContextMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition = Tizen::Graphics::Point(-1, -1)); + result SetOptionMenuItem(unsigned int contextMenuItemStyle); + result TryRemoveContextMenu(int actionId); + void RemoveContextMenu(void); + void RemoveOptionMenu(void); + + result ShowNotificationTicker(Tizen::Base::String text, int timeOut = 2000); + void RemoveNotificationTicker(void); + + Tizen::Ui::OrientationStatus GetCurrentOrientationMode(void); + void UpdateContentLibaryScreenState(void); + + virtual result Construct(void); + virtual bool IsEmptyContentList(void) = 0; + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void) = 0; + +private: + result ShowPlayListPicker(Tizen::Base::Collection::IList* pIList); + result ShowSharePicker(Tizen::Base::Collection::IList* pIList); + + void RemovePlayListPicker(const bool deletePopup = true); + void RemoveSharePicker(const bool deletePopup = true); + +private: + Tizen::Ui::Controls::Panel* __pMiniPlayerRegisterBar; + Tizen::Ui::Controls::ContextMenu* __pContextMenu; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + + PlayListPickerPopup* __pPlayListPicker; + SharePopup* __pSharePicker; + NotificationTicker* __pNotificationTicker; +}; + +#endif // _MP_CONTENT_LIBARY_PANEL_H_ \ No newline at end of file diff --git a/inc/MpContentListForm.h b/inc/MpContentListForm.h new file mode 100644 index 0000000..a5460d3 --- /dev/null +++ b/inc/MpContentListForm.h @@ -0,0 +1,164 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentListForm.h + * @brief This is the header file for ContentListForm class. + */ + +#ifndef _MP_CONTENT_LIST_FORM_H_ +#define _MP_CONTENT_LIST_FORM_H_ + +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpIMusicContentUpdateEventListner.h" +#include "MpIFontChangeEventListener.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" + +class PlayListPickerPopup; +class SharePopup; + +class ContentListForm + : public IMusicContentUpdateEventListner + , public IFontChangeEventListner + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IScrollEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + ContentListForm(void); + virtual ~ContentListForm(void); + +// virtual result Initialize(void); + + virtual result OnInitializing(void) = 0; + virtual result OnTerminating(void); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnScrollEndReached (Tizen::Ui::Control &source, Tizen::Ui::Controls::ScrollEndEvent type); + virtual void OnScrollPositionChanged (Tizen::Ui::Control &source, int scrollPos); + virtual void OnScrollStopped (Tizen::Ui::Control &source); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + virtual void RemoveCheckedTableviewItem(bool itemRemove)=0; + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} +protected: + result LanucherPicker(PickerType pickerType, PickerArgumentType argumentType = PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL); + result Construct(void); + result CreateOptionMenuN(const Tizen::Ui::Control& source); + result CreateContextMenuN(const Tizen::Ui::Control& source); + Tizen::Ui::Control* GetExtraInformaionAreaControl(void); + ScreenState GetScreenState(void); + bool IsExistExtraInformaionArea(void); + result RemoveContentAt(const Tizen::Content::ContentId& contentId); + + result SetScreenState(ScreenState screenState); + result SetOptionMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition = Tizen::Graphics::Point(-1, -1)); + result SetContextMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition = Tizen::Graphics::Point(-1, -1)); + result SetExtraInformaionArea(Tizen::Ui::Control& control); + result ShowDelayedMessageBox(const Tizen::Base::String& messageBody, const Tizen::Base::String& messageTitle = L""); + result ToggleScreenState(ScreenState screenState); + result TryRemoveContextMenu(int actionId); + result TryRemoveCommonPopup(int actionId); + + void SetCheckedCountBallonTooltip(unsigned int checkedItemCount); + void SetCommonPopup(Tizen::Ui::Controls::Popup* commonUtilPopup, Tizen::Ui::IPropagatedKeyEventListener* pKeyListener = null); + void SetContentList(Tizen::Ui::Container* pTableview); + void UpdateScreenState(void); + + virtual result SetHeader(void) = 0; + virtual void SetItemCheckedAll(bool isChecked) = 0; + virtual bool IsEmptyContentList(void) = 0; + virtual int GetCheckedItemCount(void) = 0; + virtual void UpdateTableView(void) = 0; + virtual void UpdateContentList(void) = 0; + void SetFooterStyle(FooterButtonStyle footerButtonStyle); + FooterButtonStyle GetCurrentFooterStyle(void); + + virtual void UpdateExtraInformaionArea(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + +private: + result SetShowStateNoContent(bool isShow); + result SetShowStateContentList(bool isShow); + result SetShowStateBalloonTooltip(bool isShow); + result SetShowStatExtraInformaionArea(bool isShow); + result SetShowStateCommonPopup(bool isShow); + + result ShowPlayListPicker(Tizen::Base::Collection::IList* pIList); + result ShowSharePicker(Tizen::Base::Collection::IList* pIList); + + void RemovePlayListPicker(const bool deletePopup=true); + void RemoveSharePicker(const bool deletePopup=true); + void RemoveOptionMenu(void); + void RemoveContextMenu(void); + void RemoveCommonPopup(void); + void RemoveExtraInformaionArea(void); + +protected: + Tizen::Base::String __headerTitle; + Tizen::Base::String __prevSceneId; + Tizen::Base::String __ablumName; + FooterButtonStyle __footerButtonStyle; + Tizen::Base::String __fontSizeValue; + int __itemHeight; + +private: + Tizen::Base::Runtime::Timer* __pMsgShowTimer; + Tizen::Base::String __messageBody; + Tizen::Base::String __messageTitle; + Tizen::Ui::Container* __pContentList; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + Tizen::Ui::Controls::ContextMenu* __pContextMenu; + Tizen::Ui::Controls::Popup* __pCommonUtilPopupHandler; + Tizen::Ui::Controls::Panel* __pNoContent; + Tizen::Ui::Controls::Label* __pNoContentText; + Tizen::Ui::Controls::Panel* __pExtraInformaionArea; + Tizen::Ui::Controls::Label* __pBallonTooltip; + + PlayListPickerPopup* __pPlayListPicker; + SharePopup* __pSharePicker; + + ScreenState __screenState; + int __heightExtraInformaionArea; +}; + +#endif // _MP_CONTENT_LIST_FORM_H_ diff --git a/inc/MpContentPanel.h b/inc/MpContentPanel.h new file mode 100644 index 0000000..901375e --- /dev/null +++ b/inc/MpContentPanel.h @@ -0,0 +1,92 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentPanel.h + * @brief This is the header file for ContentPanel class. + */ + +#ifndef _MP_CONTENT_PANEL_H_ +#define _MP_CONTENT_PANEL_H_ + +#include +#include +#include "MpSceneRegister.h" +#include "MpTypes.h" + +class ContentPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + ContentPanel(void); + virtual ~ContentPanel(void); + + virtual bool Initialize(void) = 0; + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, int itemIndexFrom, int itemIndexTo); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId){} + virtual void OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + void SetBackEventListner(void); + void SetFormMenuEventListener(void); +protected: + Tizen::Ui::Controls::Header* GetHeader(void); + Tizen::Ui::Controls::Footer* GetFooter(void); + void SetLayoutFitToForm(void); + + result SetShowStateContentTableview(bool isShow); + result SetShowStateNoContent(bool isShow); + + void SetFooter(FooterButtonStyle footerButtonStyle); + void SetFooterStyle(FooterButtonStyle footerButtonStyle); + FooterButtonStyle GetCurrentFooterStyle(void); + void RemoveBackEventListner(void); + void SetShowStateFooter(bool isShow); + void SetFormStyle(void); + +protected: + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::Panel* __pNoContentLabel; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Base::String __fontSizeValue; + FooterButtonStyle __footerButtonStyle; + int __itemHeight; +}; + +#endif // _MP_CONTENT_PANEL_H_ \ No newline at end of file diff --git a/inc/MpFolderContentListForm.h b/inc/MpFolderContentListForm.h new file mode 100644 index 0000000..df0b2f1 --- /dev/null +++ b/inc/MpFolderContentListForm.h @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderContentListForm.h + * @brief This is the header file for FolderContentListForm class. + */ + +#ifndef _MP_FOLDER_CONTENT_LIST_FORM_H_ +#define _MP_FOLDER_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class FolderListPresentationModel; + +class FolderContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + FolderContentListForm(void); + ~FolderContentListForm(void); + + virtual result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual int GetCheckedItemCount(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + + virtual bool IsEmptyContentList(void); + + virtual result SetHeader(void); + virtual void SetItemCheckedAll(bool isChecked); + + virtual void UpdateTableView(void); + virtual void UpdateContentList(void); + +private: + result Construct(void); + result CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void RemoveCheckedTableviewItem(bool itemRemove); + void SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status); + void GoToLibrary(void); +private: + Tizen::Ui::Controls::TableView* __pContentListTableView; + Tizen::Ui::Controls::TableViewContextItem* __pTableViewContextItem; + Tizen::Graphics::Bitmap* __pThumbnail; + Tizen::Base::String* __pCurrentFolderPath; + FolderListPresentationModel* __pPresentationModel; + + int __checkedItemCount; + int __currentFolderIndex; + int __activatedStateContextItem; +}; + +#endif // _MP_FOLDER_CONTENT_LIST_FORM_H_ diff --git a/inc/MpFolderContentPickerPanel.h b/inc/MpFolderContentPickerPanel.h new file mode 100644 index 0000000..4a5a1c1 --- /dev/null +++ b/inc/MpFolderContentPickerPanel.h @@ -0,0 +1,77 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderContentPickerPanel.h + * @brief This is the header file for FolderContentPickerPanel class. + */ + +#ifndef _MP_FOLDER_CONTENT_PICKER_PANEL_H_ +#define _MP_FOLDER_CONTENT_PICKER_PANEL_H_ + +#include "MpCommonUtil.h" +#include "MpFolderListPresentationModel.h" +#include "MpTypes.h" + +class FolderContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + FolderContentPickerPanel(void); + ~FolderContentPickerPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + FolderListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_FOLDER_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpFolderListEditorPanel.h b/inc/MpFolderListEditorPanel.h new file mode 100644 index 0000000..ddff30f --- /dev/null +++ b/inc/MpFolderListEditorPanel.h @@ -0,0 +1,87 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListEditorPanel.h + * @brief This is the header file for FolderListEditorPanel class. + */ + +#ifndef _MP_FOLDER_LIST_EDITOR_PANEL_H_ +#define _MP_FOLDER_LIST_EDITOR_PANEL_H_ + +#include +#include +#include +#include +#include +#include "MpBasePanel.h" +#include "MpContentEditPanel.h" +#include "MpFolderListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +class FolderListEditorPanel + : public ContentEditPanel +{ +public: + FolderListEditorPanel(void); + virtual ~FolderListEditorPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); + +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const Tizen::Base::String& contentPath, int contentCount); + void SetEditHeaderStyle(void); + +protected: + FolderListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_FOLDER_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpFolderListPanel.h b/inc/MpFolderListPanel.h new file mode 100644 index 0000000..8e805c3 --- /dev/null +++ b/inc/MpFolderListPanel.h @@ -0,0 +1,82 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListPanel.h + * @brief This is the header file for FolderListPanel class. + */ + +#ifndef _MP_FOLDERS_LIST_PANEL_H_ +#define _MP_FOLDERS_LIST_PANEL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "MpContentLibaryPanel.h" +#include "MpFolderListPresentationModel.h" + +class FolderListPanel + : public ContentLibaryPanel + , public Tizen::Base::Runtime::ITimerEventListener +{ +public: + FolderListPanel(void); + virtual ~FolderListPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + + virtual void OnScrollEndReached(Tizen::Ui::Control &source, Tizen::Ui::Controls::ScrollEndEvent type); + virtual void OnScrollPositionChanged (Tizen::Ui::Control& source, int scrollPos); + virtual void OnScrollStopped(Tizen::Ui::Control& source){} + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); +protected: + virtual bool IsEmptyContentList(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const Tizen::Base::String& contentPath, int contentCount); + +private: + int __itemIndex; + +protected: + int __scrolledDistance; + FolderListPresentationModel* __pPresentationModel; + Tizen::Base::Runtime::Timer* __pLaunchPlayerTimer; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; +}; + +#endif // _MP_FOLDERS_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpFolderListPresentationModel.h b/inc/MpFolderListPresentationModel.h new file mode 100644 index 0000000..7d43c5b --- /dev/null +++ b/inc/MpFolderListPresentationModel.h @@ -0,0 +1,64 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListPresentationModel.h + * @brief This is the header file for FolderListPresentationModel class. + */ + +#ifndef _MP_FOLDER_LIST_PRESENTATION_MODEL_H_ +#define _MP_FOLDER_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class FolderListPresentationModel +{ +public: + static FolderListPresentationModel* GetInstance(void); + int GetContentCount(int folderIndex); + int GetAllFolderCount(void); + ContentInformation* GetFolderInfoN(int folderIndex); + void InitializeContentList(int folderIndex); + Tizen::Base::Collection::IList* ContentDirectoryPathList(void); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int folderIndex); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Base::String* GetFolderName(int folderIndex); + Tizen::Base::String* GetFolderPath(int folderIndex); + void RemoveFolderList(int folderIndex); + void RefreshContentList(int folderIndex); + int GetCurrentFolderIndex(void); + int GetFolderIndex(const Tizen::Base::String& path); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateFolderPathList(void); + +private: + FolderListPresentationModel(void); + FolderListPresentationModel(const FolderListPresentationModel& FolderListPresentationModel); + const FolderListPresentationModel& operator = (const FolderListPresentationModel& FolderListPresentationModel); + ~FolderListPresentationModel(void); + + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pFolderPathList; + Tizen::Base::Collection::IList* __pContentList; + static FolderListPresentationModel* pFolderListPresentationModelInstance; + int __currentFolderIndex; +}; + +#endif // _MP_FOLDER_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpFolderPickerPanel.h b/inc/MpFolderPickerPanel.h new file mode 100644 index 0000000..67b5f58 --- /dev/null +++ b/inc/MpFolderPickerPanel.h @@ -0,0 +1,42 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderPickerPanel.h + * @brief This is the header file for FolderPickerPanel class. + */ + +#ifndef _MP_FOLDER_PICKER_PANEL_H_ +#define _MP_FOLDER_PICKER_PANEL_H_ + +#include "MpFolderListPanel.h" + +class NowPlayContentPanel; + +class FolderPickerPanel + : public FolderListPanel +{ +public: + FolderPickerPanel(void); + ~FolderPickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_FOLDER_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpFormFactory.h b/inc/MpFormFactory.h new file mode 100644 index 0000000..af46540 --- /dev/null +++ b/inc/MpFormFactory.h @@ -0,0 +1,79 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFormFactory.h + * @brief This is the header file for FormFactory class. + */ + +#ifndef _MP_FORM_FACTORY_H_ +#define _MP_FORM_FACTORY_H_ + +#include +#include +#include "MpAlbumContentListForm.h" +#include "MpArtistAlbumListForm.h" +#include "MpArtistAlbumListEditorForm.h" +#include "MpArtistAllSongListForm.h" +#include "MpArtistContentListForm.h" +#include "MpComposerContentListForm.h" +#include "MpContentDetailForm.h" +#include "MpContentForm.h" +#include "MpGenreContentListForm.h" +#include "MpFolderContentListForm.h" +#include "MpMusicPlayerForm.h" +#include "MpPlaylistContentListForm.h" +#include "MpPlaylistCreatorForm.h" +#include "MpPlaylistReNameForm.h" +#include "MpSettingForm.h" +#include "MpSearchForm.h" +#include "MpUserPlaylistContentListForm.h" +#include "MpYearContentListForm.h" + +extern const wchar_t* IDC_PLAYER_FORM; +extern const wchar_t* IDC_MUSIC_SETTING_FORM; +extern const wchar_t* IDC_ARTIST_CONTENT_LIST_FORM; +extern const wchar_t* IDC_GENRE_CONTENT_LIST_FORM; +extern const wchar_t* IDC_COMPOSER_CONTENT_LIST_FORM; +extern const wchar_t* IDC_YEAR_CONTENT_LIST_FORM; +extern const wchar_t* IDC_FOLDER_CONTENT_LIST_FORM; +extern const wchar_t* IDC_PLAYLIST_CONTENT_LIST_FORM; + +extern const wchar_t* IDC_CONTENT_FORM; +extern const wchar_t* IDC_CONTENT_PICKER_FORM; +extern const wchar_t* IDC_SEARCH_FORM; +extern const wchar_t* IDC_CONTENT_EDIT_FORM; +extern const wchar_t* IDC_ALBUM_CONTENT_LIST_FORM; +extern const wchar_t* IDC_PLAYLIST_CREATOR_FORM; +extern const wchar_t* IDC_PLAYLIST_RENAME_FORM; +extern const wchar_t* IDC_USER_PLAYLIST_CONTENT_LIST_FORM; +extern const wchar_t* IDC_CONTENT_DETAIL_FORM; +extern const wchar_t* IDC_ARTIST_ALBUM_LIST_FORM; +extern const wchar_t* IDC_ARTIST_ALBUM_LIST_SEARCH_FORM; +extern const wchar_t* IDC_ARTIST_ALBUM_LIST_EDIT_FORM; +extern const wchar_t* IDC_ARTIST_ALL_SONG_LIST_FORM; + +class FormFactory + : public Tizen::Ui::Scenes::IFormFactory +{ +public: + FormFactory(void); + virtual ~FormFactory(void); + + virtual Tizen::Ui::Controls::Form* CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _MP_FORM_FACTORY_H_ diff --git a/inc/MpGenreContentListForm.h b/inc/MpGenreContentListForm.h new file mode 100644 index 0000000..495e374 --- /dev/null +++ b/inc/MpGenreContentListForm.h @@ -0,0 +1,82 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreContentListForm.h + * @brief This is the header file for GenreContentListForm class. + */ + +#ifndef _MP_GENRE_CONTENT_LIST_FORM_H_ +#define _MP_GENRE_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class GenreListPresentationModel; + +class GenreContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + GenreContentListForm(void); + ~GenreContentListForm(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: +// result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void ToggleViewMode(bool editMode); + +private: + Tizen::Graphics::Bitmap* __pThumbnail; + GenreListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_GENRE_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpGenreContentPickerPanel.h b/inc/MpGenreContentPickerPanel.h new file mode 100644 index 0000000..8e4f405 --- /dev/null +++ b/inc/MpGenreContentPickerPanel.h @@ -0,0 +1,77 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumContentPickerPanel.h + * @brief This is the header file for AlbumContentPickerPanel class. + */ + +#ifndef _MP_GENRE_CONTENT_PICKER_PANEL_H_ +#define _MP_GENRE_CONTENT_PICKER_PANEL_H_ + +#include "MpCommonUtil.h" +#include "MpGenreListPresentationModel.h" +#include "MpTypes.h" + +class GenreContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + GenreContentPickerPanel(void); + ~GenreContentPickerPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + GenreListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_GENRE_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpGenreListEditorPanel.h b/inc/MpGenreListEditorPanel.h new file mode 100644 index 0000000..600e56b --- /dev/null +++ b/inc/MpGenreListEditorPanel.h @@ -0,0 +1,95 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListEditorPanel.h + * @brief This is the header file for GenreListEditorPanel class. + */ + +#ifndef _MP_GENRE_LIST_EDITOR_PANEL_H_ +#define _MP_GENRE_LIST_EDITOR_PANEL_H_ + +#include "MpBasePanel.h" +#include "MpGenreListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; + +class GenresListEditorPanel + : public BasePanel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + GenresListEditorPanel(void); + virtual ~GenresListEditorPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct, + const int contentTotalCount = 0); + void UpdateContentList(void); + +protected: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + PlayListPickerPopup* __pPlayListPickerPopup; + GenreListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_GENRE_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpGenreListPanel.h b/inc/MpGenreListPanel.h new file mode 100644 index 0000000..b5120ec --- /dev/null +++ b/inc/MpGenreListPanel.h @@ -0,0 +1,104 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListPanel.h + * @brief This is the header file for GenreListPanel class. + */ + +#ifndef _MP_GENRE_LIST_PANEL_H_ +#define _MP_GENRE_LIST_PANEL_H_ + +#include +#include +#include +#include +#include +#include "MpBasePanel.h" +#include "MpGenreListPresentationModel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; +class NowPlayContentPanel; + +class GenreListPanel + : public BasePanel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + GenreListPanel(void); + virtual ~GenreListPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + void UpdateContentList(void); + +protected: + int __itemIndex; + NowPlayContentPanel* __pNowPlayContentPanel; + PlayListPickerPopup* __pPlayListPickerPopup; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::Label* __pNoContentImageLabel; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + GenreListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_GENRE_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpGenreListPresentationModel.h b/inc/MpGenreListPresentationModel.h new file mode 100644 index 0000000..fa47898 --- /dev/null +++ b/inc/MpGenreListPresentationModel.h @@ -0,0 +1,60 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListPresentationModel.h + * @brief This is the header file for AlbumContentPickerPanel class. + */ + +#ifndef _MP_GENRES_LIST_PRESENTATION_MODEL_H_ +#define _MP_GENRES_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class GenreListPresentationModel +{ +public: + static GenreListPresentationModel* GetInstance(void); + + int GetContentCount(int genreIndex); + int GetAllGenreCount(void); + ContentInformation* GetGenreInfoN(int genreIndex); + void InitializeContentList(int genreIndex); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Base::String* GetGenreName(int genreIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int genreIndex); + void RefreshContentList(int genreIndex); + int GetCurrentGenreIndex(void); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateGnereList(void); + +private: + GenreListPresentationModel(void); + GenreListPresentationModel(const GenreListPresentationModel& genreListPresentationModel); + const GenreListPresentationModel& operator = (const GenreListPresentationModel& genreListPresentationModel); + ~GenreListPresentationModel(void); + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pGnereList; + Tizen::Base::Collection::IList* __pContentList; + static GenreListPresentationModel* pGenreListPresentationModelInstance; + int __currentGenreIndex; +}; + +#endif // _MP_GENRES_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpGenrePickerPanel.h b/inc/MpGenrePickerPanel.h new file mode 100644 index 0000000..e66472c --- /dev/null +++ b/inc/MpGenrePickerPanel.h @@ -0,0 +1,47 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenrePickerPanel.h + * @brief This is the header file for GenrePickerPanel class. + */ + +#ifndef _MP_GENRE_PICKER_PANEL_H_ +#define _MP_GENRE_PICKER_PANEL_H_ + +#include "MpGenreListPanel.h" + +class NowPlayContentPanel; + +class GenrePickerPanel + : public GenreListPanel +{ +public: + GenrePickerPanel(void); + ~GenrePickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_GENRE_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpIFontChangeEventListener.h b/inc/MpIFontChangeEventListener.h new file mode 100644 index 0000000..d5bbb0c --- /dev/null +++ b/inc/MpIFontChangeEventListener.h @@ -0,0 +1,32 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpIFontChangeEventListner.h + * @brief This is the header file for IFontChangeEventListner class. + */ + +#ifndef _MP_FONT_CHANGE_EVENT_LISTNER_H_ +#define _MP_FONT_CHANGE_EVENT_LISTNER_H_ + +class IFontChangeEventListner +{ +public: + virtual ~IFontChangeEventListner(void){} + virtual void OnFontSizeChanged(void) = 0; +}; + +#endif // _MP_FONT_CHANGE_EVENT_LISTNER_H_ diff --git a/inc/MpIMusicContentUpdateEventListner.h b/inc/MpIMusicContentUpdateEventListner.h new file mode 100644 index 0000000..76bc473 --- /dev/null +++ b/inc/MpIMusicContentUpdateEventListner.h @@ -0,0 +1,37 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpIMusicContentUpdateEventListner.h + * @brief This is the header file for IMusicContentUpdateEventListner class. + */ + +#ifndef _MP_MUSIC_CONTENT_UPDATE_EVENT_LISTNER_H_ +#define _MP_MUSIC_CONTENT_UPDATE_EVENT_LISTNER_H_ + +class IMusicContentUpdateEventListner +{ +public: + virtual ~IMusicContentUpdateEventListner(void){} + +// virtual void OnMusicContentCreated(void) = 0; +// virtual void OnMusicContentUpdated(void) = 0; +// virtual void OnMusicContentDeleted(void) = 0; + virtual void OnMusicContentUpdateStarted(void){} + virtual void OnMusicContentUpdateCompleted(void) = 0; +}; + +#endif // _MP_MUSIC_CONTENT_UPDATE_EVENT_LISTNER_H_ \ No newline at end of file diff --git a/inc/MpIMusicPlayerEventListener.h b/inc/MpIMusicPlayerEventListener.h new file mode 100644 index 0000000..0d28dba --- /dev/null +++ b/inc/MpIMusicPlayerEventListener.h @@ -0,0 +1,42 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpIMusicPlayerEventListener.h + * @brief This is the header file for IMusicPlayerEventListener class. + */ + +#ifndef _MP_IMUSIC_PLAYER_EVENT_LISTENER_H_ +#define _MP_IMUSIC_PLAYER_EVENT_LISTENER_H_ + +#include +#include +#include + +class IMusicPlayerEventListener +{ +public: + virtual ~IMusicPlayerEventListener(void){} + + virtual void OnPlayStateChanged(Tizen::Media::PlayerState playerState) = 0; + virtual void OnPlayContentChanged(int currentContentIndex) = 0; + virtual void OnPlayContentRemoved(int removedContentIndex){} + virtual void OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition) = 0; + virtual void OnPlayVolumeBarStateChanged(void) = 0; + virtual void OnPlayPresentationModelDestroying(void) = 0; +}; + +#endif // _MP_IMUSIC_PLAYER_EVENT_LISTENER_H_ \ No newline at end of file diff --git a/inc/MpIMusicSettingEventListener.h b/inc/MpIMusicSettingEventListener.h new file mode 100644 index 0000000..1e8f76a --- /dev/null +++ b/inc/MpIMusicSettingEventListener.h @@ -0,0 +1,35 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpIMusicSettingEventListener.h + * @brief This is the header file for IMusicSettingEventListener class. + */ + +#ifndef _MP_IMUSIC_SETTING_EVENT_LISTENER_H_ +#define _MP_IMUSIC_SETTING_EVENT_LISTENER_H_ + +#include + +class IMusicSettingEventListener +{ +public: + virtual ~IMusicSettingEventListener(void){} + + virtual void OnAutoOffTimeChanged(int autoOffTime) = 0; +}; + +#endif // _MP_IMUSIC_SETTING_EVENT_LISTENER_H_ \ No newline at end of file diff --git a/inc/MpIThumbnailProviderHandler.h b/inc/MpIThumbnailProviderHandler.h new file mode 100644 index 0000000..524e41c --- /dev/null +++ b/inc/MpIThumbnailProviderHandler.h @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpIThumbnailProviderHandler.h + * @brief This is the header file for IThumbnailProviderHandler class. + */ + +#ifndef _MP_ITHUMBNAIL_PROVIDER_HANDLER_H_ +#define _MP_ITHUMBNAIL_PROVIDER_HANDLER_H_ + +#include +#include + +class ThumbnailEvent; + +class IThumbnailProviderHandler +{ +public: + virtual ~IThumbnailProviderHandler(void){} + + virtual void RequestThumbnail(const Tizen::Content::ContentId& contentId, const ThumbnailEvent* event, Tizen::Base::Object* pParam = null) = 0; + virtual void CancelAllThumbnailRequest(const ThumbnailEvent* event) = 0; + virtual const Tizen::Graphics::Bitmap* GetDefaultThumbnail(void) const = 0; +}; + +#endif // _MP_ITHUMBNAIL_PROVIDER_HANDLER_H_ \ No newline at end of file diff --git a/inc/MpMainFrame.h b/inc/MpMainFrame.h new file mode 100644 index 0000000..85d5839 --- /dev/null +++ b/inc/MpMainFrame.h @@ -0,0 +1,51 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMainFrame.h + * @brief This is the header file for MainFrame class. + */ + +#ifndef _MP_MAIN_FRAME_H_ +#define _MP_MAIN_FRAME_H_ + +#include +#include +#include + +class MainFrame + : public Tizen::Ui::Controls::Frame + , public Tizen::Ui::Controls::IFrameEventListener +{ +public: + MainFrame(void); + virtual ~MainFrame(void); + + result GoToInitialScene(const Tizen::Ui::Scenes::SceneId& sceneId, Tizen::Base::Collection::IList* pArgs); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnFrameActivated(const Tizen::Ui::Controls::Frame& source); + virtual void OnFrameRestored(const Tizen::Ui::Controls::Frame& source); + virtual void OnFrameTerminating(const Tizen::Ui::Controls::Frame& source); + +private: + Tizen::Ui::Scenes::SceneId __sceneId; + Tizen::Base::Collection::IList* __pDataList; +}; + +#endif // _MP_MAIN_FRAME_H_ \ No newline at end of file diff --git a/inc/MpMiniPlayer.h b/inc/MpMiniPlayer.h new file mode 100644 index 0000000..3f74ace --- /dev/null +++ b/inc/MpMiniPlayer.h @@ -0,0 +1,104 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMiniPlayer.h + * @brief This is the header file for MiniPlayer class. + */ + +#ifndef _MP_MINI_PLAYER_H_ +#define _MP_MINI_PLAYER_H_ + +#include +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpIMusicPlayerEventListener.h" +#include "MpMusicPlayerPresentationModel.h" + +class MiniPlayer + : public Tizen::Ui::Controls::Panel + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IFocusEventListener + , public Tizen::Ui::IKeyEventListener + , public Tizen::Ui::ITouchEventListener + , public IMusicPlayerEventListener +{ +public: + MiniPlayer(void); + virtual ~MiniPlayer(void); + + result Construct(void); + bool GetPlayStatus(void); + + result MiniPlayerActivate(void); + void MiniPlayerDeactivate(void); + +protected: + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + virtual void OnPlayStateChanged(Tizen::Media::PlayerState playerState); + virtual void OnPlayContentChanged(int currentContentIndex); + virtual void OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition); + virtual void OnPlayVolumeBarStateChanged(void); + virtual void OnPlayPresentationModelDestroying(void); + + virtual void OnKeyPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyReleased(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyLongPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + + + virtual result OnDraw(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFocusGained(const Tizen::Ui::Control& source); + virtual void OnFocusLost(const Tizen::Ui::Control& source); + +private: + result SetContentInfo(int currentContentIndex); + void SetPauseButtonImage(void); + void SetPlayButtonImage(void); + +// void DrawContentsTitleName(Tizen::Graphics::Canvas& canvas); + void DrawBackground(Tizen::Graphics::Canvas& canvas); + +private: + Tizen::Base::Runtime::Timer* __pMsgTimer; + Tizen::Ui::Controls::Button* __pMinPlayerPlayToggleButton; + Tizen::Ui::Controls::Button* __pMinPlayerNextButton; + Tizen::Ui::Controls::Button* __pMinPlayerPrevButton; + Tizen::Ui::Controls::Label* __pThumbnailLabel; + Tizen::Ui::Controls::Label* __pTitleLabel; + Tizen::Ui::Controls::Label* __pArtistLabel; + Tizen::Ui::Controls::Progress* __pProgressBar; + PlayerPresentationModel* __pPresentationModel; + bool __isLongPressed; + bool __keyLongPressed; +// Tizen::Base::String __titleName; +// Tizen::Base::String __artistName; +}; + +#endif // _MP_MINI_PLAYER_H_ diff --git a/inc/MpMusicPlayerApp.h b/inc/MpMusicPlayerApp.h new file mode 100644 index 0000000..321f94f --- /dev/null +++ b/inc/MpMusicPlayerApp.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerApp.h + * @brief This is the header file for MusicPlayerApp class. + */ + +#ifndef _MP_MUSIC_PLAYER_APP_H_ +#define _MP_MUSIC_PLAYER_APP_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "MpMainFrame.h" + +class MusicPlayerApp + : public Tizen::App::UiApp + , public Tizen::App::IAppControlProviderEventListener + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Content::IContentUpdateEventListener + , public Tizen::System::IScreenEventListener + , public Tizen::System::ISettingEventListener +{ +public: + static Tizen::App::UiApp* CreateInstance(void); + +public: + MusicPlayerApp(void); + virtual~MusicPlayerApp(void); + + bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + bool OnAppInitialized(void); + bool OnAppWillTerminate(void); + bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + void OnForeground(void); + void OnBackground(void); + void OnLowMemory(void); + void OnBatteryLevelChanged(Tizen::System::BatteryLevel batteryLevel); + void OnScreenOn(void); + void OnScreenOff(void); + + Tizen::Base::String GetOperationId(void); + RequestId GetRequestId(void); + void ResetRequestId(void); + + virtual void OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, const Tizen::Base::String* pUriData, + const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnSettingChanged(Tizen::Base::String& key); + + virtual void OnContentFileCreated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentFileUpdated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentFileDeleted(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r); + virtual void OnContentDirectoryScanCompleted(const Tizen::Base::String& directoryPath, result r); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + +private: + void ParsingArgument(const Tizen::Base::String* pUriData, const Tizen::Base::Collection::IMap* pArgs); + void ReStartContentUpdateTimer(void); + void CallOnMusicContentUpdateCompleted(void); + + void ShowContentUpdateInProgressPopup(void); + void HideContentUpdateInProgressPopup(void); + +private: + RequestId __requestId; + Tizen::Base::String __operationId; + Tizen::Ui::Scenes::SceneId __sceneId; + Tizen::Base::Collection::ArrayList* __pDataList; + + MainFrame* __pMainFrame; + + Tizen::Content::ContentManager* __pContentManager; + Tizen::Base::Runtime::Timer* __pContentUpdateCompleteTimer; + Tizen::Ui::Controls::Popup* __pContentUpdateInProgressPopup; + Tizen::Base::String __fontSize; + + +}; + +#endif // _MP_MUSIC_PLAYER_APP_H_ \ No newline at end of file diff --git a/inc/MpMusicPlayerForm.h b/inc/MpMusicPlayerForm.h new file mode 100644 index 0000000..0644c26 --- /dev/null +++ b/inc/MpMusicPlayerForm.h @@ -0,0 +1,246 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerForm.h + * @brief This is the header file for MusicPlayerForm class. + */ + +#ifndef _MP_MUSIC_PLAYER_FORM_H_ +#define _MP_MUSIC_PLAYER_FORM_H_ + +#include +#include +#include +#include +#include "MpIMusicContentUpdateEventListner.h" +#include "MpIMusicPlayerEventListener.h" +#include "MpIMusicSettingEventListener.h" +#include "MpIFontChangeEventListener.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlayListPickerPopup; +class PlayerPresentationModel; +class SetAsPopup; +class SettingPresentationModel; +class SharePopup; +class SoundPathPopup; + +class PlayerForm + : public ThumbnailBase + , public Tizen::Ui::Controls::Form + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IFormMenuEventListener + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::ISliderEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IAdjustmentEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::IKeyEventListener + , public Tizen::Ui::Animations::IAnimationTransactionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public Tizen::Ui::IFocusEventListener + , public IMusicContentUpdateEventListner + , public IMusicPlayerEventListener + , public IMusicSettingEventListener + , public IFontChangeEventListner +{ +public: + PlayerForm(void); + virtual ~PlayerForm(void); + result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnFocusGained(const Tizen::Ui::Control& source); + virtual void OnFocusLost(const Tizen::Ui::Control& source); + + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnKeyPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyReleased(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyLongPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual void OnSliderBarMoved(Tizen::Ui::Controls::Slider& source, int value); + virtual void OnAdjustmentValueChanged(const Tizen::Ui::Control& source, int adjustment); + + virtual void OnAnimationTransactionStarted(int transactionId); + virtual void OnAnimationTransactionStopped(int transactionId); + virtual void OnAnimationTransactionFinished(int transactionId); + + virtual void OnPlayStateChanged(Tizen::Media::PlayerState playerState); + virtual void OnPlayContentChanged(int currentContentIndex); + virtual void OnPlayContentRemoved(int removedContentIndex); + virtual void OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition); + virtual void OnPlayVolumeBarStateChanged(void); + virtual void OnAutoOffTimeChanged(int autoOffTime); + virtual void OnPlayPresentationModelDestroying(void); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + virtual void OnChangedContentListByAppControlN(Tizen::Base::Collection::IList* pArgs); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfoStruct); + void TogglePlayPauseImage(Tizen::Media::PlayerState playerState); + void SetPauseButtonImage(void); + void SetPlayButtonImage(void); + void SetRepeatButtonImage(int repeatValue); + void SetShuffleButtonImage(bool shuffleEnable); + void SetFileNotExistState(bool isFileExist); + result ShowMessageBox(const Tizen::Base::String& showText); + void SetContentInfo(int currentContentIndex); + void UpdateAnimationAlbumArt(AlbumArtImage position); + result InitializeVolumeBar(void); + + void SetPlayerScreenState(unsigned int playerScreenState); + unsigned int GetPlayerScreenState(void); + + result CreateOptionMenuN(const Tizen::Ui::Control& source); + result SetOptionMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition = Tizen::Graphics::Point(-1, -1)); + result TryRemoveContextMenu(int actionId); + void RemoveOptionMenu(const bool deallocate = false); + + result LanucherPicker(PickerType pickerType); + Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType); + + result ShowSharePicker(Tizen::Base::Collection::IList* pIList); + result ShowPlayListPicker(Tizen::Base::Collection::IList* pIList); + result ShowSetAsPicker(Tizen::Base::Collection::IList* pIList); + + void RemoveSharePicker(const bool deletePopup = true); + void RemovePlayListPicker(const bool deletePopup = true); + void RemoveSetAsPicker(const bool deletePopup = true); + + void PlayAnimation(void); + void StopAnimation(void); + + void UpdatePlayingListBounds(const float margin); + void UpdateSplitBarState(void); + +private: + PlayerPresentationModel* __pPlayerPresentationModel; + + Tizen::Ui::Animations::VisualElement* __pAlbumArtElements; + Tizen::Ui::Animations::VisualElement* __pAlbumArtElement[ALBUM_ART_IMAGE_COUNT]; + + Tizen::Ui::Controls::Panel* __pVolumePanel; + Tizen::Ui::Controls::Panel* __pControllerPanel; + Tizen::Ui::Controls::Panel* __pPanelRegisterBar; + Tizen::Ui::Controls::Panel* __pContentsAlbumViewPanel; + +// Tizen::Ui::Controls::Label* __pAlbumArtLabel; + Tizen::Ui::Controls::Panel* __pContentsListViewPanel; + + Tizen::Ui::Controls::Label* __pCurrentTimeLabel; + Tizen::Ui::Controls::Label* __pTotalTimeLabel; + Tizen::Ui::Controls::Label* __pTitleName; + Tizen::Ui::Controls::Label* __pArtistName; + + Tizen::Ui::Controls::Button* __pRewindButton; + Tizen::Ui::Controls::Button* __pForwardButton; + Tizen::Ui::Controls::Button* __pVolumeButton; + Tizen::Ui::Controls::Button* __pPlayPauseButton; + Tizen::Ui::Controls::Button* __pHorizontalHeaderRightButton; + Tizen::Ui::Controls::Button* __pRepeatButton; + Tizen::Ui::Controls::Button* __pShuffleButton; +// Tizen::Ui::Controls::Button* __pAddToPlaylistButton; + Tizen::Ui::Controls::Button* __pContentsViewToggleButton; + + Tizen::Ui::Controls::Slider* __pPlayStateSlider; + Tizen::Ui::Controls::Slider* __pVolumeSlider; + +// Tizen::Ui::Controls::TableView* __pContentsListView; +// Tizen::Ui::Controls::ContextMenu* __pContextMenuIconText; + Tizen::Graphics::Bitmap* __pThumbnail; + + PlayListPickerPopup* __pPlayListPicker; + SharePopup* __pSharePicker; + SetAsPopup* __pSetAsPicker; + SoundPathPopup* __pSoundPathPopup; + + bool __isLongPressed; + bool __keyLongPressed; + Tizen::Ui::FlickDirection __flickDirection; + int __transactionID; + unsigned int __playerScreenState; + unsigned int __playerScreenStateBeforeCall; + bool __isAnimationPerformed; + bool __isRunByAppControl; + bool __isContentMoveCompleted; + bool __isMusicUpdated; + int __prevRepeatStateRunByAppControl; + int __playPosition; + int __itemIndexToPlay; + + Tizen::Base::Runtime::Timer* __pAnimationFinishedTimer; + Tizen::Base::Runtime::Timer* __pContentPlayTimer; + Tizen::Base::Runtime::Timer* __pMsgShowTimer; + Tizen::Base::Runtime::Timer* __pSeekTimer; + + Tizen::Ui::Scenes::SceneId __pPreviousSceneId; + Tizen::Base::String* __pPath; + Tizen::Ui::Controls::OptionMenu* __pOptionMenu; + Tizen::Base::String __fontSizeValue; + int __itemHeight; +}; + +#endif // _MP_MUSIC_PLAYER_FORM_H_ diff --git a/inc/MpMusicPlayerPresentationModel.h b/inc/MpMusicPlayerPresentationModel.h new file mode 100644 index 0000000..c135153 --- /dev/null +++ b/inc/MpMusicPlayerPresentationModel.h @@ -0,0 +1,165 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerPresentationModel.h + * @brief This is the header file for MusicPlayerPresentationModel class. + */ + +#ifndef _MP_MUSIC_PLAYER_PRESENTATION_MODEL_H_ +#define _MP_MUSIC_PLAYER_PRESENTATION_MODEL_H_ + +#include +#include +#include +#include "MpContentInformationStruct.h" + +class IMusicPlayerEventListener; + +class PlayerPresentationModel + : public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Media::IPlayerEventListener + /*, public Tizen::Media::IAudioSessionEventListener*/ + , public Tizen::Telephony::ITelephonyCallEventListener +{ +public: + static PlayerPresentationModel* GetInstance(void); + void DestroyPlayerPresentationModel(void); + + result SetContentList(Tizen::Base::Collection::IList* pArgs); + Tizen::Base::String* GetPlayContentPath(void); + Tizen::Base::String* GetPlayContentTitle(void); + Tizen::Base::String* GetPlayContentArtist(void); + Tizen::Graphics::Bitmap* GetPlayContentThumbnail(void); + long GetPlayContentDuration(void); + Tizen::Base::String* GetContentPath(int contentIndex)const; + int GetPreviousContentIndex(void)const; + int GetCurrentContentIndex(void)const; + int GetNextContentIndex(void)const; + int GetContentListCount(void)const; + + result Play(int contentIndex = 0, int sliderPosition = 0, bool bPausePlay = false, bool bPlayPause = false); + void Pause(void); + void Mute(const bool isMute); + void MovePreviousContent(bool forceMove = false); + void MoveNextContent(void); + void SeekToForward(void); + void SeekToRewind(void); + void StopForwardRewind(void); + result SetPlayPosition(int playPosition); + int GetPlayPosition(void); + Tizen::Base::String GetCurrentDuration(void); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Graphics::Bitmap* GetContentAlbumArtN(int contentIndex); + + void AddMusicPlayerEventListener(const IMusicPlayerEventListener& listener); + void RemoveMusicPlayerEventListener(const IMusicPlayerEventListener& listener); + + void SetShuffleEnable(bool shuffleEnable); + void SetRepeatMode(int repeatMode); + result SetVolume(int volume); + bool IsShuffleEnable(void); + bool IsFileExist(int contentIndex)const; + int GetRepeatState(void); + int GetVolume(void); + + Tizen::Media::PlayerState GetPlayerState(void); + bool IsDuringCall(void); + result StartAutoOffTimer(int autoOffValue); + void RemoveContent(const Tizen::Base::String& filePath); + + virtual void OnTelephonyCallStatusChangedN(Tizen::Telephony::CallStatus callStatus, Tizen::Telephony::CallInfo* pCallInfo); + + virtual void OnPlayerOpened(result r); + virtual void OnPlayerReleased(void); + virtual void OnPlayerEndOfClip(void); + virtual void OnPlayerBuffering(int percent); + virtual void OnPlayerErrorOccurred(Tizen::Media::PlayerErrorReason r); + virtual void OnPlayerInterrupted(void); + virtual void OnPlayerSeekCompleted(result r); + virtual void OnPlayerAudioFocusChanged(void); + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + /*virtual void OnAudioSessionInterrupted(void); + virtual void OnAudioSessionInterruptReleased(void); + virtual void OnAudioSessionAudioFocusChanged(void);*/ + +private: + PlayerPresentationModel(void); + PlayerPresentationModel(const PlayerPresentationModel&); + virtual ~PlayerPresentationModel(void); + const PlayerPresentationModel& operator = (const PlayerPresentationModel&); + + void ClosePlayer(void); + + Tizen::Base::String GetFileName(Tizen::Base::String* pFilePath); + + result Construct(void); + result InitializePlayer(void); + + void InitializeProgress(void); + result UpdateContentDB(void); + void GenerateNextIndex(void); + + void Rewind(void); + void Forward(void); + + void CallOnPlayStateChanged(Tizen::Media::PlayerState playerState); + void CallOnPlayContentChanged(int currentContentIndex); + void CallOnPlayContentRemoved(int removedContentIndex); + void CallOnPlayTimeChanged(Tizen::Base::String& currentDuration, int currentPosition); + void CallOnPlayVolumeBarStateChanged(void); + void CallOnPlayPresentationModelDestroying(void); + +private: + Tizen::Media::Player* __pPlayer; + Tizen::Base::Runtime::Timer* __pPlayStateTimer; + Tizen::Base::Runtime::Timer* __pFastForwardTimer; + Tizen::Base::Runtime::Timer* __pFastRewindTimer; + Tizen::Base::Runtime::Timer* __pAutoOffTimer; + Tizen::Base::Runtime::Timer* __pPauseAutoOffTimer; + Tizen::Base::Runtime::Timer* __pVolumeBarStateTimer; + + Tizen::Base::Collection::ArrayList* __pPlayContentList; + Tizen::Base::Collection::LinkedListT __musicPlayerEventListener; + + int __previousContentIndex; + int __currentContentIndex; + int __nextContentIndex; + int __removedContentIndex; + Tizen::Base::String* __pCurrentPlayContentPath; + + Tizen::Base::String* __pCurrentPlayContentTitle; + Tizen::Graphics::Bitmap* __pCurrentPlayContentThumbnail; + Tizen::Base::String* __pCurrentPlayContentArtist; + Tizen::Base::UuId* __pUuIdForFileOnly; + Tizen::Content::AudioContentInfo* __pCurrentAudioContentInfo; + long __currentPlayContentDuration; + + int __repeatMode; + bool __shuffleEnable; + bool __seekCompleted; + bool __isForceChanged; + int __playposition; + Tizen::Media::PlayerState __previousPlayerState; + int __xTimesValue; + int __currentContentTotalDuration; + Tizen::Telephony::CallManager* __pCallManager; + /*bool __audioFocusChanged;*/ + static PlayerPresentationModel* pPlayerPresentationModel; +}; + +#endif // _MP_MUSIC_PLAYER_PRESENTATION_MODEL_H_ diff --git a/inc/MpNotificationTicker.h b/inc/MpNotificationTicker.h new file mode 100644 index 0000000..9115331 --- /dev/null +++ b/inc/MpNotificationTicker.h @@ -0,0 +1,75 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpNotificationTicker.h + * @brief This is the header file for NotificationTicker class. + */ + +#ifndef _MP_NOTIFICATION_TICKER_H_ +#define _MP_NOTIFICATION_TICKER_H_ + +#include +#include +#include +#include + +class NotificationTicker + : public Tizen::Ui::Animations::IAnimationTransactionEventListener + , protected Tizen::Ui::Window +{ +public: + NotificationTicker(void); + virtual ~NotificationTicker(void); + + result Construct(void); + + void SetBoundTicker(Tizen::Graphics::Rectangle rect); + void ShowTicker(const Tizen::Base::String& text, int timeOut = 2000); + result DestoryTicker(void); + +protected: + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual result OnDraw(void); + + virtual void OnAnimationTransactionStarted(int transactionId){} + virtual void OnAnimationTransactionStopped(int transactionId); + virtual void OnAnimationTransactionFinished(int transactionId); + +private: + void DrawBackground(Tizen::Graphics::Canvas& canvas); + Tizen::Graphics::Bitmap* GetCapturedBitmapN(void); + void PlayControlAnimator(bool isShow); + void ForceStopAnimation(void); + +private: + Tizen::Ui::Controls::Panel* __pNotificationTickerPanel; + Tizen::Ui::Controls::Label* __pTickerTextLabel; + Tizen::Graphics::Bitmap* __pBgBitmap; + + Tizen::Graphics::Rectangle __hideStateRectangle; + Tizen::Graphics::Rectangle __showStateRectangle; + + int __showTransactionId; + int __HideTransactionId; + int __timeOut; + + bool __isDestory; +}; + +#endif //_MP_NOTIFICATION_TICKER_H_ \ No newline at end of file diff --git a/inc/MpNowPlayContentPanel.h b/inc/MpNowPlayContentPanel.h new file mode 100644 index 0000000..eaa545a --- /dev/null +++ b/inc/MpNowPlayContentPanel.h @@ -0,0 +1,68 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpNowPlayContentPanel.h + * @brief This is the header file for NowPlayContentPanel class. + */ + +#ifndef _MP_NOW_PLAY_CONTENT_PANEL_H_ +#define _MP_NOW_PLAY_CONTENT_PANEL_H_ + +#include +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpIMusicPlayerEventListener.h" +#include "MpMusicPlayerPresentationModel.h" + +class NowPlayContentPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::ITouchEventListener + , public IMusicPlayerEventListener +{ +public: + NowPlayContentPanel(void); + virtual ~NowPlayContentPanel(void); + result Initialize(void); + bool GetPlayStatus(void); + + virtual void OnPlayStateChanged(Tizen::Media::PlayerState playerState); + virtual void OnPlayContentChanged(int currentContentIndex); + virtual void OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition); + virtual void OnPlayVolumeBarStateChanged(void); + virtual void OnPlayPresentationModelDestroying(void); + + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + +private: + Tizen::Ui::Controls::Label* __pThumbnailLabel; + Tizen::Ui::Controls::Label* __pPlayStatusLabel; + Tizen::Ui::Controls::Label* __pTitleLabel; + Tizen::Ui::Controls::Label* __pTouchLabel; + Tizen::Ui::Controls::Slider* __pPlayStateSlider; + PlayerPresentationModel* __pPresentationModel; +}; + +#endif // _MP_NOW_PLAY_CONTENT_PANEL_H_ \ No newline at end of file diff --git a/inc/MpPanelFactory.h b/inc/MpPanelFactory.h new file mode 100644 index 0000000..e6d79a0 --- /dev/null +++ b/inc/MpPanelFactory.h @@ -0,0 +1,70 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPanelFactory.h + * @brief This is the header file for PanelFactory class. + */ + +#ifndef _MP_PANEL_FACTORY_H_ +#define _MP_PANEL_FACTORY_H_ + +#include + +extern const wchar_t* IDC_ALL_LIST_PANEL; +extern const wchar_t* IDC_PLAYLIST_LIST_PANEL; +extern const wchar_t* IDC_ALBUM_LIST_PANEL; +extern const wchar_t* IDC_ARTIST_LIST_PANEL; +extern const wchar_t* IDC_GENRES_LIST_PANEL; +extern const wchar_t* IDC_COMPOSER_LIST_PANEL; +extern const wchar_t* IDC_YEAR_LIST_PANEL; +extern const wchar_t* IDC_FOLDER_LIST_PANEL; + +extern const wchar_t* IDC_ALL_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_PLAYLIST_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_ALBUM_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_ARTIST_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_GENRES_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_COMPOSER_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_YEAR_LIST_EDITOR_PANEL; +extern const wchar_t* IDC_FOLDER_LIST_EDITOR_PANEL; + +extern const wchar_t* IDC_ALBUM_PICKER_PANEL; +extern const wchar_t* IDC_ARTIST_PICKER_PANEL; +extern const wchar_t* IDC_GENRE_PICKER_PANEL; +extern const wchar_t* IDC_COMPOSER_PICKER_PANEL; +extern const wchar_t* IDC_YEAR_PICKER_PANEL; +extern const wchar_t* IDC_FOLDER_PICKER_PANEL; + +extern const wchar_t* IDC_ALL_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_ALBUM_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_ARTIST_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_GENRE_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_COMPOSER_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_YEAR_CONTENT_PICKER_PANEL; +extern const wchar_t* IDC_FOLDER_CONTENT_PICKER_PANEL; + +class PanelFactory + : public Tizen::Ui::Scenes::IPanelFactory +{ +public: + PanelFactory(void); + virtual ~PanelFactory(void); + + virtual Tizen::Ui::Controls::Panel* CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _MP_PANEL_FACTORY_H_ \ No newline at end of file diff --git a/inc/MpPlaylistContentListForm.h b/inc/MpPlaylistContentListForm.h new file mode 100644 index 0000000..1cd5c00 --- /dev/null +++ b/inc/MpPlaylistContentListForm.h @@ -0,0 +1,108 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistContentListForm.h + * @brief This is the header file for PlaylistContentListForm class. + */ + +#ifndef _MP_PLAYLIST_CONTENT_LIST_FORM_H_ +#define _MP_PLAYLIST_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class NowPlayContentPanel; +class PlaylistListPresentationModel; + +class PlaylistContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + PlaylistContentListForm(void); + ~PlaylistContentListForm(void); + + virtual result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual int GetCheckedItemCount(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + + virtual bool IsEmptyContentList(void); + + virtual result SetHeader(void); + virtual void SetItemCheckedAll(bool isChecked); + + virtual void UpdateTableView(void); + virtual void UpdateContentList(void); + +private: + result Construct(void); + result CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + Tizen::Base::Collection::ArrayList* GetSearchResultContentList(int itemIndex); + Tizen::Base::Collection::ArrayList* GetAudioContentInfoContentList(int itemIndex); + void RemoveCheckedTableviewItem(bool itemRemove); + void SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status); + +private: + Tizen::Ui::Controls::TableView* __pContentListTableView; + Tizen::Graphics::Bitmap* __pThumbnail; + PlaylistListPresentationModel* __pPresentationModel; + + int __checkedItemCount; + int __currentContentType; + int __activatedStateContextItem; +}; + +#endif // _MP_PLAYLIST_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpPlaylistCreatorForm.h b/inc/MpPlaylistCreatorForm.h new file mode 100644 index 0000000..10e57d6 --- /dev/null +++ b/inc/MpPlaylistCreatorForm.h @@ -0,0 +1,76 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistCreatorForm.h + * @brief This is the header file for PlaylistCreatorForm class. + */ + +#ifndef _MP_PLAYLIST_CREATOR_FORM_H_ +#define _MP_PLAYLIST_CREATOR_FORM_H_ + +#include +#include +#include +#include +#include "MpIMusicContentUpdateEventListner.h" + + +class PlaylistEditorPresentationModel; + +class PlaylistCreatorForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IMusicContentUpdateEventListner +{ +public: + PlaylistCreatorForm(void); + ~PlaylistCreatorForm(void); + void Initialize(void); + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnKeypadActionPerformed(Tizen::Ui::Control &source, + Tizen::Ui::KeypadAction keypadAction); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + +private: + PlaylistEditorPresentationModel* __pPlaylistEditorPresentationModel; + Tizen::Ui::Controls::EditField* __pPlaylistEditField; + Tizen::Base::Collection::IList* __pDataList; + Tizen::Ui::Scenes::SceneId __previousSceneId; +}; + +#endif // _MP_PLAYLIST_CREATOR_FORM_H_ diff --git a/inc/MpPlaylistDB.h b/inc/MpPlaylistDB.h new file mode 100644 index 0000000..8203a60 --- /dev/null +++ b/inc/MpPlaylistDB.h @@ -0,0 +1,43 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistDB.h + * @brief This is the header file for PlaylistDB class. + */ + +#ifndef _MP_PLAYLIST_DB_H_ +#define _MP_PLAYLIST_DB_H_ + +#include "FIo.h" + +class PlaylistDB + : public Tizen::Base::Object +{ +public: + PlaylistDB(void); + virtual ~PlaylistDB(void); + + result CreatePlaylistDatabase(void); + result Insert(Tizen::Base::String& contentId, int playCount, Tizen::Base::String& playTime); + result Update(Tizen::Base::String& contentId, int playCount, Tizen::Base::String& playTime); + result Delete(Tizen::Base::String& contentId); + Tizen::Io::DbEnumerator* SearchN(int index); + result Read(Tizen::Base::String& contentId); + Tizen::Base::Collection::ArrayList* ReadValueN(Tizen::Base::String& contentId); +}; + +#endif // _MP_PLAYLIST_DB_H_ \ No newline at end of file diff --git a/inc/MpPlaylistEditorPresentationModel.h b/inc/MpPlaylistEditorPresentationModel.h new file mode 100644 index 0000000..c470789 --- /dev/null +++ b/inc/MpPlaylistEditorPresentationModel.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistEditorPresentationModel.h + * @brief This is the header file for PlaylistEditorPresentationModel class. + */ + +#ifndef _MP_PLAYLIST_EDITOR_PRESENTATION_MODEL_H_ +#define _MP_PLAYLIST_EDITOR_PRESENTATION_MODEL_H_ + +#include +#include +#include +#include +#include + +class PlaylistEditorPresentationModel +{ +public: + static PlaylistEditorPresentationModel* GetInstance(void); + + int GetPlayListItemCount(Tizen::Base::String& playlist); + int GetAllPlayListCount(void); + Tizen::Base::Collection::IList* GetAllPlayListNameN(void); + Tizen::Base::String GetPlayListName(int playlistIndex); + Tizen::Graphics::Bitmap* GetPlayListItemBitmap(Tizen::Base::String& playlist); + Tizen::Content::ContentId GetPlayListItemContentId(Tizen::Base::String& playlist); + result SetPlayListName(const Tizen::Base::String& oldPlayListName, const Tizen::Base::String& newPlayListName); + bool IsPlaylistExist(Tizen::Base::String& playlist); + void RemovePlayList(Tizen::Base::String& playlistName); + void AddItem(const Tizen::Content::ContentId& contentId, Tizen::Base::String& name); + +private: + PlaylistEditorPresentationModel(void); + PlaylistEditorPresentationModel(const PlaylistEditorPresentationModel&); + virtual ~PlaylistEditorPresentationModel(void); + const PlaylistEditorPresentationModel& operator = (const PlaylistEditorPresentationModel&); + + result Construct(void); + +private: + static PlaylistEditorPresentationModel* pPlaylistEditorPresentationModel; +}; + +#endif // _MP_PLAYLIST_EDITOR_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpPlaylistListEditorPanel.h b/inc/MpPlaylistListEditorPanel.h new file mode 100644 index 0000000..9c113c9 --- /dev/null +++ b/inc/MpPlaylistListEditorPanel.h @@ -0,0 +1,88 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListEditorPanel.h + * @brief This is the header file for PlaylistListEditorPanell class. + */ + +#ifndef _MP_PLAYLIST_LIST_EDITOR_PANEL_H_ +#define _MP_PLAYLIST_LIST_EDITOR_PANEL_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpContentEditPanel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" + +class PlaylistEditorPresentationModel; + +class PlaylistListEditorPanel + : public ContentEditPanel + , public ThumbnailBase +{ +public: + PlaylistListEditorPanel(void); + ~PlaylistListEditorPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + +protected: + virtual Tizen::Base::String GetNoContentText(void); + virtual bool IsEmptyContentList(void); + virtual void UpdateContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const Tizen::Base::String& title, int itemIndex); + void SetEditHeaderStyle(void); + +private: + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Graphics::Bitmap* __pThumbnail; + PlaylistEditorPresentationModel* __pPresentationModel; + Tizen::Base::String* __pPlaylistName; +}; + +#endif // _MP_PLAYLIST_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpPlaylistListPanel.h b/inc/MpPlaylistListPanel.h new file mode 100644 index 0000000..86ce30e --- /dev/null +++ b/inc/MpPlaylistListPanel.h @@ -0,0 +1,99 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListPanel.h + * @brief This is the header file for PlaylistListPanel class. + */ + +#ifndef _MP_PLAY_LIST_LIST_PANEL_H_ +#define _MP_PLAY_LIST_LIST_PANEL_H_ + +#include +#include +#include +#include +#include +#include "MpContentLibaryPanel.h" +#include "MpThumbnailBase.h" + +class PlaylistListPresentationModel; + +class PlaylistListPanel + : public ContentLibaryPanel + , public ThumbnailBase + , public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + PlaylistListPanel(void); + virtual ~PlaylistListPanel(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + + virtual void OnTimerExpired(Tizen::Base::Runtime::Timer& timer); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + +protected: + virtual void UpdateContentList(void); + virtual bool IsEmptyContentList(void); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent, Tizen::Base::String& labelName, const Tizen::Graphics::Bitmap& bitmap, int totalCount); + +private: + PlaylistListPresentationModel* __pPlaylistListPresentationModel; + Tizen::Base::Runtime::Timer* __pLaunchPlayerTimer; + Tizen::Graphics::Bitmap* __pThumbnail; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem_default; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem_user; + Tizen::Ui::Controls::Popup* __pDeletePopup; + int __selectedItemIndex; + Tizen::Base::String* __pPlaylistName; +}; + +#endif // _MP_PLAY_LIST_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpPlaylistListPresentationModel.h b/inc/MpPlaylistListPresentationModel.h new file mode 100644 index 0000000..8edc048 --- /dev/null +++ b/inc/MpPlaylistListPresentationModel.h @@ -0,0 +1,69 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListPresentationModel.h + * @brief This is the header file for PlaylistListPresentationModel class. + */ + +#ifndef _MP_PLAYLIST_LIST_PRESENTATION_MODEL_H_ +#define _MP_PLAYLIST_LIST_PRESENTATION_MODEL_H_ + +#include +#include +#include +#include +#include +#include "MpContentInformationStruct.h" + +class PlaylistListPresentationModel +{ +public: + static PlaylistListPresentationModel* GetInstance(void); + void DestroyPlaylistListPresentationModel(void); + + int GetAllPlayListCount(void); + int GetContentCount(void); + int GetPlayListItemCount(Tizen::Base::String& playlist); + + result SetPlayListName(const Tizen::Base::String& oldPlayListName, const Tizen::Base::String& newPlayListName); + void RemovePlayList(Tizen::Base::String& playlistName); + void UpdatePlaylistList(void); + void UpdatePlaylistContentList(const int contentType, const Tizen::Base::String& playlistName); + void DeleteContent(int contentType, const ContentInformation& contentInfoStruct); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Base::String* GetPlayListName(int playlistIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int contentType); + Tizen::Graphics::Bitmap* GetPlayListItemBitmap(Tizen::Base::String& playList); + Tizen::Content::ContentId GetPlayListItemContentId(Tizen::Base::String& playlist); + void AddContent(const Tizen::Content::ContentId& contentId, int playlistIndex); + +private: + PlaylistListPresentationModel(void); + PlaylistListPresentationModel(const PlaylistListPresentationModel&); + virtual ~PlaylistListPresentationModel(void); + const PlaylistListPresentationModel& operator = (const PlaylistListPresentationModel&); + result Construct(void); + +private: + static PlaylistListPresentationModel* pPlaylistListPresentationModel; + Tizen::Base::Collection::IList* __pPlaylistList; + Tizen::Base::Collection::IList* __pContentList; + int __contentType; + Tizen::Base::String* __pQueryName; +}; + +#endif // _MP_PLAYLIST_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpPlaylistPickerPopup.h b/inc/MpPlaylistPickerPopup.h new file mode 100644 index 0000000..51165ea --- /dev/null +++ b/inc/MpPlaylistPickerPopup.h @@ -0,0 +1,111 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistPickerPopup.h + * @brief This is the header file for PlaylistPickerPopup class. + */ + +#ifndef _MP_PLAY_LIST_PICKER_POPUP_H_ +#define _MP_PLAY_LIST_PICKER_POPUP_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class PlaylistListPresentationModel; + +class PlayListPickerPopup + : public Tizen::Ui::Controls::Popup + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + PlayListPickerPopup(void); + ~PlayListPickerPopup(void); + result Initialize(Tizen::Ui::Control* pControl, Tizen::Base::Collection::IList* pDataList); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent,Tizen::Base::String& labelName); + +private: + PlaylistListPresentationModel* __pPlaylistListPresentationModel; + Tizen::Ui::Controls::TableView* __pPlaylistTableView; + Tizen::Ui::Controls::Button* __pCancelButton; + Tizen::Ui::Controls::Button* __pCreateButton; + int __itemIndex; + Tizen::Base::Collection::IList* __pPlaylistContentList; + Tizen::Ui::Control* __pControl; +}; + +#endif // _MP_PLAY_LIST_PICKER_POPUP_H_ \ No newline at end of file diff --git a/inc/MpPlaylistReNameForm.h b/inc/MpPlaylistReNameForm.h new file mode 100644 index 0000000..92b7ca9 --- /dev/null +++ b/inc/MpPlaylistReNameForm.h @@ -0,0 +1,78 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistReNameForm.h + * @brief This is the header file for PlaylistReNameForm class. + */ + +#ifndef _MP_PLAYLIST_RENAME_FORM_H_ +#define _MP_PLAYLIST_RENAME_FORM_H_ + +#include +#include +#include +#include +#include +#include +#include "MpIMusicContentUpdateEventListner.h" + +class PlaylistEditorPresentationModel; + +class PlaylistReNameForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IMusicContentUpdateEventListner +{ +public: + PlaylistReNameForm(void); + ~PlaylistReNameForm(void); + void Initialize(void); + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnKeypadActionPerformed(Tizen::Ui::Control &source, + Tizen::Ui::KeypadAction keypadAction); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + +private: + PlaylistEditorPresentationModel* __pPlaylistEditorPresentationModel; + Tizen::Ui::Controls::EditField* __pPlaylistEditField; + Tizen::Base::String __playlistName; + Tizen::Base::String __orignalPlaylistName; + int __selectedPlaylistIndex; +}; + +#endif // _MP_PLAYLIST_RENAME_FORM_H_ \ No newline at end of file diff --git a/inc/MpResourceManager.h b/inc/MpResourceManager.h new file mode 100644 index 0000000..1430587 --- /dev/null +++ b/inc/MpResourceManager.h @@ -0,0 +1,43 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpResourceManager.h + * @brief This is the header file for ResourceManager class. + */ + +#ifndef _MP_RESOURCE_MANAGER_H_ +#define _MP_RESOURCE_MANAGER_H_ + +#include +#include + +namespace Tizen { namespace Graphics { +class Bitmap; +}} + +class ResourceManager +{ +public: + static Tizen::Graphics::Bitmap* GetBitmapN(const Tizen::Base::String& resourceName); + static Tizen::Base::String GetString(const Tizen::Base::String& id); + +private: + ResourceManager(void); + virtual ~ResourceManager(void); +}; + +#endif // _MP_RESOURCE_MANAGER_H_ \ No newline at end of file diff --git a/inc/MpSceneRegister.h b/inc/MpSceneRegister.h new file mode 100644 index 0000000..ee3378d --- /dev/null +++ b/inc/MpSceneRegister.h @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSceneRegister.h + * @brief This is the header file for SceneRegister class. + */ + +#ifndef _MP_SCENE_REGISTER_H_ +#define _MP_SCENE_REGISTER_H_ + +#include +#include + +extern const wchar_t* IDSCN_ALL_LIST; +extern const wchar_t* IDSCN_ALL_LIST_EDITOR; +extern const wchar_t* IDSCN_ALL_CONTENT_PICKER; + +extern const wchar_t* IDSCN_PLAYLIST_LIST; +extern const wchar_t* IDSCN_PLAYLIST_LIST_EDITOR; +extern const wchar_t* IDSCN_PLAYLIST_CREATOR; +extern const wchar_t* IDSCN_PLAYLIST_RENAME; +extern const wchar_t* IDSCN_PLAYLIST_NAME_EDITOR; + +extern const wchar_t* IDSCN_ALBUM_LIST; +extern const wchar_t* IDSCN_ALBUM_LIST_EDITOR; +extern const wchar_t* IDSCN_ALBUM_PICKER; +extern const wchar_t* IDSCN_ALBUM_CONTENT_PICKER; +extern const wchar_t* IDSCN_ALBUM_CONTENT_LIST; +extern const wchar_t* IDSCN_ALBUM_CONTENT_LIST_EDITOR; + +extern const wchar_t* IDSCN_ARTIST_LIST; +extern const wchar_t* IDSCN_ARTIST_LIST_EDITOR; +extern const wchar_t* IDSCN_ARTIST_PICKER; +extern const wchar_t* IDSCN_ARTIST_CONTENT_LIST; +extern const wchar_t* IDSCN_ARTIST_CONTENT_PICKER; +extern const wchar_t* IDSCN_ARTIST_ALBUM_LIST; +extern const wchar_t* IDSCN_ARTIST_ALBUM_LIST_EDITOR; +extern const wchar_t* IDSCN_ARTIST_ALL_SONG_LIST; + +extern const wchar_t* IDSCN_GENRE_LIST; +extern const wchar_t* IDSCN_GENRE_LIST_EDITOR; +extern const wchar_t* IDSCN_GENRE_PICKER; +extern const wchar_t* IDSCN_GENRE_CONTENT_PICKER; +extern const wchar_t* IDSCN_GENRE_CONTENT_LIST; +extern const wchar_t* IDSCN_GENRE_CONTENT_LIST_EDITOR; + +extern const wchar_t* IDSCN_COMPOSER_LIST; +extern const wchar_t* IDSCN_COMPOSER_LIST_EDITOR; +extern const wchar_t* IDSCN_COMPOSER_PICKER; +extern const wchar_t* IDSCN_COMPOSER_CONTENT_PICKER; +extern const wchar_t* IDSCN_COMPOSER_CONTENT_LIST; +extern const wchar_t* IDSCN_COMPOSER_CONTENT_LIST_EDITOR; + +extern const wchar_t* IDSCN_YEAR_LIST; +extern const wchar_t* IDSCN_YEAR_LIST_EDITOR; +extern const wchar_t* IDSCN_YEAR_PICKER; +extern const wchar_t* IDSCN_YEAR_CONTENT_PICKER; +extern const wchar_t* IDSCN_YEAR_CONTENT_LIST; +extern const wchar_t* IDSCN_YEAR_CONTENT_LIST_EDITOR; + +extern const wchar_t* IDSCN_FOLDER_LIST; +extern const wchar_t* IDSCN_FOLDER_LIST_EDITOR; +extern const wchar_t* IDSCN_FOLDER_PICKER; +extern const wchar_t* IDSCN_FOLDER_CONTENT_PICKER; +extern const wchar_t* IDSCN_FOLDER_CONTENT_LIST; + +extern const wchar_t* IDSCN_SEARCH; +extern const wchar_t* IDSCN_PLAYER; +extern const wchar_t* IDSCN_MUSIC_SETTING; +extern const wchar_t* IDSCN_PLAYLIST_CONTENT_LIST; +extern const wchar_t* IDSCN_USER_PLAYLIST_CONTENT_LIST; +extern const wchar_t* IDSCN_PLAYLIST_CONTENT_LIST_EDITOR; +extern const wchar_t* IDSCN_CONTENT_DETAIL; +extern const wchar_t* IDSCN_ARTIST_ALBUM_SEARCH_LIST; + +class SceneRegister +{ +public: + static result RegisterAllScenes(void); + +private: + SceneRegister(void); + ~SceneRegister(void); +}; + +#endif // _MP_SCENE_REGISTER_H_ \ No newline at end of file diff --git a/inc/MpSearchForm.h b/inc/MpSearchForm.h new file mode 100644 index 0000000..e313a6c --- /dev/null +++ b/inc/MpSearchForm.h @@ -0,0 +1,127 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchForm.h + * @brief This is the header file for SearchForm class. + */ + +#ifndef _MP_SEARCH_FORM_H_ +#define _MP_SEARCH_FORM_H_ + +#include +#include +#include +#include +#include +#include +#include "MpIMusicContentUpdateEventListner.h" +#include "MpIFontChangeEventListener.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpSearchPresentationModel.h" +#include "MpTypes.h" + +class SearchForm + : public IMusicContentUpdateEventListner + , public IFontChangeEventListner + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::ISearchBarEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::Controls::IScrollEventListener + , public Tizen::Ui::IKeypadEventListener + , public Tizen::Ui::ITextEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::IOrientationEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + SearchForm(void); + virtual ~SearchForm(void); + bool Initialize(void); + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnSearchBarModeChanged(Tizen::Ui::Controls::SearchBar& source, + Tizen::Ui::Controls::SearchBarMode mode); + virtual void OnSearchBarContentAreaResized(Tizen::Ui::Controls::SearchBar& source, + Tizen::Graphics::Dimension& size); + + virtual void OnTextValueChanged(const Tizen::Ui::Control& source); + virtual void OnTextValueChangeCanceled(const Tizen::Ui::Control& source); + + virtual void OnKeypadActionPerformed(Tizen::Ui::Control& source, + Tizen::Ui::KeypadAction keypadAction); + virtual void OnKeypadClosed(Tizen::Ui::Control& source); + virtual void OnKeypadOpened(Tizen::Ui::Control& source); + virtual void OnKeypadWillOpen(Tizen::Ui::Control& source); + virtual void OnKeypadBoundsChanged(Tizen::Ui::Control& source); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual void OnScrollEndReached(Tizen::Ui::Control& source, Tizen::Ui::Controls::ScrollEndEvent type); + virtual void OnScrollPositionChanged (Tizen::Ui::Control& source, int scrollPos); + virtual void OnScrollStopped(Tizen::Ui::Control& source); + + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + virtual void OnFontSizeChanged(void); + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); + +private: + result CreateGroupNameTableViewItem(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& GroupName); + Tizen::Base::String MakeQuery(const Tizen::Base::String& WhereExpr, const Tizen::Base::String& SearchName); + void CreateSearchResultText(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& searchName, const SearchName name); + void CreateSubArtistNameText(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& ArtistName); + +private: + Tizen::Ui::Controls::ListView* __pSearchListView; + Tizen::Ui::Controls::SearchBar* __pSearchBar; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Base::String* __pSceneId; + SearchPresentationModel* __pPresentationModel; + Tizen::Base::String __fontSizeValue; + int __itemHeight; + int __fontSize; +}; + +#endif // _MP_SEARCH_FORM_H_ diff --git a/inc/MpSearchListItem.h b/inc/MpSearchListItem.h new file mode 100644 index 0000000..841efb7 --- /dev/null +++ b/inc/MpSearchListItem.h @@ -0,0 +1,49 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchListItem.h + * @brief This is the header file for the SearchListItem class. + */ + +#ifndef _MP_SEARCH_LIST_ITEM_H_ +#define _MP_SEARCH_LIST_ITEM_H_ + +#include +#include +#include +#include "MpTypes.h" + +class SearchListItem + : public Tizen::Ui::Controls::ICustomElement +{ +public: + SearchListItem(const Tizen::Base::String& searchKey, const Tizen::Base::String& searchName, int fontsize, int itemHeight, const SearchName name); + virtual ~SearchListItem(void); + + Tizen::Graphics::EnrichedText* GetDisplayEnrichedTextN(const Tizen::Graphics::Rectangle& rect, Tizen::Ui::Controls::ListItemDrawingStatus itemStatus, bool isSearchingTextVisible = true); + + virtual bool OnDraw(Tizen::Graphics::Canvas& canvas, const Tizen::Graphics::Rectangle& rect, Tizen::Ui::Controls::ListItemDrawingStatus itemStatus); + +private: + int __fontSize; + int __itemHeight; + Tizen::Base::String __keyword; + Tizen::Base::String __searchedText; + SearchName __name; +}; + +#endif /* _MP_SEARCH_LIST_ITEM_H_ */ diff --git a/inc/MpSearchPresentationModel.h b/inc/MpSearchPresentationModel.h new file mode 100644 index 0000000..c919f24 --- /dev/null +++ b/inc/MpSearchPresentationModel.h @@ -0,0 +1,56 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchPresentationModel.h + * @brief This is the header file for SearchPresentationModel class. + */ + +#ifndef _MP_SEARCH_PRESENTATION_MODEL_H_ +#define _MP_SEARCH_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class SearchPresentationModel +{ +public: + static SearchPresentationModel* GetInstance(void); + int GetAlbumIndex(void); + int GetArtistIndex(void); + int GetSongIndex(void); + int GetTotalContentCount(void); + void InitializeContentList(const Tizen::Base::String& keyword); + void Release(void); + ContentInformation* GetContentInfoN(int index); + void RemoveSearchResult(void); + +private: + SearchPresentationModel(void); + SearchPresentationModel(SearchPresentationModel& SearchPresentationModel); + const SearchPresentationModel& operator = (const SearchPresentationModel& SearchPresentationModel); + ~SearchPresentationModel(void); + result Construct(void); + Tizen::Base::String MakeQuery(const Tizen::Base::String& WhereExpr, const Tizen::Base::String& keyword); + void RemoveDuplicateEntries(Tizen::Base::Collection::IList& list, const bool isArtist = true); + +private: + static SearchPresentationModel* pSearchPresentationModelInstance; + Tizen::Base::Collection::IList* __pSearchList; +}; + +#endif // _MP_SEARCH_PRESENTATION_MODEL_H_ diff --git a/inc/MpSetAsPopup.h b/inc/MpSetAsPopup.h new file mode 100644 index 0000000..e5092bb --- /dev/null +++ b/inc/MpSetAsPopup.h @@ -0,0 +1,109 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSetAsPopup.h + * @brief This is the header file for SetAsPopup class. + */ + +#ifndef _MP_SET_AS_POPUP_H_ +#define _MP_SET_AS_POPUP_H_ + +#include +#include +#include +#include +#include + +class SetAsPopup + : public Tizen::Ui::Controls::Popup + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::App::IAppControlResponseListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + SetAsPopup(void); + virtual ~SetAsPopup(void); + result Initialize(Tizen::Ui::Control* pControl); + + void SetCurrentContentPath(Tizen::Base::String* contentPath); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + result CreateTableViewItem(Tizen::Ui::Container& parent,Tizen::Base::String& labelName); + +private: + Tizen::Ui::Controls::TableView* __pSetAsItemTableView; + Tizen::Ui::Controls::Button* __pCancelButton; + Tizen::Base::String* __pCurrentContentPath; + Tizen::Ui::Control* __pControl; +}; + +#endif // _MP_SET_AS_POPUP_H_ \ No newline at end of file diff --git a/inc/MpSettingForm.h b/inc/MpSettingForm.h new file mode 100644 index 0000000..a6fe217 --- /dev/null +++ b/inc/MpSettingForm.h @@ -0,0 +1,91 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSettingForm.h + * @brief This is the header file for SettingForm class. + */ + +#ifndef _MP_SETTING_FORM_H_ +#define _MP_SETTING_FORM_H_ + +class SettingPresentationModel; +class AllListPresentationModel; + +class SettingForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IGroupedTableViewItemEventListener + , public Tizen::Ui::Controls::IGroupedTableViewItemProvider + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::IFocusEventListener + , public Tizen::Ui::IKeyEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + SettingForm(void); + virtual ~SettingForm(void); + void Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetGroupCount(void); + virtual int GetItemCount(int groupIndex); + virtual Tizen::Ui::Controls::TableViewGroupItem* CreateGroupItem(int groupIndex, int itemWidth); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(int groupIndex, int itemIndex, int itemWidth); + virtual bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual void UpdateItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual int GetDefaultItemHeight(void); + virtual int GetDefaultGroupItemHeight(void); + + virtual void OnGroupedTableViewGroupItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + + virtual void OnFocusGained(const Tizen::Ui::Control& source); + virtual void OnFocusLost(const Tizen::Ui::Control& source); + + virtual void OnKeyLongPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + virtual void OnKeyReleased(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode); + + virtual void OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo){} + virtual void OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo & touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo); + +private: + Tizen::Base::String GetAutoOffString(void); + +private: + SettingPresentationModel* __pSettingPresentationModel; + AllListPresentationModel* __pPresentationModel; + Tizen::Ui::Controls::GroupedTableView* __pSettingTableView; +}; + +#endif // _MP_SETTING_FORM_H_ diff --git a/inc/MpSettingPresentationModel.h b/inc/MpSettingPresentationModel.h new file mode 100644 index 0000000..e80bfd7 --- /dev/null +++ b/inc/MpSettingPresentationModel.h @@ -0,0 +1,58 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSettingPresentationModel.h + * @brief This is the header file for SettingPresentationModel class. + */ + +#ifndef _MP_SETTING_PRESENTATION_MODEL_H_ +#define _MP_SETTING_PRESENTATION_MODEL_H_ + +#include +#include +#include + +class SettingPresentationModel +{ +public: + static SettingPresentationModel* GetInstance(void); + void DestroySettingPresentationModel(void); + + void InitializeSettingValue(void); + void SetTabEnable(int tabId, bool enabled); + bool IsTabEnable(int tabId); + + int SetAutoOffTime(int autoOffTime); + int GetAutoOffTime(void); + +private: + SettingPresentationModel(void); + SettingPresentationModel(const SettingPresentationModel&); + virtual ~SettingPresentationModel(void); + const SettingPresentationModel& operator = (const SettingPresentationModel&); + + result Construct(void); + +private: + static SettingPresentationModel* pSettingPresentationModel; + int __autoOffTime; + bool __isMostPlayed; + bool __isRecentlyPlayed; + bool __isRecentlyAdd; +}; + +#endif // _MP_SETTING_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpSharePopup.h b/inc/MpSharePopup.h new file mode 100644 index 0000000..b19711d --- /dev/null +++ b/inc/MpSharePopup.h @@ -0,0 +1,104 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSharePopup.h + * @brief This is the header file for SharePopup class. + */ + +#ifndef _MP_SHARE_POPUP_H_ +#define _MP_SHARE_POPUP_H_ + +#include +#include +#include +#include +#include + +class SharePopup + : public Tizen::Ui::Controls::Popup + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::ITouchEventListener + , public Tizen::Ui::IPropagatedKeyEventListener +{ +public: + SharePopup(void); + virtual ~SharePopup(void); + result Initialize(Tizen::Ui::Control* pControl); + + void SetArguments(Tizen::Base::Collection::IList* pIList); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + virtual void OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo); + + virtual bool OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo); + virtual bool OnPreviewKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + virtual bool OnPreviewKeyReleased(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo){return false;} + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + result LaunchAppControl(const Tizen::Base::String& operationId, const Tizen::Base::String& providerId); + +private: + Tizen::Ui::Controls::TableView* __pShareItemTableView; + Tizen::Ui::Controls::Button* __pCancelButton; + Tizen::Base::Collection::HashMap* __pDataList; + Tizen::Ui::Control* __pControl; +}; + +#endif // _MP_SHARE_POPUP_H_ diff --git a/inc/MpSoundPathPopup.h b/inc/MpSoundPathPopup.h new file mode 100644 index 0000000..b2b84d2 --- /dev/null +++ b/inc/MpSoundPathPopup.h @@ -0,0 +1,79 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSoundPathPopup.h + * @brief This is the header file for SoundPathPopup class. + */ + +#ifndef _MP_SOUND_PATH_POPUP_H_ +#define _MP_SOUND_PATH_POPUP_H_ + +#include +#include +#include +#include +#include +#include + +class SoundPathPopup + : public Tizen::Ui::Controls::Popup + , public Tizen::Ui::IActionEventListener + , public Tizen::Media::IAudioRouteEventListener +{ +public: + SoundPathPopup(void); + virtual ~SoundPathPopup(void); + + result Initialize(void); + void ShowPopup(bool state); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnActiveAudioRouteChanged(const Tizen::Media::AudioRouteInfo& route); + virtual void OnAudioRouteAdded(const Tizen::Media::AudioRouteInfo& route); + virtual void OnAudioRouteRemoved(const Tizen::Media::AudioRouteInfo& route); + +private: + enum AvailableAudioRoute + { + AUDIO_ROUTE_NONE, + AUDIO_ROUTE_SPEAKER, + AUDIO_ROUTE_RECEIVER, + AUDIO_ROUTE_WIRED_ACCESSORY, + AUDIO_ROUTE_BT_SCO, + AUDIO_ROUTE_BT_A2DP, + AUDIO_ROUTE_MAX + }; + + enum SelectedAudioRoute + { + AUDIO_ROUTE_SPEAKER_ONLY, + AUDIO_ROUTE_BT_A2DP_AND_SPEAKER, + AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER, + AUDIO_ROUTE_BT_A2DP_AND_WIRED_ACCESSORY + }; + + Tizen::Ui::Controls::Button* __pCloseButton; + Tizen::Ui::Controls::CheckButton* __pCheckButton1st; + Tizen::Ui::Controls::CheckButton* __pCheckButton2nd; + + Tizen::Media::AudioRouteManager* __pAudioRouteManager; + + bool __availableAudioRoute[AUDIO_ROUTE_MAX]; + int __selectedAudioRouteMode; +}; + +#endif // _MP_SOUND_PATH_POPUP_H_ \ No newline at end of file diff --git a/inc/MpTableviewItemTag.h b/inc/MpTableviewItemTag.h new file mode 100644 index 0000000..5c595a2 --- /dev/null +++ b/inc/MpTableviewItemTag.h @@ -0,0 +1,42 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpTableviewItemTag.cpp + * @brief This is the implementation file for TableviewItemTag class. + */ + +#ifndef _MP_TABLE_VIEW_ITEM_TAG_H_ +#define _MP_TABLE_VIEW_ITEM_TAG_H_ + +#include + +class TableviewItemTag + : public Tizen::Base::Object +{ +public: + explicit TableviewItemTag(int groupIndex, int itemIndex = -1); + virtual ~TableviewItemTag(void); + +private: + TableviewItemTag(void); + +public: + int __groupIndex; + int __itemIndex; +}; + +#endif // _MP_TABLE_VIEW_ITEM_TAG_H_ \ No newline at end of file diff --git a/inc/MpThumbnailBase.h b/inc/MpThumbnailBase.h new file mode 100644 index 0000000..2295a66 --- /dev/null +++ b/inc/MpThumbnailBase.h @@ -0,0 +1,62 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailBase.h + * @brief This is the header file for ThumbnailBase class. + */ + +#ifndef _MP_THUMBNAIL_BASE_H_ +#define _MP_THUMBNAIL_BASE_H_ + +#include +#include +#include +#include "MpThumbnailEvent.h" +#include "MpThumbnailEventListener.h" + +class ThumbnailInfo; +class IThumbnailProviderHandler; + +class ThumbnailBase + : public IThumbnailEventListener +{ +public: + ThumbnailBase(void); + virtual ~ThumbnailBase(void); + + result Construct(void); + void Stop(void); + void RequestThumbnail(const Tizen::Content::ContentId& contentId, Tizen::Base::Object* pParam = null) const; + void CancelAllThumbnailRequest(void); + const Tizen::Graphics::Bitmap* GetDefaultThumbnail(void) const; + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) = 0; + +private: + void SetThumbnailEventListner(void); + void RemoveThumbnailEventListner(void); + ThumbnailInfo* GetThumbnailInfo(Tizen::Base::Runtime::IEventArg& eventArg); + + void OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg); + +private: + IThumbnailProviderHandler* __pIThumbnailProviderHandler; + ThumbnailEvent* __pThumbnailEvent; + bool __isForceStop; +}; + +#endif // _MP_THUMBNAIL_BASE_H_ diff --git a/inc/MpThumbnailEvent.h b/inc/MpThumbnailEvent.h new file mode 100644 index 0000000..40f96b4 --- /dev/null +++ b/inc/MpThumbnailEvent.h @@ -0,0 +1,40 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailEvent.h + * @brief This is the header file for ThumbnailEvent class. + */ + +#ifndef _MP_THUMBNAIL_EVENT_H_ +#define _MP_THUMBNAIL_EVENT_H_ + +#include + +class IThumbnailEventListener; + +class ThumbnailEvent + : public Tizen::Base::Runtime::Event +{ +public: + virtual ~ThumbnailEvent(void); + +protected: + virtual void FireImpl(Tizen::Base::Runtime::IEventListener& listener, + const Tizen::Base::Runtime::IEventArg& eventArg); +}; + +#endif // _MP_THUMBNAIL_EVENT_H_ diff --git a/inc/MpThumbnailEventArg.h b/inc/MpThumbnailEventArg.h new file mode 100644 index 0000000..f5b0391 --- /dev/null +++ b/inc/MpThumbnailEventArg.h @@ -0,0 +1,41 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailEventArg.h + * @brief This is the header file for ThumbnailEventArg class. + */ + +#ifndef _MP_THUMBNAIL_EVENT_ARG_H_ +#define _MP_THUMBNAIL_EVENT_ARG_H_ + +#include + +class ThumbnailInfo; + +class ThumbnailEventArg + : public Tizen::Base::Runtime::IEventArg +{ +public: + ThumbnailEventArg(ThumbnailInfo* pThumbnailInfo); + virtual ~ThumbnailEventArg(void); + virtual ThumbnailInfo* GetThumbnailInfoN(void); + +protected: + ThumbnailInfo* _pThumbnailInfo; +}; + +#endif // _MP_THUMBNAIL_EVENT_ARG_H_ diff --git a/inc/MpThumbnailEventListener.h b/inc/MpThumbnailEventListener.h new file mode 100644 index 0000000..75c768a --- /dev/null +++ b/inc/MpThumbnailEventListener.h @@ -0,0 +1,35 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailEventListener.h + * @brief This is the header file for ThumbnailEventListener class. + */ + +#ifndef _MP_THUMBNAIL_EVENT_LISTENER_H_ +#define _MP_THUMBNAIL_EVENT_LISTENER_H_ + +#include + +class IThumbnailEventListener + : public Tizen::Base::Runtime::IEventListener +{ +public: + virtual ~IThumbnailEventListener(void){} + virtual void OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg) = 0; +}; + +#endif // _MP_THUMBNAIL_EVENT_LISTENER_H_ diff --git a/inc/MpThumbnailInfo.h b/inc/MpThumbnailInfo.h new file mode 100644 index 0000000..0c9e05a --- /dev/null +++ b/inc/MpThumbnailInfo.h @@ -0,0 +1,51 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailInfo.h + * @brief This is the header file for ThumbnailInfo class. + */ + +#ifndef _MP_THUMBNAIL_INFO_H_ +#define _MP_THUMBNAIL_INFO_H_ + +#include +#include + +class ThumbnailInfo + : public Tizen::Base::Object +{ +public: + ThumbnailInfo(void); + virtual ~ThumbnailInfo(void); + + void Construct(const Tizen::Content::ContentId& contentId, + const Tizen::Graphics::Bitmap& bitmap, Tizen::Base::Object* pParam = null); + + Tizen::Content::ContentId GetContentId(void) const; + Tizen::Graphics::Bitmap* GetBitmapN(void) const; + Tizen::Base::Object* GetUserParamN(void) const; + +private: + Tizen::Graphics::Bitmap* CloneBitmapN(const Tizen::Graphics::Bitmap& bitmap) const; + +private : + Tizen::Content::ContentId __contentId; + const Tizen::Graphics::Bitmap* __pBitmap; + mutable Tizen::Base::Object* __pParam; +}; + +#endif // _MP_THUMBNAIL_INFO_H_ diff --git a/inc/MpThumbnailJob.h b/inc/MpThumbnailJob.h new file mode 100644 index 0000000..5e2b0c8 --- /dev/null +++ b/inc/MpThumbnailJob.h @@ -0,0 +1,55 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailJob.h + * @brief This is the header file for ThumbnailJob class. + */ + +#ifndef _MP_THUMBNAIL_JOB_H_ +#define _MP_THUMBNAIL_JOB_H_ + +#include + +class ThumbnailEvent; + +class ThumbnailJob + : public Tizen::Base::Object +{ +public: + ThumbnailJob(void); + virtual ~ThumbnailJob(void); + + void Construct(const Tizen::Content::ContentId& contentId, const unsigned long requestId, + const ThumbnailEvent* pRequestEvent, Tizen::Base::Object* pParam); + + Tizen::Content::ContentId GetContentId(void) const; + unsigned long GetRequestId(void) const; + const ThumbnailEvent* GetEvent(void) const; + Tizen::Base::Object* GetUserParamN(void) const; + +private: + ThumbnailJob(const ThumbnailJob&); + ThumbnailJob& operator = (const ThumbnailJob&); + +private: + Tizen::Content::ContentId __contentId; + unsigned long __requestId; + const ThumbnailEvent* __pRequestEvent; + mutable Tizen::Base::Object* __pParam; +}; + +#endif // _MP_THUMBNAIL_JOB_H_ diff --git a/inc/MpThumbnailProvider.h b/inc/MpThumbnailProvider.h new file mode 100644 index 0000000..1ed03de --- /dev/null +++ b/inc/MpThumbnailProvider.h @@ -0,0 +1,81 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailProvider.h + * @brief This is the header file for ThumbnailProvider class. + */ + +#ifndef _MP_THUMBNAIL_PROVIDER_H_ +#define _MP_THUMBNAIL_PROVIDER_H_ + +#include +#include +#include "MpIThumbnailProviderHandler.h" +#include "MpThumbnailInfo.h" + +class ThumbnailEvent; + +class ThumbnailProvider + : public IThumbnailProviderHandler + , public Tizen::Base::Runtime::EventDrivenThread +{ +public: + static IThumbnailProviderHandler* GetInstance(void); + +public: + void RequestThumbnail(const Tizen::Content::ContentId& contentId, const ThumbnailEvent* event, Tizen::Base::Object* pParam = null); + void CancelThumbnailRequest(const Tizen::Content::ContentId& contentId, const ThumbnailEvent* event); + void CancelAllThumbnailRequest(const ThumbnailEvent* event); + void ClearThumbnailRequests(void); + const Tizen::Graphics::Bitmap* GetDefaultThumbnail(void) const; + + static void Release(void); + virtual result Quit(void); + static void DestroyInstance(void); + +private: + ThumbnailProvider(void); + virtual ~ThumbnailProvider(void); + ThumbnailProvider(ThumbnailProvider& value); + ThumbnailProvider& operator = (ThumbnailProvider&); + + result Construct(void); + void CreateDefaultThumbnailBitmap(void); + void DestroyDefaultThumbnailBitmap(void); + + ThumbnailInfo* GetThumbnailInfoN(const Tizen::Content::ContentId& contentId, Tizen::Base::Object* pParam) const; + Tizen::Graphics::Bitmap* GetThumbnailByDecodeN(const Tizen::Base::String& filePath, const Tizen::Content::ContentType contentType) const; + Tizen::Base::String GetFileNameFromFullPath(const Tizen::Base::String& fullPath, bool withExt) const; + + static result CreateInstance(void); + + + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList * pArgs); + virtual bool OnStart(void); + virtual void OnStop(void); + +private: + Tizen::Base::Runtime::Mutex* __pMutexCmd; + Tizen::Base::Collection::ArrayList* __pCmdQueue; + Tizen::Graphics::Bitmap* __pDefaultThumbnail; + unsigned long __requestId; + bool __isForceClose; + + static ThumbnailProvider* __pThumbnailProviderInstance; +}; + +#endif // _MP_THUMBNAIL_PROVIDER_H_ diff --git a/inc/MpTypes.h b/inc/MpTypes.h new file mode 100644 index 0000000..9c11b63 --- /dev/null +++ b/inc/MpTypes.h @@ -0,0 +1,744 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpTypes.h + * @brief This is the header file for Types class. + */ + +#ifndef _MP_TYPES_H_ +#define _MP_TYPES_H_ + +#include +#include + +//<--__FLICK_MENU_ITEM__ +enum FlickMenuItem +{ + FLICK_MENU_ITEM_NONE = 0x00000000, + FLICK_MENU_ITEM_PLAYALL = 0x00000001, + FLICK_MENU_ITEM_ADDTO = 0x00000002, + FLICK_MENU_ITEM_SHARE = 0x00000004, + FLICK_MENU_ITEM_SET_AS = 0x00000008, + FLICK_MENU_ITEM_DELETE = 0x00000010, + FLICK_MENU_ITEM_MAX = 0x00000020 +}; +//__FLICK_MENU_ITEM__--> + +//<--__FLICK_MENU_STYLE_ +enum FlickMenuStyle +{ + FLICK_MENU_STYLE_TYPE_BASE = FLICK_MENU_ITEM_NONE, + FLICK_MENU_STYLE_TYPE_01 = FLICK_MENU_ITEM_SHARE | FLICK_MENU_ITEM_SET_AS | FLICK_MENU_ITEM_ADDTO | FLICK_MENU_ITEM_DELETE, + FLICK_MENU_STYLE_TYPE_02 = FLICK_MENU_ITEM_PLAYALL | FLICK_MENU_ITEM_ADDTO, + FLICK_MENU_STYLE_TYPE_03 = FLICK_MENU_ITEM_PLAYALL, + FLICK_MENU_STYLE_TYPE_04 = FLICK_MENU_ITEM_PLAYALL | FLICK_MENU_ITEM_DELETE, + FLICK_MENU_STYLE_TYPE_MAX +}; +//__FLICK_MENU_STYLE__--> + +//<--__IDA_FLIC_MENU_ITEM_ACTION_ID +enum IDAFlickMenuItemActionId +{ + IDA_FLICK_MENU_ITEM_BASE = 4000, + IDA_FLICK_MENU_ITEM_PLAYALL = IDA_FLICK_MENU_ITEM_BASE, + IDA_FLICK_MENU_ITEM_ADDTO, + IDA_FLICK_MENU_ITEM_SHARE, + IDA_FLICK_MENU_ITEM_SET_AS, + IDA_FLICK_MENU_ITEM_DELETE, + IDA_FLICK_MENU_ITEM_MAX +}; +//__IDA_FLIC_MENU_ITEM_ACTION_ID_--> + +//<--__CONTEXT_MENU_ITEM_STYLE +enum ContextMenuItemStyle +{ + CONTEXT_MENU_ITEM_STYLE_NONE = 0x00000000, + CONTEXT_MENU_ITEM_STYLE_CALL = 0x00000001, + CONTEXT_MENU_ITEM_STYLE_CALLER = 0x00000002, + CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW = 0x00000004, + CONTEXT_MENU_ITEM_STYLE_SETTINGS = 0x00000008, + CONTEXT_MENU_ITEM_STYLE_EMAIL = 0x00000010, + CONTEXT_MENU_ITEM_STYLE_ALARM = 0x00000020, //RES + CONTEXT_MENU_ITEM_STYLE_MESSAGE = 0x00000040, + CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY = 0x00000080, + CONTEXT_MENU_ITEM_STYLE_BLUETOOTH = 0x00000100, + CONTEXT_MENU_ITEM_STYLE_SEARCH = 0x00000200, + CONTEXT_MENU_ITEM_STYLE_CREATE_PLAYLIST= 0x00000400, + CONTEXT_MENU_ITEM_STYLE_SHARE_VIA = 0x00001000, + CONTEXT_MENU_ITEM_STYLE_EDIT = 0x00002000, + CONTEXT_MENU_ITEM_STYLE_ADD = 0x00004000, + CONTEXT_MENU_ITEM_STYLE_SET_AS = 0x00008000, + CONTEXT_MENU_ITEM_STYLE_DETAILS = 0x00010000, + CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST = 0x00020000, + CONTEXT_MENU_ITEM_STYLE_SOUND_PATH = 0x00040000, + CONTEXT_MENU_ITEM_STYLE_MAX = 0x00080000 +}; +//__CONTEXT_MENU_ITEM_STYLE--> + +//<--__CONTENT_LIST_SCREEN_MODE +enum ScreenState +{ + SCREEN_STATE_BASE = 0, + SCREEN_STATE_NORMAL = SCREEN_STATE_BASE, + SCREEN_STATE_EDITOR, + SCREEN_STATE_SHARE_VIA, + SCREEN_STATE_MAX +}; +//__CONTENT_LIST_SCREEN_MODE--> + +//__PICKER_ARGUMENT_TYPE--> +enum PickerArgumentType +{ + PICKER_ARGUMENT_TYPE_BASE= 0, + PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM = PICKER_ARGUMENT_TYPE_BASE, + PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL, + PICKER_ARGUMENT_TYPE_MAX, +}; +//__PICKER_ARGUMENT_TYPE--> + +//__PICKER_ARGUMENT_TYPE--> +enum PickerType +{ + PICKER_TYPE_BASE = 0, + PICKER_TYPE_PLAY_LIST_PICKER = PICKER_TYPE_BASE, + PICKER_TYPE_SHARE_PICKER, + PICKER_TYPE_SET_AS_PICKER, + PICKER_TYPE_MAX +}; +//__PICKER_ARGUMENT_TYPE--> + +//<--__CONTEXT_MENU_ITEM_ACTION_ID +enum IDAContextMenuitemActionId +{ + IDA_CONTEXT_MENU_ITEM_BASE = 4100, + IDA_CONTEXT_MENU_ITEM_CALL = IDA_CONTEXT_MENU_ITEM_BASE, + IDA_CONTEXT_MENU_ITEM_CALLER, + IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW, + IDA_CONTEXT_MENU_ITEM_SETTINGS, + IDA_CONTEXT_MENU_ITEM_EMAIL, + IDA_CONTEXT_MENU_ITEM_ALARM, + IDA_CONTEXT_MENU_ITEM_MESSAGE, + IDA_CONTEXT_MENU_ITEM_BLUETOOTH, + IDA_CONTEXT_MENU_ITEM_SEARCH, + IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST, + IDA_CONTEXT_MENU_ITEM_SHARE_VIA, + IDA_CONTEXT_MENU_ITEM_EDIT, + IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY, + IDA_CONTEXT_MENU_ITEM_STYLE_ADD, + IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST, + IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS, + IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS, + IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH, + IDA_CONTEXT_MENU_ITEM_MAX +}; +//__CONTEXT_MENU_ITEM_ACTION_ID--> + +//<-- _IDA_COMMON_POPUP_ACTION_ID_ +enum IDACommonPopupActionId +{ + IDA_COMMON_POPUP_BASE = 4200, + IDA_COMMON_POPUP_DELETE = IDA_COMMON_POPUP_BASE, + IDA_COMMON_POPUP_CANCEL, + IDA_COMMON_POPUP_MAX +}; +//_IDA_COMMON_POPUP_ACTION_ID_--> + +enum IDAHeaderButtonId +{ + IDA_HEADER_BUTTON_SONG = 100, + IDA_HEADER_BUTTON_PLAYLIST, + IDA_HEADER_BUTTON_ALBUM, + IDA_HEADER_BUTTON_ARTIST, + IDA_HEADER_BUTTON_GENRES, + IDA_HEADER_BUTTON_COMPOSERS, + IDA_HEADER_BUTTON_YEARS, + IDA_HEADER_BUTTON_FOLDER, + IDA_HEADER_BUTTON_SEARCH_ICON, + IDA_HEADER_BUTTON_SELECTE_ALL, + IDA_HEADER_BUTTON_CHECK_BOX_CHECKED_ICON, + IDA_HEADER_BUTTON_CHECK_BOX_UNCHECKED_ICON, + IDA_HEADER_BUTTON_THUMBNAIL_ICON +}; + +enum IDAFooterButtonId +{ + //EditToolbar + IDA_FOOTER_BUTTON_DELETE = 3000, + IDA_FOOTER_BUTTON_SHARE, + IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST, + IDA_FOOTER_BUTTON_CANCEL, + //DefToolbar + IDA_FOOTER_BUTTON_EDIT, + IDA_FOOTER_BUTTON_SEARCH, + IDA_FOOTER_BUTTON_BACK, + IDA_FOOTER_BUTTON_CREATE_PLAYLIST, + IDA_FOOTER_BUTTON_MORE, + IDA_FOOTER_BUTTON_SAVE, + IDA_FOOTER_BUTTON_ADD, +}; + +enum IDAFlickButton +{ + IDA_FLICK_BUTTON_SHARE = 1000, + IDA_FLICK_BUTTON_SET, + IDA_FLICK_BUTTON_ADD_TO_PALYLIST, + + IDA_FLICK_BUTTON_PLAY_ALL = 900, + IDA_FLICK_BUTTON_RENAME, + IDA_FLICK_BUTTON_DELETE = 910 +}; + +enum IDADeletePopup +{ + IDA_DELETE_POPUP_DELETE = 10, + IDA_DELETE_POPUP_CANCEL, +}; + +enum AlbumArtImage +{ + ALBUM_ART_IMAGE_CURRENT = 0, + ALBUM_ART_IMAGE_PREVIOUS = 1, + ALBUM_ART_IMAGE_NEXT, + ALBUM_ART_IMAGE_COUNT +}; + +enum ContentType +{ + MOST_PLAYED_CONTENT = 0, + RECENTLY_PLAYED_CONTENT, + RECENTLY_ADDED_CONTENT, + USER_CONTENT, + NORMAL_CONTENT, + CONTENT_COUNT +}; + +enum DataItemId +{ + DATA_ITEM_SCENE_NAME, + DATA_ITEM_CONTENT_NAME, + DATA_ITEM_CONTENT_TYPE, + DATA_ITEM_CONTENT_PM, + DATA_ITEM_END +}; + +enum SearchMode +{ + SEARCH_MODE_ARTIST = 0, + SEARCH_MODE_ARTIST_ALBUM, +}; + +enum FooterButtonStyle +{ + STYLE_ADDTO_DELETE_ADD = 0, + STYLE_SHARE_ADD, + STYLE_DELETE_ADD, + STYLE_MORE_EDIT_ADD, + STYLE_ADD_ADD, + STYLE_MAX, +}; + +enum SearchName +{ + SEARCH_NAME_ARTIST = 0, + SEARCH_NAME_ALBUM, + SEARCH_NAME_SONG, +}; + +static const int ADD_TO_PLAYLIST_BUTTON_ID = 0; + +static const int IDA_CHECK_BUTTON = 2005; +static const int IDA_UNCHECK_BUTTON = 2006; +static const int IDA_CONTEXT_ADD_TO_PLAYLIST = 5000; +static const int IDA_BUTTON_CANCEL = 1000; +static const int IDA_BUTTON_CREATE = 1001; +static const int IDA_RENAME_CANCEL_BUTTON = 102; + +static const int IDA_SET_CONTEXT_MENU_CALL = 200; +static const int IDA_SET_CONTEXT_MENU_CALLER = 201; +static const int IDA_SET_CONTEXT_MENU_ALARM = 202; + +static const int IDA_SHARE_CONTEXT_MENU_MESSAGE = 300; +static const int IDA_SHARE_CONTEXT_MENU_EMAIL = 301; +static const int IDA_SHARE_CONTEXT_MENU_BLUETOOTH = 302; + +static const int IDA_MORE_CONTEXT_MENU_SEARCH = 400; +static const int IDA_MORE_CONTEXT_MENU_SHARE_VIA = 401; +static const int IDA_MORE_CONTEXT_MENU_EDIT = 402; +static const int IDA_MORE_CONTEXT_MENU_FOLDER_VIEW = 403; +static const int IDA_MORE_CONTEXT_MENU_SETTINGS = 404; +static const int IDA_MORE_CONTEXT_MENU_CREATE_PLAYLIST = 405; +static const int IDA_MORE_CONTEXT_MENU_GO_TO_LIBRARY = 406; + +static const int POPUP_ITEM_WIDTH = 560; + +static const int POPUP_WIDTH = 600; +static const int POPUP_HEIGHT = 600; +static const int H_CANCEL_BUTTON = 100; +static const int Y_GAP_CANCEL_BUTTON = 10; + +static const int W_TABLE_VIEW_ANNEX_STYLE_MARK = 114; + +static const int FONT_MAIN_TEXT_SIZE_GIANT = 106; +static const int FONT_MAIN_TEXT_SIZE_HUGE = 81; +static const int FONT_MAIN_TEXT_SIZE_LARGE = 64; +static const int FONT_MAIN_TEXT_SIZE_NORMAL = 44; +static const int FONT_MAIN_TEXT_SIZE_SMALL = 36; + +static const int ITEM_HEIGHT_MAIN_TEXT_GIANT = 205; +static const int ITEM_HEIGHT_MAIN_TEXT_HUGE = 176; +static const int ITEM_HEIGHT_MAIN_TEXT_LARGE = 157; +static const int ITEM_HEIGHT_MAIN_TEXT_NORMAL = 140; +static const int ITEM_HEIGHT_MAIN_TEXT_SMALL = 140; + +//static const int ITEM_HEIGHT_DEFAULT = 112; +//static const int ITEM_HEIGHT_GIANT = 120; + +static const int FONT_SIZE_NO_CONTENT = 40; +static const int CONTACT_ID = 2; +static const int W_NO_CONTENT = 280; +static const int H_NO_CONTENT = 280; +static const int H_TEXT_NO_CONTENT = 60; +static const int Y_GAP_NO_CONTENT = 280; +static const int X_GAP_CONTEXT_ITME = 10; +static const int Y_GAP_CONTEXT_ITEM = 25; +static const int W_CONTEXT_ITME = 656; +static const int W_THUMBNAIL = 112; +static const int H_THUMBNAIL = 112; +static const int X_GAP_THUMBNAIL = 16; +static const int Y_GAP_THUMBNAIL = 8; +static const int W_TABLE_VIEW_MARK = 118; +static const int ICON_TOTAL_CONUT = 16; +static const int HEAD_ITEM_COUNT = 4; //8; +static const int FONT_SIZE = 30; +static const int INIT_VALUE = 0; +static const int MAIN_TEXT_SIZE = 36; +static const int SUB_TEXT_SIZE = 32; +static const int SEARCH_PAGE_NO = 1; +static const int SEARCH_COUNT_PER_PAGE = 30000; +static const int ITEM_HEIGHT = 140; +static const int SEARCH_ITEM_DIVIDER_HEIGHT = 2; +static const int GROUP_ITEM_HEIGHT = 144; +static const int STRING_LENGTH = 90; +static const int H_NOW_PLAY_BAR = 120; +static const int W_NOW_PLAY_BAR = 720; +static const int H_SELECT_ALL_BUTTON = 120; +static const int H_CHECKED_COUNT_LABEL = 48; +static const int WIDTH = 720; +static const int W_CLIENT_AREA = 720; +static const int HEIGHT = (1280 - (108 + 114 + 50));//Header : 108, Footer : 104, Indicator : 50 +extern const int W_WVGA_RESOLUTION; +extern const float MARGIN_LEFT_THUMBNAIL_INNER_STROKE; +extern const float MARGIN_TOP_THUMBNAIL_INNER_STROKE; + +static const int INDEX_FOOTER_DELETE = 0; +static const int INDEX_FOOTER_SHARE = 1; +static const int INDEX_FOOTER_ADDTOPLATLIST = 2; +static const int INDEX_FOOTER_EDIT = 0; + +static const int INDEX_FOOTER_STYLE_ADDTO_DELETE_ADD_ADDTO = 0; +static const int INDEX_FOOTER_STYLE_ADDTO_DELETE_ADD_DELETE = 1; + +static const int INDEX_ADDTOPLAYLIST_FOOTER_ADDTOPLAYLIST = 0; + +static const int INDEX_EDITCONTENTLIST_FOOTER_EDIT = 0; +static const int INDEX_EDITCONTENTLIST_FOOTER_SEARCH = 1; + +static const int INDEX_EDIT_FOOTER_EDIT = 0; + +static const long ID_DESTORY_PLAY_LIST_PICKER_POPUP = 0; +static const long ID_DESTORY_SHARE_POPUP = 1; +static const long ID_SHOW_SUCCESS_MESSAGE = 2; + +static const Tizen::Base::String STRING_FONT_SIZE_GIANT = L"giant"; +static const Tizen::Base::String STRING_FONT_SIZE_HUGE = L"huge"; +static const Tizen::Base::String STRING_FONT_SIZE_LARGE = L"large"; +static const Tizen::Base::String STRING_FONT_SIZE_NORMAL = L"normal"; +static const Tizen::Base::String STRING_FONT_SIZE_SMALL = L"small"; +static const Tizen::Base::String STRING_SORT_TITLE = L"Title"; +static const Tizen::Base::String STRING_SORT_ARTIST = L"Artist"; +static const Tizen::Base::String STRING_SORT_GENRE = L"Genre"; +static const Tizen::Base::String STRING_SORT_COMPOSER = L"Composer"; +static const Tizen::Base::String STRING_SORT_ALBUM = L"Album"; +static const Tizen::Base::String STRING_SORT_YEAR = L"Year"; +static const Tizen::Base::String STRING_SORT_FILE_NAME = L"ContentFileName"; +static const Tizen::Base::String STRING_UNKNOWN = L"Unknown"; +static const Tizen::Base::String STRING_SORT_GAP = L""; +static const Tizen::Base::String STRING_ITEM_DELETE = L"itemDelete"; + +static const Tizen::Base::String IDS_BLANK = L""; +static const Tizen::Base::String IDS_COLON = L":"; +static const Tizen::Base::String IDS_PERIOD = L"."; +static const Tizen::Base::String MUSIC = L"Music"; +static const Tizen::Base::String INITIAL_TIME = L"00:00"; +extern const Tizen::Base::String IDS_ALBUM_CONTENT_COUNT; +static const Tizen::Base::String RENAME_EDIT_AREA = L"RenameEditArea"; +static const Tizen::Base::String RENAME_CALCEL_BUTTON = L"RenameCancelButton"; +static const Tizen::Base::String RENAME_BG_LABEL = L"RenameBgLabel"; + +static const Tizen::Base::String APPCONTROL_KEY_PATH = L"http://tizen.org/appcontrol/data/path"; +static const Tizen::Base::String APPCONTROL_KEY_SOCIAL_ITEM_ID = L"http://tizen.org/appcontrol/data/social/item_id"; +static const Tizen::Base::String APPCONTROL_KEY_SELECTION_MODE = L"http://tizen.org/appcontrol/data/selection_mode"; +static const Tizen::Base::String APPCONTROL_KEY_SOCIAL_ITEM_TYPE = L"http://tizen.org/appcontrol/data/social/item_type"; +static const Tizen::Base::String APPCONTROL_KEY_SOCIAL_RESULT_TYPE = L"http://tizen.org/appcontrol/data/social/result_type"; +static const Tizen::Base::String APPCONTROL_OPTION_SINGLE = L"single"; +static const Tizen::Base::String APPCONTROL_OPTION_PERSON = L"person"; +static const Tizen::Base::String APPCONTROL_OPTION_ITEM_ID = L"item_id"; + +static const Tizen::Base::String SHARE_BUTTON_NAME = L"ShareButton"; +static const Tizen::Base::String SET_BUTTON_NAME = L"SetButton"; + +static const int H_INITIAL_PANEL = 10; +static const int W_INITIAL_PANEL = 10; + +static const int X_MORE_POPUP = 0; +static const int Y_MORE_POPUP = 1194; + +static const Tizen::Graphics::Color COLOR_MAIN_TEXT (0, 0, 0); +static const Tizen::Graphics::Color COLOR_SUB_TEXT (124, 124, 124); +static const Tizen::Graphics::Color COLOR_LABEL_BG (136, 136, 136); +static const Tizen::Graphics::Color COLOR_SELECT_ALL (255, 255, 255); +static const Tizen::Graphics::Color COLOR_SMALL_POPUP (215, 225, 232); +static const Tizen::Graphics::Color COLOR_RED (255, 0, 0); +static const Tizen::Graphics::Color COLOR_ITEM (255, 255, 255); +static const Tizen::Graphics::Color COLOR_SEARCH_TEXT (42, 137, 194); + +extern const unsigned int COLOR_PANEL_BACKGROUND_GRAY_BLUE; +extern const unsigned int COLOR_WHITE; + +static const int DEF_TOOL_BAR_END = (IDA_FOOTER_BUTTON_BACK - IDA_FOOTER_BUTTON_EDIT) + 1; +static const int MINUS_ONE = -1; + +extern const wchar_t* SECTION_MUSIC_SETTING; +extern const wchar_t* INITIAL_TAB; // 0 - 7 +extern const wchar_t* REPEAT_MODE; // 0 - 2 (OFF, ONE, ALL) +extern const wchar_t* SHUFFLE_MODE; // 0 - 1 (OFF, ON) +extern const wchar_t* VOLUME_LEVEL; // 0 - 15 +extern const wchar_t* ALBUMS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* ARTISTS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* GENRES_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* COMPOSERS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* YEARS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* FOLDERS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* SONGS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* PLAYERLISTS_TAB; // 0 - 1 (UNCHECKED, CHECKED) +extern const wchar_t* AUTO_OFF_LEVEL; // 0 - 5 (OFF, 15 MIN, 30 MIN, 1 HOUR, 1 HOUR 30 MIN, 2 HOURS) +extern const wchar_t* MOST_PLAYED; +extern const wchar_t* RECENTLY_PLAYED; +extern const wchar_t* RECENTLY_ADD; + +extern const wchar_t* TIZEN_APPCONTORL_PROVIDER_AUDIO_TEST; // Provider Id (for Test) +extern const wchar_t* TIZEN_APPCONTORL_PROVIDER_AUDIO; // Provider Id +extern const wchar_t* TIZEN_APPCONTROL_OPERATION_PLAY; // Operation Id +extern const wchar_t* TIZEN_APPCONTROL_OPERATION_VIEW; + +//XML +extern const wchar_t* IDL_CONTENT_LIST_PANEL; +extern const wchar_t* IDC_MINI_PLAYER_REGISTER_BAR; + +extern const wchar_t* IDL_CONTENT_EDITOR_PANEL; +extern const wchar_t* IDC_CONTENT_EDITOR_TABLEVIEW; +extern const wchar_t* IDC_NO_CONTENT_IMAGE_LABEL; +extern const wchar_t* IDC_NO_CONTENT_TEXT_LABEL; +extern const wchar_t* IDC_CHECKED_ITEM_COUNT_TEXT_LABEL; + +//_XML IDL_ +extern const wchar_t* IDL_CONTENT_LIBARY_ALL_LIST_PANEL; +extern const wchar_t* IDL_CONTENT_LIBARY_COMMON_PANEL; +extern const wchar_t* IDL_CONTENT_FORM; +extern const wchar_t* IDL_MINI_PLYAER_PANEL; +extern const wchar_t* IDL_CONTENTS_DELETE_POPUP; +extern const wchar_t* IDL_CONTENTS_UPDATE_POPUP; +extern const wchar_t* IDL_CREATE_PLAYLIST_POPUP; +extern const wchar_t* IDL_SHARE_VIA_POPUP; +extern const wchar_t* IDL_SET_AS_POPUP; +extern const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_PANEL; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_MUSIC_PLAYER_FORM; +extern const wchar_t* IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL; +extern const wchar_t* IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL; +extern const wchar_t* IDL_PLAYLIST_CREATOR_FORM; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT; +extern const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTEXT_ITEM_PLAYALL_ADDTO; +extern const wchar_t* IDL_PLAYLIST_RENAME_FORM; +extern const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT; +extern const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENTS_DETAIL_FORM; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENT_LIST_FORM; +extern const wchar_t* IDL_CONTENT_LIST_ALBUM_INFO_PANEL; +extern const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_SETTING_FORM; +extern const wchar_t* IDL_SETTING_OFF_SET_ITEM_PANEL; +extern const wchar_t* IDL_SETTING_PLAYLIST_SET_ITEM_PANEL; +extern const wchar_t* IDL_GROUPEDTABLEVIEW_ITEM_PANEL; +extern const wchar_t* IDL_CONTENT_LIST_ARTIST_FORM; +extern const wchar_t* IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE; +extern const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT; +//_XML IDL_ + +//_XML IDC_ +extern const wchar_t* IDC_PALY_TOGGLE_CONTROL_BUTTON; +extern const wchar_t* IDC_PREVIOUS_CONTROL_BUTTON; +extern const wchar_t* IDC_NEXT_CONTROL_BUTTON; +extern const wchar_t* IDC_NOW_PLAYING_STATE; +extern const wchar_t* IDC_PROGRESS_BAR; +extern const wchar_t* IDC_BACK_BUTTON; +extern const wchar_t* IDC_MORE_CONTEXT_MENU_BUTTON; +extern const wchar_t* IDC_CONTENTS_THUMBNAIL; +extern const wchar_t* IDC_CONTENT_THUMBNAIL; +extern const wchar_t* IDC_CONTENTS_ARTIST_NAME; +extern const wchar_t* IDC_CONTENTS_TITLE_NAME; +extern const wchar_t* IDC_MINI_PLAYER_REGISTER_BAR; +extern const wchar_t* IDC_NO_CONTENTS_LABEL; +extern const wchar_t* IDC_CONTENTS_TABLEVIEW; +extern const wchar_t* IDC_DELETE_BUTTON; +extern const wchar_t* IDC_CANCEL_BUTTON; +extern const wchar_t* IDC_LABEL_DELETE_Q; +extern const wchar_t* IDC_SHARE_BUTTON; +extern const wchar_t* IDC_SET_AS_BUTTON; +extern const wchar_t* IDC_ADD_TO_BUTTON; +extern const wchar_t* IDC_BUTTON_DELETE; +extern const wchar_t* IDC_PLAY_CONTENT_DURATION; +extern const wchar_t* IDC_CONTENTS_EDIT_TABLEVIEW; +extern const wchar_t* IDC_ITEM_SELECTED_COUNT_LABEL; +extern const wchar_t* IDC_PANEL_REGISTER_BAR; +extern const wchar_t* IDC_PLAYER_CONTROL_BAR; +extern const wchar_t* IDC_OPTION_VOLUMN; +extern const wchar_t* IDC_OPTION_SHUFFLE; +extern const wchar_t* IDC_OPTION_PLAY_LIST_ADD; +extern const wchar_t* IDC_OPTION_REPEAT; +extern const wchar_t* IDC_CURRENT_PLAYING_TIME; +extern const wchar_t* IDC_CONTENT_TOTAL_TIME; +extern const wchar_t* IDC_ALBUM_THUMBANIL_BACKGROUND; +extern const wchar_t* IDC_ALBUM_TURN_TABLE; +extern const wchar_t* IDC_CONTENTS_VIEW_TOGGLE_BUTTON; +extern const wchar_t* IDC_SLIDER_BAR; +extern const wchar_t* IDC_SPLIT_BAR; +extern const wchar_t* IDC_CREATE_BUTTON; +extern const wchar_t* IDC_TABLEVIEW; +extern const wchar_t* IDC_SPLIT_BAR; +extern const wchar_t* IDC_EDITFIELD; +extern const wchar_t* IDC_CONTENT_TOTAL_COUNT; +extern const wchar_t* IDC_THUMBNAIL_INNER_STROKE; +extern const wchar_t* IDC_PLAY_ALL_BUTTON; +extern const wchar_t* IDC_STORAGE_TYPE_ICON; +extern const wchar_t* IDC_FOLDER_PATH; +extern const wchar_t* IDC_FOLDER_NAME; +extern const wchar_t* IDC_CONTENTS_ITEM_COUNT; +extern const wchar_t* IDC_BUTTON_EDIT; +extern const wchar_t* IDC_PLAY_ALL; +extern const wchar_t* IDC_ADD_TO_PLAYLIST; +extern const wchar_t* IDC_CONTENT_LIST_TABLEVIEW; +extern const wchar_t* IDC_PLAY_CONTENT_COUNT; +extern const wchar_t* IDC_CONTENT_DURATION; +extern const wchar_t* IDC_CONTENT_FOLDER_STORAGE_ICON; +extern const wchar_t* IDC_CONTENT_TITLE_NAME; +extern const wchar_t* IDC_CONTENT_ADDITIONAL_REGISTER_BAR; +extern const wchar_t* IDC_ARTIST_NAME_LABEL; +extern const wchar_t* IDC_NAME_DATA_LABEL; +extern const wchar_t* IDC_FORMAT_DATA_LABEL; +extern const wchar_t* IDC_SIZE_DATA_LABEL; +extern const wchar_t* IDC_FORWARDING_DATA_LABEL; +extern const wchar_t* IDC_DATE_DATA_LABEL; +extern const wchar_t* IDC_LOCATION_DATA_LABEL; +//extern const wchar_t* IDC_TITLE_LABEL; +extern const wchar_t* IDC_BALLOON_TOOLTIP_LABEL; +extern const wchar_t* IDC_NO_CONTENT_LABEL; +extern const wchar_t* IDC_CONTENT_GROUPED_TABLEVIEW; +extern const wchar_t* IDC_LABEL_MAIN_TEXT; +extern const wchar_t* IDC_LABEL_SUB_TEXT; +extern const wchar_t* IDC_LABEL_EX; +extern const wchar_t* IDC_MEDIA_INFO_LABEL; +extern const wchar_t* IDC_NAME_LABEL; +extern const wchar_t* IDC_FORMAT_LABEL; +extern const wchar_t* IDC_SIZE_LABEL; +extern const wchar_t* IDC_FORWARDING_LABEL; +extern const wchar_t* IDC_DATE_LABEL; +extern const wchar_t* IDC_LOCATION_LABEL; +extern const wchar_t* IDC_NO_CONTENTS_PANEL; +//_XML IDC_ + +//<--__XML_IDC_ORDERING PREFIX : IDC_CONTROLTYPE_ EX) IDC_BUTTON_TOGGLE_PLAY +extern const wchar_t* IDC_LABEL_BALLOON_TOOLTIP; +extern const wchar_t* IDC_LABEL_NO_CONTENT; +extern const wchar_t* IDC_LABEL_CONTENT_THUMBNAIL; +extern const wchar_t* IDC_LABEL_CONTENT_TITLE_NAME; +extern const wchar_t* IDC_LABEL_THUMBNAIL_INNER_STROKE; +extern const wchar_t* IDC_GROUPEDTABLEVIEW_CONTENT_LIST; +extern const wchar_t* IDC_TABLEVIEW_CONTENT_LIST; +extern const wchar_t* IDC_LABEL_CONTENT_ADDITIONAL_INFO; +extern const wchar_t* IDC_LABEL_ALBUM_BACKGROUND; +//__XML_IDC_ORDERING--> + +//IMAGE +extern const wchar_t* IDB_STORAGE_SDCARD; +extern const wchar_t* IDB_STORAGE_PHONE; +extern const wchar_t* IDB_STORAGE_EXTERNAL; +extern const wchar_t* IDB_NO_CONTENTS; +extern const wchar_t* IDB_MUSIC_LINE_CONTENT_FORM; //REMOVE + +//COLOR +extern const unsigned int COLOR_HEADER_TITLE_TEXT; +extern const unsigned int COLOR_HEADER_DESCRIPTION_TEXT; +extern const unsigned int COLOR_ITEM_SUB_TEXT; + +//SIZE, POINT +extern const int H_TABLEVIEW_IITEM; +extern const int H_TABLEVIEW_GROUP_ITEM; +extern const int H_BALLOON_TOOL_TIP; +extern const int X_POINT_FOOTER_MORE; +extern const int Y_POINT_PORTRAIT_FOOTER_MORE; +extern const int Y_POINT_LANDSCAPE_FOOTER_MORE; + +//VALUE +extern const int MAX_PLAY_STATE_SLIDER_COUNT; +extern const int MIN_PLAY_STATE_SLIDER_COUNT; +extern const int STORAGE_THRESHOLD_VALUE; + +//timer related constants +extern const int COUNT_MESSAGE_BOX_TIMEOUT; +extern const int MESSAGE_BOX_DELAY; + +extern const Tizen::Base::String IDS_SEPARATOR_SLASH; +extern const Tizen::Base::String IDS_STORAGE_PHONE_PATH; +extern const Tizen::Base::String IDS_STORAGE_SDCARD_PATH; +extern const Tizen::Base::String IDS_STORAGE_FULL; +extern const wchar_t* PARAM_FONT_SIZE; +extern const wchar_t* PARAM_STORAGE_MEMORY_INTERNAL; + +static const Tizen::Base::String CheckedName[HEAD_ITEM_COUNT] = +{ + L"SONGS_TAB", + L"PLAYERLISTS_TAB", + L"ALBUMS_TAB", + L"ARTISTS_TAB", +// L"GENRES_TAB", +// L"COMPOSERS_TAB", +// L"YEARS_TAB", +// L"FOLDERS_TAB" +}; + +static const Tizen::Base::String TabNameId[HEAD_ITEM_COUNT] = +{ + L"IDS_MUSIC_ITAB4_ALL", + L"IDS_MUSIC_TAB4_PLAYLISTS", + L"IDS_MUSIC_TAB4_ALBUMS", + L"IDS_MUSIC_TAB4_ARTISTS", +// L"IDS_MUSIC_TAB4_GENRES", +// L"IDS_MUSIC_BODY_COMPOSERS", +// L"IDS_MUSIC_TAB4_YEARS", +// L"IDS_MUSIC_TAB4_FOLDERS", +}; + +static const int TIMER_INTERVAL = 100; +static const int MIN_REWIND_POSITION = 2; + +static const Tizen::Base::String PROVIDER_ID_MESSAGE = L"tizen.messages"; +static const Tizen::Base::String PROVIDER_ID_EMAIL = L"tizen.email"; +static const Tizen::Base::String PROVIDER_ID_CONTACT = L"tizen.contacts"; +static const Tizen::Base::String OPERATION_ID_COMPOSE = L"http://tizen.org/appcontrol/operation/compose"; +static const Tizen::Base::String OPERATION_ID_SOCIAL_PICK = L"http://tizen.org/appcontrol/operation/social/pick"; + +static const Tizen::Base::String CALL_RINGTONE_KEY = L"http://tizen.org/setting/sound.ringtone"; +static const Tizen::Base::String MEDIA_VOLUME = L"http://tizen.org/setting/sound.media.volume"; + +static const Tizen::Base::String DATABASE_PATH = L"data/PlaylistDb"; +static const Tizen::Base::String SELECTION_MODE = L"selectionMode:single"; +static const Tizen::Base::String RETURN_TYPE = L"returnType:contactId"; + +static const Tizen::Base::String CONTENT_FORM_REQUSEST_ID = L"ContentFormRequestId"; + +#endif // _MP_TYPES_H_ diff --git a/inc/MpUserPlaylistContentListForm.h b/inc/MpUserPlaylistContentListForm.h new file mode 100644 index 0000000..45fcebf --- /dev/null +++ b/inc/MpUserPlaylistContentListForm.h @@ -0,0 +1,101 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpUserPlaylistContentListForm.h + * @brief This is the header file for UserPlaylistContentListForm class. + */ + +#ifndef _MP_USER_PLAYLIST_CONTENT_LIST_FORM_H_ +#define _MP_USER_PLAYLIST_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class PlaylistListPresentationModel; + +class UserPlaylistContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase +{ +public: + UserPlaylistContentListForm(void); + virtual ~UserPlaylistContentListForm(void); + + virtual result Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFormMenuRequested(Tizen::Ui::Controls::Form& source); + virtual void OnFontSizeChanged(void); +protected: + virtual int GetCheckedItemCount(void); + virtual Tizen::Base::Collection::IList* GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType); + + virtual bool IsEmptyContentList(void); + + virtual result SetHeader(void); + virtual void SetItemCheckedAll(bool isChecked); + + virtual void UpdateTableView(void); + virtual void UpdateContentList(void); + +private: + result Construct(void); + result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void RemoveCheckedTableviewItem(bool itemRemove); + void SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status); + +private: + Tizen::Ui::Controls::TableView* __pContentListTableView; + Tizen::Graphics::Bitmap* __pThumbnail; + PlaylistListPresentationModel* __pPresentationModel; + + int __checkedItemCount; + int __activatedStateContextItem; +}; + +#endif // _MP_USER_PLAYLIST_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpYearContentListForm.h b/inc/MpYearContentListForm.h new file mode 100644 index 0000000..b6b327f --- /dev/null +++ b/inc/MpYearContentListForm.h @@ -0,0 +1,80 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearContentListForm.h + * @brief This is the header file for YearContentListForm class. + */ + +#ifndef _MP_YEAR_CONTENT_LIST_FORM_H_ +#define _MP_YEAR_CONTENT_LIST_FORM_H_ + +#include "MpContentListForm.h" +#include "MpThumbnailBase.h" + +class YearListPresentationModel; + +class YearContentListForm + : public ContentListForm + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public ThumbnailBase + , public Tizen::App::IAppControlResponseListener +{ +public: + YearContentListForm(void); + ~YearContentListForm(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnAppControlCompleteResponseReceived(const Tizen::App::AppId& appId, + const Tizen::Base::String& operationId, Tizen::App::AppCtrlResult appControlResult, + const Tizen::Base::Collection::IMap* pExtraData); + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: +// result CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfo); + Tizen::Base::Collection::ArrayList* MakePlayerSceneParam(int startIndex); + void ToggleViewMode(bool editMode); + +private: + Tizen::Graphics::Bitmap* __pThumbnail; + YearListPresentationModel* __pPresentationModel; +}; +#endif // _MP_YEAR_CONTENT_LIST_FORM_H_ \ No newline at end of file diff --git a/inc/MpYearContentPickerPanel.h b/inc/MpYearContentPickerPanel.h new file mode 100644 index 0000000..e76d1a1 --- /dev/null +++ b/inc/MpYearContentPickerPanel.h @@ -0,0 +1,77 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearContentPickerPanel.h + * @brief This is the header file for YearContentPickerPanel class. + */ + +#ifndef _MP_YEAR_CONTENT_PICKER_PANEL_H_ +#define _MP_YEAR_CONTENT_PICKER_PANEL_H_ + +#include "MpCommonUtil.h" +#include "MpTypes.h" +#include "MpYearListPresentationModel.h" + +class YearContentPickerPanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + YearContentPickerPanel(void); + ~YearContentPickerPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + +private: + int __checkedItemCount; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + YearListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_YEAR_CONTENT_PICKER_PANEL_H_ \ No newline at end of file diff --git a/inc/MpYearListEditorPanel.h b/inc/MpYearListEditorPanel.h new file mode 100644 index 0000000..f046717 --- /dev/null +++ b/inc/MpYearListEditorPanel.h @@ -0,0 +1,91 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListEditorPanel.h + * @brief This is the header file for YearListEditorPanel class. + */ + +#ifndef _MP_YEARS_LIST_EDITOR_PANEL_H_ +#define _MP_YEARS_LIST_EDITOR_PANEL_H_ + +#include "MpBasePanel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" +#include "MpYearListPresentationModel.h" + +class PlayListPickerPopup; + +class YearsListEditorPanel + : public BasePanel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + YearsListEditorPanel(void); + virtual ~YearsListEditorPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + void UpdateContentList(void); + +protected: + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::CheckButton* __pSelectAllCheckedButton; + Tizen::Ui::Controls::Label* __pCheckedCountLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + int __checkedItemCount; + PlayListPickerPopup* __pPlayListPickerPopup; + YearListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_YEARS_LIST_EDITOR_PANEL_H_ \ No newline at end of file diff --git a/inc/MpYearListPanel.h b/inc/MpYearListPanel.h new file mode 100644 index 0000000..7025452 --- /dev/null +++ b/inc/MpYearListPanel.h @@ -0,0 +1,106 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListPanel.h + * @brief This is the header file for YearListPanel class. + */ + +#ifndef _MP_YEARS_LIST_PANEL_H_ +#define _MP_YEARS_LIST_PANEL_H_ + +#include +#include +#include +#include +#include +#include +#include "MpBasePanel.h" +#include "MpSceneRegister.h" +#include "MpThumbnailBase.h" +#include "MpTypes.h" +#include "MpYearListPresentationModel.h" + +class PlayListPickerPopup; +class NowPlayContentPanel; + +class YearsListPanel + : public BasePanel + , public ThumbnailBase + , public Tizen::Ui::Controls::ITableViewItemProvider + , public Tizen::Ui::Controls::ITableViewItemEventListener + , public Tizen::Ui::Controls::IFastScrollListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + YearsListPanel(void); + virtual ~YearsListPanel(void); + bool Initialize(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual int GetItemCount(void); + + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(const int itemIndex, int itemWidth); + virtual bool DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultItemHeight(void); + + virtual void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated); + virtual void OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo); + + virtual void OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnMusicContentUpdateCompleted(void); + + virtual void OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + +private: + Tizen::Base::Collection::ArrayList* GetContentListN(int itemIndex); + void UpdateContentList(void); + +protected: + int __itemIndex; + NowPlayContentPanel* __pNowPlayContentPanel; + PlayListPickerPopup* __pPlayListPickerPopup; + Tizen::Ui::Controls::TableViewContextItem* __pContextItem; + Tizen::Ui::Controls::TableView* __pContentTableView; + Tizen::Ui::Controls::Label* __pNoContentImageLabel; + Tizen::Ui::Controls::Label* __pNoContentTextLabel; + Tizen::Graphics::Bitmap* __pThumbnail; + YearListPresentationModel* __pPresentationModel; +}; + +#endif // _MP_YEARS_LIST_PANEL_H_ \ No newline at end of file diff --git a/inc/MpYearListPresentationModel.h b/inc/MpYearListPresentationModel.h new file mode 100644 index 0000000..9395c90 --- /dev/null +++ b/inc/MpYearListPresentationModel.h @@ -0,0 +1,60 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListPresentationModel.h + * @brief This is the header file for YearListPresentationModel class. + */ + +#ifndef _MP_YEAR_LIST_PRESENTATION_MODEL_H_ +#define _MP_YEAR_LIST_PRESENTATION_MODEL_H_ + +#include "MpCommonUtil.h" +#include "MpContentInformationStruct.h" +#include "MpTypes.h" + +class YearListPresentationModel +{ +public: + static YearListPresentationModel* GetInstance(void); + + int GetContentCount(int yearIndex); + int GetAllYearCount(void); + ContentInformation* GetYearInfoN(int yearIndex); + void InitializeContentList(int yearIndex); + ContentInformation* GetContentInfoN(int contentIndex); + Tizen::Base::String* GetYearName(int yearIndex); + Tizen::Base::Collection::ArrayList* GetContentPathListN(int yearIndex); + void RefreshContentList(int yearIndex); + int GetCurrentYearIndex(void); + void AddContent(Tizen::Base::String path, int playlistIndex); + result UpdateYearList(void); + +private: + YearListPresentationModel(void); + YearListPresentationModel(const YearListPresentationModel& YearListPresentationModel); + const YearListPresentationModel& operator = (const YearListPresentationModel& YearListPresentationModel); + ~YearListPresentationModel(void); + result Construct(void); + +private: + Tizen::Base::Collection::IList* __pYearList; + Tizen::Base::Collection::IList* __pContentList; + static YearListPresentationModel* pYearListPresentationModelInstance; + int __currentYearIndex; +}; + +#endif // _MP_YEAR_LIST_PRESENTATION_MODEL_H_ \ No newline at end of file diff --git a/inc/MpYearPickerPanel.h b/inc/MpYearPickerPanel.h new file mode 100644 index 0000000..80b11d1 --- /dev/null +++ b/inc/MpYearPickerPanel.h @@ -0,0 +1,47 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearPickerPanel.h + * @brief This is the header file for YearPickerPanel class. + */ + +#ifndef _MP_YEAR_PICKER_PANEL_H_ +#define _MP_YEAR_PICKER_PANEL_H_ + +#include "MpYearListPanel.h" + +class NowPlayContentPanel; + +class YearPickerPanel + : public YearsListPanel +{ +public: + YearPickerPanel(void); + ~YearPickerPanel(void); + + void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs); + void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + void OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status); +}; + +#endif // _MP_YEAR_PICKER_PANEL_H_ \ No newline at end of file diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..fe06033 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,107 @@ + + + dhrul6qzj3 + 1.0.0 + C++App + + true + true + + + 2.2 + + http://tizen.org/privilege/content.read + http://tizen.org/privilege/application.launch + http://tizen.org/privilege/contact.write + http://tizen.org/privilege/content.write + http://tizen.org/privilege/setting + http://tizen.org/privilege/contact.read + http://tizen.org/privilege/audiomanager.route + + + + + + Pleyer + Музикален плейър + Reproductor de música + Hudební přehrávač + Musikafspiller + MP3-Player + Μουσική + Music Player + Music Player + Music Player + MP3-mängija + Musika Jogailua + Musiikki + Lecteur de musique + Lecteur MP3 + Seinnteoir Ceoil + Reprodutor de Música + संगीत प्लेयर + Music Player + Zenelejátszó + Նվագարկիչ + Tónlistarspilari + Lettore musicale + 音楽 + პლეერი + Музыкалық плейер + 뮤직 플레이어 + MÅ«zikas atskaņotājs + Muzikos grotuvas + Плеер за музика + MP3-speler + Musikkspiller + Odtwarzacz muzyki + Music Player + Leitor de Música + Player muzical + Музыка + Prehrávač hudby + Predvajalnik glasbe + Reproductor de música + Reproductor de Música + Muzički plejer + Musikspelare + Müzik Çalar + Музичний плеєр + Musiqa pleyeri + 音乐播放器 + 音樂播放器 + 音乐播放器 + 音樂播放器 + مشغل الموسيقى + پخش کننده موزیک + میوزک پلیر + เครื่องเล่นเพลง + מוסיקה + + + mainmenu.png + + + + audio/3ga + audio/aac + audio/amr + audio/m4a + audio/midi + audio/mmf + audio/mp3 + audio/mpeg + audio/wav + audio/wma + audio/xmf + http://tizen.org/appcontrol/operation/play + http://tizen.org/appcontrol/operation/view + + + http://tizen.org/appcontrol/operation/configure + + + + + + diff --git a/packaging/apps.MusicPlayer.spec b/packaging/apps.MusicPlayer.spec new file mode 100755 index 0000000..f631102 --- /dev/null +++ b/packaging/apps.MusicPlayer.spec @@ -0,0 +1,77 @@ +Name: apps.MusicPlayer +Summary: MusicPlayer application +Version: 1.0.0.0 +Release: 1 +Group: TO_BE/FILLED_IN +License: TO BE FILLED IN +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(osp-appfw) +BuildRequires: pkgconfig(osp-uifw) +BuildRequires: pkgconfig(osp-media) +BuildRequires: pkgconfig(osp-image) +BuildRequires: pkgconfig(osp-content) +BuildRequires: pkgconfig(osp-social) +BuildRequires: osp-social-internal-devel +BuildRequires: pkgconfig(osp-bluetooth) +BuildRequires: pkgconfig(osp-locations) +Buildrequires: pkgconfig(osp-image-core) +Buildrequires: pkgconfig(osp-net) +Buildrequires: pkgconfig(osp-telephony) +BuildRequires: osp-appfw-internal-devel +BuildRequires: osp-uifw-internal-devel +BuildRequires: hash-signer + +%description +Verification application: MusicPlayer + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%ifarch %{ix86} +%if 0%{?simulator} +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ -D_OSP_EMUL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%else +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ " cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif +%else +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_ARMEL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif + +# Call make instruction with smp support +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +cp LICENSE.Flora %{buildroot}/usr/share/license/%{name} + +%make_install +###### for package signing step ###### +PKG_ID=dhrul6qzj3 +%define tizen_sign 1 +%define tizen_sign_base /usr/apps/${PKG_ID} +%define tizen_sign_level platform +%define tizen_author_sign 1 +%define tizen_dist_sign 1 + +%post +/sbin/ldconfig +PKG_ID=dhrul6qzj3 +echo "/usr/etc/package-manager/backend/tpk -i /usr/apps/"${PKG_ID} +/usr/etc/package-manager/backend/tpk -i /usr/apps/${PKG_ID} +cp -f /usr/lib/osp/osp-ui-app-loader /usr/apps/${PKG_ID}/bin/MusicPlayer + +%postun +/sbin/ldconfig +PKG_ID=dhrul6qzj3 +echo "/usr/etc/package-manager/backend/tpk -u "${PKG_ID} +/usr/etc/package-manager/backend/tpk -u ${PKG_ID} + +%files +%defattr(-,root,root,-) +/usr/apps/* +/usr/share/license/%{name} + diff --git a/res/ara-AE.xml b/res/ara-AE.xml new file mode 100644 index 0000000..d4780ba --- /dev/null +++ b/res/ara-AE.xml @@ -0,0 +1,221 @@ + + + + أعوام + لفظي + سماعة BT + تم تحديد عنصر واحد + النوع + قديمة + المؤلف + مسح؟ + الرسائل + الألبوم + تمت إضافته بالفعل + صوت مباشر + أنماط + أغاني + الموقع + حفظ كقائمة تشغيل + ديناميكي + تتعذر إعادة تسمية قائمة التشغيل + الروك + مشاركة عبر + إعدادات الموسيقى + المضاف حديثا + إيقاف الموسيقى التلقائي + الفنانون + تعذر ضبطه كنغمة رنين + تعذر تغيير المؤثرات الصوتية عند استخدام القناة 5.1 + قوائم التشغيل + إنشاء قائمة تشغيل + كلاسيك + التحويل + الروك + إنشاء قائمة تشغيل + معلومات الوسائط + مجلداتي + ألبوم الفن + حذف؟ + بودكاست + بعد ساعة + تعزيز الصوت الجهير + عريض + مشغل الموسيقى + مقهى + تعديل + رقص + يمكن تنشيط القناة 5.1 فقط عند إيقاف المؤثرات الصوتية + الاستخدامات المتوفرة + رقم الأغنية + لا توجد مجلدات + إضافة إلى قائمة التشغيل + المؤلف + الفنان + إضافة + إضافة قائمة تشغيل + عرض المجلدات + الصلاحية + عاطفة + قائمة الموسيقى + تهيئة + سريع الغضب + سماعات رأس + تحسين الصوت الثلاثي + البوب + غير مستخدمة + مجهول + تم تحديد أقصى عدد للعناصر (%d) + نغمة رنين المتصل + %d أغنية + القادة + بايت + تم الحذف + المفضلة + القناة الافتراضية 7.1 + تتعذر إزالة العنصر + أكثر ما تم عرضه + عادي + لا شيء محدد + الشرح + Wha-wha + مباشر + الحجم + الكل + هيئة + بريد إلكتروني + حذف + إضافة إلى + تاريخ الإنشاء + مباشر + مؤثر صوت القناة 5.1 يعمل في وضع سماعة الأذن فقط + الألبومات + كل الأغاني + إنشاء + مشاركة + لا توجد قوائم تشغيل + ضبط مخصص + تغيير الاسم + يمكنك بث الموسيقى إلى الأجهزة باستخدام AllShare + المعروض حديثا + معالج إعداد الموسيقى + تحسين صوت الجهير + ممكن + تمت الإضافة إلى %s + يتعذر التشغيل أثناء المكالمة + الاسم طويل + تعديل العنوان + يتعذر الحصول على رمز + الإعتمادات + نغمة المكالمة + البوب + تعيين + لا توجد ألبومات + كلاسيك + رسالة + سنوات + غير ممكن + جمع الاسطوانات وتصنيفها + يتعذر إنشاء قائمة تشغيل + جاري التحديث... + المستخدم + التصنيف الأصلي + بعد ساعتين + تحديد جهاز + المعادل + ضبط + ذهاب إلى المكتبة + حفظ + مشاركة + الجاز + الألبومات + إيقاف + تعيين + بعد 15 دقيقة + كلمات الأغنية + لا يوجد فنانين + منزل + العثور على علامة + الجاز + إلغاء + بعد ساعة واحدة و30 دقيقة + لا توجد عناصر + Tremolo + يتعذر التشغيل. نوع ملف غير مدعوم + المحفوظات + اختيار الكل + يتعذر مشاركة ملف DRM + تحديث المكتبة + قائمة المسارات + مدة الأغنية + الانواع + بهجة + مجلدات + مسح + تغيير المحور + لا توجد كلمات + إضافة + تم تحديد %d عناصر + إضافة الى الرئيسية + تمت إزالة %s + مربع الموسيقى + المؤلفون + هل تريد تحديث المكتبة؟ + سيرة + إعادة ترتيب + إغلاق + لا توجد أغاني + هادئ + مؤثر الصوت هذا يعمل في وضعي سماعة الأذن وسماعة البلوتوث فقط + غير قابل على الإضافة + حقوق النسخ + نغمة المنبه + عدم العرض مرة أخرى + أغنية واحدة + تشغيل الكل + يتعذر الحذف. يتم تشغيل الموسيقى المحددة + عادي + المؤلفون + تمت الإضافة + إعادة عرض + موسيقى مجسمة + مسح + غير فعال + نجاح + المعروض حديثا + قائمة التشغيل + القائمة المحددة فارغة + الكل + تعذر التشغيل. حدث خطأ + تم تجاوز الحد الأقصى لعدد الملفات + نقاء صوت الموسيقى + أعوام + الانواع + ضبط كـ + بعد 30 دقيقة + قوائم التشغيل + مؤثر + التفاصيل + الضبط + رقص + قد تضر مستويات الصوت العالية بسمعك إذا استمعت إليها لفترة طويلة + مجهر الصوت + محدد + تم فصل البلوتوث + الكورال + فتح ق + بحث + تلقائي + الاسم + غير قادر على إضافة أكثر من %d ملف موسيقى + لا توجد ملفات موسيقى كافية للتشغيل في‏‫ مربع الموسيقى. يلزم وجود %d ملفات موسيقى على الأقل + ألبومات + عرض كـ + 5.1 القناة + معلومات الوسائط + النوع + ديناميكي + إضافة إلى قائمة التشغيل + diff --git a/res/aze-AZ.xml b/res/aze-AZ.xml new file mode 100644 index 0000000..224354d --- /dev/null +++ b/res/aze-AZ.xml @@ -0,0 +1,221 @@ + + + + Ä°llər + Vokal + BT qulaqlığı + 1 element seçildi + Tip + Köhnə + Tərtibat proqramı + Silinsin? + Mesajlaşma + Albom + Artıq əlavə olunmuşdur + SoundAlive + Əhvallar + Mahnılar + Yeri + Musiqi siyahısı kimi saxlayın + Dinamik + Mahnı siyahısının adını dəyişdirmək mümkün deyil + Rock + Paylaş + Musiqi parametrləri + Sonuncu dəfə əlavə edilən + Musiqini avtomatik söndür + Müğənnilər + Zəng melodiyası kimi qurmaq mümkün deyil + 5.1 kanalından istifadə edərkən səs effektlərini dəyişmək mümkün deyil + Mahnı siyahıları + Mahnı siyahısı yaradın + Klassik + Göndərilir + Rock + Mahnı siyahısı yaradın + Media məlumatı + Mənim qovluğum + Ä°ncəsənət albomu + Silinsin? + Podkastlar + 1 saatdan sonra + Basın yüksəldilməsi + Geniş + Pleyer + Kafe + Redaktə et + Rəqs + 5.1 kanalı yalnız səs effektləri aktiv olmadıqda aktivləşdirilə bilər + Ä°stifadəsi mümkün olanlar + Cığırın nömrəsi + Qovluq yoxdur + Musiqi siyahısina əlavə et + Müəllif + Artist + Əlavə et + Musiqi siyahısına əlavə edin + Qovluq görünüşü + Etibarlılıq + Həvəs + Musiqi menyusu + Format + Həvəsli + Qulaqlıqlar + Diskant səs yüksəldilməsi + Pop + Ä°stifadə edilməmişdir + Naməlum + Maksimum sayda (%d) element seçilmişdir + Zəng egənin zəng tonu + %d mahnı + Dirijorlar + Bayt + Silindi + Sevimlilər + Virtual 7.1 kanal + Elementin yerini dəyişdirmək mümkün deyil + Daha çox çalınan + Normal + He nə seçilməmişdir + Təsvir + Wha-wha + Canlı + Ölçü + Hamısı + Format + Elektron poçtlar + Sil + Əlavə et + Tarix yaradıldı + Canlı + 5.1 kanalının səs effekti yalnız qulaqlıq rejimində işləyir + Albomlar + Bütün mahnılar + Yarat + Paylaş + Mahnı siyahısı yoxdur + Adi + Adını dəyişdir + Siz AllShare istifadə edərək musiqini cihazlara göndərə bilərsiniz + Son dəfə çalınan + Musiqi tərtibatı üzrə köməkçi funksiya + Bəm səsin yüksəldilməsi + Mümkündür + %s-ə əlavə olunmuşdur + Zəng zamanı səsləndirmək olmur + Ad çox uzundur + Başlığı redaktə et + Etiket əldə etmək mümkün deyil + İştirakçıların siyahısı + Zəng Tonu + Pop + Bunun kimi qur + Albom yoxdur + Klassik + Mesaj + Ä°llər + Mümkün deyil + Diskoqrafiya + Mahnı siyahısı yaratmaq mümkün deyil + Yenilənir... + Ä°stifadəçi + Valideyn reytinqi + 2 saatdan sonra + Qurğu seç + Ekvalayzer + Qur + Kitabxanaya gedin + Yaddaşa yaz + Bölüşün + Caz + Albomlar + Dayandır + Qur + 15 dəqiqə sonra + Sözlər + Müğənni yoxdur + Hausi + İşarəni tapın + Caz + Ləğv et + 1 saat 30 dəqiqədən sonra + Elementlər yoxdur + Tremolo + Çaldırmaq mümkün deyil. Dəstəklənməyən fayl növü + Tarix + Hamısını seç + DRM faylını paylaşmaq mümkün deyil + Kitabxana yeniləməsi + Musiqi siyahısı + Cığırın uzunluğu + Janrlar + Sevinc + Qovluqlar + Sil + Oxu dəyiş + Sözlər yoxdur + Əlv et + %d element seçildi + Başlanğıca əlavə et + %s silindi + Musiqi meydanı + Bəstəkarlar + Kitabxana yenilənsin? + Bioqrafiya + Yenidən nizamlayın + Bağla + Mahnı yoxdur + Sakit + Bu səs effekti yalnız qulaqlıq və Bluetooth qulaqlığı rejimlərində işləyir + Əlavə etmək mümkün deyil + Müəllif hüququ + Xəbərdarlıq zənginin tonu + Bir daha göstərmə + 1 mahnı + Hamısını səsləndir + Silmək mümkün deyil. Seçilmiş musiqi ifa olunur + Normal + Bəstəkrlər + Əlavə edildi + Gözdən keçir + Kənarlaşdırma + Sil + Söndür + Uğur + Son dəfə çalınan + Mahnı Siyahısı + Seçilmiş şəhər boşdur + Hamısını + Səsləndirmək mümkün deyil. Səhv baş verdi + Faylların sayı maksimumu keçib + Musiqi aydınlığı + Ä°llər + Janrlar + Bunun kimi qur + 30 dəqiqədən sonra + Musiqi siyahılrı + Effekt + Təfsilatlar + Parametrlər + Rəqs + Uzun müddət ucadan qulaq assanız, bu sizin eşitmənizə mənfi təsir edə bilər + Dinamik + Seçilmişi + Bluetooth söndürüldü + Xor + Ms.syh.aç + Axtarış + Avtomatik + Ad + %d musiqi faylından çox əlavə etmək mümkün deyil + Musiqi meydanında səsləndirmək üçün kifayət qədər musiqi faylı yoxdur. Ən azı %d musiqi faylı tələb olunur + Albomlar + Kimi bax + 5.1 kanal + Media məlumatı + Janr + Dinamik + Mahnılar siyahısına daxil et + diff --git a/res/bul-BG.xml b/res/bul-BG.xml new file mode 100644 index 0000000..48a24b1 --- /dev/null +++ b/res/bul-BG.xml @@ -0,0 +1,221 @@ + + + + Години + Вокали + BT слушалка + Избран е 1 елемент + Тип + Стар + Композитор + Изтриване? + Съобщения + Албум + Вече е добавено + SoundAlive + Настроения + Песни + Позиция + Запиши като списък за изпълнение + Динамично + Списъкът за изпълнение не може да се преименува + Рок + Споделяне чрез + Настройки за музика + Последно добавени + Авто изключване на музика + Изпълнители + Не може да се зададе за тон на звънене + Звуковите ефекти не може да се сменят, когато се използват 5.1 канала + Плейлиста + Създаване на списък за изпълнение + Класическа + Препращане + Рок + Създаване на списък за изпълнение + Мултимедийна информация + Мои папки + Корица албум + Премахване? + Подкасти + След 1 час + Подобряване на баса + Панор. + Музикален плейър + Кафе + Редактиране + Танц + 5.1 канала може да се активират само когато звуковите ефекти са изключени + Налични употреби + Песента номер + Няма папки + Добави в спис. изпълн. + Автор + Изпълнител + Добавяне + Добави плейлиста + Като папка + Валидност + Страст + Меню музика + Формат + Страстно + Слушалки + Усилване на високите + Поп + Не се използва + Неизвестно + Достигнат е максималният брой избрани елементи (%d) + Тон за звънене за повикващ + %d песни + Диригент + Байт + Премахнат + Предпочитани + Виртуален 7.1 кан + Елементът не може да се премахне + Най-изпълнявани + Нормален + Нищо не е избрано + Описание + Уа-уа + На живо + Размер + Всички + Формат + Email + Премаxване + Добави в + Дата на създаване + На живо + 5.1-каналният звуков ефект работи само в режим на слушалки + Албуми + Всички песни + Създай + Сподели + Няма списъци с песни + По избор + Преименуване + Можете да предавате поточно музиката си до устройства с помощта на AllShare + Последно изпълнени + Съветник за настройки на музика + Усилване на басите + Lъзможно + Добавено в %s + Не може да се възпроизведе по време на разговор + Името е твърде дълго + Редактиране на заглавие + Не може да се получи таг + Благодарение на + Тон за звънене + Поп + Задаване като + Няма албуми + Класическа + Съобщение + Години + Невъзможно + Дискография + Не може да се създаде списък за изпълнение + Актуализиране... + Потребител + Родителска оценка + След 2 часа + Избор на устр-во + Еквалайзер + Настрой + Отиди в библиотеката + Запис + Споделяне + Джаз + Албуми + Спри + Задаване като + След 15 мин + Текст + Няма изпълнители + Хаус + Намиране на таг + Джаз + Отказ + След 1 час и 30 мин + Няма елементи + Тремоло + Не може да се възпроизведе. Неподдържан вид файл + Хронология + Избери всички + Не може да се сподели файл с DRM + Актуализиране на библиотека + Списък със записи + Песента дължина + Жанрове + Радост + Папки + Изтрий + Смяна на оста + Няма текст + Добави + Избрани са %d елемента + Добави към дом. + %s извадена + Музикална пиаца + Композитор + Актуализиране на библиотека? + Биография + Пренареждане + Затваряне + Няма песни + Спокоен/йна + Този звуков ефект работи само в режими на слушалка и Bluetooth слушалки + Не може да се добави + Авторски права + Тон аларма + Не показвай отново + 1 песен + Изпълнение на всички + Не може да се изтрие. Избраната музика се възпроизвежда + Нормален + Композ. + Добавен + Преглед + Открито пространство + Изтриване + Изключи + Успешно + Последно изпълнени + Списък възпроизвеждане + Избраният списък е празен + Всички + Не може да се възпроизведе. Възникна грешка + Надхвърлен е максималният брой файлове + Чистота на звука + Години + Жанрове + Задаване като + След 30 мин + Плейлиста + Ефект + Детайли + Настройки + Танц + Голямата сила на звука може да увреди слуха ви, ако слушате дълго + Високогов + Избрани + Bluetooth е прекъснат + Хор + Сп из + Търси + Авто + Име + Не могат да се добавят повече от %d музикални файла + Няма достатъчно музикални файлове, които да се изпълняват в Музикалната пиаца. Необходими са поне %d музикални файла + Албуми + Пр. като + 5.1 канала + Мултимедийна информация + Жанр + Динамично + Добавяне в списък за възпроизвеждане + diff --git a/res/cat-ES.xml b/res/cat-ES.xml new file mode 100644 index 0000000..b869960 --- /dev/null +++ b/res/cat-ES.xml @@ -0,0 +1,221 @@ + + + + Anys + Vocal + Auriculars BT + 1 element seleccionat + Tipus + Antic + Compositor + Esborrar? + Missatgeria + Àlbum + Ja s'ha afegit + SoundAlive + Estats d'ànim + Cançons + Ubicació + Desar com a llista de reproducció + Dinàmica + No es pot canviar el nom de la llista de reproducció + Rock + Compartir mitjançant + Ajustaments de música + Afegides recentment + Música automàtica desactivada + Artistes + No es pot definir com a melodia + No es poden canviar els efectes de so quan s'utilitza el canal 5.1 + Llistes de reproducció + Crear llista de reproducció + Clàssica + Reenviant + Rock + Crear llista de reproducció + Info multimèdia + Les meves carpetes + Caràtula àlbum + Eliminar? + Podcasts + Després d'1 hora + Millora dels baixos + Ample + Reproductor de música + Cafè + Editar + Dance + Només es pot activar el canal 5.1 quan es desactiven els efectes de so + Usos disponibles + Número de pista + No hi ha cap carpeta + Afegir a llista reprod + Autor + Artista + Afegir + Afegir llista de reproducció + Vista de carpeta + Validesa + Passió + Menú Música + Format + Apassionant + Auriculars + Accentuació d'aguts + Pop + No s'ha utilitzat + Desconegut + S'ha seleccionat el nombre màxim d'elements (%d) + Melodia de la persona que truca + %d cançons + Directors + Byte + Eliminat + Preferits + 7.1 canals virtuals + No es pot extraure l'element + El més reproduït + Normal + No s'ha seleccionat res + Descripció + Wha-wha + Directe + Mida + Tot + Format + Correu electrònic + Eliminar + Afegir a + Data creació + Directe + L'efecte de so del canal 5.1 només funciona en mode auricular + Àlbums + Totes les cançons + Crear + Compart + No hi ha llistes de reproducció + Personalitzat + Canviar nom + Pot reproduir la seva música en dispositius mitjançant AllShare + Escoltades recentment + Assistent d'instal·lació música + Accentuació de baixos + Possible + Afegit a %s + No es pot reproduir durant la trucada + Nom massa llarg + Editar títol + No es pot obtenir l'etiqueta + Crèdits + Melodia de trucada + Pop + Definir com a + Cap àlbum + Clàssica + Missatge + Anys + No és possible + Discografia + No es pot crear llista de reproducció + Actualitzant... + Usuari + Classificació dels pares + Després de 2 hores + Seleccioni dispositiu + Equalitzador + Definir + Anar a la biblioteca + Desar + Compartir + Jazz + Àlbums + Aturar + Definir com a + Després de 15 min + Lletra + Sense artistes + House + Buscar etiqueta + Jazz + Cancel·lar + Després d'1 hora 30 min + No hi ha elements + Tremolo + No es pot reproduir. No s'admet el tipus de fitxer + Historial + Seleccioni-ho tot + No es pot compartir un fitxer DRM + Actualització de biblioteca + Llista de pistes + Durada de pista + Gèneres + Alegria + Carpetes + Esborrar + Canviar eix + Sense lletra + Afegir + %d elements seleccionats + Afegir a l'inici + %s eliminat + Music square + Compositors + Actualitzar biblioteca? + Biografia + Tornar a ordenar + Tancar + Cap cançó + Tranquil + Aquest efecte de so només funciona en els modes auricular i auriculars Bluetooth + No es pot afegir + Copyright + To d'alarma + No tornar a mostrar + 1 cançó + Reproduir-ho tot + No es pot esborrar. La musica seleccionada s'està reproduint + Normal + Composit + Afegit + Revisar + Externalització + Esborrar + Desactiv + Correcte + Escoltades recentment + Llista de reproducció + Llista seleccionada buida + Tot + No es pot reproduir. S'ha produït un error + S'ha excedit el nombre màxim de fitxers + Claredat musical + Anys + Gèneres + Definir com a + Després de 30 min + Llistes de repr + Efecte + Detalls + Ajustaments + Dance + Volums elevats poden malmetre la seva oïda si els escolta durant molt temps + Altaveu + Seleccionat + Bluetooth desconnectat + Cor + Ll reprod + Cercar + Auto + Nom + No es poden afegir més de %d fitxers de música + No hi ha prou fitxers de música per reproduir a Music square. En calen almenys %d + Àlbums + Veure com + Canal 5.1 + Info multimèdia + Gènere + Dinàmica + Afegir a llista de reproducció + diff --git a/res/ces-CZ.xml b/res/ces-CZ.xml new file mode 100644 index 0000000..e24a2a3 --- /dev/null +++ b/res/ces-CZ.xml @@ -0,0 +1,221 @@ + + + + Roky + Vokály + Sluchátka BT + Byla vybrána 1 položka + Typ + Stará + Skladatel + Odstranit? + Zprávy + Album + Již přidáno + SoundAlive + Nálady + Skladby + Místo + Uložit jako seznam skladeb + Dynamicky + Seznam skladeb nelze přejmenovat + Rock + Sdílet pomocí + Nastavení hudby + Poslední přidané + Automatické vypnutí hudby + Interpreti + Nelze nastavit jako vyzváněcí tón + Při použití režimu kanálu 5.1 nelze změnit zvukové efekty + Seznamy skladeb + Vytvořit seznam skladeb + Klasika + Předání + Rock + Vytvořit seznam skladeb + Informace o médiu + Moje složky + Obal alba + Odstranit? + Podcasty + Za 1 hodinu + Zvýraznění basů + Å iroký + Hudební přehrávač + Kavárna + Upravit + Tanec + Režim 5.1 kanál lze aktivovat pouze když jsou vypnuté zvukové efekty + Počet použití k dispozici + Číslo dráhy + Žádné složky + Přidat do sezn. skladeb + Autor + Interpret + Přidat + Přidat seznam skladeb + Složky + Platnost + Vášeň + Nabídka Hudba + Formát + Vášnivá + Sluchátka + Zesílení výšek + Pop + Nepoužito + Neznámý + Byl vybrán maximální počet položek (%d) + Zvonění volajícího + %d skladeb + Dirigenti + B + Odstraněno + Oblíbené + Virtuální 7.1 kan. + Položku nelze odebrat + Nejčastěji přehrávané + Normální + Není nic vybráno + Popis + Bum bum + Živě + Velikost + VÅ¡e + Formát + E-mail + Odstranit + Přidat do + Datum vytvoření + Živě + Zvukový efekt 5.1 kanál funguje pouze v režimu sluchátka + Alba + VÅ¡echny skladby + Vytvořit + Sdílet + Žádné seznamy skladeb + Vlastní + Přejmenovat + Pomocí AllShare lze vysílat datový proud hudby do zařízení + Poslední přehrané + Průvodce nastavením hudby + Zesílení basů + Možné + Přidáno do %s + Nelze přehrát během hovoru + Jméno je příliÅ¡ dlouhé + Upravit název + Značku nelze získat + Kredity + Vyzváněcí tón hovoru + Pop + Nastavit jako + Žádná alba + Klasika + Zpráva + Roky + Nemožné + Diskografie + Nelze vytvořit seznam skladeb + Aktualizace... + Uživatel + Obecné hodnocení + Za 2 hodiny + Zvolte umístění + Ekvalizér + Nastavit + Přejít do knihovny + Uložit + Sdílet + Jazz + Alba + Zastavit + Nastavit jako + Za 15 minut + Text + Žádní interpreti + House + Najít značku + Jazz + ZruÅ¡it + Za 1 hodinu 30 min. + Žádné položky + Tremolo + Nelze přehrát. Nepodporovaný typ souboru + Historie + Vybrat vÅ¡e + Soubor DRM nelze sdílet + Aktualizace knihovny + Seznam skladeb + Délka skladby + Žánry + Radost + Složky + Odstranit + Změnit osu + Bez textu + Přid. + Vybrané položky: %d + Přidat do domů + %s byla odebrána + Hudební ráj + Skladatelé + Aktualizovat knihovnu? + Životopis + Změnit uspořádání + Zavřít + Žádné skladby + Klidný + Tento zvukový efekt funguje pouze se sluchátky a se sluchátky Bluetooth + Nelze přidat + Copyright + Tón upozornění + Znovu nezobrazovat + 1 skladba + Přehrát vÅ¡e + Nelze odstranit. Vybraná hudba se přehrává + Normální + Skladat. + Přidáno + Kontrola + Externalizace + Odstranit + Vypnout + Dokončeno + Poslední přehrané + Seznam skladeb + Vybraný seznam je prázdný + VÅ¡e + Nelze přehrát. DoÅ¡lo k chybě + Byl překročen maximální počet souborů + Čistý zvuk + Roky + Žánry + Nastavit jako + Za 30 minut + Seznamy skladeb + Efekt + Podrobnosti + Nastavení + Tanec + Dlouhodobý poslech velmi hlasité reprodukce může poÅ¡kodit sluch + Reprod. + Vybráno + Bluetooth odpojeno + Sbor + Ot. s. s. + Hledat + Automaticky + Jméno + Nelze přidat více hudebních souborů než %d + V Music Square není dostatek hudebních souborů k přehrávání. Je zapotřebí alespoň %d hudebních souborů + Alba + Zob. jako + 5.1 kanál + Informace o médiu + Žánr + Dynamicky + Přidat do přehrávaného seznamu + diff --git a/res/dan-DK.xml b/res/dan-DK.xml new file mode 100644 index 0000000..a808ce1 --- /dev/null +++ b/res/dan-DK.xml @@ -0,0 +1,221 @@ + + + + År + Vokal + BT-høretelefon + 1 element valgt + Type + Gammel + Opretter + Slet? + Meddelelser + Album + Allerede tilføjet + SoundAlive + Tilstande + Sange + Placering + Gem som afspilningsliste + Dynamisk + Afspilningslisten kan ikke omdøbes + Rock + Del via + Musikindstillinger + Tilføjet for nylig + Automatisk musik fra + Kunstnere + Kan ikke indstille som ringetone + Kan ikke ændre lydeffekter ved brug af 5.1 kanal + Afspilningslister + Opret afspilningsliste + Klassisk + Viderestiller + Rock + Opret afspilningsliste + Medieoplysninger + Min mappe + Albumcover + Fjern? + Podcasts + Efter 1 time + Basforbedring + Bred + Musikafspiller + Cafe + Redigér + Dance + 5.1 kanal kan kun aktiveres, nÃ¥r lydeffekter er fra + Gange tilbage + Spor-nummer + Ingen mapper + Føj til afspil.liste + Forfatter + Kunstner + Tilføj + Tilføj afspilningsliste + Vis mappe + Gyldighed + Passion + Musikmenu + Formatér + Passioneret + Høretelefoner + Diskantforstærkning + Pop + Ikke brugt + Ukendt + Det maksimale elementer (%d) valgt + Kontakt ringetone + %d sange + Dirigent + Byte + Fjernet + Favoritter + Virtuel 7.1-kan + Elementet kunne ikke fjernes + Mest afspillede + Normal + Intet er valgt + Beskrivelse + Wha-wha + Direkte + Størrelse + Alle + Format + E-mail + Fjern + Føj til + Dato oprettet + Direkte + 5.1 effekten kanallyd fungerer kun i tilstanden høretelefoner + Albums + Alle sange + Opret + Del + Ingen afspilningslister + Brugerdefineret + Omdøb + Du kan streame din musik til enheder ved hjælp af AllShare + Afspillet for nylig + Konfigurationsguide til musik + Basforstærkning + Muligt + Føjet til %s + Kunne ikke afspille under samtale + Navnet er for langt + Redigér titel + Kunne ikke hente tag + Anerkendelse + Telefonringetone + Pop + Indstil som + Ingen album + Klassisk + Meddelelse + År + Ikke mulig + Diskografi + Afspilningslisten kan ikke oprettes + Opdaterer ... + Bruger + Forældrebedømmelse + Efter 2 timer + Vælg enhed + Equalizer + Indstil + GÃ¥ til bibliotek + Gem + Del + Jazz + Albums + Stop + Vælg som + Efter 15 min. + Lyrik + Ingen kunstner + House + Find Kode + Jazz + Annullér + Efter 1 time og 30 min. + Ingen elementer + Tremolo + Kan ikke afspille. Filtypen understøttes ikke + Oversigt + Vælg alle + DRM-fil kan ikke deles + Biblioteksopdatering + Afspilningsliste + Sporets længde + Genrer + Glæde + Mapper + Slet + Skift akse + Ingen lyrik + Tilføj + %d elementer valgt + Føj til start + %s er fjernet + Musiktorv + Komponister + Opdatér bibliotek? + Biografi + Skift rækkefølge + Luk + Ingen sange + Rolig + Denne lydeffekt fungerer kun i tilstandene høretelefon og Bluetooth-høretelefon + Der kan ikke tilføjes + Ophavsret + Alarmtone + Vis ikke igen + 1 sang + Afspil alt + Kan ikke slette. Valgt musik afspilles + Normal + Kompon. + Tilføjet + Visning + Eksternalisering + Slet + Fra + Fuldført + Afspillet for nylig + Afspilningsliste + Den valgte liste er tom + Alle + Kan ikke afspille. Der opstod en fejl + Det maksimale antal filer er overskredet + Musikklarhed + År + Genrer + Vælg som + Efter 30 min. + Afspiln. lister + Effekt + Detaljer + Indstillinger + Dance + Høj musik kan skade din hørelse, hvis du lytter i for lang tid + Højtaler + Valgte + Bluetooth-forbindelse afbrudt + Kor + Åbn afspl + Søg + Auto + Navn + Kunne ikke tilføje mere end %d musikfil + Ikke tilstrækkelige musikfiler til at afspille pÃ¥ Musiktorv. Der kræves mindst %d musikfiler + Albums + Vis som + 5.1 kanal + Medieoplysninger + Genre + Dynamisk + Føj til afspilningsliste + diff --git a/res/deu-DE.xml b/res/deu-DE.xml new file mode 100644 index 0000000..ae54278 --- /dev/null +++ b/res/deu-DE.xml @@ -0,0 +1,221 @@ + + + + Jahre + Vocal + BT-Headset + 1 Element ausgewählt + Typ + Alt + Komponist + Löschen? + Nachrichten + Album + Bereits hinzugefügt + SoundAlive + Stimmung + Lieder + Ort + Als Wiedergabeliste speichern + Dynamisch + Wiedergabeliste kann nicht umbenannt werden + Rock + Senden via + Musik-Einstellungen + Zuletzt hinzugefügt + Musik-Auto aus + Interpreten + Festlegen als Klingelton nicht möglich. + Soundeffekte können nicht geändert werden, wenn Kanal 5.1 verwendet wird. + Wiedergabelisten + Wiedergabeliste erstellen + Klassik + Weiterleitung + Rock + Wiedergabeliste erstellen + Medien-Info + Eigene Ordner + Bild für Album + Entfernen? + Podcasts + Nach 1 Stunde + Bassverstärkung + Weit + MP3-Player + Café + Bearbeiten + Dance + Kanal 5.1 kann nur aktiviert werden, wenn die Soundeffekte ausgeschaltet sind. + Verfügbare Nutzungen + Nummer des Titels + Keine Ordner + Zu Wiedergabeliste hzfg. + Autor + Künstler + Hinzufügen + Wiedergabeliste hinzufügen + Ordner-Ansicht + Gültigkeit + Passion + Musik-Menü + Formatieren + Leidenschaftlich + Kopfhörer + Treblebooster + Pop + Nicht verwendet + Unbekannt + Maximale Anzahl an Elementen (%d) ausgewählt + Anruferklingelton + %d Lieder + Diri\n-genten + Byte + Entfernt + Favoriten + 7.1 Kanäle virtuell + Element kann nicht entfernt werden + Am häufigsten wiedergegeben + Normal + Nichts ausgewählt + Beschreibung + Wha-wha + Live + Größe + Alle + Format + E-Mail + Entfernen + Hinzufügen zu + Erstellt am + Live + 5.1-Sound-Effekte nur im Kopfhörer-Modus möglich + Alben + Alle Lieder + Erstellen + Senden + Keine Wiedergabelisten + Benutzerdefiniert + Umbenennen + Sie können Ihre Musik mit AllShare auf Geräte streamen. + Kürzlich wiedergegeben + Musikeinrichtungsassistent + Bass Boost + Möglich + Hinzugefügt zu %s + Wiedergabe während Anruf nicht möglich + Name zu lang + Titel bearbeiten + Tag kann nicht abgerufen werden + Danksagungen + Anruf-Klingelton + Pop + Einst. als + Keine Alben + Klassik + Nachricht + Jahre + Nicht möglich + Diskografie + Erstellen der Wiedergabeliste nicht möglich + Aktualisierung... + Benutzer + Altersbeschränkung + Nach 2 Stunden + Gerät auswählen + Equalizer + Einstellen + Zur Bibliothek wechseln + Speichern + Senden + Jazz + Alben + Stopp + Einstellen als + Nach 15 Minuten + Liedtext + Keine Künstler + House + Tag finden + Jazz + Abbrechen + Nach 1 Stunde und 30 Minuten + Keine Elemente + Tremolo + Wiedergabe nicht möglich. Nicht unterstützter Dateityp + Verlauf + Alle auswählen + DRM-Datei kann nicht freigegeben werden + Bibliotheksaktualisierung + Wiedergabeliste + Länge des Titels + Genres + Joy + Ordner + Löschen + Achse wechseln + Keine\nLyrics + Hzfg. + %d Elemente ausgewählt + Zum Startbildschirm hzfg. + %s entfernt + Music Square + Komponisten + Bibliothek aktualisieren? + Biographie + Neu sortieren + Schließen + Keine Lieder + Ruhig + Dieser Sound-Effekt funktioniert nur im Kopfhörer- und Bluetooth-Headset-Modus. + Hinzufügen nicht möglich + Urheberrecht + Alarmton + Nicht mehr anzeigen + 1 Lied + Alle wiedergeben + Löschen nicht möglich. Ausgewählte Musik wird wiedergegeben. + Normal + Komponisten + Hinzugefügt + Überprüfen + Externalisierung + Löschen + Aus + Abgeschlossen + Kürzlich wiedergegeben + Wiedergabeliste + Ausgewählte Liste ist leer + Alle + Datei kann nicht wiedergegeben werden. Fehler aufgetreten. + Maximale Anzahl an Dateien überschritten. + Musikklarheit + Jahre + Genres + Einst. als + Nach 30 Minuten + Wdg-Listen + Effekt + Details + Einstellungen + Dance + Das Hören lauter Musik über einen längeren Zeitraum kann sich schädlich auf Ihr Gehör auswirken. + Lautspr. + Ausgewählt + Bluetooth getrennt + Chor + Wgl. öff. + Suche + Auto + Name + Mehr als %d Musikdateien können nicht hinzugefügt werden + Nicht genügend Musikdateien zur Wiedergabe in Musik Square verfügbar. Mindestens %d Musikdateien erforderlich + Alben + Ansicht + 5.1-Kanal + Medien-Info + Genre + Dynamisch + Zu Wiedergabeliste hinzufügen + diff --git a/res/ell-GR.xml b/res/ell-GR.xml new file mode 100644 index 0000000..89b5dfb --- /dev/null +++ b/res/ell-GR.xml @@ -0,0 +1,221 @@ + + + + Έτη + Φωνητικά + Σετ ακουστικού-μικροφώνου BΤ + Επιλέχθηκε 1 στοιχείο + Τύπος + Παλιό + Συνθέτης + Διαγραφή; + Μηνύματα + Άλμπουμ + Προστέθηκε ήδη + SoundAlive + Διάθεση + Τραγούδια + Θέση + Αποθήκευση ως λίστα αναπαραγωγής + Δυναμική + Δεν είναι δυνατή η μετονομασία της λίστας αναπαραγωγής + Ροκ + Κοινή χρήση μέσω + Ρυθμίσεις μουσικής + Προστέθηκε πρόσφατα + Αυτόματη απενεργοποίηση μουσικής + Καλλιτέχνες + Δεν είναι δυνατός ο ορισμός ως ήχου κλήσης + Δεν είναι δυνατή η αλλαγή των ηχητικών εφέ κατά τη χρήση του καναλιού 5.1 + Λίστες αναπαραγωγής + Δημιουργία λίστας αναπαραγωγής + Κλασική + Προώθηση + Ροκ + Δημιουργία λίστας αναπαραγωγής + Πληροφορίες πολυμέσων + Ο φάκελός μου + Είδος άλμπουμ + Αφαίρεση; + Podcasts + Μετά από 1 ώρα + Βελτίωση μπάσων + Ευρύς + Μουσική + Καφετέρια + Επεξεργασία + Χορός + Το κανάλι 5.1 μπορεί να ενεργοποιηθεί μόνο όταν τα ηχητικά εφέ είναι απενεργοποιημένα + Διαθέσιμες χρήσεις + Αριθμός κομματιού + Δεν υπάρχουν φάκελοι + Προσ. σε λίστα αναπ. + Συντάκτης + Καλλιτέχνης + Προσθήκη + Προσθήκη λίστας αναπαραγωγής + Προβολή φακέλου + Ισχύς + Πάθος + Μενού μουσικής + Μορφοποίηση + Παθιασμένος + Ακουστικά + Ενίσχυση πρίμων + Ποπ + Δεν χρησιμοποιείται + Άγνωστο + Επιλέχθηκε ο μέγιστος αριθμός στοιχείων (%d) + Ήχος κλήσης καλούντος + %d τραγούδια + Αρχιμ. + Byte + Αφαιρέθηκε + Αγαπημένα + Εικονικό κανάλι 7.1 + Δεν είναι δυνατή η αφαίρεση του στοιχείου + Επιλέχθηκε πρόσφατα + Κανονική + Δεν έχει γίνει καμία επιλογή + Περιγραφή + Wha-wha + Πραγματικός χρόνος + Μέγεθος + Όλα + Μορφή + Email + Κατάργηση + Προσθήκη σε + Ημερομηνία δημιουργίας + Πραγματικός χρόνος + Τo εφέ ήχων του καναλιού 5.1 εκτελείται μόνο στη λειτουργία ακουστικών + Άλμπουμ + Όλα τα τραγούδια + Δημ/ργία + Κοιν.χρ + Καμία λίστα αναπαραγωγής + Προσαρμοσμένη + Μετονομασία + Μπορείτε να ακούσετε τη μουσική σας μέσω ροής σε συσκευές χρησιμοποιώντας το AllShare + Αναπ/χθηκε πρόσφατα + Οδηγός εγκατάστασης μουσικής + Ενίσχυση μπάσων + Δυνατό + Προσθήκη σε %s + Δεν είναι δυνατή η αναπαραγωγή παιχνιδιού κατά την κλήση + Πολύ μεγάλο όνομα + Επεξεργασία τίτλου + Δεν είναι δυνατή η λήψη φράσης + Συντελεστές + 'Ηχος κλήσης + Ποπ + Ορισμός ως + Δεν υπάρχουν άλμπουμ + Κλασική + Μήνυμα + Έτη + Αδύνατο + Δισκογραφία + Δεν είναι δυνατή η δημιουργία λίστας αναπαραγωγής + Ενημέρωση... + Χρήστης + Γονική αξιολόγηση + Μετά από 2 ώρες + Επιλογή συσκευής + Ισοσταθμιστής + Ορισμός + Μετάβαση στη βιβλιοθήκη + Αποθήκευση + Κοινή χρήση + Τζαζ + Άλμπουμ + Διακοπή + Ορισμός ως + Μετά από 15 λεπτά + Στίχοι + Δεν υπάρχουν καλλιτέχνες + House + Αναζήτηση ετικέτας + Τζαζ + Ακύρωση + Μετά από 1 ώρα 30 λεπτά + Κανένα στοιχείο + Τρέμολο + Δεν είναι δυνατή η αναπαραγωγή. Ο τύπος αρχείου δεν υποστηρίζεται + Ιστορικό + Επιλογή όλων + Δεν είναι δυνατή η κοινή χρήση του αρχείου DRM + Ενημέρωση βιβλιοθήκης + Λίστα κομματιών + Διάρκεια κομματιού + Είδη + Χαρά + Φάκελοι + Διαγραφή + Αλλαγή άξονα + Χωρίς στίχους + Προσθ. + Επιλέχθηκαν %d στοιχεία + Προσθήκη σε αρχική σελίδα + Το %s αφαιρέθηκε + Μουσικό κουτί + Συνθέτες + Ενημέρωση βιβλιοθήκης; + Biography + Επανάληψη παραγγελίας + Κλείσιμο + Δεν βρέθηκαν τραγούδια + Ήρεμος + Αυτό το εφέ ήχων εκτελείται μόνο στη λειτουργία ακουστικών και Bluetooth + Δεν είναι δυνατή η προσθήκη + Πνευματικά δικαιώματα + Ήχος ειδοποίησης + Να μην εμφανιστεί ξανά + 1 τραγούδι + Αναπαραγωγή όλων + Δεν είναι δυνατή η διαγραφή. Γίνεται αναπαραγωγή της επιλεγμένης μουσικής + Κανονικό + Συνθέτες + Προστέθηκε + Εξέταση + Εξωτερίκευση + Διαγραφή + Ανενεργό + Ολοκληρώθηκε + Αναπ/χθηκε πρόσφατα + Λίστα αναπαραγωγής + Η επιλεγμένη λίστα είναι κενή + Όλα + Δεν είναι δυνατή η αναπαραγωγή. Προέκυψε σφάλμα + Έγινε υπέρβαση του μέγιστου αριθμού αρχείων + Καθαρότητα μουσικής + Έτη + Είδη + Ορισμός ως + Μετά από 30 λεπτά + Λίστες αναπαραγ. + Εφέ + Λεπτομέρειες + Ρυθμίσεις + Χορός + Η ακρόαση μουσικής σε υψηλή ένταση για μεγάλο χρονικό διάστημα μπορεί να βλάψει την ακοή σας + Ηχείο + Επιλεγμένο + Αποσυνδεδεμένο Bluetooth + Χορωδία + Άν.λί.αν. + Αναζήτηση + Αυτό-ματο + Όνομα + Δεν είναι δυνατή η προσθήκη περισσότερων από %d αρχείων μουσικής + Δεν υπάρχουν αρκετά αρχεία μουσικής προς αναπαραγωγή στο Music square. Απαιτούνται τουλάχιστον %d αρχεία μουσικής + Άλμπουμ + Προβ. ως + Κανάλι 5.1 + Πληροφορίες πολυμέσων + Είδος + Δυναμικό + Προσθήκη στη λίστα αναπαραγωγής + diff --git a/res/eng-GB.xml b/res/eng-GB.xml new file mode 100644 index 0000000..0580ddf --- /dev/null +++ b/res/eng-GB.xml @@ -0,0 +1,222 @@ + + + + Years + Vocal + BT headset + 1 item selected + Type + Old + Composer + Delete? + Messaging + Album + Already added + SoundAlive + Moods + Songs + Location + Save as playlist + Dynamic + Unable to rename playlist + Rock + Share via + Music settings + Recently added + Music auto off + Artists + Unable to set as ringtone + Unable to change sound effects when using 5.1 channel + Playlists + Create playlist + Classic + Forwarding + Rock + Create playlist + Media info + My folders + Album art + Remove? + Podcasts + After 1 hour + Bass enhancement + Wide + Music Player + Cafe + Edit + Dance + 5.1 channel can only be activated when sound effects are off + Available uses + Track number + No folders + Add to playlist + Author + Artist + Add + Add playlist + Folder view + Validity + Passion + Music menu + Format + Passionate + Headphones + Treble boost + Pop + Not used + Unknown + Maximum number of items (%d) selected + Caller ringtone + %d songs + Conductors + Byte + Removed + Favourites + Virtual 7.1 ch + Unable to remove item + Most played + Normal + Nothing selected + Description + Wha-wha + Live + Size + All + Format + Email + Remove + Add to + Date created + Live + 5.1 channel sound effect works in earphone mode only + Albums + All songs + Create + Share + No playlists + Custom + Rename + You can stream your music to devices using AllShare + Recently played + Music setup wizard + Bass boost + Possible + Added to %s + Unable to play during call + Name too long + Edit title + Unable to get tag + Credits + Call ringtone + Pop + Set as + No albums + Classic + Message + Years + Impossible + Discography + Unable to create playlist + Updating... + User + Parent rating + After 2 hours + Select device + Equaliser + Set + Go to library + Save + Share + Jazz + Albums + Stop + Set as + After 15 mins + Lyric + No artists + House + Find tag + Jazz + Cancel + After 1 hour 30 mins + No items + Tremolo + Unable to play. Unsupported file type. + History + Select all + Unable to share DRM file + Library update + Track list + Track length + Genres + Joy + Folders + Delete + Change axis + No lyrics + Add + %d items selected + Add to home + %s removed + Music square + Composers + Update library? + Biography + Reorder + Close + No songs + Calm + This sound effect works in earphone and Bluetooth headset modes only + Unable to add + Copyright + Alarm tone + Do not show again + 1 song + Play all + Unable to delete. Selected music is playing. + Normal + Composers + Added + Review + Externalisation + Delete + Off + Success + Recently played + Playlist + Selected list empty + All + Unable to play. Error occurred. + Maximum number of files exceeded + Music clarity + Years + Genres + Set as + After 30 mins + Playlists + Effect + Details + Settings + Dance + High volumes may harm your hearing if you listen for a long time + Speaker + Selected + Bluetooth disconnected + Chorus + Open playlist + Search + Auto + Name + Unable to add more than %d music file + There are not enough music files to play in Music square. At least %d music files required. + Albums + View as + 5.1 channel + Media info + Genre + Dynamic + Add to playlist + Unable to change the setting. + diff --git a/res/eng-PH.xml b/res/eng-PH.xml new file mode 100644 index 0000000..31baf38 --- /dev/null +++ b/res/eng-PH.xml @@ -0,0 +1,221 @@ + + + + Years + Vocal + BT headset + 1 item selected + Type + Old + Composer + Delete? + Messaging + Album + Already added + SoundAlive + Moods + Songs + Location + Save as playlist + Dynamic + Unable to rename playlist + Rock + Share via + Music settings + Recently added + Music auto off + Artists + Unable to set as ringtone + Unable to change sound effects when using 5.1 channel + Playlists + Create playlist + Classic + Forwarding + Rock + Create playlist + Media info + My folders + Album art + Remove? + Podcasts + After 1 hour + Bass enhancement + Wide + Music Player + Cafe + Edit + Dance + 5.1 channel can only be activated when sound effects are off + Available uses + Track number + No folders + Add to playlist + Author + Artist + Add + Add playlist + Folder view + Validity + Passion + Music menu + Format + Passionate + Headphones + Treble boost + Pop + Not used + Unknown + Maximum number of items (%d) selected + Caller ringtone + %d songs + Conductors + Byte + Removed + Favorites + Virtual 7.1 ch + Unable to remove item + Most played + Normal + Nothing selected + Description + Wha-wha + Live + Size + All + Format + Email + Remove + Add to + Date created + Live + 5.1 channel sound effect works in earphone mode only + Albums + All songs + Create + Share + No playlists + Custom + Rename + You can stream your music to devices using AllShare + Recently played + Music set up wizard + Bass boost + Possible + Added to %s + Unable to play during call + Name too long + Edit title + Unable to get tag + Credits + Call ringtone + Pop + Set as + No albums + Classic + Message + Years + Impossible + Discography + Unable to create playlist + Updating... + User + Parent rating + After 2 hours + Select device + Equalizer + Set + Go to library + Save + Share + Jazz + Albums + Stop + Set as + After 15 mins + Lyric + No artists + House + Find Tag + Jazz + Cancel + After 1 hour 30 mins + No items + Tremolo + Unable to play. Unsupported file type + History + Select all + Unable to share DRM file + Library update + Track list + Track length + Genres + Joy + Folders + Delete + Change axis + No lyrics + Add + %d items selected + Add to home + %s removed + Music square + Composers + Update library? + Biography + Re-order + Close + No songs + Calm + This sound effect works in earphone and Bluetooth headset modes only + Unable to add + Copyright + Alarm tone + Do not show again + 1 song + Play all + Unable to delete. Selected music is playing + Normal + Composers + Added + Review + Externalization + Delete + Off + Success + Recently played + Playlist + Selected list empty + All + Unable to play. Error occurred + Maximum number of files exceeded + Music clarity + Years + Genres + Set as + After 30 mins + Playlists + Effect + Details + Settings + Dance + High volume may harm your hearing if you listen to it for a long time + Speaker + Selected + Bluetooth disconnected + Chorus + Open playlist + Search + Auto + Name + Unable to add more than %d music file + Not enough music files to play in Music square. At least %d music files required + Albums + View as + 5.1 channel + Media info + Genre + Dynamic + Add to playlist + diff --git a/res/eng-US.xml b/res/eng-US.xml new file mode 100644 index 0000000..08107ef --- /dev/null +++ b/res/eng-US.xml @@ -0,0 +1,221 @@ + + + + Years + Vocal + BT headset + 1 item selected + Type + Old + Composer + Delete? + Messaging + Album + Already added + SoundAlive + Moods + Songs + Location + Save as playlist + Dynamic + Unable to rename playlist + Rock + Share via + Music settings + Recently added + Music auto off + Artists + Unable to set as ringtone + Unable to change sound effects when using 5.1 channel + Playlists + Create playlist + Classic + Forwarding + Rock + Create playlist + Media info + My folders + Album art + Remove? + Podcasts + After 1 hour + Bass enhancement + Wide + Music Player + Cafe + Edit + Dance + 5.1 channel can only be activated when sound effects are off + Available uses + Track number + No folders + Add to playlist + Author + Artist + Add + Add playlist + Folder view + Validity + Passion + Music menu + Format + Passionate + Headphones + Treble boost + Pop + Not used + Unknown + Maximum number of items (%d) selected + Caller ringtone + %d songs + Conductors + Byte + Remove + Favorites + Virtual 7.1 ch + Unable to remove item + Most played + Normal + Nothing selected + Description + Wha-wha + Live + Size + All + Format + Email + Delete + Add to + Date created + Live + 5.1 channel sound effect works in Earphone mode only + Albums + All songs + Create + Share + No playlists + Custom + Rename + You can stream your music to devices using AllShare + Recently played + Music setup wizard + Bass boost + Possible + Added to %s + Unable to play during call + Name too long + Edit title + Unable to get tag + Credits + Call ringtone + Pop + Set as + No albums + Classic + Message + Years + Impossible + Discography + Unable to create playlist + Updating... + User + Parent rating + After 2 hours + Select device + Equalizer + Set + Go to library + Save + Share + Jazz + Albums + Stop + Set as + After 15 min + Lyric + No artists + House + Find tag + Jazz + Cancel + After 1 hour 30 min + No items + Tremolo + Unable to play. Unsupported file type. + History + Select all + Unable to share DRM file + Library update + Track list + Track length + Genres + Joy + Folders + Delete + Change axis + No lyrics + Add + %d items selected + Add to home + %s removed + Music square + Composers + Update library? + Biography + Reorder + Close + No songs + Calm + This sound effect works in earphone and Bluetooth headset modes only + Unable to add + Copyright + Alarm tone + Do not show again + 1 song + Play all + Unable to delete. Selected music is playing. + Normal + Composers + Added + Review + Externalization + Delete + Off + Success + Recently played + Playlist + Selected list empty + All + Unable to play. Error occurred. + Maximum number of files exceeded + Music clarity + Years + Genres + Set as + After 30 min + Playlists + Effect + Details + Settings + Dance + High volumes may harm your hearing if you listen for a long time + Speaker + Selected + Bluetooth disconnected + Chorus + Open playlist + Search + Auto + Name + Unable to add more than %d music file + Not enough music files to play in Music square. At least %d music files required. + Albums + View as + 5.1 channel + Media info + Genre + Dynamic + Add to playlist + diff --git a/res/est-EE.xml b/res/est-EE.xml new file mode 100644 index 0000000..b9c8146 --- /dev/null +++ b/res/est-EE.xml @@ -0,0 +1,221 @@ + + + + Aastad + Vokaal + BT-peakomplekt + 1 üksus on valitud + Tüüp + Vana + Helilooja + Kustutada? + Sõnumid + Album + Juba lisatud + SoundAlive + Meeleolud + Laulud + Asukoht + Salvesta esitusloendina + Dünaamiline + Esitusloendit ei ole võimalik ümber nimetada + Rock + Jaga: + Muusika seaded + Hiljuti lisatud + Muusika automaatselt välja + Esitajad + Helinaks ei saa määrata + Heliefekte ei saa muuta, kui kasutusel on 5.1 kanal + Esitusloendid + Loo esitusloend + Klassikaline + Edastamine + Rock + Loo esitusloend + Meediumiteave + Minu kaustad + Albumi kujundus + Eemaldada? + Pod-castid + 1 tunni pärast + Bassi rikastamine + Laialdane + MP3-mängija + Kohvik + Muuda + Tantsumuusika + 5.1 kanalit saab aktiveerida ainult siis, kui heliefektid on väljas + Võimalikud kasutusviisid + Muusikapala number + Kaustasid pole + Lisa esitusl.-sse + Autor + Esitaja + Lisa + Lisa esitusloend + Kaustad + Kehtivus + Kirg + Muusika menüü + Vorming + Kirglik + Kõrvaklapid + Kõrg. helide võimendamine + Popmuusika + Pole kasutusel + Tundmatu + Maksimaalne arv üksusi (%d) on valitud + Helistaja helin + %d laulu + Dirigen-did + Baiti + Eemaldatud + Lemmikud + Virtuaalne 7.1 kanal + Üksust ei ole võimalik eemaldada + Enim esitatud + Tavaline + Valik tegemata + Kirjeldus + Wha-wha + Elav muusika + Suurus + Kõik + Vorming + E-post + Eemalda + Lisa + Kuupäev loodud + Elav muusika + 5.1-kanaline heliefekt töötab ainult kõrvaklappide režiimis + Albumid + Kõik laulud + Loo + Jaga + Sünkroonimine... + Kohandus + Nimeta ümber + Muusikat saate seadmetes voogesitada AllShare'i abil + Hiljuti esitatud + Muusika seadistusviisard + Bassi võimendamine + Võimalik + Lisatud asukohta %s + Kõne ajal ei saa esitada + Nimi on liiga pikk + Muuda nimetust + Silti ei saa hankida + Tiitrid + Kõne helin + Popmuusika + Määra + Albumid puuduvad + Klassikaline + Sõnum + Aastad + Võimatu + Diskograafia + Esitusloendit ei ole võimalik luua + Värskendamine... + Kasutaja + Vanemate hinnang + 2 tunni pärast + Vali seade + Ekvalaiser + Määra + Mine teeki + Salvesta + Jaga + Džäss + Albumid + Peata + Määra + 15 minuti järel + Laulusõnad + Esitajaid ei ole + House + Otsi silti + Džäss + Tühista + 1 tunni ja 30 minuti pärast + Üksusi ei ole + Väriheli + Ei saa esitada. Toetuseta failitüüp + Ajalugu + Vali kõik + DRM-faili ei saa jagada + Teegi värskendamine + Lugude loend + Muusikapala pikkus + Žanrid + Rõõm + Kaustad + Kustuta + Vaheta telge + Laulusõnu pole + Lisa + %d üksust on valitud + Lisa avaekraanile + %s eemaldatud + Muusikaruut + Heliloojad + Kas värskendada teeki? + Elulugu + Järjesta ümber + Sulge + Laule pole + Rahulik + See heliefekt töötab ainult kõrvaklappide ja Bluetooth-peakomplekti režiimides + Ei saa lisada + Autoriõigus + Alarmi toon + Ära näita uuesti + 1 laul + Esita kõiki + Ei saa kustutada. Valitud muusikat esitatakse + Tavaline + Helil.-d + Lisatud + Eelvaade + Eksternalisatsioon + Kustuta + Väljas + Õnnestus + Hiljuti esitatud + Esitusloend + Valitud loend on tühi + Kõik + Ei saa esitada. Ilmnes tõrge + Failide maksimaalne arv on ületatud + Muusika selgus + Aastad + Žanrid + Määra: + 30 minuti pärast + Esitusloendid + Efekt + Üksikasjad + Seaded + Tantsumuusika + Valju heli kuulamine pika aja vältel võib põhjustada kuulmiskahjustusi + Kõlar + Valitud + Bluetoothi ühendus katkestatud + Koorilaul + Ava loend + Otsi + Automaatne + Nimi + Üle %d muusikafaili ei saa lisada + Pole piisavalt muusikafaile, mida esitada Muusikaruudus. Nõutav on vähemalt %d muusikafaili + Albumid + Kuva: + 5,1 kanalit + Meediumiteave + Žanr + Dünaamiline + Lisa esitusloendisse + diff --git a/res/eus-ES.xml b/res/eus-ES.xml new file mode 100644 index 0000000..b11089d --- /dev/null +++ b/res/eus-ES.xml @@ -0,0 +1,221 @@ + + + + Urteak + Ahots musika + BT aurikularrak + Elementu 1 hautatu da + Mota + Zaharra + Egilea + Ezabatu? + Mezularitza + Albuma + Gehituta dago lehendik + SoundAlive + Aldarteak + Abestiak + Kokalekua + Gorde erreprodukzio zerrenda gisa + Dinamikoa + Ezin da erreprodukzio zerrenda berrizendatu + Rock + Partekatu honen bidez + Musika konfigurazio + Azken gehitutakoak + Musika automatikoa itzalita + Artistak + Ezin da dei tonu gisa ezarri + Ezin dira soinu efektuak aldatu 5.1 kanala erabiltzerakoan + Erreprodukzio zerrendak + Erreprodukzio zerrenda sortu + Klasikoa + Birbidaltzea + Rock + Erreprodukzio zerrenda sortu + Multimedia informazioa + Nire karpetak + Albumaren azala + Kendu? + Podcast-ak + Ordu 1en ostean + Baxuak hobetu + Zabala + Musika Jogailua + Kafetegia + Editatu + Dance + 5.1 kanala soinu efektuak itzalita daudenean bakarrik aktibatu daiteke + Erabilera eskuragarriak + Abesti zenbakia + Karpetarik ez + Gehitu erreprod. zerrendara + Egilea + Artista + Gehitu + Gehitu erreprodukzio zerrenda + Karpet. ikuspeg. + Baliozkotasuna + Pasioa + Musikaren menua + Formateatu + Apasionatua + Aurikularrak + Treble boost + Pop + Erabili gabe + Ezezaguna + Elementuen kopuru maximoa (%d) hautatu duzu + Dei egilearen dei doinua + %d abesti + Zuzend. + Byte + Kenduta + Gogokoenak + 7.1 kate birtuala + Ezin da elementua kendu + Gehienetan erreproduzitutakoak + Arrunta + Ez da ezer aukeratu + Deskribapena + Wha-wha + Zuzenean + Tamaina + Guztiak + Formatua + Posta elektroniko mezuak + Kendu + Hona gehitu + Sortze data + Zuzenean + 5.1 kanalaren soinu efektuak aurikular moduan soilik funtzionatzen du + Albumak + Abesti guztiak + Sortu + Partek. + Erreprodukzio zerrendarik ez + Pertsonalizatua + Berrizendatu + Zure musikaren stream egin dezakezu gailuetara AllShare bidez + Azken erreproduzituak + Musika konfigurazio laguntzailea + Bass boost + Posible + %s zerrendan gehitua + Ezin da deian zehar erreproduzitu + Izen luzeegia + Izenburua editatu + Ezin da etiketa eskuratu + Kredituak + Dei doinua + Pop + Ezarri + Albumik ez + Klasikoa + Mezua + Urteak + Ezinezkoa + Diskografia + Ezin da erreprodukzio zerrenda sortu + Eguneratzen... + Erabiltzailea + Gurasoen balorazioa + 2 orduren ostean + Gailua aukeratu + Ekualizadorea + Ezarri + Joan liburutegira + Gorde + Partekatu + Jazz + Albumak + Gelditu + Honela zehaztu + 15 min. geroago + Lirikoa + Artistarik ez + House + Bilatu etiketa + Jazz + Ezeztatu + Ordu 1 eta 30 minutu ondoren + Elementurik ez + Tremolo + Ezin da erreproduzitu. Fitxategi mota ez onartua + Historia + Denak aukeratu + Ezin da DRM fitxategia partekatu + Liburutegi eguneraketa + Pisten zerrenda + Abesti iraupena + Generoak + Poztasuna + Karpetak + Ezabatu + Aldatu ardatza + Letrarik ez + Gehitu + %d elementu hautatu dira + Gehitu nagusira + %s ezabatu da + Musika plaza + Egileak + Eguneratu liburutegia? + Biografia + Ordenatu berriro + Itxi + Abestirik ez + Lasaia + Soinu efektu honek aurikular eta Bluetooth aurikular moduetan soilik funtzionatzen du + Ezin da gehitu + Copyright + Alarma doinua + Ez erakutsi berriro + Abesti 1 + Denak erreproduzitu + Ezin da ezabatu. Hautatutako musika erreproduzitzen ari da + Arrunta + Konposit. + Gehituta + Berrikusi + Kanporatzea + Ezabatu + Desaktibatu + Behar bezala + Azken erreproduzituak + Erreprodukzio zerrenda + Hautatutako zerrenda hutsik + Guztia(k) + Ezin da erreproduzitu. Errorea gertatu da + Gehienezko fitxategi kopurua gainditu duzu + Musikaren argitasuna + Urteak + Generoak + Honela zehaztu + 30 min ostean + Errepr. zerrendak + Efektua + Xehetasunak + Ezarpenak + Dance + Baliteke bolumen handien zure entzumena kaltetzea denbora luzean entzuten baduzu + Bozgorai. + Aukeratutakoa(k) + Bluetooth deskonektatuta + Chorus + Err. zr. ir. + Bilatu + Auto + Izena + Ezin izan dira %d musika fitxategi baino gehiago gehitu + Ez dago nahikoa musika fitxategi erreproduzitzeko Music square-n. Gutxienez %d musika fitxategi behar dira + Albumak + Ik. hon. + 5.1 kanala + Multimedia informazioa + Generoa + Dinamikoa + Erreprodukzio zerrendara gehitu + diff --git a/res/fas-AF.xml b/res/fas-AF.xml new file mode 100644 index 0000000..9e5aad7 --- /dev/null +++ b/res/fas-AF.xml @@ -0,0 +1,221 @@ + + + + سال + صوتی + هدست بلوتوث + 1 مورد انتخاب شد + نوع + قديمی + آهنگ ساز + حذف شود؟ + پيام رسانی + آلبوم + قبلاً اضافه شده است + SoundAlive + حالت ها + آهنگ ها + مکان + ذخیره به عنوان لیست پخش + پویا + تغییر نام لیست پخش ممکن نیست + راک + اشتراک از طریق + تنظیمات موسیقی + اخیرا افزوده شده + خاموش شدن خودکار موزیک + هنرمندان + تنظیم بعنوان آهنگ زنگ ممکن نیست + هنگام استفاده از 5.1 کاناله، جلوه های صوتی تغییر نمی کند + لیست پخش + ایجاد فهرست پخش + کلاسيک + انتقال + راک + ایجاد فهرست پخش + اطلاعات رسانه + پوشه های شخصی + جلدآلبوم + حذف؟ + پادکست ها + بعد از 1 ساعت + امکان جانبی باس + پهن + پخش کننده موزیک + کافه + تصحيح + رقص + کانال 5.1 فقط زمانی فعال می شود که صداها غیرفعال باشند + استفاده های در دسترس + شماره آهنگ + هیچ پوشه ای موجود نیست + افزودن به لیست پخش + نویسنده + هنرمند + افزودن + افزودن لیست پخش + نمای پوشه + اعتبار + احساسی + منوی موسیقی + فرمت + احساساتی + هدفون ها + تقویت تربل + پاپ + استفاده نشده + ناشناس + حداکثر تعداد موارد (%d) انتخاب شده است + زنگ تماس گيرنده + %d آهنگ + گردانندگان + بایت + حذف شد + موردعلاقه ها + کانال 7.1 مجازی + پاک کردن مورد ممکن نیست + بیشتر پخش شده + عادی + بدون انتخاب + شرح + وا وا + زنده + سايز + همه + فرمت + ایمیل + حذف + افزودن به + تاریخ ایجاد + زنده + جلوه صوتی کانال 5.1 فقط در حالت گوشی + آلبوم ها + همه آهنگ ها + ايجاد + اشتراک + بدون لیست پخش + مخصوص + تعويض نام + با استفاده از AllShare می توانید موسیقی را بصورت جریانی در دستگاه ها پخش کنید + اخیرا پخش شده + راهنمای تنضظیم موزیک + تقویت باس + ممکن + اضافه شد به %s + پخش در حین تماس ممکن نیست + نام طولانی + تصحيح + دریافت برچسب امکان پذیر نیست + اعتبارها + زنگ تماس + پاپ + تنظيم برای + آلبومی وجود ندارد + کلاسيک + پيام + سالها + غير ممکن + ضبط و ثبت صدا بر روی صفحه گرامافون + ایجاد لیست پخش ممکن نیست + درحال بروزرسانی… + کاربر + درجه بندی اصلی + بعد از 2 ساعت + انتخاب دستگاه + اکولايزر + تنظيم + رفتن به کتابخانه + ثبت + اشتراک + جاز + آلبوم ها + توقف + تنظيم برای + بعد از 15 دقیقه + ترانه + خواننده ای وجود ندارد + هاوس + جستجوی برچسب + جاز + لغو + بعد از 1 ساعت و 30 دقیقه + موردی نیست + ارتعاش + پخش ممکن نیست. نوع فایل پشتیبانی نشده است + تاریخچه + انتخاب همه + به اشتراک گذاشتن فایل DRM ممکن نیست + به‌ روزرسانی کتابخانه + لیست آهنگ + مدت آهنگ + انواع + سرگرمی + پوشه ها + حذف + تغییر محور + ترانه وجود ندارد + افزودن + %d مورد انتخاب شد + افزودن به صفحه اصلی + %s حذف شد + دامنه موسیقی + آهنگ سازان + بروزرسانی مجموعه؟ + زندگینامه + ترتیب مجدد + بسته + آهنگی موجود نیست + آرام + این جلوه صدا فقط در حالت های هدست بلوتوث و گوشی کار می کند + افزودن ممکن نیست + حق چاپ + زنگ هشدار + دوباره نمایش داده نشود + 1 آهنگ + پخش همه + نمی توانید حذف کنید. موسیقی انتخاب شده در حال پخش است + عادی + آهنگ ساز + اضافه شد + مرور + صدای طبیعی خارجی + حذف + خاموش + موفقیت + اخیرا پخش شده + لیست پخش + لیست انتخابی خالی است + همه + پخش ممکن نیست. خطا رخ داد + به حداکثر تعداد مجاز فایل رسیده اید + وضوح موسیقی + سال + انواع + تنظیم به عنوان + بعد از 30 دقیقه + لیست های پخش + جلوه + جزئيات + تنظيمات + رقص + اگر به مدت طولانی به موسیقی بلند گوش دهید ممکن است صدای بلند ممکن است به شنوایی شما آسیب برساند + بلندگو + منتخب + Bluetooth قطع شد + کر + بازکردن لیست + جستجو + خودکار + نام + افزودن بيش از %d فايل موزیک مقدور نيست + تعداد کافی آهنگ برای پخش در Music Square وجود ندارد. حداقل %d فایل آهنگ نیاز است + آلبوم ها + مشاهده بعنوان + کانال 5.1 + اطلاعات رسانه + نوع + متحرک + افزودن به فهرست + diff --git a/res/fin-FI.xml b/res/fin-FI.xml new file mode 100644 index 0000000..47584a4 --- /dev/null +++ b/res/fin-FI.xml @@ -0,0 +1,221 @@ + + + + Vuodet + Laulu + BT-kuulokkeet + 1 kohde valittu + Tyyppi + Vanha + Säveltäjä + Poistetaanko? + Viestit + Albumi + On jo lisätty + SoundAlive + Tunnelmat + Kappaleet + Paikka + Tallenna soittolistana + Dynaaminen + Soittolistan nimeäminen uudelleen epäonnistui + Rock + Jakotapa + Musiikkiasetukset + Viimeksi lisätyt + Automaattinen musiikin lopetus + Esittäjät + Ei voi asettaa soittoääneksi + Äänitehosteita ei voi muuttaa, kun 5.1-kanava on käytössä + Soittolistat + Luo soittolista + Klassinen + Edelleenlähetys + Rock + Luo soittolista + Median tiedot + Omat kansiot + Kansitaide + Poistetaanko? + Podcast + 1 tunnin kuluttua + Basson korostus + Leveä + Musiikki + Kahvila + Muokkaa + Tanssi + 5.1-kanava voidaan aktivoida vain silloin, kun äänitehosteet on poistettu käytöstä + Jäljellä olevat käyttökerrat + Kappaleen numero + Ei kansioita + Lisää soittolistaan + Tekijä + Esittäjä + Lisää + Lisää soittolista + Kansion. + Kelpoisuus + Intohimo + Musiikkivalikko + Alusta + Intohimoinen + Kuulokkeet + Diskanttikorostus + Pop + Ei käytössä + Tuntematon + Valittujen kohteiden enimmäismäärä (%d) saavutettu + Soittajan soittoääni + %d kappaletta + Kap.m. + Tavu + Poistettu + Suosikit + Virtuaalinen 7.1-kanava + Kohdetta ei voi poistaa + Eniten soitetut + Normaali + Mitään ei valittu + Kuvaus + Wah-wah + Suora + Koko + Kaikki + Muoto + Sähköposti + Poista + Lisää + Luontipäivämäärä + Suora + 5.1-kanavainen äänitehoste toimii vain kuuloketilassa + Albumit + Kaikki kappaleet + Luo + Jaa + Ei soittolistoja + Mukautettu + Nimeä uudelleen + Voit virtauttaa musiikin AllShare-laitteisiin + Viimeksi soitetut + Ohjattu musiikkiasennus + Bassokorostus + Mahdollinen + Lisätty kohteeseen %s + Puhelun aikana ei voi toistaa + Nimi on liian pitkä + Muokkaa otsikkoa + Tunnistetta ei voi hakea + Tekijät + Puhelun soittoääni + Pop + Määritä + Ei albumeita + Klassinen + Viesti + Vuosi + Mahdoton + Diskografia + Soittolistan luonti epäonnistui + Päivitetään... + Käyttäjä + Aikuisluokitus + 2 tunnin kuluttua + Valitse laite + Taajuuskorjain + Aseta + Siirry kirjastoon + Tallenna + Jaa + Jazz + Albumit + Lopeta + Aseta + 15 min kuluttua + Sanoitus + Ei esittäjiä + House + Etsi tunniste + Jazz + Peruuta + 1 h 30 min kuluttua + Ei kohteita + Tremolo + Toisto ei onnistu. Tiedostotyyppiä ei tueta + Historia + Valitse kaikki + DRM-tiedostoa ei voi jakaa + Kirjaston päivitys + Kappaleluettelo + Kappaleen pituus + Tyylilajit + Ilo + Kansiot + Poista + Vaihda akselia + Ei sa-noitusta + Lisää + %d kohdetta valittu + Lisää etusivulle + %s poistettu + Musiikkineliö + Säveltäjät + Päivitetäänkö kirjasto? + Biografia + Järjestä uudestaan + Sulje + Ei kappaleita + Rauhallinen + Tämä äänitehoste toimii vain kuuloke- ja Bluetooth-kuuloketiloissa + Lisääminen ei onnistu + Tekijänoikeus + Hälytysääni + Älä näytä uudestaan + 1 kappale + Toista kaikki + Ei voi poistaa. Valittu musiikki soi + Normaali + Sävelt. + Lisätty + Tarkista + Ulkoistaminen + Poista + Pois päältä + Valmis + Viimeksi soitetut + Toistoluettelo + Valittu luettelo on tyhjä + Kaikki + Ei voi toistaa. Tapahtui virhe + Tiedostojen enimmäismäärä on ylitetty + Musiikin selkeys + Vuodet + Tyylilajit + Aseta + 30 min kuluttua + S.listat + Tehoste + Yksityiskohdat + Asetukset + Tanssi + Suuri äänenvoimakkuus vaurioittaa kuuloasi pitkäaikaisen kuuntelun aikana + Kaiutin + Valittu + Bluetooth-yhteys on katkennut + Kuoro + A.s.lista + Etsi + Auto + Nimi + Yli %d musiikkitiedostoa ei voi lisätä + Musiikkineliössä ei ole riittävästi toistettavia musiikkitiedostoja. Vaaditaan vähintään %d musiikkitiedostoa + Albumit + N.tapa + 5.1-kanavainen + Median tiedot + Tyylilaji + Dynaaminen + Lisää toistoluetteloon + diff --git a/res/fra-CA.xml b/res/fra-CA.xml new file mode 100644 index 0000000..886f1de --- /dev/null +++ b/res/fra-CA.xml @@ -0,0 +1,221 @@ + + + + Années + Vocal + Casque Bluetooth + 1 élément sélectionné + Type + Ancien + Écrire un message + Supprimer ? + Messagerie + Album + Déjà ajouté + SoundAlive + Ambiances + Chansons + Emplacement + Enregistrer comme liste de lecture + Dynamique + Impossible de renommer la liste de lecture + Rock + Partager via + Paramètres de musique + Ajoutés récemment + Arrêt auto de la musique + Artistes + Impossible de définir en tant que sonnerie + Impossible de modifier les effets sonores pendant l'utilisation de la chaine 5.1 + Listes de lecture + Créer une liste de lecture + Classique + Transfert + Rock + Créer une liste de lecture + Informations sur les multimédias + Mes dossiers + Illustration de l'album + Retirer? + Balados + Après 1 heure + Optimisation des basses + Écran large + Lecteur de musique + Café + Modifier + Dance + La chaine 5.1 ne peut être activée que si les effets sonores sont désactivés + Utilisations disponibles + Numéro de la piste + Aucun dossier + Aj. dans liste lecture + Auteur + Artiste + Ajouter + Ajouter liste de lecture + Affich. dossier + Validité + Passion + Menu musique + Format + Passionné + Écouteurs + Amplification des aigus + Pop + Non utilisé + Inconnu + Nombre maximum d'éléments (%d) sélectionnés + Sonnerie de l'appelant + %d titres + Chefs d'orch. + Octet + Retiré + Favoris + Chaine 7.1 virtuelle + Impossible de retirer l'élément + Les plus écoutés + Normale + Aucune sélection + Description + Wha Wha + Direct + Taille + Tout + Formater + Courriel + Retirer + Ajouter à + Date de création + Direct + L'effet sonore de la chaine 5.1 ne fonctionne qu'en mode Écouteur uniquement + Albums + Tous les morceaux + Créer + Partag. + Aucune liste de lecture + Personnaliser + Renommer + Vous pouvez diffuser votre musique sur des périphériques via AllShare + Écoutés récemment + Assistant de configuration de la musique + Amplification des basses + Possible + Ajouté à %s + Impossible de lire le message pendant un appel + Nom trop long + Modifier le titre + Impossible d'obtenir le libellé + Remerciements + Sonnerie d'appel + Pop + Définir comme + Aucun album + Classique + Message + Ans + Impossible + Discographie + Impossible de créer la liste de lecture + Mise à jour... + Utilisateur + Classement parental + Après 2 heures + Sélectionnez le périphérique + Égaliseur + Régler + Accéder à la bibliothèque + Enreg. + Partager + Jazz + Albums + Arrêter + Définir comme + Après 15 min + Paroles + Aucun artiste + House + Rechercher un libellé + Jazz + Annuler + Après 1 h 30 min + Aucun élément + Trémolo + Lecture impossible. Type de fichier non pris en charge + Historique + Sélectionner tout + Impossible de partager le fichier GDN + Mise à jour de la bibliothèque + Liste des pistes + Durée de la piste + Genres + Joie + Dossiers + Supprimer + Modifier l'axe + Aucune parole + Ajouter + %d éléments sélectionnés + Ajouter à l'accueil + %s supprimé + Coin musique + Compositeurs + Mettre à jour la bibliothèque? + Biographie + Réorganiser + Fermer + Aucun titre + Calme + L'effet sonore fonctionne uniquement avec le mode Écouteur et le casque Bluetooth + Impossible à ajouter + Droit d'auteur + Tonalité d'alarme + Ne plus afficher + 1 titre + Écouter tout + Suppression impossible. La musique sélectionnée est en cours de lecture + Normal + Compos. + Ajouté + Aperçu + Externalisation + Supprimer + Désactivé + Terminé + Écoutés récemment + Liste de lecture + La liste sélectionnée est vide + Tout + Lecture impossible. Une erreur s'est produite + Nombre maximum de fichiers dépassé + Clarté musicale + Années + Genres + Définir comme + Après 30 min + Listes de lecture + Effets + Détails + Paramètres + Dance + L'écoute prolongée de musique à un volume élevé risque d'endommager votre audition + HP + Sélectionné + Bluetooth déconnecté + Chorale + Liste + Recherche + Auto + Nom + Impossible d'ajouter plus de %d fichier(s) musical/aux + Nombre de fichiers musicaux insuffisant pour la lecture dans Coin musique. Au moins %d fichiers musicaux requis + Albums + Affichage + Chaine 5.1 + Informations sur les multimédias + Genre + Dynamique + Ajouter à liste de lecture + diff --git a/res/fra-FR.xml b/res/fra-FR.xml new file mode 100644 index 0000000..fe3c7a0 --- /dev/null +++ b/res/fra-FR.xml @@ -0,0 +1,221 @@ + + + + Années + Chant + Casque Bluetooth + 1 élément sélectionné + Type + Ancien + Compositeur + Supprimer ? + Messages + Album + Déjà ajouté + SoundAlive + Ambiances + Chansons + Emplacement + Enregistrer comme liste de lecture + Dynamique + Impossible de renommer la liste de lecture + Rock + Partager via + Paramètres audio + Ajoutés récemment + Arrêt auto de la musique + Artistes + Impossible de définir en tant que sonnerie + Modification des effets sonores impossible lors de l'utilisation du canal 5.1 + Listes de lecture + Créer une liste de lecture + Classique + Transfert + Rock + Créer une liste de lecture + Infos sur le média + Mes dossiers + Illustration de l'album + Supprimer ? + Podcasts + Après 1 heure + Optimisation des basses + Espace ouvert + Lecteur MP3 + Café + Modifier + Dance + Le canal 5.1 ne peut être activé que si les effets sonores sont désactivés + Utilisations disponibles + Numéro de la piste + Aucun dossier + Aj. dans liste lecture + Auteur + Artiste + Ajouter + Ajouter liste de lecture + Affichage dossier + Validité + Passion + Menu musique + Formater + Passionné + Écouteurs + Amplification des aigus + Pop + Non utilisé + Inconnu + Nombre maximum d'éléments (%d) sélectionnés + Sonnerie d'appelant + %d titres + Chefs d'orch. + Octet + Supprimé + Favoris + Canal 7.1 virtuel + Impossible de retirer l'élément + Les plus écoutés + Normal + Aucune sélection + Description + Wha Wha + Live + Taille + Tout + Format + Email + Supprimer + Ajouter à + Date créée + Live + L'effet sonore 5.1 ne fonctionne qu'en mode Écouteur uniquement + Albums + Tous les morceaux + Créer + Partag. + Aucune liste de lecture + Personnaliser + Renommer + Vous pouvez diffuser votre musique sur des périphériques via AllShare + Écoutés récemment + Assistant de configuration de la musique + Amplification des basses + Possible + Ajouté à %s + Lecture impossible pendant un appel + Nom trop long + Modifier le titre + Impossible d'obtenir le libellé + Remerciements + Sonnerie d'appel + Pop + Définir comme + Aucun album + Classique + Message + Années + Impossible + Discographie + Impossible de créer la liste de lecture + Mise à jour... + Utilisateur + Classement parental + Après 2 heures + Sélectionnez un appareil + Egaliseur + Appliquer + Accéder à la bibliothèque + Enregistrer + Partager + Jazz + Albums + Arrêter + Définir comme + Après 15 min + Paroles + Aucun artiste + House + Rechercher tag + Jazz + Annuler + Après 1 heure 30 min + Aucun élément + Trémolo + Lecture impossible. Type de fichier non pris en charge + Historique + Sélect. tout + Impossible de partager le fichier DRM + Mise à jour de la bibliothèque + Liste des pistes + Durée de la piste + Genres + Joie + Dossiers + Supprimer + Modifier l'axe + Aucune parole + Ajouter + %d éléments sélectionnés + Ajouter à l'accueil + %s supprimé + Coin musique + Compositeurs + Mettre à jour la bibliothèque ? + Biographie + Réorganiser + Fermer + Aucun titre + Calme + L'effet sonore fonctionne uniquement avec le mode Écouteur et le casque Bluetooth + Impossible à ajouter + Copyright + Tonalité de l'alarme + Ne plus afficher + 1 titre + Écouter tout + Suppression impossible. La musique sélectionnée est en cours de lecture + Normal + Compos. + Ajouté + Compte-rendu + Externalisation + Supprimer + Désactivé + Terminé + Écoutés récemment + Liste de lecture + La liste sélectionnée est vide + Tout + Lecture impossible. Une erreur s'est produite + Nombre maximum de fichiers dépassé + Clarté musicale + Années + Genres + Déf. comme + Après 30 min + Listes lecture + Effet + Détails + Paramètres + Dance +  L'écoute prolongée de musique à un volume élevé risque d'endommager votre audition + HP + Sélectionné + Bluetooth déconnecté + Chorale + Liste + Rechercher + Configuration automatique. + Nom + Impossible d'ajouter plus de %d fichier(s) musical/aux + Nombre de fichiers musicaux insuffisant pour la lecture dans Coin musique. Au moins %d fichiers musicaux requis + Albums + Affichage + Canal 5.1 + Infos sur le média + Genre + Dynamique + Ajouter à liste de lecture + diff --git a/res/gle-IE.xml b/res/gle-IE.xml new file mode 100644 index 0000000..d5030dd --- /dev/null +++ b/res/gle-IE.xml @@ -0,0 +1,221 @@ + + + + Blianta + Guthach + Gléas cinn BT + 1 mhír roghnaithe + Cineál + Sean + Cumadóir + Scrios? + Cur teachtaireachtaí + Albam + Curtha leis cheana + SoundAlive + Mothúcháin + Amhráin + Suíomh + Sábháil mar sheinnliosta + Dinimiciúil + Ní féidir seinnliosta a athainmniú + Rac + Comhroinn le + Socruithe ceoil + Curtha leis le déanaí + Uathcheol as + Ceoltóirí + Ní féidir é a shocrú mar chlingthon + Ní féidir maisíochtaí fuaime a athrú agus imfhuaim in úsáid + Seinnliostaí + Déan seinnliosta + Clasaiceach + Seoladh ar aghaidh + Rac + Déan seinnliosta + Faisnéis faoi mheáin + M'fhillteáin + Ealaín albaim + Bain? + Podchraoltaí + I ndiaidh 1 uair an chloig + Breisiú doird + Leathan + Seinnteoir Ceoil + Caife + Cuir in eagar + Damhsa + Ní féidir imfhuaim a chur i ngníomh ach amháin nuair a bhíonn maisíochtaí fuaime as + Úsáidí atá ar fáil + Uimhir an riain + Níl fillteán ann + Cuir le seinnliosta + Údar + Ceoltóir + Cuir leis + Cuir seinnliosta leis + Amharc fillteáin + Bailíocht + Paisean + Roghchlár ceoil + Formáidigh + Paiseanta + Cluasáin + Treisiú tribile + Pop + Neamhúsáidte + Anaithnid + Uaslíon na míreanna roghnaithe (%d) + Clingthon glaoiteora + %d amhrán + Stiúrthóirí + Beart + Bainte + Ceanáin + Cainéal fíorúil 7.1 + Ní féidir mír a bhaint + Is mó seinm + Normálta + Dada roghnaithe + Cur síos + Wha-wha + Beo + Méid + Gach + Formáid + R-phost + Bain + Cuir le + Dáta a rinneadh + Beo + Ní fheidhmíonn maisíocht fuaime imfhuaime ach i mód cluasáin amháin + Albaim + Gach amhrán + Cruthaigh + C.roinn + Níl seinnliostaí ann + Saincheaptha + Athainmnigh + Is féidir leat do cheol a shruthú chuig gléasanna le AllShare + Seinnte le déanaí + Draoi suiteála ceoil + Treisiú doird + Indéanta + Curtha le %s + Ní féidir seinm le linn glao + Ainm ró-fhada + Cuir teideal in eagar + Ní féidir clib a fháil + Creidiúintí + Clingthon glao + Pop + Socraigh mar + Níl albaim ann + Clasaiceach + Teachtaireacht + Blianta + Dodhéanta + Dioscliosta + Ní féidir seinnliosta a chruthú + Ag nuashonrú... + Úsáideoir + Rátáil tuismitheoirí + I ndiaidh 2 uair an chloig + Roghnaigh gléas + Cothromóir + Socraigh + Téigh chuig leabharlann + Sábháil + Comhroinn + Snagcheol + Albaim + Stop + Socraigh mar + Tar éis 15 nóim + Liric + Níl ceoltóirí ann + Ceol tí + Aimsigh clib + Snagcheol + Cuir ar ceal + Tar éis 1 uair an chloig 30 nóim + Níl míreanna ann + Tremoló + Ní féidir seinm. Cineál comhaid gan tacú + Stair + Roghnaigh gach + Ní féidir comhad DRM a chomhroinnt + Nuashonrú leabharlainne + Liosta fuaimrianta + Fad ama an riain + Seánraí + Lúcháir + Fillteáin + Scrios + Athraigh ais + Níl liricí ann + Cuir leis + %d mír roghnaithe + Cuir le baile + %s bainte + Cearnóg ceoil + Cumadóirí + Nuashonraigh leabharlann? + Beathaisnéis + Déan athordú + Dún + Níl amhráin ann + Suaimhneach + Ní oibríonn an mhaisíocht fuaime seo ach amháin sna móid cluasáin agus gléas cinn Bluetooth + Ní féidir cur leis + Cóipcheart + Ton aláraim + Ná taispeáin arís + 1 amhrán + Seinn gach + Ní féidir scriosadh. Tá an ceol roghnaithe á sheinm + Normálta + Cumadóir + Curtha leis + Athbhreithniú + Seachtrú + Scrios + As + D’éirigh leis + Seinnte le déanaí + Seinnliosta + Liosta roghnaithe folamh + Gach + Ní féidir seinm. Tharla earráid + Uaslíon na gcomhad sáraithe + Soiléireacht cheoil + Blianta + Seanrá + Socraigh mar + I ndiaidh 30 nóim + Seinnliostaí + Maisíocht + Sonraí + Socruithe + Damhsa + Is féidir le hairdí arda dochar a dhéanamh don éisteacht má éisteann tú ar feadh tamall fada + Callaire + Roghnaithe + Bluetooth dícheangailte + Cór + Osc. SL + Cuardaigh + Uath- + Ainm + Ní féidir níos mó ná %d comhad ceoil a chur leis + Níl go leor comhad ceoil ann le seinm sa Chearnóg ceoil. Tá %d comhad ceoil ar a laghad de dhíth + Albaim + Féach mar + Imfhuaim + Faisnéis faoi mheáin + Seánra + Dinimiciúil + Cuir le seinnliosta + diff --git a/res/glg-ES.xml b/res/glg-ES.xml new file mode 100644 index 0000000..8fb4770 --- /dev/null +++ b/res/glg-ES.xml @@ -0,0 +1,221 @@ + + + + Anos + Música vocal + Auriculares BT + 1 elemento seleccionado + Tipo + Antiga + Compositor + Eliminar? + Mensaxeria + Álbum + Xa engadida + SoundAlive + Ambientes + Cancións + Situación + Gardar como lista de reprodución + Dinámico + Non se pode cambiar o nome da lista de reprodución + Rock + Compartir a través de + Configuración de música + Engadidas recentemente + Música automática desactivada + Artistas + Non se pode definir como melodía + Non se poden cambiar os efectos de son mentres estás a usar a canle 5.1 + Listas de reprodución + Crear lista de reprodución + Clásico + Reenviando + Rock + Crear lista de reprodución + Información multimedia + As miñas carpetas + Portada + Eliminar? + Podcasts + Tras 1 hora + Aumento de grave + Amplo + Reprodutor de Música + Cafetaría + Editar + Dance + Só se pode activar a canle 5.1 cando os efectos de son están desactivados + Usos dispoñibles + Número de pista + Non hai carpetas + Eng á lista de reprod + Autor + Artista + Engadir + Engadir lista de reprodución + Ver arquivos + Validez + Passion + Menú de música + Formato + Pasional + Auriculares + Potenciación de agudos + Pop + Sen utilizar + Descoñecido + Número máximo de elementos (%d) seleccionados + Melodía do chamante + %d cancións + Directores + Byte + Eliminado + Favoritos + Virtual de 7.1 canles + Non se pode eliminar o elemento + As máis escoitadas + Normal + Non se seleccionou nada + Descrición + Wha-wha + En directo + Tamaño + Todas + Formato + Correo electrónico + Eliminar + Engadir a + Data creada + En directo + O efecto de son da canle 5.1 só funciona no modo de auriculares + Álbums + Todas as cancións + Crear + Compart + Sen listas de reprodución + Personalizado + C. nome + Podes transmitir por secuencias a túa música a dispositivos mediante AllShare + Reproducida recentemente + Asistente de configuración de música + Potenciación de graves + Posible + Engadido a %s + Non se pode reproducir durante a chamada + Nome demasiado longo + Editar título + Non se pode obter etiqueta + Créditos + Melodía de chamada + Pop + Definir como + Non hai álbums + Clásico + Mensaxe + Anos + Non é posible + Discografía + Non se pode crear a lista de reprodución + Actualizando... + Usuario + Preferidos polos pais + Tras 2 horas + Seleccionar dispositivo + Ecualizador + Establ. + Ir á biblioteca + Gardar + Compartir + Jazz + Álbums + Deter + Definir como + Logo de 15 min + Letra + Non hai artistas + Música house + Buscar etiqueta + Jazz + Cancelar + Tras 1 hora e 30 min + Sen elementos + Trémolo + Non se pode reproducir. Tipo de arquivo non admitido + Historial + Seleccionar todo + Non se pode compartir o arquivo DRM + Actualización da biblioteca + Lista de pistas + Duración da pista + Xéneros + Joy + Carpetas + Eliminar + Cambiar eixo + Sen letras + Eng. + %d elementos seleccionados + Engadir ao inicio + %s eliminado + Music square + Compositores + Actualizar biblioteca? + Biografía + Volver ordenar + Pechar + Non hai cancións + Tranquilo + Este efecto de son funciona só no modo de auriculares e audiófono Bluetooth + Non se pode engadir + Copyright + Ton de alarma + Non volver mostrar + 1 canción + Reproducir todo + Non se pode eliminar. Estase a reproducir a música seleccionada + Normal + Composit + Engadido + Revisar + Exteriorización + Eliminar + Desactiv. + Éxito + Reproducida recentemente + Lista de reprodución + Lista seleccionada baleira + Todo + Non se pode reproducir. Produciuse un erro + Superouse o número máximo de arquivos + Claridade musical + Anos + Xéneros + Establecer como + Tras 30 min + Listas de música + Efecto + Detalles + Axustes + Dance + A música a un volume elevado pode danar a túa capacidade auditiva se a escoitas durante un período de tempo prolongado + Altofal. + Seleccionado + Bluetooth desconectado + Coro + Ab lr + Buscar + Automático + Nome + Non se pode(n) engadir máis de %d arquivo(s) de música + Non hai arquivos de música suficientes para reproducir en Music square. Precísanse polo menos %d arquivos de música + Álbums + Ver como + Canle 5.1 + Información multimedia + Xénero + Dinámico + Engadir á lista de reprodución + diff --git a/res/hin-IN.xml b/res/hin-IN.xml new file mode 100644 index 0000000..ab04389 --- /dev/null +++ b/res/hin-IN.xml @@ -0,0 +1,221 @@ + + + + वर्ष + मौखिक + BT हेडसेट + 1 मद चयनित + प्रकार + पुराना + कंपोज़र + हटाएँ? + सन्देश + एल्बम + पहले ही ज़ोड दिया है + साउंडअलाइव + मूड्स + गाने + स्थान + प्लेसूची के रूप में सुरक्षित करें + डायनामिक + प्‍लेलिस्‍ट का नाम बदलने में अक्षम + रॉक + इसके द्वारा साझा करें + संगीत सेटिंग्स + हाल में जोड़ा गया + संगीत स्वत: बंद + कलाकार + रिंगटोन के रूप में सेट करने में अक्षम + 5.1 चैनल का उपयोग करने पर साउंड इफेक्ट्स बदलने में अक्षम। + प्लेसूचियाँ + प्लेसूची बनाएँ + शास्त्रीय + अग्रेषण + रॉक + प्लेसूची बनाएँ + मीडिया सूचना + मेरे फोल्डर + एल्बम कला + हटाएँ? + पॉडकास्ट्स + 1 घंटे बाद + बास एन्हेंसमेंट + वाइड + संगीत प्लेयर + कैफे + संपादित करें + नृत्य + ध्वनि प्रभाव बंद होने पर केवल 5.1 चैनल सक्रिय हो सकता है। + उपलब्ध उपयोग + ट्रैक नंबर + फोल्डर्स नहीं + प्लेसूची में जोड़ें + लेखक + कलाकार + जोड़ें + प्लेसूची जोड़ें + फ़ोल्डर दृश्य + वैधता + उत्साह + संगीत मेन्यू + फॉर्मेट + भावुक + हेडफ़ोन्‍स + ट्रेबल बूस्‍ट + पॉप + उपयोग नही हुआ + अज्ञात + मदों की अधिकतम संख्‍या (%d) चयनित + कॉलर रिंगटोन + %d गाने + कंडक्टर + बाइट + हटाया + पसंदीदा + वर्चुअल 7.1 ch + आइटम रिमूव करने में अक्षम + अधिकांश चलायें हुए + सामान्य + कुछ चयनित नहीं + विवरण + व्‍हा-व्‍हा + लाइव + आकार + सभी + फॉर्मेट + ईमेल + हटाएँ + में जोड़ें + दिनांक निर्मित + लाइव + 5.1 चैनल ध्वनि प्रभाव सिर्फ़ इयरफोन अवस्था में ही काम करता है + एल्बम + सभी गाने + बनाएँ + साझा + प्‍लेसूचियाँ नहीं है + कस्‍टम + पुन: नाम दें + ऑलशेयर का उपयोग करते हुए आप आपका म्यूज़िक डिवाइसेस में स्‍ट्रीम कर सकते हैं + हाल में चलाया गया + संगीत सेटअप विज़ार्ड + बास बूस्‍ट + संभव + %s में जोड़ा गया + कॉल के दौरान चलाने में असमर्थ + नाम काफी लम्बा है + शीर्षक सम्पादित करें + टैग प्राप्त करने में अक्षम + क्रेडिट्स + कॉल रिंगटोन + पॉप + के जैसे सेट + कोई एल्बम नहीं + शास्त्रीय + सन्देश + वर्ष + असंभव + डिस्कोग्राफ़ी + प्‍लेलिस्‍ट्स बनाने में अक्षम + अपडेट हो रहा है... + उपभोक्ता + पैरेंट रेटिंग + 2 घंटे बाद + डिवाइस चुनें + इक्वेलाईजर + सेट + लायब्रेरी में जाएँ + सुरक्षित + साझा + जैज़ + अल्बम + रोकें + के रूप में सेट करें + 15 मिनट बाद + बोल + कलाकार नहीं + घर + टैग ढूँढें + जैज़ + रद्द करें + 1 घंटा 30 मिनट के बाद + कोई मदें नहीं + ट्रेमोलो + चलाने में अक्षम. असमर्थित फ़ाइल प्रकार + इतिहास + सभी चुनें + DRM फ़ाइल साझा करने में अक्षम + लाइब्रेरी अपडेट + ट्रैक सुची + ट्रैक की लंबाई + शैली + आनंद + फ़ोल्‍डर्स + हटाएँ + अक्ष बदलें + गीत नहीं + जोड़ें + %d मदें चयनित + होम में जोड़े + %s हटाया गया + संगीत स्क्वेयर + संगीतकार + लायब्रेरी अपडेट करें? + जीवनी + पुन: क्रम + बंद करें + कोई गाने नहीं + शांत + यह ध्वनि प्रभाव केवल इयरफ़ोन और Bluetooth headset मोड्स में काम करता है + जोड़ने में अक्षम + कॉपीराइट + अलार्म स्वर + दुबारा न दिखाएँ + 1 गाना + सभी चलाएँ + हटाने में अक्षम। चयनित म्यूज़िक चल रहा है + सामान्‍य + संगीतकार + जोड़ा गया + समीक्षा + बाह्यकरण + हटाएँ + बंद + सफलता + हाल में चलाया गया + प्लेसूची + चयनित सूची खाली + सभी + चलाने में अक्षम। त्रुटि पाई गई। + फ़ाइल की संख्‍या अधिकतम तक पहुँची + संगीत स्पष्टता + वर्ष + जेन्रेस + के जैसे सेट + 30 मिनट बाद + प्लेसूची + प्रभाव + विवरण + सेटिंग्स + नृत्य + उच्च वॉल्यूम से आपके सुनने में नुकसान हो सकता है यदि आप लंबे समय तक उसे सुनते हैं + स्पीकर + चुना गया + ब्‍लूटूथ डिस्‍कनेक्‍ट हो गया है + समूहगायक + Open playlist + खोजें + स्वत: + नाम + %d से अधिक संगीत फ़ाइल जोड़ने में अक्षम + संगीत वर्ग में चलाने हेतु पर्याप्त संगीत फ़ाइलें नहीं। कम से कम %d संगीत फ़ाइलें आवश्यक। + एल्बम्स + के रूप में देखें + 5.1 चैनल + मीडिया सूचना + शैली + डायनामिक + प्लेसूची में जोड़ें + diff --git a/res/hrv-HR.xml b/res/hrv-HR.xml new file mode 100644 index 0000000..a19f2be --- /dev/null +++ b/res/hrv-HR.xml @@ -0,0 +1,221 @@ + + + + Godine + Vokal + BT sluÅ¡alice + 1 stavka odabrana + Vrsta + Stari + Kompozitor + Obrisati? + Poruke + Album + Već dodano + SoundAlive + Raspoloženja + Pjesme + Lokacija + Spremi kao popis pjesama + Dinamično + Nije moguće preimenovati popis pjesama + Rock + Dijeljenje preko + Postavke glazbe + Nedavno dodano + Auto. isključivanje glazbe + Izvođači + Nemoguće postaviti za ton zvona + U načinu zvuka 5.1 kanala nije moguća promjena zvučnih efekata + Popisi pjesama + Novi popis pjesama + Klasično + Prosljeđivanje + Rock + Novi popis pjesama + Podaci o mediju + Moje mape + Omot albuma + Ukloniti? + Podcast + Nakon 1 sat + Pojačanje basa + Å iroko + Music Player + Kafić + Uredi + Dance + 5,1-kanalni zvuk radi samo kada su zvučni efekti isključeni + Preostalo upotreba + Broj pjesme + Nema mapa + Dodati na popis za rep. + Autor + Izvođač + Dodaj + Dodaj popis + Prikaz mapa + Valjanost + Strastveno + Glazbeni meni + Formatiraj + Strastveno + SluÅ¡alice + Pojačanje visokih tonova + Pop + Ne koristi se + Nepoznato + Maks. broj (%d) odabranih stavki + Ton pozivatelja + %d pjesama + Dirigenti + Bajt + Uklonjeno + Favoriti + Virtualni 7.1 kanal + Nemoguće premjeÅ¡tanje + NajsluÅ¡anije + Normalna + NiÅ¡ta odabrano + Opis + Wha-wha + Uživo + Veličina + Sve + Format + Email + Ukloni + Dodaj u + Datum + Uživo + Zvučni efekt 5.1 kanala radi samo u načinu sluÅ¡alice + Albumi + Sve pjesme + Novi + Dijeli + Nema popisa pjesama + Prilagođeno + Preimenuj + Možete puÅ¡tati svoju glazbu na uređajima pomoću AllSharea + Posljednje + Čarobnjak postavki glazbe + Pojačanje basa + Moguće + Dodano u %s + Nemoguće reprod. tijekom poziva + Predugačko ime + Uredi naslov + Oznaka nedostupna + Zasluge + Melodija zvona + Pop + Postavi kao + Nema albuma + Klasično + Poruka + Godine + Nemoguće + Diskografija + Nije moguće napraviti popis pjesama + Aktualiziranje... + Korisnik + Roditeljska zaÅ¡tita + Nakon 2 sata + Odaberite uređaj + Equaliser + Postavi + Idi u fonoteku + Spremi + Dijeli + Jazz + Albumi + Prekid + Postavi za + Nakon 15 min + Tekst + Nema izvođača + House + Info pjesme + Jazz + Prekid + Nakon 1 sata i 30 min + Nema stavki + Tremolo + Ne može se reproducirati. Nepodržana vrsta datoteke + Povijest + Odaberi sve + Nemoguće dijeliti zaÅ¡tićenu datoteku + Aktualizacija biblioteke + Popis pjesama + Trajanje zapisa + Žanrovi + Veselo + Mape + ObriÅ¡i + Promijeni os + Nema tekstova + Dodaj + %d odabranih stavki + Dodaj na početnu + %s uklonjen + Glazbeni kutak + Skladatelji + Aktualiziraj biblioteku? + Biografija + Poredaj + Prekid + Nema pjesama + Mirno + Ovaj zvučni efekt radi samo u načinu sluÅ¡alice i Bluetooth sluÅ¡alice + Nije moguće dodati + Autorsko pravo + Ton alarma + Ne prikazuj viÅ¡e + 1 pjesma + Reproduciraj sve + Nemoguće obrisati. Reproducira se odabrana glazba + Normalno + Skladat. + Dodano + Pregled + Vanjski zvuk + ObriÅ¡i + Isključeno + UspjeÅ¡no + Posljednje + Popis pjesama + Odabrani popis prazan + Sve + GreÅ¡ka reprodukcije + Maks. broj datoteka + Čistoća glazbe + Godine + Žanrovi + Postavi za + Nakon 30 min + Popisi pjesama + Efekt + Detalji + Postavke + Dance + Velika glasnoća može oÅ¡tetiti sluh pri dugom sluÅ¡anju + Zvučnik + Odabrano + Bluetooth isključen + Chorus + Otvori + Traži + Auto + Naziv + Moguće dodati najviÅ¡e %d pjesama + Nedovoljno glazbenih datoteka za reprodukciju u Glazbenom kutku. Potrebno je min. %d glazbenih datoteka + Albumi + Prikaži kao + 5.1 kanal + Podaci o mediju + Žanr + Dinamično + Dodaj na popis za reprodukciju + diff --git a/res/hun-HU.xml b/res/hun-HU.xml new file mode 100644 index 0000000..7964e5e --- /dev/null +++ b/res/hun-HU.xml @@ -0,0 +1,222 @@ + + + + Évek + Vocal + BT-fejhallgató + 1 tétel kijelölve + Típus + Régi + Zeneszerző + Törli? + Üzenetek + Album + Már hozzáadva + SoundAlive + Hangulatok + Számok + Hely + Mentés lejátszási listaként + Dinamikus + A lejátszási listát nem lehet átnevezni + Rock + Megosztás + Zenebeállítások + Legutóbb hozzáadott + Lejátszó automatikus kikapcsolása + Előadók + Nem állítható be csengőhangként + Az 5.1 csatorna használata közben a hangeffektusok nem módosíthatók + Lejátszási listák + Új lejátszási lista + Classic + Továbbítás + Rock + Új lejátszási lista + Média adatai + Saját mappák + Lemezborító + Törli? + Pod- castok + 1 óra múlva + Bass enhancement + Wide + Zenelejátszó + Cafe + Szerkeszt + Dance + Az 5.1 csatorna térhatás csak akkor aktiválható, ha a hangeffektusok ki vannak kapcsolva + Lehetséges felhasználás + Szám száma + Nincs mappa + Listára \n +vétel + Szerző + Előadó + Hozzáad + Lejátszási lista hozzáadása + Mappanézet + Érvényesség + Szenvedély + Zene menü + Formázás + Szenvedélyes + Fejhallgató + Magas hangok kiemelése + Pop + Nincs használatban + Ismeretlen + Maximális számú (%d) tétel van kiválasztva + Hívó csengőhangja + %d szám + Kar- mesterek + Bájt + Törölve + Kedvencek + Virtuális 7.1 csatorna + A tétel nem távolítható el + Leggyakrabban játszott + Normál + Semmi nincs kiválasztva + Leírás + Wha-wha + Live + Méret + Összes + Formátum + E-mail + Eltávolít + Hozzáad + Létrehozás dátuma + Live + Az 5.1 csatorna hangeffektus csak fülhallgatós üzemmódban működik + Albumok + Összes szám + Létrehoz + Megoszt + Nincs lejátszási lista + Egyedi + Átnevez + Az AllShare segítségével adatfolyamként küldhet zenét az eszközökre + Legutóbb lejátszott + Zenelejátszó beállításvarázsló + Mély hangok kiemelése + Lehetséges + Hozzáadás a következőhöz: %s + Hívás közben nem lehet lejátszani + A név túl hosszú + Név szerkesztése + Nem sikerült lekérni a címkét + Közreműködők + Hívás csengőhangja + Pop + Beállít, mint + Nincs album + Classic + Üzenet + Év + Nem lehetséges + Diszkográfia + Nem hozható létre lejátszási lista + Frissítés... + Felhasználó + Szülői értékelés + 2 óra múlva + Válasszon eszközt + Ekvalizer + Beállít + Könyvtár megnyitása + Ment + Megosztás + Jazz + Albumok + Leállít + Beállít, mint + 15 perc múlva + Dalszöveg + Nincs előadó + House + Címke keresése + Jazz + Mégse + 1 óra 30 perc múlva + Nincs tétel + Tremoló + Nem játszható le. Nem támogatott fájltípus + Előzmények + Összes kijelölése + A DRM-fájl nem osztható meg + Könyvtár frissítése + Számlista + Szám hossza + Műfajok + Vidámság + Mappák + Töröl + Tengely módosítása + Nincs dalszöv. + Hozzáad + %d tétel kijelölve + Kezdőképernyőhöz ad + %s eltávolítva + Zene-sarok + Szerzők + Frissíti a könyvtárat? + Életrajz + Átrendezés + Bezárás + Nincs szám + Higgadt + A hangeffektus csak fülhallgatós és Bluetooth-fejhallgatós üzemmódban működik + Nem adható hozzá + Szerzői jog + Jelzőhang + Ne jelenjen meg ismét + 1 szám + Összes lejátszása + Nem lehet törölni. Zene lejátszása folyamatban + Normál + Szerzők + Hozzáadva + Előnézet + Térhatás + Töröl + Ki + Sikeres + Legutóbb lejátszott + Lejátszási lista + A kiválasztott lista üres + Mind + Nem játszható le. Hiba történt + Elérte a fájlok maximális számát + Music clarity + Évek + Műfajok + Beállít, mint + 30 perc múlva + Lejátsz. listák + Effektus + Részletek + Beállítások + Dance + Ha sokáig hallgat nagy hangerőn zenét vagy egyebet, akkor károsodhat a hallása + Hangszóró + Kiválasztott + Bluetooth szétkapcsolva + Kórus + L. megnyit + Keresés + Auto. + Név + Legfeljebb %d zenei fájl adható hozzá + Nincs elég lejátszható zenei fájl a Zenesarokban. Legalább %d zenei fájl szükséges + Albumok + Nézet + 5.1 csatorna + Média adatai + Műfaj + Dynamic + Lejátszási listára + diff --git a/res/hye-AM.xml b/res/hye-AM.xml new file mode 100644 index 0000000..b14c6a1 --- /dev/null +++ b/res/hye-AM.xml @@ -0,0 +1,221 @@ + + + + Տարիներ + Վոկալ + BT Õ£Õ¬Õ­Õ¡ÕµÕ«Õ¶ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½ + 1 տարր Õ§ ընտրվել + Տեսակ + Հին + Երգահան + Ջնջե՞լ + Հաղորդագրությունների ուղարկում + Ô±Õ¬Õ¢Õ¸Õ´ + Արդեն ավելացված Õ§ + SoundAlive + Տրամադրություն + Երգեր + Գտնվելու վայր + Պահել որպես նվագացուցակ + Ô´Õ«Õ¶Õ¡Õ´Õ«Õ¯Õ¡Õ¯Õ¡Õ¶ + Անհնար Õ§ վերանվանել երգացանկը + Ռոք + Համօգտագործել հետևյալի միջոցով՝ + Երաժշտության պարամետրեր + Վերջերս ավելացված + Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ կերպով Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ նվագարկիչը + Կատարողներ + Անհնար Õ§ նախադրել որպես հնչերանգ + Անհնար Õ§ փոխել հնչյունային էֆեկտները, երբ գործածվում Õ§ 5.1 կապուղին + Երգացանկեր + Երգացանկ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ + Ô´Õ¡Õ½Õ¡Õ¯Õ¡Õ¶ + Փոխանցում + Ռոք + Երգացանկ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ + Մեդիա տվյալներ + Ô»Õ´ թղթապանակները + Ô±Õ¬Õ¢Õ¸Õ´Õ« Õ·Õ¡ÕºÕ«Õ¯ + Հեռացնե՞լ + Փոդքասթեր + 1 ժամից + Բասերի ընդլայնում + Ô¼Õ¡ÕµÕ¶ + Նվագարկիչ + Սրճարան + Խմբագրել + Պարային + 5.1 կապուղին կարող Õ§ ակտիվացվել, Õ´Õ«Õ¡ÕµÕ¶ երբ հնչյունային էֆեկտներն Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶ + Հասանելի օգտվողներ + Ձայնագրության Õ©Õ«Õ¾Õ¨ + Թղթապանակներ Õ¹Õ¯Õ¡Õ¶ + Ավելացնել երգացանկին + Հեղինակ + Կատարող + Ավելացնել + Ավելացնել երգացանկ + Ô¹Õ²Õ©ÕºÕ¡Õ¶Õ¡Õ¯Õ« դիտում + Վավերականություն + Կիրք + Երաժշտության մենյու + Ձևաչափել + Կրքոտ + Ô³Õ¬Õ­. հեռախոսներ + Վերին հաճախութ. վերելք + Փոփ + Չի օգտագործվում + Ô±Õ¶Õ°Õ¡ÕµÕ¿ + Ընտրվել Õ¥Õ¶ առավելագույն Õ©Õ¾Õ¸Õ¾ տարրեր (%d) + Զանգահարողի Õ¦Õ¡Õ¶Õ£Õ« Õ´Õ¥Õ²Õ¥Õ¤Õ« + %d երգ + Դիրիժորներ + Ô²Õ¡ÕµÕ© + Հեռացված Õ§ + Սիրվածները + Վիրտուալ 7.1 կապուղի + Հնարավոր Õ¹Õ§ հեռացնել տարրը + Հաճախակի նվագարկվող + Նորմալ + Ոչինչ ընտրված Õ¹Õ§ + Նկարագրություն + Ուա-ուա + Ուղիղ եթեր + Չափս + Բոլորը + Ձևաչափ + Ô·Õ¬.փոստ + Հեռացնել + Ավելացնել ...ում + Ստեղծման Õ¡Õ´Õ½Õ¡Õ©Õ«Õ¾Õ¨ + Ուղիղ եթեր + ‘5.1 ալիք’ Õ±Õ¡ÕµÕ¶Õ¡ÕµÕ«Õ¶ էֆեկտը աշխատում Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ¯Õ¡Õ¶Õ»Õ¡Õ¯Õ¡Õ¬Õ« ռեժիմում + Ալբոմներ + Բոլոր երգերը + Ստեղծել + Համօգտ. + Երգացանկեր Õ¹Õ¯Õ¡Õ¶ + Կարգավորել + Վերանվանել + Կարող եք Ձեր երաժշտությունը հոսքային Õ¥Õ²Õ¡Õ¶Õ¡Õ¯Õ¸Õ¾ փոխանցել AllShare օգտագործող սարքերին + Վերջերս Õ¬Õ½Õ¾Õ¡Õ® + Երաժշտության տեղադրման վարպետ + Ստորին հաճախութ. վերելք + Հնարավոր + Ավելացվել Õ§ %s-Õ«Õ¶ + Անհնար Õ§ վերարտադրել Õ¯Õ¡Õ¶Õ¹Õ« ընթացքում + Անունը չափազանց երկար Õ§ + Խմբագրել վերնագիրը + Անհնար Õ§ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ հատկորոշիչ + Մակագրեր + Ô¶Õ¡Õ¶Õ£Õ« Õ´Õ¥Õ²Õ¥Õ¤Õ« + Փոփ + Նշանակել որպես + Ալբոմներ Õ¹Õ¯Õ¡Õ¶ + Ô´Õ¡Õ½Õ¡Õ¯Õ¡Õ¶ + Հաղորդագրություն + Տարիներ + Անհնար Õ§ + Դիսկոգրաֆիա + Անհնար Õ§ եգացանկ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ + Թարմացնում Õ§... + Օգտվող + Ô¾Õ¶Õ¸Õ²Õ« Õ£Õ¶Õ¡Õ°Õ¡Õ¿Õ¡Õ¯Õ¡Õ¶ + 2 ժամից Õ°Õ¥Õ¿Õ¸ + Ընտրեք սարք + Էկվալայզեր + Գործադրել + Ô³Õ¶Õ¡Õ¬ երաժշտադարան + Պահպանել + Ô¿Õ«Õ½Õ¾Õ¥Õ¬ + Ջազ + Ալբոմներ + Դադարեցնել + Նշանակել որպես + 15 րոպե Õ°Õ¥Õ¿Õ¸ + Երգի խոսքեր + Կատարողներ Õ¹Õ¯Õ¡Õ¶ + Հաուս + Որոնել Տեգ + Ջազ + Չեղարկել + 1 ÕªÕ¡Õ´ 30 րոպե Õ°Õ¥Õ¿Õ¸ + Տարրեր Õ¹Õ¯Õ¡Õ¶ + Վիբրացիա + Անհնար Õ§ Õ¶Õ¾Õ¡Õ£Õ¥Õ¬: Չսատարվող ֆայլի Õ¿Õ¥Õ½Õ¡Õ¯ + Պատմություն + Ընտրել բոլորը + Անհնար Õ§ համօգտագործել DRM ֆայլ + Երաժշտադարանի թարմացում + Երիզների ցանկ + Ձայնային Õ°Õ¸Õ¬Õ¸Õ¾Õ¡Õ¯Õ« տևողությունը + Ժանրեր + Ուրախություն + Թղթապանակներ + Ջնջել + Փոխել առանցքը + Խոսքեր Õ¹Õ¯Õ¡Õ¶ + Ô±Õ¾Õ¬Õ¶Õ¬ + %d տարր Õ§ ընտրվել + Ավելացնել Õ¿Õ¡Õ¶Õ¨ + %s հեռացված Õ§ + Երաժշտահրապարակ + Կոմպիոզիտորներ + Թարմացնե՞լ մեդիադարանը: + Կենսագրություն + Վերադասավորել + Փակել + Երգ Õ¹Õ¯Õ¡ + Անվրդով + Ô±ÕµÕ½ հնչյունային էֆեկտը գործում Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ¯Õ¡Õ¶Õ»Õ¡Õ¯Õ¡Õ¬Õ« և Bluetooth Õ£Õ¬Õ­Õ¡ÕµÕ«Õ¶ Õ°Õ¥Õ¼Õ¡Õ­Õ¸Õ½Õ« ռեժիմներում + Անհնար Õ§ ավելացնել + Հեղինակային իրավունք + Ô±Õ¦Õ¤Õ¡Õ¶Õ·Õ¡Õ¶Õ« Õ´Õ¥Õ²Õ¥Õ¤Õ« + Չցուցադրել կրկին + 1 երգ + Վերարտադրել Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ¨ + Անհնար Õ§ վերացնել: Ընտրված երաժշտությունը նվագարկվում Õ§ + Նորմալ + Կմպզտրնր + Ավելացված Õ§ + Վերանայում + Մարմնացում + Ջնջել + Ô±Õ¶Õ»Õ¿Õ¾Õ¡Õ® Õ§ + Հաջողված Õ§ + Վերջերս Õ¬Õ½Õ¾Õ¡Õ® + Երգացանկ + Ընտրված ցուցակը դատարկ Õ§ + Բոլոր + Անհնար Õ§ նվագարկել. Õ½Õ­Õ¡Õ¬ Õ§ Õ¿Õ¥Õ²Õ« ունեցել + Ֆայլերի առավելագույն քանակը գերազանցվել Õ§ + Երաժշտության պարզություն + Տարիներ + Ժանրեր + Նշանակել որպես + 30 րոպեից + Երգացանկեր + Էֆեկտ + Մանրամասներ + Պարամետրեր + Պարային + Բարձր Õ±Õ¡ÕµÕ¶Õ¨ կարող Õ§ Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ Ձեր լսողությունը, Õ¥Õ©Õ¥ Õ¡ÕµÕ¶ լսեք երկար ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ + Բարձրախոս + Ընտրված + Bluetooth-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§ + Խորիչ + Բց Õ¥Õ£ + Որոնել + Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ + Անուն + Անհնար Õ§ %dից Õ¡Õ¾Õ¥Õ¬Õ« երաժշտական ֆայլ ավելացնել + Երաժշտական հրապարակում նվագարկելու համար բավարար երաժշտական ֆայլեր Õ¹Õ¯Õ¡Õ¶: Պահանջվում Õ§ Õ¡Õ¼Õ¶Õ¾Õ¡Õ¦Õ¶ %d երաժշտական ֆայլ + Ալբոմներ + Ô´Õ¿Õ¬ որպ. + 5.1 ալիք + Մեդիա տվյալներ + Ժանր + Ô´Õ«Õ¶Õ¡Õ´Õ«Õ¯ + Ավելացնել երգացանկում + diff --git a/res/isl-IS.xml b/res/isl-IS.xml new file mode 100644 index 0000000..a4f969c --- /dev/null +++ b/res/isl-IS.xml @@ -0,0 +1,221 @@ + + + + Ár + Söngur + Bluetooth-höfuðtól + 1 atriði valið + Tegund + Eldri + Tónskáld + Á að eyða? + Skilaboð + Albúm + Þegar bætt við + SoundAlive + Lyndi + Lög + Staðsetning + Vista sem lagalista + Breytilegt + Ekki tókst að endurnefna afspilunarlista + Rokk + Samnýta um + Tónlistarstillingar + Bætt við nýlega + Sjálfvirk lokun + Flytjandi + Ekki hægt að nota sem hringitón + Mistókst að breyta hljóðhrifum þegar 5.1 rás er notuð + Lagalistar + Búa til afspilunarlista + Sígilt + Framsending + Rokk + Búa til afspilunarlista + Miðlaupplýsingar + Möppurnar mínar + Albúmmyndir + Á að fjarlægja? + Netvörp + Eftir 1 klst. + Viðbótarbassi + Breitt + Tónlistarspilari + Kaffihús + Breyta + Dans + Einungis er hægt að kveikja á 5.1 stöð þegar slökkt er á hljóðhrifum + Tiltæk notkun + Númer lags + Engar möppur + Bæta á spilunarl. + Höfundur + Listamaður + Bæta við + Setja inn spilunarlista + Möppur + Gildistími + Ástríða + Tónlistarvalmynd + Snið + Ástríðufullt + Höfuðtól + Hátónaaukning + Popp + Ekki notað + Óþekkt + Komið er að hámarksfjölda valinna atriða (%d) + Hringitónn hringjanda + %d lög + Stjórar + Bæti + Fjarlægt + Eftirlæti + Sýndar 7.1 ch + Ekki tókst að fjarlægja atriði + Spilað mest + Venjulegt + Ekkert er valið + Lýsing + Wha-wha + Bein sending + Stærð + Allt + Snið + Tölvupóstur + Fjarlægja + Bæta við + Dagsetning búin til + Bein sending + Hljóðbrellan „5.1 rás“ virkar aðeins með heyrnartólum + Plötur + Öll lög + Búa til + Samnýta + Engir spilunarlistar + Sérstilla + Endurnefna + Þú getur streymt tónlistina þína í tæki sem nota AllShare + Spilað nýlega + Uppsetningarforrit tónlistar + Bassaaukning + Mögulegt + Bætt við %s + Ekki er hægt að spila á meðan símtal stendur yfir + Nafn of langt + Breyta titli + Merki fannst ekki + Höfundar + Hringitónn viðmælanda + Popp + Nota sem + Engar möppur + Sígilt + Skilaboð + Ár + Ekki hægt + Útgáfusaga + Ekki tókst að búa til afspilunarlista + Verið er að uppfæra... + Notandi + Einkunn foreldra + Eftir 2 klukkustundir + Veldu tæki + Tónjafnari + Stilla + Opna safn + Vista + Samnýta + Jass + Albúm + Stöðva + Setja sem + Eftir 15 mín. + Texti + Engir flytjendur + House-tónlist + Leita að merki + Jass + Hætta við + Eftir 1 klst. 30 mín. + Engin atriði + Tremolo + Ekki tókst að spila. Óstutt skrársnið + Saga + Velja allt + Mistókst að vista höfundarréttarvarða skrá + Uppfærsla á safni + Lagalisti + Lengd lags + Tónlistartegund + Gleði + Möppur + Eyða + Breyta ás + Enginn texti + Bæta + %d atriði valin + Bæta við heimaskjá + %s var fjarlægt + Tónfern. + Höfundar + Uppfæra safn? + Upplýsingar + Panta aftur + Loka + Engin lög + Rólegt + Þessi hljóðbrella virkar aðeins í með heyrnartólum og Bluetooth höfuðtólum + Ekki tókst að bæta við + Höfundaréttur + Vekjaratónn + Ekki birta aftur + 1 lag + Spila allt + Mistókst að eyða. Valda tónlistin er í spilun + Venjulegt + Höfundar + Bætt við + Endurskoða + Útvíkkun + Eyða + Slökkt + Árangur + Spilað nýlega + Afspilunarlisti + Listinn er tómur + Allt + Mistókst að spila. Villa kom upp + Komið er fram yfir hámarksfjölda skráa + Skýrleiki tónlistar + Ár + Tónlistartegund + Nota sem + Eftir 30 mín. + Spilunarlistar + Brella + Upplýsingar + Stillingar + Dans + Hátt spiluð tónlist getur skaðað heyrn þína ef hlustað er í langan tíma í einu + Hátalari + Valið + Bluetooth aftengt + Kór + Opna sp.lista + Leit + Sjálfvirkt + Heiti + Ekki tókst að bæta við nema %d tónlistarskrám + Of fáar tónlistarskrár til að spila í Tónlistarferningi . Lágmarkið er %d tónlistarskrár + Möppur + Birta sem + 5.1 rás + Miðlaupplýsingar + Stefna + Breytilegt + Bæta við lagalista + diff --git a/res/ita-IT.xml b/res/ita-IT.xml new file mode 100644 index 0000000..276b05d --- /dev/null +++ b/res/ita-IT.xml @@ -0,0 +1,221 @@ + + + + Anni + Vocale + Auricolare Bluetooth + 1 elemento selezionato + Tipo + Passato + Compositore + Eliminare? + Messaggi + Album + Già aggiunto + SoundAlive + Umore + Canzoni + Posizione + Salva come playlist + Dinamica + Impossibile rinominare playlist + Rock + Condividi con + Impostazioni musica + Ultimi aggiunti + Disattivaz. automatica musica + Artisti + Impossibile impostare come suoneria + Impossibile modificare gli effetti sonori con 5.1 canali attivo + Playlist + Crea playlist + Classica + Inoltro + Rock + Crea playlist + Info multimedia + Cartelle personali + Copertina album + Rimuovere? + Podcast + Dopo 1 ora + Potenziamento bassi + Spazio ampio + Lettore musicale + Caffè + Modifica + Danza + È possibile attivare il canale 5.1 solo se gli effetti sonori sono disattivati + Usi disponibili + Numero traccia + Nessuna cartella + Aggiungi a playlist + Autore + Artista + Aggiungi + Aggiungi playlist + Vista cartella + Validità + Sentimentale + Menu musicale + Formatta + Appassionato + Cuffie + Treble boost + Pop + Non attivo + Sconosciuto + Selezionare numero max. di elementi (%d) + Suoneria chiamante + %d canzoni + Condutt. + Byte + Rimosso + Preferiti + Canale virtuale 7.1 + Impossibile rimuovere elemento + Più ascoltati + Normale + Nessun elemento selezionato + Descrizione + Wha-wha + Live + Dimensioni + Tutto + Formato + E-mail + Rimuovi + Aggiungi + Data creazione + Live + L'effetto sonoro a 5.1 canali funziona solo in modalità auricolare + Album + Tutte le canzoni + Crea + Condiv. + Nessuna playlist + Personalizzato + Rinomina + Potete eseguire lo streaming della musica sui dispositivi tramite AllShare + Ultimi riprodotti + Procedura guidata configurazione musica + Bass boost + Possibile + Aggiunto a %s + Impossibile riprodurre durante una chiamata + Nome troppo lungo + Modifica titolo + Impossibile ottenere tag + Ringraziamenti + Suoneria chiamata + Pop + Imposta come + Nessun album + Classica + Messaggio + Anni + Impossibile + Discografia + Impossibile creare playlist + Aggiornamento... + Utente + Valutazione genitori + Dopo 2 ore + Selezionate dispositivo + Equalizzatore + Imposta + Vai a libreria + Salva + Condividi + Jazz + Album + Interrompi + Imposta come + Dopo 15 min + Testo + Nessun artista + House + Trova tag + Jazz + Annulla + Dopo 1 ora e 30 min + Nessun elemento + Tremolo + Impossibile riprodurre. Tipo file non supportato + Cronologia + Seleziona tutto + Impossibile condividere file DRM + Aggiornamento libreria + Elenco brani + Durata traccia + Generi + Allegro + Cartelle + Elimina + Modifica asse + Senza testo + Aggiungi + %d elementi selezionati + Agg. a schermata home + %s rimosso + Music square + Compositori + Aggiornare la libreria? + Biografia + Riordina + Chiudi + Nessuna canzone + Calmo + Questo effetto sonoro funziona solo in modalità auricolare e Bluetooth + Impossibile aggiungere + Copyright + Tono sveglia + Non mostrare più + 1 canzone + Riproduci tutto + Impossibile eliminare. La musica selezionata è in riproduzione + Normale + Compos. + Aggiunto + Verifica + Esternalizzazione + Elimina + No + Operazione eseguita + Ultimi riprodotti + Playlist + Elenco selezionato vuoto + Tutto + Impossibile riprodurre. Si è verificato un errore + Superato numero massimo di file + Riduzione rumore musica + Anni + Generi + Imp. come + Dopo 30 min + Playlist + Effetto + Dettagli + Impostazioni + Danza + Volumi troppo alti possono danneggiare l'udito in caso di ascolto prolungato + Vivavoce + Selezionato + Bluetooth disconnesso + Coro + Apri play + Cerca + Auto + Nome + Impossibile aggiungere più di %d file musicali + Non sono presenti abbastanza file musicali in Music square. Sono necessari almeno %d file + Album + Vis. come + 5.1 canali + Info multimedia + Genere + Dinamico + Aggiungi a playlist + diff --git a/res/jpn-JP.xml b/res/jpn-JP.xml new file mode 100644 index 0000000..47be0c1 --- /dev/null +++ b/res/jpn-JP.xml @@ -0,0 +1,222 @@ + + + + å¹´ + ボーカル + BT​ヘッド​セット + 1件選択 + タイプ + OLD + 作曲者 + 削除しますか? + SMS + アルバム + 既に登録されています。 + SoundAlive + ムード + 曲 + 保存先 + プレイリストとして保存 + Dynamic + プレイリスト​名​を​変更​できません + ロック + 共有 + ミュージック設定 + 最近追加した曲 + 音楽自動停止 + アーティスト + 着信音に設定できません。 + 5.1チャンネル使用中は\nサウンドエフェクトを使用できません。 + プレイリスト + プレイリストを作成 + クラシック + 転送 + ロック + プレイリストを作成 + メディア情報 + マイフォルダ + アルバムアート + 削除しますか? + ポッドキャスト + 1時間後 + 低音強調 + ワイド + 音楽 + カフェ + 編集 + ダンス + 5.1チャンネルは、サウンドエフェクトとイコライザーが標準のときのみ使用できます。 + 使用可能 + トラック番号 + フォルダがありません。 + プレイリストに追加 + 著者 + アーティスト + 追加 + プレイリストを追加 + フォルダ表示 + 有効回数 + Passion + 音楽メニュー設定 + ファイルタイプ + Passionate + ヘッドホン + 高音強調 + ポップ + 未使用 + 不明 + アイテムの最大選択数(%d)を選択しました + 個別着信音 + %d 曲 + 指揮者 + Byte + 削除しました。 + お気に入り + バーチャル7.1ch + アイテム​を​消去​できません + よく聴く曲 + 標準 + 何も選択されていません。 + 詳細 + Wha-wha + ライブ + サイズ + 全て + ファイル形式 + Eメール + クイックリストから削除 + 登録 + 作成日付 + ライブ + 5.1チャンネルは、イヤホンモードでのみ使用できます。 + アルバム + 全曲 + 作成 + 共有 + プレイリストがありません。 + カスタム + 名前を変更 + AllShareを使って端末で音楽をストリーミング再生できます。 + 最近再生した曲 + ミュージックセットアップウィザード + 低音強調 + 可能 + 「%s」に追加しました。 + 通話中は再生できません。 + 名前が長すぎます。 + タイトルを編集 + タグ​を​取得​できません + クレジット + 着信音 + ポップ + 登録 + アルバムはありません。 + クラシック + メッセージ + å¹´ + 不可 + アルバム + プレイリスト​を​作成​できません + 更新中... + ユーザー + 保護者の指導が必要 + 2時間後 + デバイスを選択 + イコライザー + 設定 + ライブラリーへ移動 + 保存 + 共有 + ジャズ + アルバム + 停止 + 登録 + 15分後 + 歌詞 + アーティストがありません。 + ハウス + タグを検索 + ジャズ + キャンセル + 1時間30分後 + アイテムがありません。 + トレモロ + 再生できません。未対応のファイルです + 履歴 + 全て選択 + DRMファイル​を​共有​でき​ません + ライブラリーを更新 + トラックリスト + 再生時間 + ジャンル + Joy + フォルダ + 削除 + 軸の変更 + 歌詞なし + 追加 + %d件選択 + ホームに追加 + %sを​削除​しました + ミュージックスクエア + 作曲者 + ライブラリーを更新しますか? + アーティスト + 並べ替え + 閉じる + 曲がありません。 + Calm + この​音響​効果​は​、​イヤホン​および​ Bluetooth ​ヘッド​セット ​モード​で​のみ​機能​します + 追加できません + 著作権情報 + アラーム音 + 今後表示しない + 1 曲 + 全て再生 + 削除できません。 +選択した音楽は再生中です。 + 標準 + 作曲家 + 追加しました。 + プレビュー表示 + 野外 + 削除 + OFF + 正常に完了しました。 + 最近再生した曲 + プレイリスト + 選択されたリストは空です。 + 全て + 再生できません。エラーが発生しました。 + ファイルの最大件数を超えています。 + クリア + å¹´ + ジャンル + 設定 + 30分後 + プレイリスト + 効果 + 詳細 + 設定 + ダンス +  長時間大音量で聴き続けると、聴力を損傷する可能性があります + Speaker + 選択済み + Bluetoothが切断されました。 + コーラス + プレイリスト​表示 + 検索 + 自動 + 名前 + ミュージックファイルは%d以上追加できません + ミュージックスクエアで再生するには音楽ファイルが不足しています。少なくとも、%d曲の音楽ファイルが必要となります。 + アルバム + 表示 + 5.1チャンネル + メディア情報 + ジャンル + ダイナミック + プレイリストに追加 + diff --git a/res/kat-GE.xml b/res/kat-GE.xml new file mode 100644 index 0000000..5fd1785 --- /dev/null +++ b/res/kat-GE.xml @@ -0,0 +1,221 @@ + + + + წლები + ვოკალური + BT გარნიტურა + არჩეულია 1 ელემენტი + ტიპი + ძველი + კომპოზიტორი + წაიშალოს? + მიმოწერა + ალბომი + უკვე დაემატა + SoundAlive + რითმები + სიმღერები + ადგილმდებარეობა + მუსიკის სიად შენახვა + დინამიკური + მუსიკის სიას სახელს ვერ ვუცვლი + როკი + გაზიარების მეთოდია + მუსიკის პარამეტრები + ბოლოს დამატებული + მუსიკის ავტო. გამორთვა + მსახიობები + ზარის მელოდიად დაყენება შეუძლებელია + ვერ შეცვლით ხმოვან ეფექტებს, როდესაც იყენებთ 5.1 არხს + მუსიკის სიები + მუსიკის სიის შექმნა + კლასიკური + გადამისამართება + როკი + მუსიკის სიის შექმნა + მედია ინფო + ჩემი საქაღალდეები + სამხატვრო ალბომი + წაიშალოს? + პოდკასტები + 1 საათის შემდეგ + ბასის გამაძლიერებელი + ფართო + პლეერი + კაფე + შეცვლა + ცეკვა + 5.1 არხის გააქტიურება მხოლოდ მაშინაა შესაძლებელი, როდესაც გამორთულია ხმოვანი ეფექტები + დასაშვები გამოყენება + ბილიკის ნომერი + საქაღალდეები არ არის + მუსიკის სიაში დამატება + ავტორი + შემსრულებელი + დამატება + მუსიკის სიის დამატება + საქაღალდის ხედი + ქმედითობა + ჟინი + მუსიკის მენიუ + ფორმატი + მგზნებარე + გარნიტურები + დისკანტის გაძლიერება + ამოხტომა + არ გამოიყენება + უცნობი + არჩეულია ელემენტების მაქსიმალური რაოდენობა (%d) + აბონენტის ზარის მელოდია + %d სიმღერა + ორგანიზატორები + ბიტი + წაშლილია + ფავორიტები + ვირტუალური 7.1 არხი + ვერ მოვაშორებ ელემენტს + ყველაზე ხშირად დაკრული + ნორმალური + არაფერია არჩეული + აღწერა + ვაჰ-ვაჰ + ცოცხალი + ზომა + ყველა + ფორმატი + ელ-ფოსტა + წაშლა + დამატება + შექმნის თარიღი + ცოცხალი + 5.1 არხის ხმოვანი ეფექტი მუშაობს მხოლოდ ყურმილის რეჟიმში + ალბომები + ყველა სიმღერა + შექმნა + გაზიარ. + დასაკრავი სია არ არის + შერჩეული + ხელახლა დასათაურება + შეგიძლიათ გამოიყენოთ AllShare და მოუსმინოთ მუსიკას აპარატით + ბოლოს დაკრული + მუსიკის შერჩევა + ბასის გაძლიერება + შესაძლო + დაემატა ადგილზე: %s + ვერ დაუკრავთ ზარის დროს + სახელი ძალზე გრძელია + სათაურის შეცვლა + ჩანართს ვერ მიიღებთ + კრედიტები + ზარის მელოდია + ამოხტომა + დაყენება + ალბომები არ არის + კლასიკური + შეტყობინება + წლები + შეუძლებელია + დისკოგრაფია + მუსიკის სიას ვერ ვქმნი + განახლება... + მომხმარებელი + მშობლის შეფასება + 2 საათის შემდეგ + მოწყობილობის შერჩევა + ეკვალაიზერი + დაყენება + ბიბლიოთეკაზე გადასვლა + შენახვა + გაზიარება + ჯაზი + ალბომები + შეჩერება + დაყენება + 15 წუთის შემდეგ + ლექსი + შემსრულებლები არ არის + სახლი + ჩანართის ძებნა + ჯაზი + გაუქმება + 1 საათისა და 30 წუთის შემდეგ + ელემენტები არ არის + ხმის ვიბრირება + ვერ დავუკრავ. ფაილის ტიპს არა აქვს მხარდაჭერა + ისტორია + ყველას არჩევა + ვერ გააზიარებთ DRM ფაილს + ბიბლიოთეკის განახლება + ბილიკების სია + ბილიკის სიგრძე + ჟანრები + სიხარული + საქაღალდეები + წაშლა + ღერძის შეცვლა + ლექსი არ არის + დამატ. + არჩეულია %d ელემენტი + დამატება საწყის გვერდზე + %s წაიშალა + მუსიკის სკვერი + კომპოზიტორები + განახლდეს ბიბლიოთეკა? + ბიოგრაფია + გადალაგება + დახურვა + სიმღერები არ არის + მშვიდი + ეს ხმოვანი ეფექტი მუშაობს მხოლოდ ყურმილისა და Bluetooth გარნიტურის რეჟიმებში + ვერ ვამატებ + საავტორო უფლება + სიგნალის მელოდია + აღარ მაჩვენო + 1 სიმღერა + ყველაფრის დაკვრა + წაშლა შეუძლებელია. არჩეული მუსიკა უკრავს + ნორმალური + კომპოზიტ. + დამატებულია + დათვალიერება + ექსტერნალიზაცია + წაშლა + გამორთ. + წარმატება + ბოლოს დაკრული + მუსიკის სია + არჩეული სია ცარიელია + ყველა + ვერ დაუკრავთ. შეცდომა მოხდა + გადაჭარბებულია ფაილების მაქსიმალური რაოდენობა + მუსიკის სისუფთავე + წლები + ჟანრები + არჩევა + 30 წუთის შემდეგ + მუსიკის სიები + ეფექტი + დეტალები + პარამეტრები + ცეკვა + ხანგრძლივი დროით მუსიკის მაღალ ხმაზე მოსმენა შეიძლება გახდეს სმენის დაქვეითების მიზეზი + დინამიკი + შერჩეული + Bluetooth გამორთულია + გუნდური + ღია სია + ძიება + ავტომატური + სახელი + ვერ ვამატებ მუსიკის %d-ზე მეტ ფაილს + მუსიკის ფაილების რაოდენობა არ არის საკმარისი ”მუსიკის სკვერში” დასაკრავად. უნდა იყოს მინიმუმ %d მუსიკის ფაილი + ალბომები + ნახეთ + 5.1 არხი + მედია ინფო + ჟანრი + დინამიკური + დასაკრავი ფაილების სიაში დამატება + diff --git a/res/kaz-KZ.xml b/res/kaz-KZ.xml new file mode 100644 index 0000000..3a82aea --- /dev/null +++ b/res/kaz-KZ.xml @@ -0,0 +1,221 @@ + + + + Жылдар + Вокал + BT гарнит. + 1 элемент таңдалды + Түрі + Ескі + Сазгер + Өшіресіз бе? + Хабарлама + Альбом + Қосылып қойған + SoundAlive + Қөңілдер + Әндер + Орналасу орны + Файлдар тізімі ретінде сақтау + Динамикалық + Ойнату тізімін атын өзгерту мүмкін емес + Рок + Бөлісу + Музыка параметрлері + Соңғы қосылғандар + Музыканы авто өшіру + Орындаушылар + Рингтон ретінде орнату мүмкін емес + 5.1 арнасы пайдаланылғанда дыбыстық әсерлерді өзгерту мүмкін емес + Әндер тізімі + Әндер тізімін құру + Классика + Басқа біреуге жіберу + Рок + Әндер тізімін құру + Медиялық ақпарат + Менің папкам + Көрініс альбомы + Жоясыз ба? + Подкасттар + 1 сағаттан кейін + Басс дыбысын күшейту + Кеңейтілген + Музыкалық плейер + Кафе + Өзгерту + Би + Дыбыстық әсерлер өшірілгенде ғана 5.1 арнасын іске қосуға болады + Пайдалануға жарамды + Нөмір жолағы + Қалталар жоқ + Файлдар тізіміне қосу + Aвтор + Орындаушы + Қосу + Файлдар тізімін қосу + Қалта көрінісі + Жарамдылық + Құмарлық + Музыка мәзірі + Форматтау + Ашулы + Құлаққаптар + Жоғары жиілікті күшейту + Поп + Пайдаланылмаған + Белгісіз + Ең көп элемент саны (%d) таңдалды + Телефон шалушы әуені + %d өлең + Дирижерлар + Байт + Жойылған + Таңдаулылар + Виртуалды 7.1 арна + Тармақ ауыстырла алмайды + Әйгілі файлдар + Қалыпты + Ештенке таңдалмады + Сипаттама + Уа-уа + Тікелей трансляция + Өлшемі + Барлығы + Форматтау + Эл. пошта + Жоғалту + Қосу + Күн белгіленген + Тікелей трансляция + 5.1 арнаның дыбыс әсері гарнитура қосылғанда ғана істейді + Альбомдар + Барлық өлеңдер + Құру + Бөлісу + Ойнату тізімі жоқ + Әдеттегі + Атын өзгерту + AllShare арқылы музыкаңызды құрылғыларға жіберуге болады + Соңғы файлдар + Пішіндеу шебері + Басс күшейту + Мүмкін + %s құрамына қосылған + Сөйлесу барысында ойнатуға мүмкіндік жоқ + Тым үлкен атауы + Тақырыпты өзгерту + Тег алу мүмкін емес + Орындаушылар құрамы + Қоңырау рингтоны + Поп + Орнату реті + Альбомдар жоқ + Классика + Хабарлама + Жылдар + Мүмкін емес + Дискография + Ойнату тізімін құру мүмкін емес + Жаңартуда... + Тұтыныш + Ата-ана қамқорлығы + 2 сағаттан кейін + Құрылғыны таңдау + Эквалайзер + Орнату + Кітапханаға өту + Сақтау + Бөлісу + Джаз + Альбомдар + Тоқтату + Орнату + 15 мин кейін + Лирикалық + Орындаушылар жоқ + Хаус + Белгісін табу + Джаз + Тоқтату + 1 сағат 30 мин кейін + Баптар жоқ + Тремоло + Ойнату мүмкін емес. Файл түріне қолдау жоқ + Тарих + Бәрін бөлектеу + DRM файлын бөлісу мүмкін емес + Кітапхана жаңарту + Тректер тізімі + Ұзақтығы + Жанрлары + Қуаныш + Қалталар + Жою + Осін өзгерту + Лирикасыз + Қосу + %d элемент таңдалды + Бастапқы бетке қосу + %s жойылды + Музыка. квадрат + Композиторлар + Кітапхананы жаңарту керек пе? + Өмірбаян + Қайта ретке келтіру + Жабу + Өлеңдер жоқ + Тыныш + Бұл дыбыс әсері тек құлақаспап және Bluetooth гарнитурасы режимдерінде істейді + Қосу мүмкін емес + Авторлық құқықтар + Сигнал дыбысы + Қайта көрсетпеңіз + 1 өлең + Бәрін ойнату + Жою мүмкін емес. Таңдалған музыка ойнап тұр + Қалыпты + Компози-р + Қосылды + Қарап шығу + Экстернализация + Жою + Өшірілген + Жетістік + Соңғы файлдар + Әндер тізімі + Таңдалған тізім бос + Барлығы + Ойнату мүмкін емес. Қате пайда болды + Ең көп файлдар санынан асып кетті + Музыка тазалығы + Жылдар + Жанрлары + Белгілеу + 30 минуттан кейін + Файл тізімдері + Әсер + Өзгешеліктері + Қондырғ-р + Би + Ұзақ уақыт тыңдайтын болсаңыз, қатты дауыс деңгейі есту мүшеңізді зақымдауы мүмкін + Динамик + Таңдалды + Bluetooth ажыратылған + Хор + Ә. тіз.аш + Іздеу + Авто + Аты + Музыкалық файл қосудың реті келмеді: %d артық емес + Музыкалық квадратта ойнатуға музыкалық файлдар жеткілікті емес. Кемінде %d музыкалық файл қажетті + Альбом-р + Бас. көру + 5.1 арна + Медиялық ақпарат + Жанр + Динамикалық + Ойнату тізіміне қосу + diff --git a/res/kor-KR.xml b/res/kor-KR.xml new file mode 100644 index 0000000..f37f18e --- /dev/null +++ b/res/kor-KR.xml @@ -0,0 +1,221 @@ + + + + 연도 + 보컬 + 블루투스 헤드셋 + 1개의 항목이 선택되었습니다 + 형식 + 오래된 + 작곡가 + 삭제할까요? + 메시지 + 앨범 + 이미 추가되었습니다 + SoundAlive + 분위기 + 노래 + 저장위치 + 재생 목록으로 저장 + 다이내믹 + 이름을 변경할 수 없습니다 + 락 + 공유 + 음악 설정 + 최근 추가 목록 + 음악 자동 종료 + 아티스트 + 벨소리로 설정할 수 없습니다 + 5.1채널이 사용 중인 경우에는 음향 효과를 변경할 수 없습니다 + 재생 목록 + 재생 목록 추가 + 클래식 + 전송 + 락 + 재생 목록 추가 + 미디어 정보 + 보관 메시지함 + 앨범 아트 + 제거할까요? + 팟캐스트 + 1시간 후 + 중저음 강화 + 와이드 + 뮤직 플레이어 + 카페 + 편집 + 댄스 + 음향 효과가 꺼져 있을 경우에만 5.1 채널을 실행할 수 있습니다 + 사용 가능 + 트랙 번호 + 폴더가 없습니다 + 재생 목록에 추가 + 저자 + 아티스트 + 추가 + 재생 목록 추가 + 폴더별 보기 + 유효 횟수 + 열정적인 + 음악 라이브러리 + 포맷 + 열정적인 + 헤드폰 + 고음 강화 + 팝 + 사용 안 함 + 알 수 없음 + 최대 항목 수(%d개)를 선택하였습니다 + 개인 벨소리 + %d개의 곡 + 지휘자 + Byte + 제거되었습니다 + 즐겨찾기 + 가상 7.1채널 + 항목을 삭제할 수 없습니다 + 많이 재생된 음악 + 보통 + 선택된 것이 없습니다 + 설명 + 와-와 + 라이브 + 크기 + 모두 + 형식 + 이메일 + 제거 + 추가 + 생성 날짜 + 라이브 + 5.1채널 음향효과는 이어폰 연결 시에 적용됩니다 + 앨범 + 모든 노래 + 추가 + 공유 + 재생 목록이 없습니다 + 사용자 설정 + 이름 변경 + AllShare를 사용하여 음악을 디바이스로 스트리밍할 수 있습니다 + 최근 재생된 음악 + 음악 설정 마법사 + 중저음 강화 + 가능 + %s에 추가되었습니다 + 통화 중에는 재생할 수 없습니다 + 이름이 너무 깁니다 + 제목 편집 + 태그를 가져올 수 없습니다 + 크레디트 + 수신벨 + 팝 + 다음으로 설정 + 앨범이 없습니다 + 클래식 + 메시지 + 연도 + 불가능 + 전체 앨범 + 재생 목록을 추가할 수 없습니다 + 업데이트 중... + 사용자 + 부모의 시청 지도가 필요한 등급 + 2시간 후 + 기기 선택 + 이퀄라이저 + 설정 + 라이브러리 + 저장 + 공유 + 재즈 + 앨범 + 중지 + 설정 + 15분 후 + 가사 + 아티스트가 없습니다 + 하우스 + 태그 검색 + 재즈 + 취소 + 1시간 30분 후 + 항목이 없습니다 + 트레몰로 + 사용할 수 없는 파일 형식이므로 재생할 수 없습니다 + 히스토리 + 모두 선택 + DRM 파일을 공유할 수 없습니다 + 라이브러리 업데이트 + 트랙 목록 + 재생 시간 + 장르 + 기쁜 + 폴더 + 삭제 + 축 변경 + 가사 없음 + 추가 + %d개의 항목이 선택되었습니다 + 홈에 추가 + %s이(가) 삭제되었습니다 + 뮤직스퀘어 + 작곡가 + 라이브러리를 업데이트할까요? + 아티스트 + 순서 변경 + 닫기 + 음악이 없습니다 + 차분한 + 이 음향 효과는 이어폰과 블루투스 헤드셋 모드에서만 작동합니다 + 추가할 수 없습니다 + 저작권 + 알람음 + 다시 표시 안 함 + 1곡 + 모두 재생 + 삭제할 수 없습니다. 선택한 음악이 재생 중입니다. + 일반 + 작곡가 + 추가되었습니다 + 리뷰 + 부드러운 음질 + 삭제 + 끄기 + 완료되었습니다 + 최근 재생된 음악 + 재생 목록 + 선택된 목록이 비어 있습니다 + 전체 + 재생할 수 없습니다. 오류가 발생하였습니다. + 최대 파일 수를 초과하였습니다 + 선명한 음질 + 연도 + 장르 + 설정 + 30분 후 + 재생 목록 + 효과 + 상세 정보 + 설정 + 댄스 + 오랫동안 큰 소리로 음악을 들으면 청각이 손상될 수 있습니다 + Speaker + 단일 선택 + 블루투스가 해제되었습니다 + 코러스 + 재생 목록 열기 + 검색 + 자동 + 이름 + %d개 이상 추가할 수 없습니다 + 뮤직스퀘어에서 재생할 음악 파일이 부족합니다. %d곡 이상의 음악 파일이 있어야 합니다. + 앨범 + 보기 방식 + 5.1 채널 + 미디어 정보 + 장르 + 다이내믹 + 재생 목록에 추가 + diff --git a/res/lav-LV.xml b/res/lav-LV.xml new file mode 100644 index 0000000..06d1a56 --- /dev/null +++ b/res/lav-LV.xml @@ -0,0 +1,221 @@ + + + + Gadi + Vokāls + BT austiņas + Ir izvēlēts 1 objekts + Veids + Vecā + Komponists + Vai dzēst? + Ziņas + Albums + Jau pievienots + SoundAlive + Noskaņa + Dziesmas + AtraÅ¡anās vieta + Saglabāt kā atskaņoÅ¡anas sarakstu + Dinamisks + Nevar pārdēvēt atskaņojumu sarakstu + Roks + Koplietot, izmantojot + MÅ«zikas iestatÄ«jumi + Nesen pievienotie + MÅ«zika autom. izslēgta + IzpildÄ«tāji + Nevar iestatÄ«t kā zvana signālu + 5.1 kanāla lietoÅ¡anas laikā nevar mainÄ«t skaņas efektus + AtskaņoÅ¡anas saraksti + Izveidot atskaņoÅ¡anas sarakstu + Klasiskais + PārsÅ«tÄ«Å¡ana + Roks + Izveidot atskaņoÅ¡anas sarakstu + Multivides informācija + Manas mapes + Albuma attēls + Vai noņemt? + Aplādes + Pēc 1 stundas + Zemo frekvenču skaņas pastiprināšana + PlaÅ¡s + MÅ«zikas Atskaņotājs + KafejnÄ«ca + Rediģēt + Deju mÅ«zika + 5.1 kanālu režīmu var aktivizēt tikai tad, ja ir izslēgti skaņas efekti + Atlikušās lietoÅ¡anas reizes + Ieraksta numurs + Nav mapju + Piev. atsk. sarakstam + Autors + IzpildÄ«tājs + Pievienot + Piev. atsk. sar. + Mapes skats + DerÄ«gums + KaislÄ«ba + MÅ«zikas izvēlne + Formatēt + KaislÄ«gs + Austiņas + Diskantu pastiprināšana + PopmÅ«zika + Netiek izmantots + Nezināms + Izvēlēts maksimālais objektu skaits (%d) + ZvanÄ«tāja zvana signāls + %d dziesmas + DiriÄ£. + Baits + Noņemts + Izlases + Virtuālais 7.1 kan. + Nevar noņemt vienumu + Visvairāk atskaņotie + Parasta + Nekas nav izvēlēts + Apraksts + Va-va + DzÄ«vā mÅ«zika + Lielums + Visi + Formāts + E-pasts + Noņemt + Pievienot + IzveidoÅ¡anas datums + DzÄ«vā mÅ«zika + 5.1 kanālu skaņas efekts darbojas tikai austiņu režīmā + Albumi + Visas dziesmas + Izveidot + Kopl. + Nav atskaņojumu sarakstu + Pielāgot + Pārdēvēt + Varat straumēt mÅ«ziku uz ierÄ«cēm, izmantojot programmu AllShare + Nesen atskaņotie + MÅ«zikas iestatÄ«Å¡anas vednis + Basu pastiprināšana + Iespējams + Pievienots atskaņoÅ¡anas sarakstam %s + Sarunas laikā nevar veikt atskaņoÅ¡anu + Nosaukums par garu + Rediģēt nosaukumu + Nevar iegÅ«t atzÄ«mi + Albuma veidotāji + Zvana signāls + PopmÅ«zika + IestatÄ«t kā + Nav albumu + Klasiskais + Ziņa + Gadi + Nav iespējams + Diskogrāfija + Nevar izveidot atskaņojumu sarakstu + Atjaunina... + Lietotājs + Vecāku novērtējums + Pēc 2 stundām + AtlasÄ«t ierÄ«ci + Ekvalaizers + IestatÄ«t + Doties uz bibliotēku + Saglabāt + Koplietot + Džezs + Albumi + Apturēt + IestatÄ«t kā + Pēc 15 minÅ«tēm + Dziesmu vārdi + Nav izpildÄ«tāju + HausmÅ«zika + Atrast atzÄ«mi + Džezs + Atcelt + Pēc 1 h 30 min + Nav vienumu + Tremolo + Nevar atskaņot. NeatbalstÄ«ts faila tips. + Vēsture + Izv. visu + DRM failu nevar koplietot + Bibliotēkas atjauninājums + Ierakstu saraksts + Ieraksta ilgums + Žanri + Prieks + Mapes + Dzēst + MainÄ«t asi + Nav vārdu + Pievien. + Ir izvēlēti %d objekti + Pievienot sākumam + %s noņemts + MÅ«zikas laukums + Komponisti + Vai atjaunināt bibliotēku? + Biogrāfija + Pārkārtot + Aizvērt + Nav dziesmu + MierÄ«gs + Å is skaņas efekts darbojas tikai austiņu un Bluetooth austiņas režīmā + Nevar pievienot + AutortiesÄ«bas + Atgādinājuma signāls + NerādÄ«t vēlreiz + 1 dziesma + Atskaņot visu + Nevar izdzēst. Izvēlētā mÅ«zika tiek atskaņota + Parasts + Kompon. + Pievienots + PārskatÄ«t + Eksternalizācija + Dzēst + Izslēgt + VeiksmÄ«gi + Nesen atskaņotie + AtskaņoÅ¡anas saraksts + Izvēlētais saraksts ir tukÅ¡s + Visas + Nevar atskaņot. Radās kļūda + Pārsniegts maksimālais failu skaits + MÅ«zikas dzidrums + Gadi + Žanri + Iest. kā + Pēc 30 minÅ«tēm + Atskaņ. saraksti + Efekts + Dati + IestatÄ«jumi + Deju mÅ«zika + IlgstoÅ¡a skaļas mÅ«zikas klausÄ«Å¡anās var izraisÄ«t dzirdes traucējumus + Skaļrunis + Izvēlēts + Bluetooth atvienots + Koris + Atv.atsk.s + Meklēt + Auto. + Nosaukums + Nevar pievienot vairāk kā %d mÅ«zikas failus + Nepietiek mÅ«zikas failu, lai atskaņotu MÅ«zikas laukumā. NepiecieÅ¡ami vismaz %d mÅ«zikas faili + Albumi + SkatÄ«t kā + 5.1 kanāls + Multivides informācija + Žanrs + Dinamisks + Piev. atsk. sar. + diff --git a/res/lit-LT.xml b/res/lit-LT.xml new file mode 100644 index 0000000..2e2e4a3 --- /dev/null +++ b/res/lit-LT.xml @@ -0,0 +1,221 @@ + + + + Metai + Vokalinė + BT ausinės + Pasirinktas 1 elementas + Tipas + Sena + Kompozitorius + Ar trinti? + PraneÅ¡imai + Albumas + Jau įtraukta + „SoundAlive“ + Nuotaikos + Dainos + Vieta + IÅ¡saugoti kaip grojaraÅ¡tį + Dinaminis + Negalima pakeisti grojaraščio pavadinimo + Rokas + Bendrinti per + Muzikos nustatymai + Neseniai pridėti + Automatinis muzikos iÅ¡jungimas + Atlikėjai + Neįmanoma nustatyti kaip skambėjimo tono + Neįmanoma keisti garso efektų, kai naudojamas 5.1 kanalas + Grojaraščiai + Sukurti grojaraÅ¡tį + Klasika + Persiuntimas + Rokas + Sukurti grojaraÅ¡tį + Informacija apie mediją + Mano aplankai + Albumų menas + Ar Å¡alinti? + Interneto trans. + Po 1 val. + Žemų dažnių garsų stiprinimas + Platus + Muzikos grotuvas + Kavinė + Redaguoti + Å okis + 5.1 kanalai gali bÅ«ti naudojami tik iÅ¡jungus garso efektus + Galimi panaudojimai + Ä®raÅ¡o numeris + Nėra aplankų + Ä®traukti į grojaraÅ¡tį + Autorius + Atlikėjas + Pridėti + Pridėti grojaraÅ¡tį + Aplanko rodinys + Galiojimas + Aistra + Muzikos meniu + Formatas + Aistringa + Ausinės + AukÅ¡tųjų dažnių stiprin. + Popmuzika + Nenaudojama + Nežinomas + Pasirinktas didžiausias elementų skaičius (%d) + Skambintojo skambėjimo tonas + %d dainos (-ų) + Dirigentai + Baitas + PaÅ¡alinta + Mėgstamiausieji + Virtualus 7.1 kan. + Negalima paÅ¡alinti elemento + Dažniausiai grojami + Ä®prastas + Niekas nepasirinkta + ApraÅ¡as + Ua-ua + Gyvai + Dydis + Viskas + Formatas + El. paÅ¡tas + Å alinti + Pridėti prie + SukÅ«rimo data + Gyvai + 5.1 kanalo garso efektas veikia tik ausinių režimu + Albumai + Visos dainos + Kurti + Bendr. + Nėra grojaraščių + Pasirinktinis + Pervardyti + Galite siųsti savo muzikos įraÅ¡us į įrenginius naudojančius „AllShare“ + Neseniai groti + Muzikos sąrankos vedlys + Žemųjų dažnių stiprinimas + Ä®manoma + Pridėta prie %s + Negalima paleisti skambučio metu + Pavadinimas per ilgas + Redaguoti antraÅ¡tę + Neįmanoma gauti žymos + Naudinga informacija + Skambučio tonas + Popmuzika + Nustatyti kaip + Albumų nėra + Klasika + Žinutė + Metai + Neįmanoma + Ä®rašų sąraÅ¡as + Negalima sukurti grojaraščio + Atnaujinama... + Vartotojas + Tėvų vertinimas + Po 2 val. + Pasirinkite įrenginį + Ekvalaizeris + Nustatyti + Eiti į biblioteką + IÅ¡saugoti + Bendrinti + Džiazas + Albumai + Stabdyti + Nustatyti kaip + Po 15 min. + Lyrinė + Atlikėjų nėra + Housas + Rasti žymę + Džiazas + AtÅ¡aukti + Po 1 val. 30 min. + Elementų nėra + Tremolo + Negalima paleisti. Nepalaikomas failo tipas + Istorija + Pasirinkti viską + Neįmanoma bendrinti DRM failo + Bibliotekos naujinys + Takelių sąraÅ¡as + Ä®raÅ¡o ilgis + Žanrai + Džiaugsmas + Aplankai + Trinti + Keisti ašį + Dainų žodž. nėra + Ä®trauk. + Pasirinkta elementų: %d + Pridėti prie pradž. + %s paÅ¡alintas + Muzikos kvadrat. + Kompozitoriai + Atnaujinti biblioteką? + Biografija + Pertvarkyti + Uždaryti + Dainų nėra + Ramus + Å is garso efektas veikia tik ausinių ir „Bluetooth“ ausinių režimu + Negalima pridėti + Autorių teisės + Signalo tonas + Daugiau nerodyti + 1 daina + Groti viską + Neįmanoma iÅ¡trinti. Pasirinkta muzika jau leidžiama + Ä®prastas + Kompozit. + Pridėta + PeržiÅ«rėti + IÅ¡orinis garsas + Trinti + IÅ¡jungti + Pavyko + Neseniai groti + GrojaraÅ¡tis + Pasirinktas sąraÅ¡as yra tuščias + Visos + Neįmanoma paleisti. Ä®vyko klaida + VirÅ¡ytas didžiausias leistinas failų skaičius + Muzikos aiÅ¡kumas + Metai + Žanrai + Nustatyti kaip + Po 30 min. + Grojaraščiai + Efektas + IÅ¡sami informacija + Nustat. + Å okis + Jei klausysitės garsiai ilgą laiką, gali bÅ«ti pažeista klausa + Garsiak. + Pasirinkta + „Bluetooth“ atjungta + Choro efektas + Atid. groj. + IeÅ¡koti + Auto. + Pavadinimas + Negalima pridėti daugiau kaip %d muzikos failo (-ų) + Nepakanka muzikos failų, kad juos bÅ«tų galima atkurti muzikos kvadrate. Reikia ne mažiau kaip %d muzikos failų + Albumai + Žr.kaip + 5.1 kanalas + Informacija apie mediją + Žanras + Dinaminis + Pridėti prie grojaraščio + diff --git a/res/mkd-MK.xml b/res/mkd-MK.xml new file mode 100644 index 0000000..01f0457 --- /dev/null +++ b/res/mkd-MK.xml @@ -0,0 +1,221 @@ + + + + Години + Вокална музика + Слушалки BT + Избран е 1 запис + Тип + Стари + Компонирање + Да се избрише? + Пораки + Албум + Веќе е додадено + SoundAlive + Расположенија + Песни + Локација + Сочувај како музичка листа + Динамично + Музичката листа не може да се преименува + Рок + Сподели преку + Опции за музиката + Последно додадено + Авто. искл. на музиката + Изведувачи + Не може да се постави како ѕвонење + Не можат да се сменат звучните ефекти кога се користат 5.1 канали + Музички листи + Нова музичка листа + Класика + Препраќање + Рок + Нова музичка листа + Податоци за медиумот + Мои папки + Омот на албумот + Отстрани? + Подкасти + По 1 час + Подобрување басови + Широко + Плеер за музика + Кафеана + Измени + Денс + 5.1 канали може да се активира само кога се исклучени звучните ефекти + Можност за употреба + Реден број + Нема папки + Додај во листа + Автор + Изведувач + Додај + Додај листа + Преглед на папки + Валидност + Страст + Музичко мени + Формат + Страсно + Слушалки + Засилување средни + Поп + Не користи + Непозната + Избран е макс. број записи (%d) + Тон за повикувач + %d песни + Дириг. + Бајт + Отстрането + Омилени + Виртуелен 7.1 канал + Содржината не може да се отстрани + Најчесто емитувано + Нормално + Не е избрано ништо + Опис + Вах-вах + Во живо + Големина + Сите + Формат + Е-пошта + Отстрани +  Додај на + Датум на создавање + Во живо + Звучниот ефект 5.1 канали е само за слушалки + Албуми + Сите песни + Ново + Сподели + Нема музички листи + Одредено + Преименувај + Може да ја емитувате својата музика до уреди коритејќи го AllShare + Последно емитувано + Програма за конфигурација на музиката + Засилување бас + Возможно + Додадено на %s + Не може да се пушти за време на разговор + Предолго име + Измени наслов + Не може да се добие ознака + Учесници + Ѕвонење за повик + Поп + Постави како + Нема албуми + Класика + Порака + Години + Невозможно + Дискографија + Не може да се отвори музичка листа + Се ажурира... + Корисник + Родителска оцена + По 2 часа + Избери уред + Еквилајзер + Постави + Оди до библиотека + Сочувај + Сподели + Џез + Албуми + Прекини + Постави како + По 15 мин + Текстови + Нема изведувачи + Хаус + Најди ознака + Џез + Откажи + По 1 час и 30 мин + Нема записи + Тремоло + Не може да се емитува. Неподдржан тип фајл + Историја + Избери ги сите + Не може да се сподели фајл со DRM + Ажурирај библиотека + Листа песни + Времетраење + Жанрови + Радост + Папки + Избриши + Смени оска + Нема текст + Додај + Избрани се %d записи + Додај дома + %s е отстранета + Музички плоштад + Композитори + Ажурирај библиотека? + Биографија + Пререди + Затвори + Нема песни + Смирен + Звучниот ефект е само за слушалка и слушалки Bluetooth + Не може да се додаде + Авторски права + Тон за аларм + Не прикажувај веќе + 1 песна + Емитувај сè + Не може да се избрише. Избраната музика се емитува + Нормално + Композ. + Додадено + Ревизија + Екстернализација + Избриши + Исклучено + Успешно + Последно емитувано + Музичка листа + Избраната листа е празна + Сите + Не може да се емитува. Дојде до грешка + Максималниот број фајлови е надминат + Музичка јасност + Години + Жанрови + Постави како + По 30 мин + Музички листи + Ефект + Детали + Опции + Денс + Големи јачини може да ви го оштетат слухот ако слушате долго време + Звучник + Избраните + Bluetooth е откачено + Корус + Отвори + Пребарување + Автоматски + Име + Не може да се додадат повеќе од %d музички фајлови + Нема доволно музички фајлови за емитување на Музичкиот плоштад. Потребни се барем %d музички фајлови + Албуми + Прег.како + 5.1 канали + Податоци за медиумот + Жанр + Динамично + Додај во музичка листа + diff --git a/res/nld-NL.xml b/res/nld-NL.xml new file mode 100644 index 0000000..8fb87b5 --- /dev/null +++ b/res/nld-NL.xml @@ -0,0 +1,221 @@ + + + + Jaren + Zang + BT-headset + 1 item geselecteerd + Type + Oud + Componist + Verwijderen? + Berichten + Album + Al toegevoegd + SoundAlive + Stemmingen + Nummers + Locatie + Opslaan als afspeellijst + Dynamisch + Kan de naam van de afspeellijst niet wijzigen + Rock + Delen via + Muziekinstellingen + Onlangs toegevoegd + Muziek automatisch uit + Artiest + Kan niet ingesteld worden als beltoon + Kan geluidseffecten niet wijzigen bij gebruik van 5.1-kanaals + Afspeellijsten + Afspeellijst maken + Klassiek + Doorsturen + Rock + Afspeellijst maken + Media-info + Mijn mappen + Album art + Verwijderen? + Podcasts + Na 1 uur + Lage tonen versterken + Ruimtelijk + MP3-speler + Café + Bewerken + Dance + 5.1-kanaal kan alleen worden geactiveerd wanneer geluidseffecten zijn uitgeschakeld + Aantal keer dat het gebruikt mag worden + Tracknummer + Geen mappen + Toev. aan afspeellijst + Auteur + Artiest + Toevoegen + Afspeellijst toevoegen + Map-\nweergave + Geldigheid + Passion + Muziekmenu + Formatteren + Vurig + Koptelefoons + Hoge-tonenboost + Pop + Niet gebruikt + Onbekend + Maximumaantal items (%d) geselecteerd + Beltoon beller + %d nummers + Dirigent + Byte + Verwijderd + Favorieten + Virtueel 7.1 kanaals + Kan het item niet wissen + Meest afgespeeld + Normaal + Niets geselecteerd + Omschrijving + Wha-wha + Live + Grootte + Alles + Formaat + E-mail + Wissen + Toevoegen aan + Datum gemaakt + Live + 5.1-kanaals geluidseffect werkt alleen met oortelefoonstand + Albums + Alle nummers + Nieuw + Delen + Geen afspeellijsten + Aangepast + Naam wijzigen + Gebruik AllShare voor streaming van muziek naar apparaten + Onlangs afgespeeld + Wizard Muziek instellen + Basboost + Mogelijk + Toegevoegd aan %s + Niet mogelijk tijdens gesprek + Naam te lang + Titel bewerken + Kan tag niet ophalen + Credits + Beltoon voor oproep + Pop + Instellen als + Geen albums + Klassiek + Bericht + Jaar + Niet mogelijk + Discografie + Kan de afspeellijst niet maken + Bijwerken... + Gebruiker + Leeftijdsclassificatie + Na 2 uur + Apparaat selecteren + Equalizer + Instellen + Ga naar bibliotheek + Opslaan + Delen + Jazz + Albums + Stoppen + Instellen als + Na 15 min. + Songtekst + Geen artiesten + House + Tag zoeken + Jazz + Annuleren + Na 1 uur 30 min. + Geen items + Vibrato + Kan niet afspelen. Niet-ondersteund bestandstype + Geschiedenis + Alles selecteren + Kan DRM-bestand niet delen + Bibliotheek bijwerken + Afspeellijst + Lengte track + Genres + Joy + Mappen + Wissen + As wijzigen + Geen songtkst + Voeg toe + %d items geselecteerd + Toevoegen aan startpagina + %s verwijderd + Music square + Componisten + Bibliotheek bijwerken? + Biografie + Indeling wijzigen + Sluiten + Geen nummers + Rustig + Dit geluidseffect werkt alleen in de oortelefoon- en Bluetooth-headsetstand + Kan niet toevoegen + Copyright + Alarmtoon + Niet meer tonen + 1 nummer + Alles afspelen + Kan niet verwijderen. Geselecteerde muziek wordt afgespeeld + Normaal + Compon. + Toegevoegd + Overzicht + Weergeven als extern geluid + Wissen + Uit + Voltooid + Onlangs afgespeeld + Afspeellijst + Geselecteerde lijst is leeg + Alles + Kan niet afspelen. Fout opgetreden + Maximumaantal bestanden overschreden + Helderheid muziek + Jaren + Genres + Inst. als + Na 30 min. + Afspl. lijsten + Effect + Gegevens + Instellingen + Dance + Hoog volume kan uw gehoor beschadigen wanneer u er lang naar luistert + Speaker + Geselecteerd + Verbinding met Bluetooth verbroken + Koor + Afsp.lijst + Zoeken + Automatisch + Naam + Kan niet meer dan %d muziekbestanden toevoegen + Onvoldoende muziekbestanden om af te spelen in Music square. Ten minste %d bestanden vereist + Albums + Weergeven als + 5.1-kanaals + Media-info + Genre + Dynamisch + Naar afspeellijst + diff --git a/res/nob-NO.xml b/res/nob-NO.xml new file mode 100644 index 0000000..67cd745 --- /dev/null +++ b/res/nob-NO.xml @@ -0,0 +1,221 @@ + + + + År + Vokal + BT-headsett + 1 element valgt + Type + Gammel + Forfatter + Slette? + Meldinger + Album + Allerede lagt til + SoundAlive + Stemninger + Sanger + Plassering + Lagre som spilleliste + Dynamisk + Kan ikke gi spillelisten nytt navn + Rock + Del via + Musikkinnstillinger + Nylig lagt til + Musikk auto av + Artist + Kan ikke angi som ringetone + Kan ikke endre lydeffekter ved bruk av 5.1-kanal + Spillelister + Opprett spilleliste + Klassisk + Videresending + Rock + Opprett spilleliste + Medieinformasjon + Mine mapper + Albumomslag + Fjerne? + Podcasts + Etter 1 time + Bassforsterkning + Bred + Musikk-spiller + Kafé + Rediger + Dans + 5.1-kanal kan bare aktiveres nÃ¥r lydeffekter er av + Kan brukes antall ganger + Spornummer + Ingen mapper + Legg til i spilleliste + Forfatter + Artist + Legg til + Legg til spilleliste + Vis mapper + Gyldighet + Lidenskap + Musikkmeny + Formater + Lidenskapelig + Hodetelefoner + Diskantheving + Pop + Brukes ikke + Ukjent + Maksimalt antall elementer (%d) nÃ¥dd + Kontaktringetone + %d sanger + Dirig. + Byte + Fjernet + Favoritter + Virtuell 7.1 kanal + Kan ikke fjerne element + Mest spilt + Normal + Ingenting valgt + Beskrivelse + Wha-wha + Live + Størrelse + Alle + Format + E-post + Fjerne + Legg til i + Opprettet dato + Live + 5.1-kanals lydeffekt virker bare i høretelefonmodus + Album + Alle sanger + Opprett + Del + Ingen spillelister + Egendefinert + Endre navn + Du kan streame musikken din til andre enheter med AllShare + Nylig avspilt + Veiviser for musikkonfigurering + Bassheving + Mulig + Lagt til %s + Kan ikke spille av under samtale + Navnet er for langt + Rediger tittel + Kan ikke hente tagg + Medvirkende + Ringetone for samtale + Pop + Angi som + Ingen album + Klassisk + Melding + År + Umulig + Diskografi + Kan ikke opprette spilleliste + Oppdaterer... + Bruker + Aldersgrense + Etter 2 timer + Velg enhet + Equalizer + Angi + GÃ¥ til bibliotek + Lagre + Del + Jazz + Album + Stopp + Bruk som + Etter 15 min + Tekster + Ingen artister + House + Finn tagg + Jazz + Avbryt + Etter 1 time 30 min + Ingen elementer + Tremolo + Kan ikke spilles av. Ikke støttet filtype + Historikk + Merk alt + Kan ikke dele DRM-fil + Biblioteksoppdatering + Avspillingsliste + Sporlengde + Sjangre + Glede + Mapper + Slett + Endre akse + Ingen tekster + Tilføy + %d elementer valgt + Legg til pÃ¥ startside + %s er fjernet + Musikk-firkant + Komponister + Oppdatere bibliotek? + Biografi + Omordne + Lukk + Ingen sanger + Rolig + Denne lydeffekten virker bare i høretelefon- og Bluetooth headset-moduser + Kan ikke legge til + Copyright + Alarmtone + Ikke vis igjen + 1 sang + Spill av alle + Kan ikke slette. Valgt musikk spilles av + Normal + Kompon. + Lagt til + Gjennomgang + Eksternalisering + Slett + Av + Fullført + Nylig avspilt + Spilleliste + Valgt liste er tom + Alle + Kan ikke spille av. Det oppstod en feil + Maks. antall filer overskredet + Musikklarhet + År + Sjangre + Bruk som + Etter 30 min + Spille-\nlister + Effekt + Detaljer + Innstillinger + Dans + Høy lydstyrke kan skade hørselen din hvis du lytter til det over lengre perioder + Høyttaler + Valgt + Bluetooth koblet fra + Kor + Åpn sp.l. + Søk + Auto + Navn + Kan ikke legge til mer enn %d musikkfiler + Ikke nok musikkfiler til Ã¥ spille av i Musikk-firkant. Minst %d musikkfiler kreves + Album + Vis som + 5.1-kanal + Medieinformasjon + Sjanger + Dynamisk + Legg til i spilleliste + diff --git a/res/pol-PL.xml b/res/pol-PL.xml new file mode 100644 index 0000000..60740b4 --- /dev/null +++ b/res/pol-PL.xml @@ -0,0 +1,221 @@ + + + + Lata + Śpiew + Zestaw BT + Wybrane elementy: 1 + Typ + Stare + Kompozytor + Usunąć? + Wiadomości + Album + Już dodano + SoundAlive + Rodzaje + Piosenki + Miejsce + Zapisz jako listę odtwarzania + Dynamiczna + Nie można zmienić nazwy listy odtwarzania + Rock + Udostępnij przez + Ustawienia muzyki + Ostatnio dodane + Auto-wył. odtwarzacza + Wykonawcy + Nie można ustawić jako dzwonek + Nie można zmienić efektów dźwiękowych, gdy włączony jest dźwięk przestrzenny 5.1 + Listy odtwarzania + Utwórz listę odtwarzania + Classic + Przesyłanie + Rock + Utwórz listę odtwarzania + Multimedia + Moje katalogi + Okładka + Usunąć? + Podcasty + Po 1 godz. + Podbicie basów + Wide + Odtwarzacz muzyki + Kawiarnia + Edytuj + Dance + Dźwięk przestrzenny 5.1 można włączyć tylko wtedy, gdy efekty dźwiękowe są wyłączone + Dostępne zastosowania + Numer utworu + Brak katalogów + Dodaj do listy odtw. + Autor + Wykonawca + Dodaj + Dodaj listę odtwarzania + Katalog + Ważność + Pasja + Elementy menu muzyka + Formatuj + Å»arliwe + Słuchawki + Podbicie tonów wysokich + Pop + Ręcznie + Nieznany + Wybrano maksymalną liczbę elementów (%d) + Dzwonek kontaktu + Utworów: %d + Dyrygenci + Bajt + Usunięto + Ulubione + Wirtualne 7.1 + Nie można usunąć elementu + Najczęściej odtwarzane + Normalny + Niczego nie zaznaczono + Opis + Wha-wha + Live + Rozmiar + Wszystkie + Format + E-mail + Usuń + Dodaj do + Data utworzenia + Live + Podłącz słuchawki, aby korzystać z dźwięku przestrzennego 5.1 + Albumy + Wszystkie utwory + Utwórz + Udost. + Brak list odtwarzania + Niestand. + Zmień nazwę + Możesz przesyłać muzykę strumieniowo do urządzeń przez AllShare + Ostatnio odtwarzane + Kreator konfiguracji muzyki + Podbicie basów + Możliwe + Dodano do %s + Niedozwolone podczas połączenia + Zbyt długa nazwa + Edytuj tytuł + Nie można pobrać etykiety + Kredyty + Dźwięk dzwonka + Pop + Ustaw jako + Brak albumów + Classic + Wiadomość + Rok + Niemożliwe + Dyskografia + Nie można utworzyć listy odtwarzania + Aktualizacja... + Użytkownik + Ocena rodzica + Po 2 godz. + Wybierz urządzenie + Equalizer + Ustaw + Idź do biblioteki + Zapisz + Udostęp. + Jazz + Albumy + Stop + Ustaw jako + Po 15 min + Tekst + Brak wykonawców + House + Znajdź tag + Jazz + Anuluj + Po 1 godz. 30 min + Brak elementów + Tremolo + Nie można odtworzyć. Nieobsługiwany typ pliku + Historia + Zaznacz wszystko + Nie można udostępnić pliku DRM + Aktualizacja biblioteki + Lista utworów + Długość utworu + Rodzaje + Radość + Katalogi + Usuń + Zmień oś + Brak tekstu + Dodaj + Wybrane elementy: %d + Dodaj do ekr. startowego + Usunięto: %s + Plac muzyczny + Kompozytorzy + Zaktualizować bibliotekę? + Biografia + Zmień kolejność + Zamknij + Brak utworów + Spokojna + To ustawienie jest dostępne tylko w trybie słuchawek przewodowych lub Bluetooth + Nie można dodać + Copyright + Sygnał alarmu + Nie wyświetlaj ponownie + 1 utwór + Odtwórz wszystkie + Nie można usunąć. Wybrana muzyka jest odtwarzana + Wył. + Kompoz. + Dodano + Podgląd zdjęcia + Na zewnątrz + Usuń + Wył. + Zakończono + Ostatnio odtwarzane + Lista odtwarzania + Wybrana lista jest pusta + Wszystkie + Nie można odtworzyć. Wystąpił błąd + Przekroczono maksymalną liczbę plików + Muzyka + Lata + Rodzaje + Ustaw jako + Po 30 min + Listy odtwarz. + Efekty + Szczegóły + Ustawienia + Dance + Słuchanie muzyki przy wysokim ustawieniu głośności przez długi czas może spowodować uszkodzenie słuchu + Głośnik + Wybrany + Przerwano połączenie Bluetooth + Chór + Ot. odtw. + Szukaj + Automatyczny + Nazwa + Nie można dodać więcej utworów muzycznych niż %d + Niewystarczająca liczba plików muzycznych do odtwarzania na Placu muzycznym. Minimalna liczba wymaganych plików muzycznych: %d + Albumy + Widok + Dźwięk przestrzenny 5.1 + Multimedia + Rodzaj + Dynamiczny + Dodaj do listy odtwarzania + diff --git a/res/por-BR.xml b/res/por-BR.xml new file mode 100644 index 0000000..f7f3e7f --- /dev/null +++ b/res/por-BR.xml @@ -0,0 +1,221 @@ + + + + Anos + Vocal + Fone de ouvido BT + 1 item selecionado + Tipo + Antiga + Compositor + Apagar? + Mensagem + Álbum + Já adicionado + SoundAlive + Ambiente + Músicas + Local + Salvar como lista de reprod. + Dinâmica + Impossível renomear a lista de reprodução + Rock + Compartilhar via + Configurações de música + Adic. recentemente + Desligar música automaticamente + Artistas + Impossível definir como tom de toque + Impossível alterar efeitos de som durante a utilização do canal 5.1 + Listas de reprodução + Criar lista de reprodução + Clássico + Encaminhamento + Rock + Criar lista de reprodução + Informações + Minhas pastas + Capa do álbum + Remover? + Podcasts + Após 1 hora + Aumento do grave + Wide + Music Player + Café + Editar + Dance + O canal 5.1 só pode ser ativado quando os efeitos de som estão desligados + Utilizações disponíveis + Nº da faixa + Sem pastas + Adicion. à lista reprod. + Autor + Artista + Adicionar + Adicionar lista de reprodução + Ver por pasta + Validade + Paixão + Menu Música + Formatar + Apaixonada + Fones de ouvido + Amplificação de agudos + Pop + Não utilizado + Desconhecido + Número máximo de itens (%d) selecionados + Toque para um contato + %d músicas + Maestros + Byte + Removido + Favoritos + 7.1 ch Virtual + Impossível remover item + Mais tocadas + Normal + Nada selecionado + Descrição + Wha-wha + Vivo + Tamanho + Todas + Formato + E-mail + Remover + Adicionar a + Data de criação + Vivo + O efeito de som Surround 5.1 funciona apenas no modo de fone de ouvido + Álbuns + Todas as músicas + Criar + Compart. + Nenhuma lista de reprodução + Personalizar + Renomear + Você pode enviar música para dispositivos usando o AllShare + Tocadas recentemente + Assistente de música + Amplificação de baixos + Possível + Adicionada a %s + Impossível durante chamada + Nome muito longo + Editar título + Impossível obter link + Créditos + Toque da chamada + Pop + Definir como + Sem álbuns + Clássico + Mensagem + Anos + Impossível + Discografia + Impossível criar lista de reprodução + Atualizando… + Usuário + Taxa anterior + Após 2 horas + Selecione dispositivo + Equalizador + Definir + Ir para biblioteca + Salvar + Compart. + Jazz + Álbuns + Parar + Definir como + Após 15 min + Letra + Nenhum artista + House + Localizar etiqueta + Jazz + Cancelar + Após 1 hora e 30 min + Sem itens + Tremolo + Impossível reproduzir. Tipo de arquivo não suportado + Histórico + Selecionar tudo + Impossível compartilhar arquivo DRM + Atualização de biblioteca + Lista de faixas + Duração + Gêneros + Alegria + Pastas + Apagar + Alterar eixo + Nenhuma letra + Adicionar + %d itens selecionados + Adicionar à tela principal + %s removida + Salão de música + Compositores + Atualizar biblioteca? + Biografia + Reordenar + Fechar + Nenhuma música + Calmo + Este efeito de som funciona apenas com fone de ouvido ou fone de ouvido Bluetooth + Impossível adicionar + Copyright + Som do alarme + Não mostrar novamente + 1 música + Reproduzir tudo + Impossível apagar. música selecionada em reprodução + Normal + Compos. + Adicionado + Rever + Externalização + Apagar + Desativado + Sucesso + Tocadas recentemente + Lista de reprodução + Lista selecionada vazia + Todos + Impossível reproduzir. Ocorreu um erro + Número máximo de arquivos excedido + Claridade da música + Anos + Gêneros + Definir como + Após 30 min + List. reprodução + Efeito + Detalhes + Config. + Dance + O volume alto do som pode prejudicar a sua audição se a expor durante muito tempo + Viva-voz + Selecionado + Bluetooth desligado + Coral + Abrir lista de reprodução + Pesquisar + Automático + Nome + Impossível adicionar mais que %d arquivos de música + Não há arquivos de música suficientes para tocar no Salão de música. Pelo menos %d arquivos de música são necessários + Álbuns + Ver como + Canal 5.1 + Informações + Gênero + Dinâmico + Adic. à lista de reprodução + diff --git a/res/por-PT.xml b/res/por-PT.xml new file mode 100644 index 0000000..eb0689a --- /dev/null +++ b/res/por-PT.xml @@ -0,0 +1,221 @@ + + + + Anos + Vocal + Auricular BT + 1 item seleccionado + Tipo + Antigo + Compositor + Eliminar? + Mensagens + Álbum + Já adicionado + SoundAlive + Humores + Músicas + Localização + Guardar como lista de reprodução + Dinâmico + Impossível mudar o nome da lista de reprodução + Rock + Partilhar via + Definições de música + Adicionadas recentemente + Desligar música automaticamente + Artistas + Impossível definir como tom de toque + Impossível alterar efeitos de som durante a utilização do canal 5.1 + Listas de reprod. + Criar lista de reprodução + Clássica + Reencaminhar + Rock + Criar lista de reprodução + Info multimédia + As minhas pastas + Capa do álbum + Remover? + Podcasts + Após 1 hora + Melhoramento de graves + Amplo + Leitor de Música + Café + Editar + Dança + O canal 5.1 só pode ser activado quando os efeitos de som estão desligados + Utilizações disponíveis + Número da faixa + Sem pastas + Adicion. à lista reprod. + Autor + Artista + Adicionar + Adicionar lista de reprodução + Vista de pasta + Validade + Paixão + Menu Música + Formatar + Apaixonada + Auscultadores + Amplificação de agudos + Pop + Não utilizado + Desconhecido + Número máximo de itens (%d) seleccionados + Toque do chamador + %d músicas + Maestros + Byte + Removido + Favoritos + Canal virtual 7.1 + Impossível remover item + Mais reproduzidas + Normal + Nada seleccionado + Descrição + Wha-wha + Em directo + Tamanho + Tudo + Formato + E-mail + Remover + Adicionar a + Data criada + Em directo + O efeito de som do canal 5.1 funciona apenas no modo de auricular + Álbuns + Todas as músicas + Criar + Enviar + Nenhuma lista de reprodução + Personalizar + Mudar nome + Pode efectuar o streaming da sua música para dispositivo utilizando AllShare + Reproduzidas recentemente + Assistente de configuração de música + Amplificação de baixos + Possível + Adicionada a %s + Impossível jogar durante chamada + Nome demasiado comprido + Editar título + Impossível obter etiqueta + Créditos + Tom de toque de chamada + Pop + Definir como + Sem álbuns + Clássica + Mensagem + Anos + Impossível + Discografia + Impossível criar lista de reprodução + A actualizar... + Utilizador + Classificação parental + Após 2 horas + Seleccionar dispositivo + Equalizador + Definir + Ir para biblioteca + Guardar + Partilhar + Jazz + Álbuns + Parar + Definir como + Após 15 min + Letra + Nenhuns artistas + House + Localizar etiqueta + Jazz + Cancelar + Após 1 hora e 30 min + Sem itens + Tremolo + Impossível reproduzir. Tipo de ficheiro não suportado + Histórico + Seleccionar tudo + Impossível partilhar ficheiro DRM + Actualização da biblioteca + Lista de faixas + Duração da faixa + Géneros + Alegria + Pastas + Eliminar + Alterar eixo + Nenhumas letras + Adicion. + %d itens seleccionados + Adicionar ao início + %s removida + Music square + Compositores + Actualizar biblioteca? + Biografia + Reordenar + Fechar + Nenhumas músicas + Calmo + Este efeito de som funciona apenas nos modos de auricular e auricular Bluetooth + Impossível adicionar + Direitos de autor + Tom do alarme + Não mostrar novamente + 1 música + Reproduzir tudo + Impossível eliminar. A música seleccionada está a ser reproduzida + Normal + Compos. + Adicionado + Rever + Externalização + Eliminar + Desligar + Concluído + Reproduzidas recentemente + Lista de reprodução + Lista seleccionada vazia + Tudo + Impossível reproduzir. Ocorreu um erro + Número máximo de ficheiros excedido + Nitidez da música + Anos + Géneros + Definir como + Após 30 min + Listas reprod. + Efeito + Detalhes + Definições + Dança + O volume de som elevado pode prejudicar a sua audição se a expuser a este durante muito tempo + Altifal. + Seleccionado + Bluetooth desligado + Coro + Lis. rep. + Procurar + Automático + Nome + Impossível adicionar mais de %d ficheiros de música + Ficheiros de música insuficientes para reproduzir em Music Square. São necessárias pelo menos %d ficheiros de música + Álbuns + Ver + Canal 5.1 + Info multimédia + Género + Dinâmico + Adic. á lista de reprod. + diff --git a/res/ron-RO.xml b/res/ron-RO.xml new file mode 100644 index 0000000..5ff9df8 --- /dev/null +++ b/res/ron-RO.xml @@ -0,0 +1,221 @@ + + + + Ani + Vocală + Cască BT + 1 element selectat + Tip + Vechi + Compozitor + ŞtergeÅ£i? + Mesaje + Album + Deja adăugat + SoundAlive + Stări + Melodii + LocaÅ£ie + Salvare ca listă de redare + Dinamic + Imposibil de redenumit lista de redare + Rock + Partajare prin + Setări muzică + Adăugat recent + Oprire automată muzică + Artişti + Imposibil de setat ca ton de sonerie + Imposibil de modificat efectele sonore în timpul utilizării sistemului pe 5.1 canale + Liste de redare + Creare listă de redare + Clasic + RedirecÅ£ionare + Rock + Creare listă de redare + InformaÅ£ii media + Directoarele mele + Grafică album + Eliminare? + Podcast. + După 1 oră + Accentuare başi + Larg + Player muzical + Cafenea + Editare + Dance + Sistemul pe 5.1 canale poate fi activat numai când efectele sonore sunt dezactivate + Utilizări disponibile + Număr piesă + Niciun folder + Ad. la lista de red. + Autor + Artist + Adăugat + Adăugare listă de redare + Viz. foldere + Valabilitate + Pasiune + Meniu muzică + Format + Pasional + Căşti + Accentuare înalte + Pop + Neutilizat + Necunoscut + A fost selectat numărul maxim de elemente (%d) + Ton sonerie apelant + %d melodii + Dirijori + Octet + Eliminat + Favorite + 7.1 canale virtuale + Imposibil de eliminat elementul + Cea mai redată + Normal + Nimic selectat + Descriere + Wha-wha + Live + Dimensiune + Toate + Format + Email + Eliminare + Adăugare la + Data creării + Live + Efectul sonor pentru 5.1 canale funcÅ£ionează numai în modul cască + Albume + Toate melodiile + Creare + Partaj. + Nici o listă de redare + Particularizat + Redenumire + PuteÅ£i reda în flux muzica pe dispozitive utilizând AllShare + Redate recent + Expert configurare muzică + Accentuare başi + Posibil + Adăugate la %s + Imposibil de redat în timpul unui apel + Nume prea lung + Editare titlu + Imposibil de obÅ£inut eticheta + Credite + Ton sonerie apel + Pop + Setare ca + Nu există albume + Clasic + Mesaj + Ani + Imposibil + Discografie + Imposibil de creat lista de redare + Actualizare... + Utilizator + Evaluare părinte + După 2 ore + Selectare dispozitiv + Egalizator + Afiş. + Accesare bibliotecă + Salvare + Partajare + Jazz + Albume + Oprire + Setare ca + După 15 minute + Versuri + Nu există artişti + House + Căutare etichetă + Jazz + Anulare + După 1 oră 30 min. + Niciun element + Tremolo + Imposibil de redat. Tip fişier neacceptat + Istoric + Selectare toate + Imposibil de partajat fişierul DRM + Actualizare bibliotecă + Listă de melodii + Lungime piesă + Genuri + Bucurie + Foldere + Ştergere + Schimbare axă + Fără versuri + Adăug. + %d elemente selectate + Adăugare la ecran principal + %s a fost eliminat + Pătrat muzical + Compozitori + ActualizaÅ£i biblioteca? + Biografie + Reordonare + Închidere + Nu există melodii + Calm + Acest efect de sunet funcÅ£ionează numai în modurile cască şi cască Bluetooth + Imposibil de adăugat + Drept de autor + Ton alarmă + Nu se mai afişează + o melodie + Redare totală + Imposibil de şters. Muzica selectată este în curs de redare + Normal + Compoz. + Adăugat + Examinare + Externalizare + Ştergere + Oprit + Succes + Redate recent + Listă de redare + Listă selectată goală + Toate + Imposibil de redat. A avut loc o eroare + Numărul maxim de fişiere a fost depăşit + Claritate muzică + Ani + Genuri + Setare ca + După 30 min. + Liste de redare + Efect + Detalii + Setări + Dance + Sunetele la volum ridicat pot afecta auzul, dacă le ascultaÅ£i timp îndelungat + Difuzor + Selectat + Bluetooth deconectat + Cor + Des. listă + Căutare + Automat + Nume + Imposibil de adăugat mai mult de %d fişier muzical + Nu sunt suficiente fişiere muzicale pentru redarea în pătratul muzical. Sunt necesare cel puÅ£in %d fişiere muzicale + Albume + Viz. ca + 5.1 canale + InformaÅ£ii media + Gen + Dinamic + Adăugare la lista de redare + diff --git a/res/rus-RU.xml b/res/rus-RU.xml new file mode 100644 index 0000000..225a687 --- /dev/null +++ b/res/rus-RU.xml @@ -0,0 +1,221 @@ + + + + Годы + Вокал + Гарнитура BT + Выбран 1 элемент + Тип + Старая + Сообщение + Удалить? + Сообщения + Альбом + Уже добавлено + SoundAlive + Настроение + Песни + Расположение + Сохранить как список воспроизведения + Динамичная + Невозможно переименовать список воспроизведения + Рок + Отправить через + Настройки музыки + Недавно добавленные + Автоотключение музыки + Исполнители + Не удалось установить как мелодию + Невозможно изменить звуковые эффекты при использовании 5.1-канального звука + Списки воспроизведения + Создать список + Классика + Пересылка + Рок + Создать список + Информация + Мои папки + Обложка альбома + Удалить? + Подкасты + Через 1 час + Усиление басов + Широкий диапазон + Музыка + Кафе + Изменить + Танец + 5.1-канальный звук можно использовать только тогда, когда звуковые эффекты отключены + Доступно + Номер композиции + Нет папок + Добавить в список воспр. + Автор + Исполнитель + Добавить + Добавить список воспроизведения + Просмотр по папкам + Период действия + Страсть + Музыкальное меню + Форматировать + Страстная + Наушники + Усиление высоких частот + Поп + Не используется + Неизвестно + Выбрано максимальное количество элементов (%d) + Мелодия контакта + Композиций: %d + Дирижеры + Байт + Удалено + Избранное + Виртуальная система 7.1 + Невозможно удалить элемент + Популярные файлы + Обычный + Ничего не выбрано + Описание + Вау-вау + Живой звук + Размер + Все + Формат + E-mail + Удалить + Добавить + Дата создания + Живой звук + 5.1-канальный звуковой эффект доступен только в режиме наушников + Альбомы + Все песни + Создать + Отправ. + Нет списков воспроизведения + Создать + Переименовать + Можно передавать музыку на устройства с помощью AllShare + Последние файлы + Мастер настройки + Усиление низких частот + Возможно + Добавлено в %s + Воспроизведение во время вызова невозможно + Слишком длинное имя + Изменить заголовок + Не удается получить тег + Исполнители + Мелодия звонка + Поп + Установ. + Нет альбомов + Классика + Сообщение + Годы + Невозможно + Дискография + Невозможно создать список воспроизведения + Обновление... + Пользователь + Родительский контроль + Через 2 часа + Выберите устройство + Эквалайзер + Применить + Перейти в библиотеку + Соxранить + Отправить + Джаз + Альбомы + Остановить + Установить как + Через 15 мин + Слова + Нет исполнителей + Хаус + Поиск тегов + Джаз + Отмена + Через 1 час 30 мин + Нет элементов + Тремоло + Невозможно воспроизвести. Неподдерживаемый тип файла + Журнал + Выбрать все + Невозможно предоставить общий доступ к файлу DRM + Обновление библиотеки + Список файлов + Длительность + Жанры + Радость + Папки + Удалить + Сменить ось + Нет текста песни + Добав. + Выбрано элементов: %d + Добавить на главный экран + Удалено: %s + Музык. квадрат + Композиторы + Обновить библиотеку? + Биография + Изменить порядок + Закрыть + Нет композиций + Спокойная + Этот звуковой эффект доступен только в режимах наушников и гарнитуры Bluetooth + Не удалось добавить + Авторские права + Мелодия сигнала + Не показывать снова + 1 композиция + Воспроизвести все + Невозможно удалить. Выбранная музыка воспроизводится + Обычный + Композ. + Добавлено + Просмотр + Экстернализация + Удалить + Выключено + Успешно + Последние файлы + Список воспроизведения + Выбранный список пуст + Все + Сбой воспроизведения. Произошла ошибка + Превышено максимальное число файлов + Четкость музыки + Годы + Жанры + Установить как + Через 30 мин + Списки воспроизведения + Эффект + Свойства + Настройки + Танец + Прослушивание громкой музыки в течение продолжительного времени может привести к ухудшению слуха + Динамик + Выбрано + Устройство Bluetooth отключено + Хор + Откр. + Поиск + Авто + Имя + Невозможно добавить больше %d музыкальных файлов + Недостаточно файлов для музыкального квадрата. Требуется не менее %d аудиофайлов + Альбомы + Вид + 5.1-канальный звук + Информация + Жанр + Динамический + Добавить в список + diff --git a/res/screen-density-xhigh/00_btn_circle_bg_normal.png b/res/screen-density-xhigh/00_btn_circle_bg_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..981d624c46d4af306b6fe952341791537b49c62a GIT binary patch literal 5130 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_btn_circle_bg_press.png b/res/screen-density-xhigh/00_btn_circle_bg_press.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5f8b242d7203cc396533b436e8c8507fd95534 GIT binary patch literal 5141 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 Y02G%!6Bpplz5oCK07*qoM6N<$f^IL^3IG5A literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_rename_press.png b/res/screen-density-xhigh/00_button_rename_press.png new file mode 100644 index 0000000000000000000000000000000000000000..39c5de5039ee6bb12314b27775de8b5b68709138 GIT binary patch literal 3186 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 Y02G%!6Bpplz5oCK07*qoM6N<$f^IL^3IG5A literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_check_bg.png b/res/screen-density-xhigh/00_check_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..80398eda7a04ebe009c6801be69c87f85dbed790 GIT binary patch literal 4703 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⋘%OR?yb!1jIWWhq|DVQy2sF!*Q7ONGK{JW(WJjDpQXjN|xOyM54T zwOZbo=ty1p!M*^2HWAwGwr{nXjW~|?Z6=~I3M4TePgK58ECAR~1ODrca^;imVb>g+ zdyH1F)*{M8)q1^JuhnbL*es2Wpp?EcCWr`>(l9oHu~{}6byutH*P~2SwbsIDg<}&{ zuh%p8?(ePv_*a@be~{1TtLqz;O20qYFBS`4L}0BYfW#R6-C^gY>mIf$Yo$%KoX@Ll z6pK=q@53X($z;Mox5I;G-IJlVl*{c~YjNzu3n56i+tZs{JKF%h5s_{x?=9vgp5OlC z>%Tq9Mz)>H#o?H4M-EI$5~q`7wh=-o0$9e?SkFCxp;GG5+Dy}0<7_6P(F(@~#L;M^ z5{LDleYW=i!0$z*lgfK5A}>h(X=SzadA+tj1u)Fz;xIQIdl6)5Gjzd6HSc}xmG|~? zGY_2h-p>1wIn_f5G8&E4U@$3eZtZMh?!NB4Q+q2Se?NL$u-9%iYtz~6#C07-dhWW` ziry18a~k$lyRMycC$8&qWxKMuS@}{#{(bJa>HPMOj{NpTAII4R^V|2{zu*3~e}2nL zi;xTk{UOLJd}#rM5JV|;H7_mR807lDvAMm*x&?m={ucaoi~kM)VuheBG$;No00000 LNkvXXu0mjfQj*pd literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_check_bg_press.png b/res/screen-density-xhigh/00_check_bg_press.png new file mode 100644 index 0000000000000000000000000000000000000000..834918e50939e4bf0d22527b9d462c61dba400a1 GIT binary patch literal 4740 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_check_checking.png b/res/screen-density-xhigh/00_check_checking.png new file mode 100644 index 0000000000000000000000000000000000000000..eae81d568debc1930c42a803509f23c924c70540 GIT binary patch literal 3217 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 LNkvXXu0mjfxi7>! literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_dim_web.png b/res/screen-density-xhigh/00_icon_more_dim_web.png new file mode 100644 index 0000000000000000000000000000000000000000..9adc70b6d4ed5c28a4df1e8ba278b2efaa51cc4b GIT binary patch literal 3535 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 JPDHLkV1kELvM>Mu literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_ef.png b/res/screen-density-xhigh/00_icon_more_ef.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8323aae253b996e1907361e65c03c13027696e GIT binary patch literal 3314 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_press_web.png b/res/screen-density-xhigh/00_icon_more_press_web.png new file mode 100644 index 0000000000000000000000000000000000000000..291e1e2011f162fb098c66edc452c93788964abd GIT binary patch literal 3675 zcmV-h4y5skP)j{00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000AqNkl#e&+}&C8JsvBU}b=@CI-225;~NZ}0|h@CI-2k9;}9E?8Wu2f!Y{ z)6CKVes47!(Vz>&Fz5Mdt^N{-&xB=9AOs*ZaZ8XAnZ#>S%HyqOpR(18<$6LzU-tp2$)1{r+vEm#~kU31K-{vRhC(?N7hHB!X-S#|yNB0|?8;PNm5gckszOC*ncY4E*G4&+Q5Q@pV4` z={D=_7#*vU_c(d1%2T^@0}Z5Mrv2leZKv`LXOGy20wxao5iL2ByeUs+v|3b*9Xo6@3)$bTT1cOTHUi8 z?>pP`_uGyKx&mtXL|`n8V}WVOup z0G91CUYO#|7xzX=+kWNPGwoD9VUj_p`nRE4Tmv002ovPDHLkV1i_X1ZMyM literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_web.png b/res/screen-density-xhigh/00_icon_more_web.png new file mode 100644 index 0000000000000000000000000000000000000000..25d9f8f6ddeb6b4c58cee0f27845aca2d397140d GIT binary patch literal 3581 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 D<1@j3 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_select_all_dim_web.png b/res/screen-density-xhigh/00_icon_select_all_dim_web.png new file mode 100644 index 0000000000000000000000000000000000000000..d427c9b813964f2a1038b881e6ddefb6ca97e39a GIT binary patch literal 4336 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 AA^-pY literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/34_mostplayed.png b/res/screen-density-xhigh/34_mostplayed.png new file mode 100755 index 0000000000000000000000000000000000000000..8baf52423d172bbf1e3361a5e935f9a0558b5ce1 GIT binary patch literal 16212 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
  • Uvg7XlaOdIfTVMZ!fA~wky(xF^-FYz2(|ga} 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 Q24Eg_6`j|WO4eWg4-|$E1poj5 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/34_recentlyadded.png b/res/screen-density-xhigh/34_recentlyadded.png new file mode 100755 index 0000000000000000000000000000000000000000..341fdf3242acbe23ead6e5f570c594d3e172d4f7 GIT binary patch literal 15251 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�zu3??drE`+7$SC3TUlHBMcPI98*zA$8;r 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/34_thumb_07.png b/res/screen-density-xhigh/34_thumb_07.png new file mode 100755 index 0000000000000000000000000000000000000000..75fbaf70785815832a6abcbaa63255dcb6ac1396 GIT binary patch literal 136235 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ÐPaxE57W*z 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_next_focus.png b/res/screen-density-xhigh/T02_Play_btn_next_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..4d892ee35c42aa6ad5b423b34a8d67f81617fa2f GIT binary patch literal 4723 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_next_press.png b/res/screen-density-xhigh/T02_Play_btn_next_press.png new file mode 100755 index 0000000000000000000000000000000000000000..d12b36aeff743aa7f100b8033598a76af62bd27c GIT binary patch literal 3297 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_pause.png b/res/screen-density-xhigh/T02_Play_btn_pause.png new file mode 100755 index 0000000000000000000000000000000000000000..3091db406927efe12ac92e3d0465f558c7fca2f3 GIT binary patch literal 2943 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 SxOROBfQf;nehthy>VE*!V{M`U literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_pause_press.png b/res/screen-density-xhigh/T02_Play_btn_pause_press.png new file mode 100755 index 0000000000000000000000000000000000000000..3091db406927efe12ac92e3d0465f558c7fca2f3 GIT binary patch literal 2943 zcmZWrc{CJ!7ygMD`;s;3wbO*L%g&5_Uq&;c?1m(ivPFYz@sea6BTM$BqK2`QeK)qO zW672fzARC;&-?xLp7Z_jJkPo3Jolb^pTBOLg_%Ah-DNre0HdLSj@7wZ`~wK}IVZC2 zRGtg1uYv7D0O&9M0}7Cp%?$vZxhDc)Vd3H9@AJ^Z$Cuv_f#COj;N$Lj&kcaUX}mQC zX}!j&elWKOH;%==GWN0Jfbd(vNt$JW{KUwD*yp`R3n2wwqa+5jEuiZTfBr#QyNQ#LBCI`v&&(vpv&dy7xD}&{}S^zBghYg=f zz-lgIRjIMwr}-jVR33Nea~~bVyH_)7eFV8{)2LnFf3nfddqJFCcY&Mg`jq zor!2D`;sM_U!qP{!mezgU>yAAwGNSyGuOp=i6cslc?Iz9t_DR&vSi6^7s_A8Vk~I? z=EVa5b{c$IzKBC8u^y2Ng8^sTnkV|XA^_`d_|gx6J37Kr$le;wE(icRx#7@v+Pr%$ z+!D>yS6VL4w9p?rDn5e?x3|Js;B>CoD-Rs6RYbtWqX*vcK^ol> zGFH!#{5A%BJL(TED970A)hDZV1KEh<=tg~+SK-x`>R%W>B8VkQm!Ik7(+|1&%VZ^S z=HiAPe7LNhpqRHhRPMn%ouq;2l5YOaO(WNSPg<(84gUUy1Z|2--+RFdhVstK?`~F5 zHpK0_489MbVhh)8rd6a0fb%7H(S#6tw zEUVd)JS3|^(k*yp9>MCZWlYH>`A1pG1CgAD#)XynsiT)YxI7L#-+uS6XPr&GYL-5P z8tGfp|DOJxaxZ{^F`6T?D;6WpgX5;*#_$Aizs)cy;u($S=|V~?$!uh-W-@2`*r1^V z=o60QUbl%zIRw^?Bu6+;i(Cf5b$CwkA4)c&@TFZVCuo4yzT6>HV$8oZ#7Mza+fm-Ra#~AWAJNAZl#7 zZn~9aWlAi%R-|g8YSJ~(Kaf8#o~eLSmzj`V#jWBdaPzf}w*qfT5K0JjZidy%w~B1H z2#xonZYkRqqHS*7uFUXD5_$-wwLI@uCaK9)1aCs9 z6ULbfQ`=G1ww2P95?UYn_lY_UW6Ts&Io~b5u!kQWu&dlunad(&Z)t{h?4_;2Fz7*+ z!AZF#!lk}z?VfmR+^9Z=3qyPuxf>fFXB^Qdm98O$t@zru=Sd;#Bs_sX})9RXw$-osdh^=Fm=xsEk-?sTA<&{_&zx;9xa_luYtu zin0j%K0ZX_^vx;0EsQ}dDkcgQt(oW>i@rQ8ldcdjJcD>Ruk%MIO=k{=kug_(D`}(v z)hLs?t2V7vFJG_ODdle4KZeGm4euFWQI>*MDc-;LY5sU~H)avPNWT=ql>zI%?HiOw zYTb(}<}8(BlTb<1GKn?2@#;U?EYK3p1d*Lf0V0WXL9KkP7(v*u;&ALF!XA3nY{vj< z8vOD{a-%|!aEDx>#0v45Sm}#K6GoF+oJtO7)?jRtp zHNE5)O4-}5&ofIO%->QtJVC1$aG5_7q3U(q^?k_drp9QkC~Tm zqSC9vnnZ(5y~6Lb^hUINr109Hx1n2!3f-8Q*t~6yhS|=4bovvG=hfhddtSv(=1S*y zIw?LAxWXIb)B8Dd=GBMN@^+%@p!z?>il=A$t#yob*QYjDh}T3{_AR|DWm3H4cQG@ zRYZF);#P3e#}M~}HQpR0((GPS&`-{@@v$6b_1UJ~V4s7IgZ+8V*{}yhdr%L?J2};%$TO#>CEKz%+tHg0lB-wGx`VAQIUhE$@@vnh>J;?Nqy0b(Hl88 zG?bMWH6NU;9Ty`8T?a*TxK8s=`>MD&VPS`38xy4AjN!cWo%EE?-cJfo)|)qY-jX|8 zJFkA~36zt$vv>1ovn60AfN#5Cp4oi)3I9{^Gmqcz_pOJDk5YJ2QqHI-Gj@+%oqNj+b+nOz(?4cf7y&Db zmSsUlrAeErU8J8=)9X4x*rKqY9B%y)6`;64C5}C3cCB-!<3Hz%EMEt(w%mj5#|3qr zZ_ORE>$dR#W7bVS#P>hv|NGCoEKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0004aNklFws$fNh z51Hw1?%QNJRi`>HGrh=SnkLNroJk;{fC36=1Qbv}0gZqH3MilvP(T3%Gy)1Jpn!jp zOJFVF{49Y-;1#$M@OP8=0z3g10?yA0cmwX+bP6~#cMWna;6LuiDA$;@{TS^Yn64kA zUZm6XW8{}eihj)SlndRDncl)7`!VA(AyhwR-NuCJ$L#B@;r&=;A2_TZt1VQ!_hZG4 zbk}~YywdN|kLT3Ss(s!#fj`e4xIPtL$!@6U3;z);EeO95Rz3y*d3H|hd&x#P00000NkvXXu0mjfvVhN( literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_play_focus.png b/res/screen-density-xhigh/T02_Play_btn_play_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..01a6b6b36ecf1cf7ae7cf757f568946d7689f36c GIT binary patch literal 3771 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_press.png b/res/screen-density-xhigh/T02_Play_btn_press.png new file mode 100755 index 0000000000000000000000000000000000000000..d585d093cc94e509e193e0c6129c5d04224dbdb9 GIT binary patch literal 2914 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 M07*qoM6N<$f&s>2f&c&j literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_previous.png b/res/screen-density-xhigh/T02_Play_btn_previous.png new file mode 100755 index 0000000000000000000000000000000000000000..80f0a5342b22f5768cfc1f4af2899ce1a76bd17e GIT binary patch literal 3283 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 Dk^Kdb literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_Play_btn_previous_press.png b/res/screen-density-xhigh/T02_Play_btn_previous_press.png new file mode 100755 index 0000000000000000000000000000000000000000..80f0a5342b22f5768cfc1f4af2899ce1a76bd17e GIT binary patch literal 3283 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 AApigX literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_album_thumbnail_h_bg.PNG b/res/screen-density-xhigh/T02_album_thumbnail_h_bg.PNG new file mode 100644 index 0000000000000000000000000000000000000000..62a825aa783aae13dccc6de515fd5c505baf3838 GIT binary patch literal 5163 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�gYdVxhB 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

    EdWz?dF=_~wl(S1$by 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 RDuDi|DrqX#Jhu${{{e!hk%IsL literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_album_turn_table_h.PNG b/res/screen-density-xhigh/T02_album_turn_table_h.PNG new file mode 100644 index 0000000000000000000000000000000000000000..efdae96e67bd24cd26f46499cf091dee524433f8 GIT binary patch literal 93054 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 e&--!y{{a9skm?eKna2$P0000| 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®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 T2OLY7R~3+#R*|ZbFb?@YRc|># literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_button_02_press.png b/res/screen-density-xhigh/T02_control_circle_button_02_press.png new file mode 100644 index 0000000000000000000000000000000000000000..324d3ce25eb82640ff8deb00d74ce9982d5b289e GIT binary patch literal 14538 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 BCj9^a literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_button_03.png b/res/screen-density-xhigh/T02_control_circle_button_03.png new file mode 100644 index 0000000000000000000000000000000000000000..9b79838555adae5a576ea0e090a7e43f21c7f07f GIT binary patch literal 9785 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 OIY3TINwN}R9QZ#Cl(ftM literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_button_03_press.png b/res/screen-density-xhigh/T02_control_circle_button_03_press.png new file mode 100644 index 0000000000000000000000000000000000000000..8d34162150158886f26109f9d1265b7713735b60 GIT binary patch literal 10104 zcmWkzWmHsK6u$J(9TL*r-5nwz-QC^Yjera#NH+{fHwXyQDc#*&N+b2=t#!}c|IXRp zw|4JXRpk%pD8wiL0HA-Amr;jG{r?XL5&9SSE(r@2$gc8w9sq!f`~QIfvT}$307b=4 zT3S`r*2UAs!`8)>;-j=Qg{!-ZwVk6C0Qj!tYS?IM921D%Z`?>J#)PISx~SuWDAc9m zLh+L6m?)946k;d~m+{qluw`Z8Nrnqz;1Uu-!T4${XkSp4koG8x5+aIYzKlL?2NXLj z{JcLHe{EhAJFL3SZJb2v2BD?NbF1-&qLoX%$KHw<>L1+RW0MF&p>YMUK#i7^9xv1| zz(cTz2s2eTQWpT@JBtbex<6%ibC5>AVV+238p4D|!gPBk3n+p@@c;?`1gTO$LJlT0 zH-kCwHYI@|U>= z>yQb`RAz%n8;ziBm;s2@4M|6b?LEW9M?z*iJ~LReED5$=zsz@BVLX^y*S`UvAQ>Nu z_WH$l0;6VPf-j*3!-VzZ7vdY0x%uwv{$!=A1ORM%22a1Tus0Hi3L}O(y%y14z}p(5 z7I@vqSvO!xGy?_4D>~P%|8pZ-nAEnsyuY`%q|h&AU^c1~^lH;<(yjC2_!unme1E&u zwL=reWfb-S{$Z>4_l**Sbn+{5r1{!G;)mx})VF7{S*rez=54x6c)MyiZV573;A<`j zRjkxk#sS)yH_M$(mM1u|OBt?J(jL#_s%^4Ty?ng%rSuALTw|q zCw<;7#a})Y&;p^>AHTW*fUyh>o91Yv_z(yHWD3HV>Lf{SdWcxM5lMRx)_PE%P5C0F zX!?7lu%u8dLrL9D8LPsj7(S2JkujOF&q(%;!A?k|x&kU5;!|*c< z8D4T2glk5*5(8uYMVC4OM3@=%K-nV?j}u2jF%pBPMx~g{E6=I^MUz5Hp6p809ab>f zP_8{$co^UcfByXQ17~VjgPQ0ZTC;T9cYfkXxgyjlOHaf* zj}(R3dr5g+C0*qu`R^2@G(6ZV$o$A~k!rp4R4LyTo9NoHANz^Sxj3VBxYG`}t{bVx_t0+mc{E)|Y6`;LOO)IIB}1vy^A^$P-hijI3BXG$0A4vQRJ&NA2bA z_3d%*k?c`k8KC5vOSqLhXzVbkkJ>A|+sE4H*+;a>;F8oT&Qf3hUZ{!9o2V~UUD%>t zs}}tom&Yqha6E$Gqavib=-Vu@EurnbUG0%)JNEjw_sZ#0Ix}O(ACA(G;BI`-&_Clx z48_hsLsXlgRQhf-$f=nwXU_sG!x5>HG*p7w74~P%aP~ODzz$dRZlfYG;GR+zeiWte0R|lFA3Ir ziAB`wQ|eQZE>SC}H`)C;NP%kcuF;o;(gD5lvsV~zKVAL!a-cU;N5%_TN1SLyd7+>* zw*t3LqxyBKwK&plhTB7qr!w*(Ls|ND@Rtp|OU4~Wl2RU}Hcl%;hl;fHG~G)1O0~)l zr=5H?=ViI2ow6NzPhl96LkjeU^dD>zClGQEHI_Bj%TUS)K8Xt5*05DLKu8KZWPE-( zmtAD!bs2}|DY=ww_;nusBMoAI(R^|GS9bdWO&75djRtWQZGuQ-fY;4Mgp7S?^{<+= zQJ;h~#O#|{`gUY;+q6jWyj;8-CfIJ!aF=G+Y0zn~m=2MSl1}l{$)}4f^-pc3jHSX# z!b(HqzsHNl7czOXML8F_4zmxl7qd58P4#{CSz5lg{IL4iu%}3{X z(QEm?dGZr^k+wL*L^LMunw~ndwx#XEdZAynwzgfQdzfA*Wp|mhIaIs;MVFs{I z5B`CazY@fSR;}(Dmd_=@1#Ob}l8NEf;rl(+l(xfXN!671hZz&e6LuI;s=-GKQ%Gh9 zW^sMNX!KFhQ97T+6I^3-iKjW!d3~nWq&+re{>h}tY-HPTstDGyD)2IiRj}EMtnjz< zw2Ke2S?m3t*Ui=a=%`34$i`H|=j_Q^|?dlOYgP|k+K zB9tbf6r(JV`bQFr={o_K_6paBHUY)2m#o)@ihY`II%Y}Qkm#Gx^%3PFz*rA4arNK>C-kqN26#!AQf*LduxU|MA!^Z5Di#?jRz{+!GF zw{x6cob9hIkk5)btYo?eomKXN4I*xSt0=qp2+W_g5vxRgd}(2Fnpdej*GaDl?xgeo zEjHm9T6?k zZNan67chm=WKq};OG5|*htr^7L3-X zdFy$rr;ksK_u@6N6~_;0PfkYF%1&kPhRC~K zb1!{Z(fQD|;&TRfs9k0J_Kxq7H}Bu03$1vA1FE)>X34$DY{=N{rLwNFBnAo(( zbh&KD^4y-0eTzF3{wX|Rc=f~cs$q2>SLcULR;`eU(~0Ma$ZN{1%1}p6M^;Unp+nn+ ze`j-m_5CqP9{qg13eFJVDX*&TD^{`+@u0O@j4cclwu!v5sXQ`ittHDnCtb zB+ez5rPrh9#SLE9mM+&q?7MvmuBX>N+#^OsOui=HCSpn>BxWX#eMbL$nkOJ8D7Yi; z{&M_WCOv66NtZ|XTJ$dH9_S1Qf&zcX}W$`Aa%3dHv2*aE0WBskhRM}I?yOfkSc({z~XA5rDRcO6QVIi;n z2>|?Q0U$I203P3<@)!WTH~`?p6aa)W0D#cttI2>I0FV}cl#$f*T{+8LcGuMDI(Tzf zk)FtkqNAaqq@;|r+`FRa_+H^rwCm|<^5frJe4olx`XRD!c-I*{#l$*i5S!4BW?TE1 zw^{ZGY@{_01y5q;sM{rPURgarUZ9HwB&a!aNYftFk)I*Y%)R0N3wRP*y% zh`{sJ{ND-k(-5Xm2cx&Exy$RZVs@2jN<$=o3fQWts&R60b`}f#apmd|WMPr6R>3it zrC!82n1yAI6)H(Y=EZ=R#EFRVNIEk}!HB=0Zvo+5P?%1kUnMcf%03|>AvsN}395i8 z00EE$pI6=cQG=nGW)*&b0t2{+*pD`7^k}?4JUrB4fb^Pcat&%4eQGXEwUw$HBqE7S zLViQ|e$<97WeOxM5W@hr)rqFe@iWJry$1(_aE!FFAmPqVQTmRK_7&(OOwvbf&?lCj z6~c_$?~dt!e#{0vZeHF_9!}2sf+i+`1lEd5jTv(#4Fx<(84al>79V1Pe0?q`&ZIJR8+Q}LH4r)TSn@(PlH8=nP7`_Yg zJZ{4mBY%muxjM>+znS}{SXn6B@3Pj;>-91iKVsW|OI=?7`q=|HZ#1g z^g!oyfghUt?z}5eqNEHhqV0&Ad0O6?qQVX8T11PgXOB`LaUj~MQ0*&LiAZWrtCUo@ z^YZc@9}Kp4hRs$BVkSRg9X3~Kml;=h#XfHExX{6lrK6x_j7%7wti(yw{Ukp=Fd#Q$zxSjj`dts^70@v{2>96jbk5RgYHKQHF3On)LV{=Ct;l-v4 zp|_FYk8ws*>@OS$k(?AVz%~|Jq=Fo1)Qh{o!Z;M!-k#x&bTAYKy?~bp*H}MH4JB#V zx9Ue;EO-5)TZP5#&gx5?+p2s?P*V7;RH5bm6+%aIbMuSRW#%mXs{Z;^hk>z>ZLpsw z8E|rukjVb}Qdv8w9_!0U5a&Kr59v`l6okCJt#nS5kCZz*FAiCi&_;b%#4ZfwfQdxb zTqE?9*JEfRP`3gi|Q#rg&sA)Sfk?z zdY{iB-^ryCTa(M#{;JH0A$r}9C}f04MhYodd}`8A837;wgfD8buK7p{3mW2K&=le# zMxzUrilSEP#MHkuVm{I7FadhCn#3yMWz(WXFr+z^}N&0>2JAp zw!8qfj0NKorpKOrvR@+Y=m4*YNe7=8Cnsm7!k}Wk?(d=0kvK z)5;d48g~q);67yxaq%@9=YwHmu$bnLX%ui;!8iEgKxtIwcVh-BiH1aZ52in!3L~Pn zyFOe+h3Ae~QeSpmPyBi8=}`ujj-QUyXD3UKR7ZG2o_5CSqoSU;=e0)Ed3M|j(k9&H zUSDb#Cs=EpTAxNd&|?OODA82)MnG^|3b(IIuK5%`@I67F1PsDCh$3OkV2LeC%*nLg zD+=*zR336-DC%w*I;rI-j#19nQojNQI5)xcY zmVAv>r@`5lFzRfeFM7KpH^F3gBJh9STeh~OC9=k#u!o^Kn@Ukznto|Y$_K~_3w8%+ ze0P!IlvuleBknG=L+0Aj+V-nwbza@C4HLK(G9b9IKhmM>wRUxSJx#24paQBS3An*R zQ_ojN#K7Ff4?hQgcX#(9w09ahn+7Y@uV z<@Va28C8MJGI?(V6MC}hbHTRO=t`a;MxvByCWvV&XA07vCl}vxTy^eQh4Rgq=f1M*WG#04P?m%2>jDDd4u~3`z4%VD9i%S0Cb-Ef` zpq%g!!;!KNem&3r%U$`@t|Oa;lc68V00&-HyxAeQrj1E8GoUapv)5_yD0`hWsl~*D zr%YXDB8Yn+>gzFi{rA=dCBl{TZ=WPI`9m4HZDsHJ2}xZ_94N}sYhh6ce|u?kfMX6Y zP6xMWnc0&|A%dB!b{3~bwXcXA?coxA_*rVt^Zq6NO1uYIQZ9N~QN6z=7tz%x?Fc#) z12kWBzbJz@vvu=wb2H-xiq^cydeHkq9{q~~{DL}+`i1N{8iAAo<=0!unmsbG9H#K- zRO5@U&&%(ZsG7=FLIb>pc#BmL>_k5klc$4;(G&YLXk>VlEa+2b^Ml$V!T+Ww+RNJ@DXV(>SYr#xF?|-( zG5oxuqL@JWAO5!}{M`27>jN68q&PY19M#fm(%HYq11Tai#&NpfLe&vaimUUE4%(w| zUObEiN(Ki|#@Ap_w%Sr{J`FO_*Z1cLb}<*s2?+`Q-=OdQ4a#jVv~DWP zQP4%Wn;?LQAX>|V2?5H+wU%2BiZ3VOOj z1NsxLPj>OhvUBqEJ;}0#6KF$K8`Cu=dUvEcJhQ*{n3nW%8Gju9mP?JCN`}!}GMkgt z`D;!eFGJOuaj`k-@@aXbyxar8p zImAQMg+7h+P1K6aKc1vuD4x0c^PiDM%^LDTS<&A5j3d>wyW}q3`KzO&!(cD{Lu(%L z&Dq)+95l;W>CKp050<89(J0D>3EkYPUvpLr!h?DTIUg=5L?yJJk9 zmK{(p^tgi}k%@>KzvL-ZogbJJ*O`Ht;yBydnwwF3xb`e04JuDhh0_LTdUQQLP7U5U z#}~OF_4U^dc%xGXKUEt^QhUpf15fCY}va~8KZ59A0%uV zmjizQhH$-gUAfA(JNn-owv7!!f=lN5Tp2_hHP|4z?2Og`r9ydWB9wHS- zj(jTebt}g9kzC7xbEeVn+2$(@OK;m-r^=vgEj4TN`Fuq*i{PAz#L6AFLLG{jAl(BE z3WX|cQRFAu@90M}3vWt@<=6`uM#gdw?M%HWiB-T*gX?>UG6TC*MKE~S{AtB~DfrY$ zG?~&IBUt_o&n)v-G0Tv3PYqiy2T~TLO6~{o=jmKAKZ?QXyHaAwA%Zy(In))@y76@8 zPF?gN6%p8IL`s~5;l$mhU>I=yUy*!rBw|0~*ytIga$XQ4Cq?*%XQ&D(&HG?8RY3op z1c*`skONUNkw3;12@-Mz!bYHls-t9^E+6jt_|CrP#;)eYIPa$bOWHva;n3Al$k^H< zO*vcH7Cl^6xOp|)$i&MnscH;1ZX?lPyCV?;@ZS3s@t?b)4ckhCrU77($g&A09JwZN zkGgmb=dUk|Kg*FO*E<~r3kXlCe0G*5RibAyl8Ws{H(S7W zMw2i=((g*fi7Q${I@5%O*ozWm_lRMetWdh6fS`tE%9Hb5Wk2aE3Kl*<4m64_Y8k>Rj6-3F2h~A7m&>V>UtYn2BRFY` z&-4%7L8JaKXV~#rM*2MOQ@onK86~Z=gPl_-h4oP^9036Qf)?s|9+Ii*F*r{8#HT*7 zA`D>|8(Vyg*v8aaO?VOz}-i)VM$H&p76qq1X@`?hB z>+MlmHQ(_U_dlKOFMVG0kg>(!zoyQ-HLsUHkny5Pl!$=hVzjf6mL9)nZihf5K_dc$ z@bA#e8TRAR(G7Gm!h}nX%i9@FJI-*Ra#v+L# zlBR3&__*dm8(=hfHG9ZDd`Sy^ zevt}t8lQ-@Zw&>*ZywGa=6HE|wMZsO-E|fylAWK&6K%&FdK5+WBa_5-jGYv8aa*~>?JF=eP@wfSs5j_c*4uHFkGu&ObI4;3J8?qBgt`b~dU%xRdkUmcTjEJN{s7O0@n8UGka8Lbmt$Su2KkQab z13!upcdw&9kN@qnwrMJ`=VFyjT%p5u(_9sCu;nMlj2CwY?ZEkgJ?0M)lSQ^b=vn3l zcNvQ8B%9xR4XLdY&`!ilkjGp=odq7|#`fsf%WvUi-go#(%{M&zr%!!BWohP0%(MuM zX(9x%gB6o^_pNXeuRm;r37T$4<_9Y(@cb@weUPpmi_SgrvA6y_p^C<_qVtXouZ|Ma z!lF*^hyAXE?J%@rm=dZ(t%g^1@v3dC_G){xJbym}`%NM5+a%$6Vb8TFkR+@;zF7v< zFQWBxv_IKUH5-9wX$b{q>Ad_~Iql%$J=&yuH9Qe*g8KpVMm=)<&)Tp_t=TT})BA6C z+kaA{ejtCPh|_j)ak*c9?Mf>ve+-a}F3vuidMxB_3+!RU`$8~7dfz%D%Z5F7B8fPE#>EqESUj6}*phchG7#0lypnp(xqUAT|5tb)V=`63BFMcN8^D;j%Rd(#K3EIvvUOl|UBkIb4Do$(cBtk~?3@Ru z1p@{nLn5osD3nhUC~*eo^c4hR|IYtJ#V4KW zkPh4qdA_I)P@_x5%h|h@6;2sxmp+W1kV?{9`BUZNzp>Wwd#k&9Wb@}scHwWy1x7qn zK6!GVxsJBCtBY<;2lQOp0f-Un&jMUEstm%%0lklct#hP^{r0pHA2Ag0c*iH5oA~K2 z-;ObXMZ7VLJ|I0EiLRPvwpA-)M(a!EocTA7ys#w$+3)D zzSS6?zYh7=XAqs_(e^WC!jii9vNL4cF(d>PD9OK{n9SWHN(=08Ni;k`-V_xt1RGFuw;gc&*!|mkYU=FUS%}qo} z&>1T2MVD(;Jv1E1L7%tSt8VoN(e3?&tTTp}59HFO6%M3n6UeHZ%GYt_P<6eS>jILsn(j zKyIJw_e;yC==CADks}o)De=+R;G65tE!aFZtor1Svemg88uU6FBuBcjdiuE3-PeKo zEZ=nbvVHvh{Z&k!|MVr-MJkG&ABN~fGoHaooMfLaUaohE^5G{UN!Hh#f)p}mx+#XR zU#=!zT9zUEEsm0!%=-A;+D>S7pT?5=Lf^Nhl${p}GR-qB8o|5rhW_@TxxbdVIJB=+ z7k^a}x>wdj5C>K#HuaxowmFB>f*ayq} zfn&7^*3)lndHS@b4%MRDwkGMfA2iiNKkRJMCSHCg%-cMDyNZT5Y*akH8C%-=!^bM! z8{IC|Iu$QZ@0;7)V|zR2gedL5O1T?~qJQY%^AJP(&xL(1LvC+%?n#I4ijudwNrvhX zDEnQWO+wD~a(-|ZJ!>krY0tYDKcizY%?hxgR;ABFeN8_~8OS4R6l8V(vq;>+iQhXog)m#2e z!++29x9D&+(~-{}2!n|T+-wC=W~tG^035Iyxk?8`HM`AoI#whOI|$L?*76SF-+Bs? zQ*lr!>n}YHo^nz}CL5gS1wCH_C%4)>%6i-O*5Wkr#Yv9Z=igpB6ZM{+P53E5n{gXm z9`~>7e><*eYdyDg)9M@*^}+Uo88q-D3NeF`L=bG-?gFqR01t+-#NtYfZ@~)X1mUTo zA%bDT!JKjy<#;$!Nv>WjjDBLbf;L`Ww_ZV=Hp;o@m%{I0C-_aCAEH!>m+T(%C*l9u z2)do%8>!@{QT`9BBDM_Hyc4*Fk3n^sb%A1Ztgl9pbCOHJHI>>IK%;0pck>D>(+!gcZ?f4*$oWF;?s*wLM{7vM1ylqQd<7pBGFf(a^AXqgKLRXu> NM_FZ=8Y$E8{{Z6~E|UNN literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_next.png b/res/screen-density-xhigh/T02_control_circle_icon_next.png new file mode 100644 index 0000000000000000000000000000000000000000..0874dd126f4f7aa95b232a59573b890ec87cfdda GIT binary patch literal 3707 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 MSJOzN8shNsUw>@)4gdfE literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_next_press.png b/res/screen-density-xhigh/T02_control_circle_icon_next_press.png new file mode 100644 index 0000000000000000000000000000000000000000..31b6d658be8fbfc655476c9b8f8cfdfa70807794 GIT binary patch literal 3792 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 E1)o79K>z>% literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_pause.png b/res/screen-density-xhigh/T02_control_circle_icon_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..b39b66f2fb22d0abcf95b71a4ff45f00d6043444 GIT binary patch literal 3271 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_pause_dim.png b/res/screen-density-xhigh/T02_control_circle_icon_pause_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..5004f190ce0bb92d8df386e7544bf1196c3134f5 GIT binary patch literal 3264 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 A&;S4c literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_play_dim.png b/res/screen-density-xhigh/T02_control_circle_icon_play_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbbbc4a3f96142814351493f9fe0a2eacec6489 GIT binary patch literal 4041 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 Ycz>B`1d0kI+`I(ez<_@Y59h&qnyPO<0KTV& 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_previous_dim.png b/res/screen-density-xhigh/T02_control_circle_icon_previous_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..c1fb1a46557549870c566da53c9c3569af9c4210 GIT binary patch literal 3705 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_control_circle_icon_previous_press.png b/res/screen-density-xhigh/T02_control_circle_icon_previous_press.png new file mode 100644 index 0000000000000000000000000000000000000000..42fa95eb07c551c30f812d82423d920206237e6f GIT binary patch literal 3753 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 b9_woWL-<|3KM|eO00000NkvXXu0mjfM+CtU literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_add_to_playlist.png b/res/screen-density-xhigh/T02_controlbar_icon_add_to_playlist.png new file mode 100755 index 0000000000000000000000000000000000000000..820512166f155ba6eedcd529da20dd2fc3288208 GIT binary patch literal 3417 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_all.png b/res/screen-density-xhigh/T02_controlbar_icon_all.png new file mode 100755 index 0000000000000000000000000000000000000000..99dcd707e0213c22897faaff95adb21eea5b90ab GIT binary patch literal 3599 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 V64?N-WvT!G002ovPDHLkV1l~%uvh>9 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_all_press.png b/res/screen-density-xhigh/T02_controlbar_icon_all_press.png new file mode 100755 index 0000000000000000000000000000000000000000..f02f86346b22645073954ef59ca532977e0fe3d1 GIT binary patch literal 1728 zcmaJ?c~BE)91TGbNW)nauTAHy0Fwe5gpdOUO^Q|r8~BU~U6`Dkwm}9k0U?t4 zjE_mlB;h~+iX#Ar#bzqmTnONLvmkFa&zt7~c(Nfj2zi2RA11_xIX*BO0wx~@84Xt@ zz>y;HWGr&UXCx5>27{npuV?AKSSX$dLOdQ1WP5_1o=g(K)MaQ1xq+$GEt*mgAvz_l z#t1d41x$)^1)4_i8Dyp(OVD7`vRd6_o5+TN1~~>oEViknDWF91|4@x)8m%KDkx%*l zr?5_%fgxZdqC?YgC3$cOi%g*~H~>fF1d2;hG-axb;Ylcg>XJ|l2#DgaAYi>(t3vg< z3A{uChiG+#T&qMvM0^IRz*4JKFk9#&7K@+&9}$-WL4lCam(2|n^0=Np9Jar=zi^5x zLX~M6L`zI@RiC(`8M!7aXfQIe2*K6qh)Rs38epPiSUqzt{xj-La#b_uBAk&6lF5Lk zgZLzF-@m!OD?93k7!A^`=p>Z^{&7^3wm%rT55kR zTVUbu46I;F<4;hc%u1+#*qoLEHPn4JLinZ^s6s2+Vp->FH@>I8>bdbGezj2FKiof@ zs;`fmy)b(Fw|1-rH_bBzb`QE|apJEpT?p!1=OXL8cgx25 z+>=5tJXq+OCq6Jba!6a{5H8tl3!BpgbBk*%-&xf*ZgPxh=ojqkGc#KwNvFRpjuuM3 zqB8Bpz5P}9)NOm+HMeRlX89uJ_4gIa!;T7k{00&a)#tPeXZug_mV}ptu8r(MT zt!$V|?Qu}H5=AF1N81DNG1?>Q7u=kAvYrY%`5unyN||-Fh&IOR#RdBdjgP-9-9;@7 zU5p-Vb^m!w^KYexx}Hm$9XABl3Wn;UunwIQO`E$d%8(juyCAt_3~JWqZ1_-Q)#qG2 zr>Z?WslKRDW5kyc{d}F!`uLk{2W3ISQDtmOxrMUL#>RGht9?V63pRd$n&8)o-{Ph6 zZ>M`XZHozgpu4;|J#H>0jvYTz;~13Q_>$9keG#-y+x?RRi}`qI1MGBdXdN@_I$zSd zdj!0tIQe&vm$L9|zD4&b^>>3CofPdcSL)H)`^F|UU~DYYzo=&IQM4pPfrS8_)lh8Vk#ErDdV zVE!{H)9Lf~p6NyO+cxYYjaS?*WM?eS%lDuR4 zXIt-<$5ia$G;WHp$lX@oaoRPh;GAGJp1-t&jxF}9Jb9_hvZeHLQIv81@%N4u9yfNl z?Fe35YSsZi?e9FZI&;sc^@|_AUmLKyqbA;G-+=9sR1X5pYX5+VWsf~tn}0O#t9{-7 kaKgkN9sPRi;CYHUr90ZLd~kq~Yx<{z1cr%z5yof#1DKGR_W%F@ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_artist.png b/res/screen-density-xhigh/T02_controlbar_icon_artist.png new file mode 100755 index 0000000000000000000000000000000000000000..a6d353a5d7f19327f056a7ccc896562c415cdcdf GIT binary patch literal 3412 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_artist_press.png b/res/screen-density-xhigh/T02_controlbar_icon_artist_press.png new file mode 100755 index 0000000000000000000000000000000000000000..d1cc16794d1878c835b93e77353ccebf746b3eac GIT binary patch literal 1549 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0zld+?Vv!knv zsf)R#nW;HUuSMv>2~2MaLa!lCy`ZF!TL84#CABECEH%ZgC_h&L>}9J=oNh63 z#c3W?ZwgMgn7HB8s}FRHJ}6?5A{r(HOg$hbJlO&{@Pwb52Tbinz+~<2ykY_a15=}? zi(^Q|tv9nS<{mN-XyaW~agO68i?4ddjE0gXHQ_CD7Z^D1VtmOmg>!-M6h8+m#=2*! zTbFikSi>Uoe2&DE$$nF3JvniF?%V(CWT&Qj=G{E@34)O~65%K!d3nNsxa*NWAXRxH{>a0D(9aTL-uu2t zgPZ;R3uS=|zS91RcdlQPYiF5bZ12!{jN#^zh*d#$3SPE{1O zR;FhCV*2sUdUd57t3bBRi-YGP9TuN{J9o~%Fh}VxuSMpqUG+kEt9**;F7=AZ>tzy@ zillx%KU6r8BYSN_w%i@*L(>H|lyxRCCH)URD`I5P&J$+9?fJAK;LxLwUyh_(tl(YG z=)kpCxz*DlY;i@$mX!eww`XNkY# z0cGyk$Es0WdR#yEmiSf*B?u=-=f3_PwrKkbS75RzY2dp6N+T7j-}DbKNShv*{Pz5| QK2QPe>FVdQ&MBb@0HMP|MF0Q* literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_cancel.png b/res/screen-density-xhigh/T02_controlbar_icon_cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..6c3eac6820ce9f0b05fc1f514db02b1233e63428 GIT binary patch literal 3314 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_composer.png b/res/screen-density-xhigh/T02_controlbar_icon_composer.png new file mode 100755 index 0000000000000000000000000000000000000000..4ca67b4e435b532178d2ea07c69b4aa4ad6a81cb GIT binary patch literal 3550 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 Y0I*=!&MWcQlmGw#07*qoM6N<$g5VsAT>t<8 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_composer_press.png b/res/screen-density-xhigh/T02_controlbar_icon_composer_press.png new file mode 100755 index 0000000000000000000000000000000000000000..f5f815d2fb2e8b80a46ca0d5736aa5f4bbac3114 GIT binary patch literal 1670 zcmaJ?Yfuws6kQa=Vx*$-P(asJ!HP+C6Od#j#XtzA5JZR-f!c&*0~yHfk}M{IR6t=A z6tzAWL8LNvOljpYWz;Gn_(Ce$R_UNfAqW;l2M`=ZaB4RQ*dNlJ+5H}K&bjB_?|!p; z!oz}R+by&M0ARLcohX7Hd6swP4Ek%zS+j^97EnP^R3xFM3<@0v2vtNJ21>Mwcq{@_ zsJ10HVtxQH9n#36s3>VDswA{5g$2VhYDt<60Dk^PQlU)5C@>C-*Wd!E|Keo`)Tji| zCLbv*B?GYp&AL<_7MU6*Q>G>=`6|f&bI{L-(gIqHQh-Kn60S#$0%%MZrRSDyHUy4A zs6+wu-c*z{91J9M80f=-nM!yy0J_Go4*R=zzEDnIBeLLiNL6jFA5{z_yf_= zbSgC(Arg&OHRt-`tdT+1!Ef(BpYGDmXs!dQtAIgwc1Ivo{GRe z`2DD`Ubc)??cYk=&ZYnAJkX5clMkc zt@cVbpv74+XGhI9wDi?=1MGp~R?{<}p{uG-ck1otH}e}>?H(T+l)dR^b@(sZpIFh6 zQf&Jhz&KKIn7xp3(5vLLf|hBO*00NBtKE7Vb8hzo#!BEc6Tj8HJfjU7x@#4ysc3_) z-Znc2ROboSX4ELjUxD)KlG-~vul$^R-zp4u2Me-mr@fUg^c-@O_dVb}2VR?yi_yJa zb#vQXr>CWr1gW(#-iK0~pM6ugHvT|N)~)TfrmL&)7nRvs&lkl*^31})A3RjEGIC?G z^1_?fr#*d=n3R7ZqB-=*CmZf~Jc52t%rOd`-!%mJ^MZXBZ!Q}cX`<$pww&s^QC4&y zJ=@gR?dxQI!fD8a6Kl`UG`B2^O=}cx7?Nw5SMmy7drBlYdx^UA(~OZ!=x?_ZE*%cS zy{ds7N5W7W(_jVTM|XoQF#1!%$+Nt6Gx4;r-qG+*jOM0Gt9PC6i4!8dbz6=Rvuw>r zMWWD$3tsb!Z8zoTPUk+~0>bLep2b$yX?v8UgUdWe?5nQ)t4HgD)vrRu3D*Odc+Aa* zxlM;1+S=vUtP2huPx|ZowwN5xp6bdorkt0<7hKjCeaUiTcrmNcLxyurJ&T8% zG5deW`=8J>NCD~t-=`~4* z_Ad?DFf6xTmv;Fu?CBMC@5()6(d|E-wicWi1W0bFiC9s&nCw{7w`a5+cr4e?a5Btn zU@9WbHRTEA`NEZcu5-(58XFmP?=owznO6+lTjpVm9`eY%K3H18@US*Hos0~xx|F_; zf!|EstG?U1ecrKaQAu-o&h2(}D>oiF^(yI-phs!nJHicqT-p-C4P7EEa(n6U-3*ae o;rtM1VLy<5uG6-v1>a%g0+e9`9Dmifu9iQ8Bq&T&9w5*97sAkoHvj+t literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_delete.png b/res/screen-density-xhigh/T02_controlbar_icon_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..ee52ace7a35729f6f7e003ebda312d7692f04465 GIT binary patch literal 3250 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 FV1f;!i}(Nl literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_folders.png b/res/screen-density-xhigh/T02_controlbar_icon_folders.png new file mode 100755 index 0000000000000000000000000000000000000000..4ee62ce6368cc601a663f4de0f125bae9c1c4052 GIT binary patch literal 3112 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_genres.png b/res/screen-density-xhigh/T02_controlbar_icon_genres.png new file mode 100755 index 0000000000000000000000000000000000000000..cbb051c285ffde0b24d1717bc277c96d1989044a GIT binary patch literal 3344 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 IM6N<$g1fcX{Qv*} literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_more_press.png b/res/screen-density-xhigh/T02_controlbar_icon_more_press.png new file mode 100755 index 0000000000000000000000000000000000000000..04991f16425d2fca7d6aeb82581f01dbdf8fddde GIT binary patch literal 3182 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 Q{pX;-NY7li8sZfBUwk>=MgRZ+ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_music_albums.png b/res/screen-density-xhigh/T02_controlbar_icon_music_albums.png new file mode 100755 index 0000000000000000000000000000000000000000..19c5bd0117d648d35124dc9384af36012a8b4529 GIT binary patch literal 3225 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 LNkvXXu0mjfH6!;< literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_music_albums_press.png b/res/screen-density-xhigh/T02_controlbar_icon_music_albums_press.png new file mode 100755 index 0000000000000000000000000000000000000000..6cf8d881e06f13bc5963796e9bf45ea502b0d83b GIT binary patch literal 1368 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0jxg$`((9+b& z$iUIk#T2I3B|o_|H#M&WrZ)wl*9@m#P*TV(0NU)5T9jFqn&MWJpQ`}&vQ;K-w;1Cz z52`l>w_8kb>eUB2MjsThND&Pa0;V1i6P|2=9C*S{%>$*>z94LJc;jEPN`IJtzk_%KL|sAX6=N-Ew}n7cqyvG%NYmAa&6 zmsC>n@fjcHml!$m{dipSe7CVVL&YU9J=h7#rTYV0?ue(D%*7TGA)Xh0+tNGS%&v4q6 zv(fK*@yzbO`9dj0x8l5;qt5@<*!A90w)-6KkJSdx_dWfa>3+!eJ7d9`gr(a$q`If+ zS%wRn?74kw(X!aB?aBuq1($pexfE61TtC76QtPRzklk6!8d`0XCbgAblY0Kp^AXnu zzFAkJ1ow7lJ3MbXJzbb#yWHC7O5MhD^;e&$zHs_-;qN7n3&K}V`{z1{?16mdKI;Vst04L4oqyPW_ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_playlists.png b/res/screen-density-xhigh/T02_controlbar_icon_playlists.png new file mode 100755 index 0000000000000000000000000000000000000000..51e12e06ecfabfd63c27feb0443260f692800d88 GIT binary patch literal 3528 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_share.png b/res/screen-density-xhigh/T02_controlbar_icon_share.png new file mode 100755 index 0000000000000000000000000000000000000000..a8e46110e15a3dbae171caec230959cc922d5679 GIT binary patch literal 1486 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0VrKO9btBaAT zg}JG#iJ>!0uSMv>2~2MaLa!rEy`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<) zX&zK>3U0Sp;MA)Rbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3z5mC>D+~-wPM$7~ zAr-gY%<9fg{#%i#3uAEjbc7WrSWX7kXCq z%3^)_1mjeOY0Y7aqPdvfr~XKP$infx&+&UwL{Owp>4`2R*nGXZ@JDcxXH951)=f=cYNzcE; zl_*$WoLckA;2{T3s%fN}bJ}9&Hnr_aYxP;ntLml}U0lJvBGxyc=(pEKt;u_?o4;T? zXK$8J5OHbe#}3njugw?SUKX`rdu7%At+&62=id!px#TjNj)>O3sCBIB zx)r+H)z67F`@X)X_@XN`eYS(WuCv;ksP874(TW)-*Om6)6Z*nxcW*Mg=|uLh+KcmK zO*Kze?5~;lcz)ZTAD=#@K7VwVW%>8!nQfJF5v`o8C%&GDG5g9@z>;$HKqb4z%*?y}vd$@?2>>b< BB%uHR literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controlbar_icon_years.png b/res/screen-density-xhigh/T02_controlbar_icon_years.png new file mode 100755 index 0000000000000000000000000000000000000000..76273774dac46c643b5f0331e2e3dea9b7d3dbb1 GIT binary patch literal 3647 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 KMNUMnLSTaUjbv^B literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controller_icon_back.png b/res/screen-density-xhigh/T02_controller_icon_back.png new file mode 100755 index 0000000000000000000000000000000000000000..bb420e6a89ba31d140286e8c88c8bd6dba040d67 GIT binary patch literal 1367 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0#fu*^lg^9DN ziMv>2~2MaLa!@My`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-`Bg zX&zK>3U0SJP~`ag++&NcuK6WU+v74(F7t$d^Oh`8!OxsZN{d3bbh&g2IlFXah%OD? z;^o347`XobMafC`_HMs-r8<4i;ry>@hW6k06~Fs?{)URDk9m0i%TGa$q9Jf}ug6 zPkrW!&tO+cH<~VEZex`vv3uUR=pTo_vF0D0<~%9w`HGN(-#%)TrDzMzH#oMGODa!o zqjGZR53~5mS{|jZChB~2+@Tjbq08ycD)&i?x-(ZcwLO2_QpoPT(^X0)Qy6?B3E-URxxh6bRZ`hfRLJPb1%vOSl1Ci8%b NI!{+Wmvv4FO#lyO>4^XU literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controller_icon_back_focus.png b/res/screen-density-xhigh/T02_controller_icon_back_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..7881f360e334ce4c4f23370b6befff9c3e9c539f GIT binary patch literal 4412 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 NI!{+Wmvv4FO#lyO>4^XU literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controller_icon_volume.png b/res/screen-density-xhigh/T02_controller_icon_volume.png new file mode 100755 index 0000000000000000000000000000000000000000..851b4bc7e568733a0689be4daeafdad5f8bd3479 GIT binary patch literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0Vp{a|riHV7e zo13Mxo0}0#uSMv>2~2MaLa!@My`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-`Bg zX&zK>3U0SJvYos!&nI~&|et*O)N%Vl}EuokxbAuOkY+onuqaAT-=fkZG3vPd! zCCU)1RG6bZ$tz9zzydY7zq4L9v;PP=C>NUeHit<T{a~(XAp;wlMT)ph+{{GOZwpni{@xPsL$MS@`@O+Pbti{*WtbWOa{o0o~ z)lp@#;{=aQ8^e8C>?Ri!JhPqzA#Zi5`p2NvGi&cMuI#j%{VSualqRM>jD`njxgN@xNA D&)XdI literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controller_icon_volume_focus.png b/res/screen-density-xhigh/T02_controller_icon_volume_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..841109b29dc376d4bb15c8f5332d646813d4ca12 GIT binary patch literal 5044 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_controller_icon_volume_press.png b/res/screen-density-xhigh/T02_controller_icon_volume_press.png new file mode 100755 index 0000000000000000000000000000000000000000..851b4bc7e568733a0689be4daeafdad5f8bd3479 GIT binary patch literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0Vp{a|riHV7e zo13Mxo0}0#uSMv>2~2MaLa!@My`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-`Bg zX&zK>3U0SJvYos!&nI~&|et*O)N%Vl}EuokxbAuOkY+onuqaAT-=fkZG3vPd! zCCU)1RG6bZ$tz9zzydY7zq4L9v;PP=C>NUeHit<T{a~(XAp;wlMT)ph+{{GOZwpni{@xPsL$MS@`@O+Pbti{*WtbWOa{o0o~ z)lp@#;{=aQ8^e8C>?Ri!JhPqzA#Zi5`p2NvGi&cMuI#j%{VSualqRM>jD`njxgN@xNA D&)XdI literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_external_storage_01.png b/res/screen-density-xhigh/T02_external_storage_01.png new file mode 100755 index 0000000000000000000000000000000000000000..f2e2c915b0a3047a14783e4e5ec8c74fc64745e0 GIT binary patch literal 3625 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_external_storage_02.png b/res/screen-density-xhigh/T02_external_storage_02.png new file mode 100755 index 0000000000000000000000000000000000000000..383df95aaaf512839e3ec44e68ff097db419a74b GIT binary patch literal 3435 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 N002ovPDHLkV1iv|Y-#`i literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_folder_storage_icon_inner_memory.png b/res/screen-density-xhigh/T02_folder_storage_icon_inner_memory.png new file mode 100644 index 0000000000000000000000000000000000000000..af3ad24d6fd1ba16ce778c59d4b9f6906a99b47a GIT binary patch literal 1494 zcmbVMeM}o=7{87%nmYD{0~utVor}!T-bY(XPwM)~$6Q%$i=c+c_4-1O(z|kZtc45* zn`|0U6F(MFr;XEuk4dJJIk)LHH6xO_4Q0cb;f%1E83-eW;ABqU0>%A7_`^%?-mmBP z{GQ+QJny~WEG|e^tW_Wgl3Y}1bHQ;-?3FKt-^>eN)xsfNvX@D2zETR)0zk|@-V4y8 zAYBDqfcDkbehcytB%z1(lu2cdtrWut)pX289SMdY8bR_lM?y3c021m2RV-&zjvqg% zL|LCvS*mm3j*u1j*}?_^xEqQ+OhbS%_>`L;Me`yQbPxm*jYfhsoJd8C${D{DoX55? zB|2jw1&qqspvoLh)XED0)v0k6gXa)vj#f=*af8;7jgmNlV+4uedKH0FIz5FG=-i`( zY=W{^NsJ^_&_X5Fa}pg zfelG4&!I7ow3n}wj7k{ktb}05#a8(xao#y6&Ls<`4U5nrj8Nm4Fk=(b7e_f9iz9-; zd23N}f&YSE(7))Z4*|>tM7~a7U==IZ-$k`JQOs~o1LdHF0Dx7@r)xwobKr1L+hFi4 zN7vYRrY;CLsmNwjLWtVO`Y3y@S!>al?RFg3+ev~jb>|DZ0Oi@{wBf2{9ObbES&&v+BEa9 z5kX|171_+5$WNnJ{&ws(WuBP`3?r@43@PD;oI^8yl&N(za=iIybH*?7mru!ukez9M zS6B0J-_y4m-y6B(f9=bWl-zaE!ICHU?fJASS>`m!67O|Z3*oVh57@PTeP5dX3aLnc zB)xYda|QHhfpxqE9;{&pJ8uPkQ?y_oirjlBxf|Irjk5O06Cu2ljS! z?^wS7MBp?SOsM|Gu;s1JO%>Be8qTMdluWz7xQbjGEGuE^+75V_y8UM_dRsClJ>Hf} zyHlQ6_WDEn*rR(A2F6bWPW|51hOO&5?|xGsz5QEuG*3V}jcpyz>XJP7xV)+F>I%QM zf=f@WDI7G7X&-2@Y}ln8Saq)4p(?m<;(~MeMvda|(vD}cE*7eTdee%@{*Um!ALJWM zTw`DVO0H=MOiV00GDQ|ttZ4t4984MWa?Z=kKE5(_>z(1$9^LRk*Uh0Nt*uEm;d-P`;GF6`@@-&5SJAl7%6CyAwADW)Fp3!(ir>G7TJq!-Ij`7{{qAB B6LJ6m literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_folder_storage_icon_inner_memory_press.png b/res/screen-density-xhigh/T02_folder_storage_icon_inner_memory_press.png new file mode 100644 index 0000000000000000000000000000000000000000..01e2bdca5e4457d0ef991beb48666ca42e6056cb GIT binary patch literal 3168 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_folder_storage_icon_memory_press.png b/res/screen-density-xhigh/T02_folder_storage_icon_memory_press.png new file mode 100644 index 0000000000000000000000000000000000000000..1b773e16de7605bd243d2f3d88e6d80825aba08e GIT binary patch literal 3283 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 RGL8TM002ovPDHLkV1h%k3yS~% literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_function_icon_details.png b/res/screen-density-xhigh/T02_function_icon_details.png new file mode 100755 index 0000000000000000000000000000000000000000..6d3e65ef01e577933bc3b0fb824f4c5bf6740b49 GIT binary patch literal 2140 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 X@>nmon$@1#c%eEI-0|i10g3+s+wsBw literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_function_icon_share.png b/res/screen-density-xhigh/T02_function_icon_share.png new file mode 100755 index 0000000000000000000000000000000000000000..e4ee55991dc2bc413d57e73758d4ac2e7550c1bb GIT binary patch literal 2321 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_play_list.png b/res/screen-density-xhigh/T02_icon_play_list.png new file mode 100644 index 0000000000000000000000000000000000000000..9408f0213f990a7db354a73e1f228f42e8629054 GIT binary patch literal 6481 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_play_list_web.png b/res/screen-density-xhigh/T02_icon_play_list_web.png new file mode 100644 index 0000000000000000000000000000000000000000..0982581ee86fdcb7e279673cab9d23673b0fb979 GIT binary patch literal 6035 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 z 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 bzWw(AmYfb%zK`8&00000NkvXXu0mjf$5Q`N literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_search.png b/res/screen-density-xhigh/T02_icon_search.png new file mode 100644 index 0000000000000000000000000000000000000000..6bebef38502b809df2fbe2594206b74cbde4d829 GIT binary patch literal 5674 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 C54+|7 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_search_press.png b/res/screen-density-xhigh/T02_icon_search_press.png new file mode 100644 index 0000000000000000000000000000000000000000..50d1da0a6ba5a89a1f1d722f611c8effd22d33a0 GIT binary patch literal 5453 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_search_web.png b/res/screen-density-xhigh/T02_icon_search_web.png new file mode 100644 index 0000000000000000000000000000000000000000..e926fc4a8ee8938fd25dcdfe5d4c0b0f297d0eae GIT binary patch literal 5171 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 CTcSk( literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_icon_search_web_press.png b/res/screen-density-xhigh/T02_icon_search_web_press.png new file mode 100644 index 0000000000000000000000000000000000000000..8a70cf84d5e85fea313e28ae65a98980ca53127b GIT binary patch literal 5438 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_memory_card_01.png b/res/screen-density-xhigh/T02_memory_card_01.png new file mode 100755 index 0000000000000000000000000000000000000000..6ef563809f5b4d0f846cc7262fa809b98cf23fde GIT binary patch literal 3323 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 FV1msC9S#5h literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_memory_card_02.png b/res/screen-density-xhigh/T02_memory_card_02.png new file mode 100755 index 0000000000000000000000000000000000000000..64306274700fa0d9eb6f8f5e4fed34dbab1d959e GIT binary patch literal 3156 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 YBw^Uv!Mh53y)pq5WK^W9B|nAy4_VZtSpWb4 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_button_02.png b/res/screen-density-xhigh/T02_mini_control_circle_button_02.png new file mode 100644 index 0000000000000000000000000000000000000000..b446d34ab751fd4fac93e4493cd994c3b935b287 GIT binary patch literal 11474 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 eD;bCQ*eFT6uzK4$?LfS04BkIHv*9P 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_icon_next.png b/res/screen-density-xhigh/T02_mini_control_circle_icon_next.png new file mode 100644 index 0000000000000000000000000000000000000000..5c35cfe8776614cd1e796de21884048bfaca7adf GIT binary patch literal 3441 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 BV%h)z literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_icon_next_press.png b/res/screen-density-xhigh/T02_mini_control_circle_icon_next_press.png new file mode 100644 index 0000000000000000000000000000000000000000..11a4113756d58f13dee3f07e00b97fbd2c961909 GIT binary patch literal 3461 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 a5*OUjOO5@OKg#mA=Ri|UPqhYW`|6)0yk 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_icon_pause_press.png b/res/screen-density-xhigh/T02_mini_control_circle_icon_pause_press.png new file mode 100644 index 0000000000000000000000000000000000000000..47d2c93ab87d9758485c09ff7fcb5d0639ec43ba GIT binary patch literal 3146 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 TpA=A6#{_gV4ArY(_7VR9s!o#o literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_icon_play_press.png b/res/screen-density-xhigh/T02_mini_control_circle_icon_play_press.png new file mode 100644 index 0000000000000000000000000000000000000000..598b6ee405d52070567015c706471d9ae017dd09 GIT binary patch literal 3651 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 Jy%uH{{U2<+Jh1=( literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_control_circle_icon_previous_dim.png b/res/screen-density-xhigh/T02_mini_control_circle_icon_previous_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c072b5fe2cf03e4170b97da22d884f1c653483 GIT binary patch literal 3369 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 uyypH1z2bxB%ckjWb6h&DYpf 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 A#sB~S literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_eq_ani_03.png b/res/screen-density-xhigh/T02_mini_eq_ani_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8668fae6b126a6b134c6671752ac4da755033ce9 GIT binary patch literal 2932 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_eq_ani_05.png b/res/screen-density-xhigh/T02_mini_eq_ani_05.png new file mode 100644 index 0000000000000000000000000000000000000000..b0360b7a2e581acfefc888f01318478be0cbdc66 GIT binary patch literal 2936 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 IM6N<$g7i&#b^rhX literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_eq_ani_08.png b/res/screen-density-xhigh/T02_mini_eq_ani_08.png new file mode 100644 index 0000000000000000000000000000000000000000..a998f4475783fcba8e6ed3c851c26527f8ea4b9b GIT binary patch literal 2962 zcmV;D3vKj?P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002JNklss&vWumo^r7zyVkdCC6?2`8FzfynEAi1@j`jguUh^uSM` zjcxpS8}X<3Z5)9TnDsC>KpU<0E;$4ue&Jt3O9Fw_wE(XH0EZ@KEZt{(8~^|S07*qo IM6N<$g0b>^F#rGn literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_mini_icon_now_playing.png b/res/screen-density-xhigh/T02_mini_icon_now_playing.png new file mode 100644 index 0000000000000000000000000000000000000000..041e6ab78ae867e60dba24077228af58f9116cf6 GIT binary patch literal 3166 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 LNkvXXu0mjfKQLnC literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_music_line.png b/res/screen-density-xhigh/T02_music_line.png new file mode 100644 index 0000000000000000000000000000000000000000..92295f470109b305ea7519b3adca905a5ee00c04 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^!a$tQ!3HGxHvBFFQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0WWfx5Vb85w5HkpK#^mw5WRvfpK9Wj8a~|2F0uSjaV^#Idv_ zBfp4Y<+?K-Kp~zIppZ*yadJ^+K}lwQ9)mEaqB2mN3ncEGUrQ|C?XKlsV_;=BDPAFnl{RZ9hOhfrPZ!6K4Cl8O7m79*2(TV(QOlTbRM_Cb{JG`%fw?3>`1hk65)78&qol`;+03-gEQ~&?~ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_music_player_image_shadow.png b/res/screen-density-xhigh/T02_music_player_image_shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..bd87b52d9f0673dd2d0ba667f8ddad146b308ac0 GIT binary patch literal 14792 zcmZvDc|6qH|NooBU}Ef3)JosS`ipcwie7m|Gmk01iO51N_n+2a=&9C*wxFi2s$nVCY+ z(LkSr0p17_+MT=C*KY4eNu%k$Nz%@Q=<_=Rf0Mu{{6A6GPut06c|eW+S4t-O}V#rQl2sOy!Vcf5WlpQkW3QOBqxZiWd)XsG{r{IQn(+KjlI*|EN6|*ARk2=s1vNT3qu*zGD zMEh(%cLYHWm@8}8Jt-%)U=YMSFGj7*RCsS5ijm5Sn;|f*c|?75NEw(~Zqqv>Jx- ze4CmBv@{+zk^axSGKb<7)rsFdJN^ve5sk5E;NQ#>LQ8kZ zg<`tLv$wWUCAaUqR>H`5vBpozZ~9>AaPWPR-VC{27oRykfBMmC_~P)2$q?+ScnNAt zg0Jf896TT1cXbH9G}Gq#>KDnYTkN#9Xn)Qe$`Z~Bw0BagR123#dm@mrBSR%aT20gL z#?9+D`)&%_f3tsTN564kZ^SK2`%QZXZ}7joP-K5IchBd&(tCYx7#5zs>020RNBkqw zc_ES4xyhz!x7i=$yg%IrYaS{Hdaf=HRVVnbDvCcIqt~qRXIoeJ3AO6X1=;FkqnkIb zZZ+GqW0Pa~Z{N=Q5cvi(kIY;O-o-zpT5$1OWKy5_*!p+trLXJS+|%~n=YR9U#S2bF z)-+u3M-FdXK z=Jz<4t|OSkTbAUOtbJ8oQe7ZYaBo-ouA7um>TcaDl1I2iP0w_h41Mm(6j@KMv( zsRP&XX47D$*wgjR2Xpu4ys+|>^1XMA`Yj?s}HJbG~S^xG?~x>wd;cHVUCS<@pkHu(dKD0n49%fG)ka<|#;7~hH^ zB~4GwG{=(HWp}TI+?=M2Nf}QWAH6bYJh*L3pH82%TkDpFyN~WZ-Q5&;*)6W$EJ|s~ zYw6Sy3n_?R%jLTwF~&5;m3waHR5+nNm1xl8J$1Y5i)l*UJyQu&dTdGT2WAPu@6pKF z62kOQW_w!uL7})kk;AW^@lpPwBsWE3*TtQVbBrgZ1|>MHVQF8~3t_!AJJxSLYktAJ zFUMDV_tw&lJM`3yZ)zOc*1hGv?tS7z4Ik&$PN!U_?EyPwwrZ%|+WdP!UH|--Z>Qho zz7re_lgiY5v_I(N)%M28xB|%=8lvh37ffstcIlrVH^r$HN~Wy+Di*RfRp4Z!Y@@HD zCTlY*;f>ioHMw11t<`K#of}E3(L1U9VAD1A5BF&6Zk(;LS!L6kV{lnA`-H+_9V3HU zZR)wSvqwlb3AX8#zMp*m@;ULe*gNj_;)CCl?`q0r@ICe~KU=)gd80rj>H4spi|T7N zzT3Xujz0BmiBGm(D7w6%?MrLRW4ltj@GAp?JKMUFme29zq{Py*i z{kxqso%<^&v+=po#uAB1x5Rs-E=okbQGFZwLHcyyllrW;=kMGoYQE>y;q%<*<6nIn zFS`m|xOwrfi$cGz>gv9;s^8(xm+w;+J(?HWRC}tam1g(y>$g?aco#fwZ!;v?{b4t0 zH*2?f^m%Uu<@L<(tWoK(nkn6p&K}pA=>_A*bv^c6_O_iqo!)cX=gOyvw-RrDoVhS} zcz?;R!$-cfta!d+flo=O^7Xx!owCo3?0%!a+VI&*s71bRF?TFvH{8xg7T2ft z!y3c(eP64BzuxZoAm&)*m|be%cKB29r)`VrFLt+7U#iZ&b#I^lz0p&(6=6QpAEhsE zY44q^Jvkw{^s4jnR-@k9Z>IvMA54Gmm+Xx^x^AKUX?0h~y3vxF-8F8LCSOdu%z96E z5?vSHz8QNPb*LdE?;Go_)iiG$wPP{uJ6+gpB|VG&G=5e5=ga!WTerR=9$ol2UtreZ z)uD1(YLT({^p=#QX5>ug=hyA5OxD$lUoWQD9}d5^@TuYR>e8NvjSuDO9*1tyJ}~Jp z_k|hqHbizTzh8Lw`*4LQ)g`|le}3QltY9vEb$a>|&x*`%^PZbF_JH41@U;HT7C}y} zMUZGJg8W#5KR+VKaV-S-?-p_FUD| zQPnH#zR(YQ&@QdNw#&3Oe()e*M z?rSX0U6aQ`5g8Ax-o0q^bq`*E6n%1JzYxz=KOQ7CzHhXC?5njn`c2FMNjI@rq#-13 zz$l?EZ0@*0XsC-ShD%#tn7Q+-9tDGhhhS1gLgg3r247be#Kq!p)GJX&@$8v23x+BW zQfI(B_PEsdYLx|!yLH9*^TjCN&uX{_3dp!0&SxS-FtYcY>RSPGQ_Q8Uh_80&7h?^k zo3E)VFITh@8UKJ?G8g_ivR9Jqqymr3Jk4%t**jkG zEgpn{$ka>9iY;K6(@~3;CJcT|htJ;|e6}+`7N_sZ<3kQz6+3>dVv4w5ybepwwB>i~ zmqPR%XWABzFAQpr^|rhq5<*um8r_XroImmz{@cAc|L1&%A||Fho)Xo3Op?0v!h%BF zIG@nC*h!w?Lq;C5^;gT#6Q>9>eSgt=w(1CIB{p23v1bxm@w6pr^MTL+-E3Tv8RA|M zsFlo|7_%zPy=&#M2gmK3+BEFV8dBz6x*Ks>yghag4>wYzKO#@Nw@&-b>38b9^5|1} z*fU#C+4yYJ$+qR6^UPO)2~k7xOTX_Nn(GvG#zsE9vVn&X^iV%V?%c^Wq@WtJH&Ml@ zDFUX5f*^C)o<%3_4i7&(zv@kndzxK6YCS^;9+D0wx)PE#1U*l~C2 z$7S|4{P~SDH4=$1S9|e3!cWXKQ|ho>Z=%BIKQqeb0ohI~2dw66m%de~^Ngj_k52NF z*sUUX3yQbM!qfNpQE4x!I!MDVY~Rw4O-(He4X&cG3$jfUN`e5Pv$TO0;qK2kYB`_x zL+g>Hez777S%!CAS-LSJr`tkU@51m^VSdb3bf>`KD; z-6gG5xpU4B*xzu}-DX(J*qVzmHQ7S#Dzpf3%Me~o z517t`3oWG{<9dmW0pHCh7hrL^F_+>fl?ldz%&uH!=k!XXT{eacKhBr`n5`~QA7G%0 ziK*X;rN^_?csE|{<&AhZ`BV)oUluPMpGyGiQ7C&-;?9w{6?G{zoTbQd&+ zWhA_v#b1I=I!7&U@nT?BB89v70+Vs!pBE$V&=wavmzXfyTbla;;QNDzGKZ_e%Jg2C zBJM=d4KJ9lr~305Mfle1v{+nTo1?9rB#XF8+s^=l*fnYMX1vq$E*k)hNEb!-S{ z{9$&y3jEB?&FoP!OO@A_4;T9JX&IgXpS6awjXmWo4zt;yD$p{>=$d%uEZ#@$|K8_)+uu7iK&TG{wfcxyd$3m14Blc;ZvOcL&pzFpwH(S2^Flvz!%I3%C z&xmA}WIOfB>jL`fbVSQli<{j~L}>|+#~P%g%G&73KK?4R)o~dsCqe%FOwYGnrxpz|#+X)j!p7;! zn3#Tv=pqG~by3wV7AqByAZ1ZU&E&dWjaoTE208*~X`myK$L(|tbk^ANSr8ChoSS$| z`D+W`X+B^2K8%fsYvCrt1%(P14UV(rMqPOT?_F#73~@0MA9+{ zWAP~}v@Wa45YA7~2GaN`!6D;TyU>*hw1Sm?eL-F-;@}TjneZcL9szJmlHQ%Cy&N=? z`+9_P(5VHByEd`WPY3@+?vkt&syAwss%)XUiiH-h$d@QvEcpO;R%>_!!SKanIh3;n z#bXZc)+?L&%vyBE_EPXh%9}J8Zbr)Gr}m2@?h^3}L%n(^&AZM~IGA)5!ABg{la+aG zvrUs!hLZ3xEB4Ii344}nQNL_!YSLmRx;q!YXcgOFu28j74oKGOf^4y!@S`#k`ya4J zj+1|JAF#WOn`A`@Fk@nax$A!F93Ys5o8fEE;4Ni;E8g3|QB{hCJ!a72N!vl5hI0B-T ze0yY+?K+W9XV(9Y0)GtCbfmXAKy5}R{J<|fI@J>O>r}IA)eU+KhsmqilPHwl$~zgU z8H8E;eE+5AEn!sHb#J9>mNqW2d0@yWDEB5Z3)oGtfAmG;i)yJwQWpI#b%z)~b=cDF zsS0&rlo`-T<1B7jn%u4uJ7#LVSP_D5Y+!@D>9eCB^u1g3%`1zyzR6+^_Ko^{M z`A7Ds;;dh1v)gVQclE@U$kYQ;y<63~ck`8U!vy0KGd{Z4hXqMcyUqh|-1%`cvA4xb zV|xHMk}@D=!4BwbK16z>d5id<7RDg6s=*!y1{_2_HJKaf7fH;xXt4o^dJf)E0ZYZ# z+zB0X4?Z2V&s=_Eo>UBCA|6TRF~0Ak7-p?9*9S($o2Q*ocGNt0pLxB@CISTC9m+mM zDvUWQ>nX!o99$o`LVCU2G+#Rd#&prAljmQ~5>@&=sbIcWkh7lDGUu`u z2LwoYYvMce85#Iih?z*a)}=3UtsZ6f|BFJf8b8hJe_Ul`WmH2fu8@YB%6n#SoIJfbX!!r=~NF z1?I+|zOs2^2rY&MzWtSr-3eg_sb}D#!6mmh1`TOvfrF~kM1n>!t&E@$kp+k!2T{6n z0!uK>3nF*N2gRKgio2??@!Eyi!W49`2*p$6<2t^4{>6u#+_RlYiNk&DPmhLgY?~XC zjaLk856SPWRGp4D0U>NK(FfNyPIe@r0(JjSgcxSrPRX{y9XIP00;=Pebpbk*r!QC-&uk7|m=@);wJNg1F{=!>V$cF%%Uh zNS;@}~@{1Pb4UlL|F_vU} zNtXVpC>$t%e0eW*p|=5I#DsR%jsy^YJ0Q{$oz){_LQ^4v`MBb6H-udyqA%D4`_^Ha z*8|i09d-`;Lbh5^ihf~%4jatoG#?~~4?okLfG_Y~ zY9f?aVS=ukz_yw!XKM+uF40qHp4}n}A)ArN_Me-7H#~=4#ZAM2BLU>HUHkK$>|TSxZDSZ@9Oz57{Zv6lG@_)MRdGv2aX>zru6@ z+gO$+r6v#O>xl)HEM{V3al7QB28RMjAfHF3-T&nqcp%+rFGz9 z2^5c8roHw9QnLBu6`gYFSrLIegym43i=85aO8;a&u$~8`&ZH*YI)H~kXa!s;2sMOy z<0G)RIFRRBZh7ZT+H&CV0Qbt=`DmJIm1J2hM}H;Yjvhq;w{(2?74xeYbQrN46PSLa zs$+I9QS%wUY%MvMjKicb#=HM&u?Ue*ca8wayhYk#`+UU3yxy!ZQW(gVp4+9DQ2hyehNnusf5uK{AsPU5t=rXdc@p51ja$$Yg!>dl6*Dl2 z?hD{fDf5@D*5U;!YeUbS@aaJL8w2yS5`a<2%6T#;>h2EnGPs2R5cKDLv4anKnGD1 z36!BsnX$LBxZ<+yZ)`b8vV1{?2d|Z5#N$zn#}ui`tfOj{oCtiTcnWGv>tbV-@?-lr zVPJdScgW6#e)3VQUen}ZurUK$EZK+J%-0HRDCIl=0=OzTa`*3dRY$zErP+Zhi&i4V_i)pIx8fb#Pb=XL@brfew z;Dp#^WxkoHF0kPjw>^bb^B7-0qlJoUJZ0(Rbf0^0)c7mZ9pEfEozI&wImo7&@C-0$ z^T(%d4zoDb-ZCG3WVb(MTtwwiMz9G;u;c@@rua*>8fsvgFBx+?Qr=imK5#~bk}K>K z3yS=SF7qJCI5e%Glx5vC{-~DOrFiO>D`byoXMO79a1s^;9b}to>feYn*$914&E1(% z_st^V!ldWDKwavMK^3&R*+z($=x#+TI-Ob65uRR_<$-oH9hR3?HBl8Hqx$6b%E=<= zPez%GeR;X)2;K#zG(i8dLmZt-y7{|MyF0g|f+`Z~R$dXIHQ;`az*=f1-n3m;Wir#|!>Ic|*!$f>PXgMUpB(jRfqA6OeCqaaz!=Kl5C>A~P8|N8&+x=r(jVKQ zPO1-02%&btC%o<)4cx;6G=;e{F_`u*LwHG6;*8w+)lg`X#7!{;Ny`Ozj}iU>nhn8~ zI^%C0kSwWF>&`~k^tskPTfPk;n7MqkAmTJY)7tvb-d9th*+CbY1HW>u5zq1NPc0T- zP=KRV(BKgkthBZO`m%c1*7L#57=rPeyB^$D+ zo*@k3?8AP149tCto|rRs8GRn!236I6L$CAydO)Ia{VvA%W_}V6;hFL7F_+{5>T3r$ zKhWiQe{F852c3=IIkgXGNT_U>Xba`zi!~TgYnF=?8rs*`i$UcRVUmqStsc}pDIRd9 zpzpegfIw%9T0vNlTw6>W_&gPYz6PT|3)}ur#QtQa18sN_N3qfPXF>U%=?8{Y4|SP^ z<{pr@^QZYx|8x!qVckC&w#LP0R$?R$(TzU>3-*Bp*}8ELuJI$sF)gw`jj}5~{MQIR zLpOIgw6&jAZcg($CUY8HD7X9M!}l*MrV1K`hYI~ZXlHTGB%~q17RyLP9RB_|50!D8 zpP`iny-%J80f`Qnc8}T;R1pRaZAXG4X5b(DXI$a-3+~JA&j;0KSRS74Lk3j_ItKr7 zf2Ci(EinCb{Ls{@43Z3UXQ;NuNO{nk3|H}hx?59|Zy7TzCjU`neM`y-yWomnZ8j9> zV6>oxk|HF5D*tc)S5%tpkeY;wCP->IoLc-J=O-bykexU|UcGGInkEYUj!(1yTWS|o z^MN0kJAP_QygS&8gY|v?F16WV$3nmqp633O-uMJ6QZKYc%S7uuRuN-RaTa#9d|X#B z&J=^CoY?N61r4ku6?$Hf2d?M^YZ>`-S)5~-B76-Wya&&bH(-ijpu0C7_)oRnsm%)L z<%z{*(z-q!XFUN(Y0ko0WVD-u-WqB<*)Ru2A zR&Fs#=4`c2ulgY3_m^TG==#+&J7v3H2i3du73gE=zJv<&PsQ zG#mU1D^-U9850fU>y}a}oU<=nw~i{{E&jD;4VC5$LDk6dOPa2Uu=` zKso>+5*~W3l;q)%Whu96EL+;QRb#gMU5gj0!(|C*BEL@UNL~&oZ_y^|P8ftFt!$x6 z4$0_ZTOPAV7nnl?&hd{D#c4lj$t8i=_4(%xgGgQt!M#&_3Ixs&M0f!0<`F{=Wp64CZ~NJJm>q3J+<4v$`Cd@!i_v zV(9NGr2%J#xsJ&ft1|+bzCd)J=#S0)RTzd;Xx0DDv3IB5^qNkr!^Bu*%GMI`wd&nO zWhD-MwZ5`xb+8GaKYqf_4uYlve^aS}+U(1Be@9s@=unaxCq~_)YJw$WmRTrBBF;)K z{hluB>RJ^4oXu=)N0$pMW6Z1F6AajY)l{_0b`yyKp36`zu2K7Gav)4xr*?WW;M=xf z)sj`ErC1#&gzGBZ)={AtU#7u;FW-)I6jX+I1y9{C#PA>v6gVWig)X@w<|-P6+f$S4 zuvc2_#de!wZ~d$v8iUsH%+ZZuRhQN3;5-^Mazc@Q8*K)~!2w{nH})7+B{6@tf@{#CI*f`I)trop2iti2v3pdMma86W z!DSK~CSG?HF|6cKdE=y6V;usRgJ0#ekCjE>Mz>9AoPzrAppc9IcR?L!CT^KL>`R`R z2!rYbAg_y+&k}GL{fW512l(Pq&Ms@f!PbD%1x}e?zMG@IMvY~0Q|Z!Y=*~hzv~n%AGtoA=^07mp2HlfKr;%N#{Ga!-6WJ-~}4XA}+tPC{lS?OU}=AqTgeclkOuW9w`-|m&=H}y!;k=Xr>uRTT#&-p7AN~8_uge@H9;_z}0jy`Qba9>58d;7=Kz~tz)>Z#N?-5wc zf85>`S&=g*g!}IIH~j)08&uD)t$Dd`9rsgqxK1s9%-)#D48t)LFoZ-V9OKo)!K95! z(jFxGNia0P#4zi>N*?SSejpE1pp|@`7V+kbjF@bQFz`RxM0!k}wW(Zgo^d<`w0VZW zT(GPLJJ1tiSG_+CG`cl!g#-e+(vf{DDdOm!@A@UgY1LH7L!FDJI2xu&fmd^5pP|#% ze;@F5>WP(>)Fnht)tcgtKKbeRCU5&y{ybzx+kU98pm}w}& zc#%RYc3LkL#QHiFL(1fw$}TYBRM!7#2nV`o+uArT3H@WZv7yGAjSMNy$CRzot_ri$ zO+w2IsFAHkh2e1f22B-1;v`(Co*m@UZ~R@{fwzC{5CuoNiWmasPHsNKY7FGK6>hVH zmDNj!dUcwwHHQ~K;p&iuoeJT*(p{>_Nzk3>4H?+8pNbfYFh{0&C2%ULls`yDB^zp# zsVk1!`lE6wDv-e8{m`~ql{ZB0+{A5Fq)ZI>8!V%v{NQKC;23`_E*3N5i5>!HC;lw! z)?xE;Z@Y|~_M2#8MQD(WeJL}Ko-!i-X`0Jsp%q(3xunRJK;*#dWcc~?)C(Hg&$+gcnCHmz;YBU!hf2* zHV4~cPO*ohEf;$c*4OEco!R_QVA`Pv$JbBodx@s(02+me9vTBvzVy^VuLb<-^nUUf zdJUvc6Fv5aX6rwV-ZBw>2;4`HQZeo?j!Q}&Z zCIJg?4)>}5|27XsjJA2()&QI!ze1%5x4oS1q0SeC7=Cq4{I4qtp|Xp$97~0l+fO2L zsyu$+IJC->hnaxG4hS9Ps+VL}M;!ilwj6`X0a){kXYeVh zNe83|(8ppgU!0u7zE$1hIG(jm+JIL65*m(7&g@!;65yYH5{yFzCoYEiCYn^kP;hIvjxsT!7n?D&zAGW;_fR*6FX8-~5e zH3_l=4-8CbH0GYejVw9VO47hyBR<;tuG$mb5$5Eo@{m1vMGQqWE`vUC`cPC&{!;f^ z%q}E)2QIRi9Tl%I-+?oFaBhlpnprq&{Teb-(l-Ds&mEnifa<^$97lTFF4bJcMwHczgS# z+x_~BwfbrTT+#N}Q5#IYYRyV=W`rhe|M{SOy@Df47w;EDMIvtT*2Nmvr4pe28P8d$ zg-Zi{7H;CSPIStl4l|mOv0Yi(TOTDseJ6|*&Y%3_>k~h?B1Sh210f!FhkZmHtb_X# zW6jUVWawdurzfN85~grd>5bYLI2-|VtRSABTRJ}KImZ5sOZLPbkkVGgaYeuS%HKB< zl{rehjrwE^>CKF3xbwUMT+G#vf2Y5?MrdFi#DqgKse2ots_o!lK!3a`6kES}K05Ny zl`$-o#c-F;{reDoxI>XFo+|$oSJOY%2)Ym_|8TIkVPb6Bke4XQqSGH`Vxcm8I50!p zHNB+t9iQNgNiqSdigy=`Jlhv9-#Q34+c4;dZQ*TENNF73Jb$W^b^z9oFn?pN<748} z4>}Ji^?ZfGwG+P&98!Z@*3rHAktid>gxXqa#sGjp{a?kwdaxvAqS7B4 z+yE`BU;w};`>$dE#cv));2C;UD53?BO54q^+vT6cFU^=IP@K0O89p6L(V+ z6s7#dk24kB>OB6;(5_NSD-Ees_W@ct=I)xD* zK`P!N_7?NI%=n7r)X{$%Q5D|vT^BnOcdZKwyLD(-^AvU;4ne+_sF8RqL5&I{$f$IH@(-2-5R&*I|%eflMRLi9=ZPxe)cY%yXJ zF#1BWrF3y($pNLvOcgkwq=69&E95W%%0U2l%-LxZc*YNaIbZI~0xAa~OpkOmg{0U>P*H!a{}JJ2^tjNb&{5CB3($%)(m zC<*`%v$BQ*2}J<8#;Jwe32y`OF3&@xikjpQY|`p+HaPr&*cKK7j9io2RJ`O8j*lFR zl?3`DifBaQ#Gd>_j{`t?HpRnk(YN7~L=BUZ5}9p84*dJQSobVWPMdezQy&790AM2| zX8Mj#u$eYi7Aw~G?j8FP$ip7LJoF;Xt?7wUD^QMFwm=8`7aR4ruMta2+gn?UIs+;; zj-wXQckcZTeHOPqS21!o7w12FezC=g*u`mrE`RoqpXpW6PeE}LoK|mVvzuO>b+@PGxsD=~=m8F{?Q z2_O>aH~UN^AMoVb5vLT%)fI;eQXa-3b7Wpl#&AltWX;5(DoVU$Mrwgb)7Y3slF5x& zbhE{^gpE^8nas2pPUV9hNhjHAbY#m810s-{S6!OIxp7TK^4|$sRT1wcX%jTw;eT@p z5iZW6EHC*M)IuwtF7bBv+Xs&)%UKGlUxoVisIf%{e1rsszNmbX;=|2x9{a>nNAO{Y z_M>?nW@pN|^VFv>5NVuxAFc!_OohpjQCZ7U&(dH~>pc@an;6M5t|TsIf>A#wOU`@U z7LE>*s{v{!5#c0DEk4$H(kwDT;;3ZR0ZBH}6jc#U#Op`epDImfNM|%={ES&qd^IIv zTC}V=Bg-z{P1w@8d`!Hc&DnIL&Mt%~w+)N#TRS-J&N& z{$`duZ9Fe1vPbdqbn-az=y(K8Yii-OKWg#K&}L(%SvB@1(G41Aq9&U)xZm?XnAO6b z9hlIWxYx+OPpWl)?{BJD8Dn*uf@SqZ?~9>orBV4Ohs~}bCVXd_=5Rh{Z^93+LgT~- zI6h4*y?D;kS$NCPnI>Ob^Hy3_R7cdJ*%+Pcrii^+7b2 zYP@PneR-Ml27y}dD!R9wYGJ*8)klS;J@&Dsdj8cvBD#04>7xa2O>cd#tIstFEU}si z*sxXzCaL8H#RL827zDqroEWLveNj@aa?Eoq*ht7mOv_cwX=G?TN%tJG-DKPJ9r7Kj z;K1Tw=FrvO*FP#Y)e=Tz>pQDSsu2b`1|Lf2-M@T1X&Y&)X{Y(P zy@<8a(B|6~?da}A<=#Hn@Z~6{J14p$I^$Lzn=omK=mUc_Lric>5V?%G%#Y&9H%E%m zgJ=0DL3hh3;;BW^%{HkI3AsxmZA$86DUv+D4`o#8}8oH2{{k6 z+lZVwhm|y!^dG)oX*`lR@;pjfEgKgr<1V!l4gU6JSoNpT_Ov2?S)P#hdR>g6s$raa z>n^LHvtYJG{ldrgs<7G%$73pmzY0NRn+lt9l0QU#SUHSK_O%bUj~RaPFLg*_H&an&#r1E~(xGyCIYOC2ISWz`*+$kgdkp`6 zUC(^6TR53L=}DCMEM{;18@A()W7?M(0?x#wM2lC7nE}a`w9~=`;$hRPs=@1O*J}A{ zKT6z%4W%3Tb;NlTY6ZOHmL)sHIuwTl+^ojuEMb<~KDzYM0z3^8em*_xH;3q?U$9^J zn^9DSg2Q$J5pO5^&l0OCYXnI7Wb&2tk`1JC|0omlyr)cOKP3xe&%}%9XXtll5uBEo zPF_^Cc(UsSdZ;s3E4@vt;H=u1*uXHW=87z0Y>%63!PF=#~52wcv*vjZG>N`G?YV;;hw&3i5SnGY8T!Q zL-ytFa%K&`cE0H>Za~<2BaR}wTcg}AP;{k|lWS+)5hs-Q^K+%r@@w7bNdJq$i}Q8L zwU{8z+sU!cr7+H;`YyvRhcl%^KyVb?x)t6pe_FlXKDU3j`8Dh5Bj6*FE)@WX2>_-C)CFMz4>bHB z00_qa3IO?kMeKt^|09%yfd3T_lm1uy&k7IXe^+?uiA6}CMq}vDKEp>Fcb~4el2d#S zg|&gfoPp#}9rT4Wdbj_EzMrW^v^NZT=Y2;{Ou|&yVo9Bn3;j`|NR{8)yqNl;)*Te$ ze)pU0+?0Z;@DI0swZe0@99591Jk-Fua@J2>3BVZ&cDJK_YZ`~=TJX8=%xuExUi}eYo1gV8J%}DAhJk<`^5L`DITw+ML}fWhb6m3L7vZwJlwR6n5fI@ z26B>fD`o^M^)_CwJSViErJAf7El=tWj=Jr*&|z+my1mvb`k^Z$>iP(0Xk^%&ohPq# zNZ!1|;^yDP{4sux@l9U2PySBnT0c_PpIG>v@Ga%0hzAylmf=&{oI6y`!DB zZPTiCadv1Bm4CUcX%`R)i`hva6ZRC%MVuYnRJH9H-t>rq^=Y1NiryR-o!nTkaef+G zwE3mro_NY%YH%eqsV8%?y^ypy8)1PdE>en?VoJ0wtzAnPPiu{p zYTOJSO5*GuUFKriu zOn*Bl!HCvB%!a;1-DpB-(*~k=@ zy&NH-vXK5PIb;8!HeZ3Lc#q!)Wq*3Dp|4x}Y*ZyA%I*U}?;;GisnajlBebk2of3nI zNz!!@Asow}TfQ$wk`cnJ{lY ztBB6?sA;hbw)%sPw$u5}LmYVe4I1HgBrL&`QIhH4x$1u9fDZnUq+zlrdPaY&fA$f75I1QS<8=v}0OiQGTs&2+6_N0HOBKf}-+ zMDHAZO_v$s{DeAhV6mbW?p?c<_wvEt>8^N1p9VIkdG$yB=#rhHhy_~4VQbR0w73g~ z<8Zus)ny!GXyLUTU8~YcQ8X@W2myNxPuV;B)sY{0K9P9WY8*q<$_g3jVr~@i3*c54 zHUSxP_v0>*Ki+Km9N*P(?EctBs%fEDGnlt)T4TIJ)_~*2=%-)1Wh0_18uTUJ2YX3z zyXpHBSp)um4!KR1`Ln@B*DL)KZA-UoH+PmxiuMtvPWZFLdi1%_o`_Tz^Wkl)zcpFh z-9?NT1x}?PB#3xqwfOam!#&yRcC!sn30aN2s!Bnp1~%&-Y%woQI$S!l%{iP@1g4q~ z9DO8*A0r3)W^jH6?R<-LltI=PYP}%rRD-g+rh=W)+`KYMj#u|S;v)01N4rlW<4%Z| z<@fPfc88TKY9DnS=P@#t_?-oasoxLKD|^yLRRux=wVRjHWK#j;mWDFuS9&H3llr5N zgGvt|g+OsTE$S3tAjd})$%X&pxnu*Ogu(ylj7b3*@}KFGiroUHIzcShXU2H^fuktp z2mcc%FefY}p|(9PHvkk52EgWZz4~?w=ikKi8*iR-(8aJW7)SgLotf!&tCmy@v*~Sz z%kzu-Ezz2;$OJ7enx|OAR0rw~&)+D>q5bh$i?iU4e54+i^@w`|z28&fQlYf#y9f5f zf6D{g`^+~dGmu(CdEg$-RpNQ5!tr7a)-1JkMhUb4dYAgFpDyETzh6MVa=d?IlKzxE z?Hha2TWgF%!b1^=c812LaO)R>vN=z=^N-V?>vwq|27$~w3(xB}wb|-Rf5-H0Ro8|OT?3Vg&uHD0vJ@KYi~%^kk_ zqKq7ozaD=Ot?3JkDGku)W--(d@*UXTvKGjaZI{#G;6&)vj43wBJ{+?hc*8-DXR*Nv z1AN;=Uoj?SS|BaHyDW@L#ulj@Ph+Hy3AmyWdrE#eBY_^+FQg4)@$ zGyTdMz!Hoa8>;==V|@)Ml}(HQd~7sPHOZ7{$j)_&j@)L**my^SGp(|U9wCb(H9n*#{g(>TfEEKD8 z1<6T`T56sl8nAJOr69QS`q%W@YqzkIZcIpous&X3C5n7%3+%mNEg6FQz#ThMImD_b zjoEYSZ))81f*ym&T%~?!n7<68S?~1c$w*@qWM9+iu(&R%Jsi(&6qINrYJtBaPQO3c zK1-_R78mg06K|+2y}K)XR&gr#*xBO|sa`rtx$Nq8YNY?h6#9cUJ2zW%%c@$d_MpQ| ziZ{yn5FBh5RuHIo>1h1MM*cU~=QLZa!EPyGeI)p<93=WI7rWJQRPY(H4tI(JQ*EJ%V2 z&sz`W62^m%-`quO3NDbV%0Y0MQ)@&h$D=yFO#0^Sv5O!>PGwo2mVh%wdoJFra6?i; zTrR1tZYQ`Cp<>*{T69SI!j;H%^t$#Xn&dF7<#)t!g+IDxU zHx2)~YCp1O(m;0-0~J#UU=r7{6q>p82sq?6vwoZ_(9xAI@{Mbf9Tx7Dn+SH{=|Jc5 zT;-2HfS5x8jjr44kW`jal5wV9v~UkwFba{=D5765IiMhDh3kfA6+N-DE_Jk*c-2G9 zNY^NKWYIZX=^*CxgIyOnZ2DsJQ$=*nEhk^zRjHZMwtca;jA56d&w%rF-DA-zLhmVt z!=e7<9-%Tiua;*XFQB0x#MXQM(lE0Y0>N98!OH>u2>~8zCPh;z+aZ0UT07>bE^8qz z8Il7#;&DpO)82yPT#2=k>FBG}J?FPcoMIOwVc)gW?==Kyx13Tch8tgcQLjJJ;-++q zaf-@(7tJ!rMdqal8;bUn%nq9*#^M2yeRMIaQMNPG-+DNU_z*w)bI5`0O`u zYH+vP8;dhk;-Zr7;#8g2oA(`IyuZspnf0{w{NBqJXED)MP&3604_c&n+eJ)g+gbii z>g0a9a(*zg=0an};&GeOAAJagxHi0cf|0)Ug_3{)OCCylHRJEPQ6S=68fPfZMS*zc zSUnQge{@RK{dGxCOvsWSNSaML!r4#w|-&< zwv#6iC!ROfP+d>8pt?X6G~(1xzkAj9wiIgHv=({B^(E?PJUN=3h(>m{>uWzB+ilfa zR%?Bm%%-U(ccr(kYfs~e5&S~FaPr*j>Zr7L{smb_-cZVz*U%p4Uz}$061clKHo7wx z6@Mx_-Zd+i^8;VB{q;VUX;R-OK^zT{tGg6bfT~8#^xKQbhLh|AD90Iofm7xaq}(r= z91r-kBbqKT#kzs|?Mu43z#d6Rgha9S`TK7_lFx_{tE8=R_(2cfyr%ij$0MOm7jyJX zliC6acT<{zyr~$-u2;&NUE`fv6P8 z8+ou`r}0n>W~iNwXOd^Ii5AM~`Zxh$SxjU8C05fcj!Xjs$k)ZuZC4vOSYXB;jqr(h zzD6lcAtiF*Cv=1D6Z^Xz4fXb-kht7E`Iq-HO-&tbx9m7r#=kmukMHS?tfZyk*hnQV z?jc)Gol_&EUUq&?lZp_racbaRYf`|i{?F}2&r%b45`y1z+DTfC^0{X&-!56alL=_s zNdnEk;$W%hiW1@eQ`HeK=^J(b_PP7R>>eJn&)La#>JyRBX$OH;WR9)OfLKsIXB|7fRJcxLA-c`^nK6z6P&c57Iv!~MP=KI-YgA8daz24-mp z6HSAQHbqlet0jSdO226+T8z^O?7l$DPTzQrhIeaTf2SRZ5mG!LK1gLa{8?ptXFB7n zw9sNsj}~Zjtw?IsOdPU%OcfdFUplYFRy<6I?DN(b71fr+u+_!MiuTo%@YRu2O9eG% z(7u4{elh34z`-JQVO9K~Y?Bd8KvxSOm6k&^L>7p8K1gzBFC;p}g8QO7g5I8Fzt6~Z zB~7cJ!UkcIeB_55U{<6nKS9eSvonXMf`XHG`fqY+4NG4%CZXG27I>Z0wtw~+^h_T) weaHnWayKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000XNklKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000CHNkllA@z>bH|T*=Z@dAQO7H^Q z;30U39;!+ls)|-6v`L-VI~=l0CQB0P&04rntzG>V8IasP+}fdCU= z0!)AjFbM%Bzyz286JQboOn?b60Vco%n1lce6pfH#N~u2%EqklkFI*qr+1Z&petLT9 zrQ;qCu^g{LuIV#i$}ttO*J^<&dlGtu`E_(C6tG4GS*sj_b|0~yd1h#~SIjs$aC~&^ zF}30k@lS!duwnpFv)OEIZEd}cqUa5PC(f7)t@Veqv$J;q3S+WxGRRlwZ&_PDh$z^` zKs5lg0JH&Y_WS*hM@L6=d3i~0TwGkx;o%|m`~CL-I%Z4@K+|mN>NIRN2Ju({u-F)F z1K8|#yD#?k_Gnd%MkCtY-K8W+o&nf2V^g#F>U01+0+5(<3IZ&usD@c^NgT&dJDtwT z0co0|-EJdI(;hQuw}z)q(_YFe?$)&_`qpfdh?@5uSQJHSfDwS4oujV~uZgH@(dTt6 z(OS1k)YFzRs-1K6)tRunYLMbzRfgF+WTQ-G5K&@`=FHqWI`NV@TP-up8cj-!Ps};R zEX!g5iHA0I3~RJtz+z9G$eH-oe&T8~t;}LTR_RYN8}Fc^H=-`{_IaBzU_ z?d`cYpPZcF`1lxEmVLqWd1S#hVEQn_S4W427P_G>!t|M76VpbJ$Cx&SbbGzt%Z-hV zS5Xu_2kYx9isIYt?d|95>+7!oegOChV1!w#Kw`9fbZ(8-7{G*xbRB^;j7i&hvw>+x zPS?CnF?(cI7(+Jz2FBzKfDH4!6{)Ar2*8~ImQw(;jf(1*E!1Q4JBFrS=Ei_Enw$3w z&31=rKg0y{4J1A~V{=^By@uJlRBp`OVb(G^#_Tb^&5Vi3sG-@9of-x+zO2sVp#ZZz zrq+aFrpB1H0)T-To6TN|`GRSLk52IrfbqK|oVgTlKjOy=mJzu#592d+ADvoHD{RNI zUQpKxEbfsg9K+hliba#*GCDfs$D^uhnA--M$wVj91sr4nv`|Y`5Zqog$ zFEbcIr}lSAH#@yV9pUtOi->#$@2QGf|B0VcpC1egF5U;<2lNeD0jR&D$m Y015JKS|;+G3jhEB07*qoM6N<$g1y!qtpET3 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_now_playing_icon_play.png b/res/screen-density-xhigh/T02_now_playing_icon_play.png new file mode 100755 index 0000000000000000000000000000000000000000..fb9014c5adbbb92ba97fb776af7c93d60146ab34 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_SA.png b/res/screen-density-xhigh/T02_option_SA.png new file mode 100644 index 0000000000000000000000000000000000000000..db4d39b9ab28e0db2688e880705ef4802613fdeb GIT binary patch literal 5589 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 JovLlb{{g-Ged_=K literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_SA_dim.png b/res/screen-density-xhigh/T02_option_SA_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..54fe8517672c2f3e6fe9a35df564f71c9d53166b GIT binary patch literal 5369 zcma)8=R4fp+WiS(bV;;mA(3FB6TOb!V|1cL86~>tWOPA@&Wsi^dI@4gCwd$0QAder z(Gx>-j^{n+4|qS^d)?RC`~I-kUi-S%`BV0HI&vv+)B2LOKaIeIXC zy)9bllcghwMhrYv!wpIUVueED;M7Uaz-+`+>M?Ae=4f;~?9{nvQh}ky&vIy z-MuSoymFx=?Ct;+sLqzn>*@&}a2g^d_55)MQ5%5gH%STtI<$}-{7lg|l-rQ3S9tIU zybkXqF%1x$8juS}fD{38%6Rac%x8K)J^^4gWb=9zc*z4;alG4@1mHQRS%G+fSt=V1 zUVak5`oJzm5pa+MDn<=sl>lRYfZAT8TO63>0r=I7>{Wp;4L}EminJC0kpcX=F_ByV zK_Fn&|Ky1u5RnB?D<2w3{drzRwF$meDyvqikzHIV)C|PqL1bja%fg9KqkB#*VtvON zA;@R25pX*8KQ;`PEtqRM3h>CGkc zQ&wQ9tnzwc$^^W@q0)zSI^Ul8{41D+!y#V%P)X0PBM6bNjxRyHu!%v zIH-)hJAR%3z+tmn=Rceve7HmS%Bb(nf$Wt^{!;*Mua@iq02Yeuy!wN6vV9-`P|Obn zf01WA>ZIrHAY|&iyU3ES(n`7k;l=F!)3Vr+?zvzjCy5I2g_I5#P#JGu5Y=&wcSCEzW zGJG+tz;AwkY%^NpOK?9_se@RAz!$=5%_6UAtZA%0t6IX!#4dbqo>-I^KSK9A$K#X| zjjzv|?wxhhzZMjTHdf_+GJQYs0UuRhj6%04`~CL{f*g$>@2J&$)}OdPp*-OVeX_+} ziWF95c#<+OZ|hu3B%aF6`n*4KEoZH3O=yjAjqT8kBr& zMVaMhU<^isgJ_ZlNz&BQo~1E@`SeT6iprMCNDXiXL;8uO7J9)|$_7GutEI&Mq?a3% z<-FX{W7LC{N|r>I!AjipWj}|QT)ihW>C)`dQTVKzUt_u2(#uL}^RUj3o6VWLJnC)e zi|%JNBXdDM;O5LL=H@u*veHlD3PS2aMs-kJs=X}HYNp3&wzoF%CTDR5E+lq|`he>v z7h{pIW}|@JE9bKGjCA92)pFf(m7P|Rs=eZzqE@A5lZ#La`95`yR~#y^M9kfsO}#n2 z#bT0TS}kdb<0{@VXB6Y7W<}q2*W&%m+%^k%uBKb@l7H*wIa4s-mHw5>dGWCdnK5A< z89O1C3_~x~^TNYTikYtu`$t#7yh~02Wu0c7u@aHgI4)H8uw>X@MERP2?tW2D#i|W$I_jjV?id zvs0^GGc7XNN4K~}nu?pCj15f9>y#^VDxXd_S2h>lD{jL%hCvQcD<0EFm!2`?A43 zN9kL9Fym3G(OIEY^n)R;ZpR!wIj@yuJ5S(Or95?nH|92V_p=x-R(>2k}pj9gZD_vFU* zCg5fqD26}9gWjtqOMY9j`ZuahfzrT`aat^iV91QEM$8+8xH6U4!4BlCo*)!KM<}+EYw?2=`VU(eH zA6rF@rOTjsH_N%;x6T;tHrSrEkovW>yt~nM)PBN#Yh#Hg*Nh^)EMp^s!j*h({ww*i z;n%(6ze-rXj1f+3b2wU|v9Mk0TZ>)s0A@r|R{yj9k^Z^9$o|A)z4gqg>-aunV9Q_O z-6^bD%gL3@KpWNo&p>O+e#-7b?V|2Pw(5P^)@k~Mi+QECi^pCc{sjIN(Gv>vOyfUO z%oEc3(8THIJ1P`?kJ_$t4t#mYMaT_4WcU7j;;!hwwsk_he8NI5G4B%}Sg}Gh`N)SE z#?0pgK^!8Kk$Q*=v)5)#I>R#K)7wh{mnzstl-a^kCjRO;{Q<}Mt+2@y*x_h=PFhZI z2=Cc~6}A8!xM_n~cA|7UXrl67nNYfk+mvjP#JoEE=6zU;U4LNo%?ME~Vd=8%y)AW} zGO5$ooZXD5YJBC~xF673A83EF#h5FKSv+d>|3iB-J(Vjiz1WHia69QaIbNn+4DsZ+ z!VERf`Eu-6w&=829?9*=&nYZMPsy5HFU%e+ymRXC&Bu)|sGJZ+hL2t+9Vb#M+)d0% z9Eu{3+Q}7@5f}d{>v^?xS*$Q>JNhh_?z-T5sEUr3FXVJ;X9hE#IsPf*Fe9biB?xu3 z-Ldnq8r%E5m!)mMPe{Px$navX(|5s_`Jix_QfDoQ^&RJp!&%L--dOQP%EOeD8v^`H z+@*~W5B4^1vf8LZwE!UCDFDF30pRTB7PkQ4Ek6KkTLFMXCIHa6C0q6=-^NgOHAQ)S zzxmy4b2r8whQ1piNui4k^XdnE15G??YKRF49!g@W zW2ygSEdPZA54mahbbh_C1G%ZjZSy~3;K0Dkx2q^u*=0>b%k0onD{M1#U{v2Xb}f6Dcb(ty+>Bj6mk z1DxP33|Pu)-|2W2()u%u3J4F9%2AC=C~%d!xr%)+pCM86W~PYr`rjtB@3%1 zH>G-7a2@La*ww1~Z{NhGoazUotjAWYwIDw6^ZaB5sZBLCHRE}lV~x!v_7_ysGta)QiY+OICKSZngV1sh z9S*J6>P2+X>!F}(y6OgqqR%rsN$hGMwuqPNb4N#C#eJs0H23;EI>aAI7F*M^YfTl%?oL;ly>WIP%J&W; z+!jliJUH3w(^3Voc`#)h!o?rvKTlK7Ppx$fMQr*XUY_BuP$*PLu8ArZ{ehosWU^SN z&c06V-Q^z@3*L-o%b-6!ED5a^d{*%f+eNEWC&;_T97T|e?}0sk3vspkx=f^Da+uN4 z8^RwF@a03MdCX*M7C#y6JHIzh*hPmme$@{lpqvNH9|bSFh#-AA?s(Um)=$sO_};B_ zZ9rNy`|NE;KML_H=FbNFfFCo;g)8_a>ybmek=ClH)JYwL5m!$tbp1VX6b^@T3JwmQ zncdiUc6GX%hz}rFgB+-pC_R4#>Vwn#%BK#=x;P1C-7!;E{H$Hsrd&#^Vt;Q)@cv{S zNzl^KHCOEnCP`)3oA@ww{AnS$>2j(!wNu}!^6q+T{xHhgi9QNUsEA61A)e*M6hSKu zu>q?eM19Uodox#>smV%sk;0y2nd{}&Ojh9mFy3|g+xVRIt0I1 zL8iqzc_F_Syhc$<&R*s-gK-&M00uA)N`4z{t*SX$K|>b_jrDAl`W@VkQfA2>t{q;> zZhnBr(7_4{b3SOnX*XC@(^(hlgH7bA#2_Hb4p|_35UFmne$j@<%4wK#tHs527b|GK zaLNx+#Lf4rpB;_?E(JwJ8?N`84}3Dx(~}=lO$z&?pdQkrLgZbUM8Cms_k~CiQBh_{ z%nRsUFy;&&aAAvJz%d8!dL3MuXfF}DJG#2M;#yCZcG}K1kinxkTRhrhsZrjHAvD!% zhK`|GN7OzvnH`VK*2uju72G=;-f8taUmrYhPgd)p4T=?X`WddA`{3QC|5EklXx@SO zH}_8$m$*@m9#P};r(vw_w~qHRf-(;9+J8=M-p8W%-uU?V?5qu>FfX5^jKeeSvUZxP zUT`fon}5Okn)pbzjVkKX#a_d5tXtbz@9uGccV-e9QfJZiL}_>TTQ|@lUTte4vh6lC zWBJa-)y3s3cXMwb}6{q!%^EqcnyAmn(;$gq4$FsiEi zB-l({{6XKJ?9@ZLJ`XX}S9a9G-Sef^z@u9u8V}ZTmrpsh827Jb5jD7Ak?b=y9O(7w ztE*DIVwS3^s=qnI0 zPt1RF#-8g^o8$jp97y3X>q}t9rX{&!vNrwotm!98OG{a`CZ**+2-u&t9i$G~A-&p& zgxMm%D0LvV$l|I7(OWb4u>%z5C||a+sg%$EF@Bc*RpN6jvJ@^ynSwNZufg6sW}#HkZ#w_ zPo@M4g_1;2i6s<@ZC2{YUVUvwqyK{8wFejIg9}@G`=X$HxjgB>>6U=wGVGRjZKu^2 z&=1wyzm4;DCWUun&f*(|wOl5J)dVPIJbo&k;6`N|BB^{l@IY+8rTECZeur2DPq3@0 z7EgYPpn9o3?o_}3?r2=4Z0-$)@zZ(z`AVJ*4 zzc@Sl1FF88&7PksfbN4tyNo*3BPwrQNJ~qL$P4~Ehfb{(WB^4{fk9y^crJE!Ju$0( z_BJ+Mk5V#soehsQMDw&o~U5*PeK|ta{LX*4%%7t@p7%sHmw#y0iCYx6N#cpqJ|1&tK z-qPBtHNPj~Qg8Zo`QQPHntKRZZ>ohE9=4UIvYnmdyJYFOs)LQ57dcXhZEo<>t8?j= z>IV!B4V{ppM6SzZGfyifnpxoQ@Ws~rm#jx|yZmHo7E&L>+V%Y(tx>=kb*bOt<&Qh4 z?(Tj}+-Sx2)JWCqrH}=H*1>S3|CY1OW{}XRHHSaUO)|D%sUIc;H2i5_ZB3L2?dk#G zGZuk7t)A=ZGqn{FREPbW4Oo|egC%Jj*~(zqCg1SO19^+jmq~-QL_ZEwmW--r3|cMR zY;2$J?k_eU4e_;qt+H&#q_EG?-2{)ZRH_~(SPA*c`U01xm4*lHH`fM2u|WJhvi2hE4~e)<)TyNhpfU~(jlD7*NZ{r(iZJ=r&p|65tFbaO*G)~UT5 z=;Gl~b2a$9x|@`g)Un?5L*A71N8-z?UtoC3?3T*%o!^gK#&uLq4u@e668%M#&5o9h q&qKBUjb8svTK~T&cK!KU64-g_Sz}Yfah! literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_SA_press.png b/res/screen-density-xhigh/T02_option_SA_press.png new file mode 100644 index 0000000000000000000000000000000000000000..649b063557cc59647b9e85372625c1cbc83ab239 GIT binary patch literal 5270 zcmXw7cQo8h7yc=+tQuXEXwf^->k_?0UA=}?!fJ_#Xc4UN5)r*eS%MWkYP2jNdRQ$w zON13ATJY`redn8V?%aExxqr-k?wy%?CgGv64kh>w7ytlDJzXs`yte&UNJ;Rse1!%f zUXl6h+5`arIo-cP0OaH`0|3~>OH=dVLr-`xJjfI7 -W$>|>m_wah`4gk;Q^UYxv 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 Ny$8lxD2VgR{{T|q{1gBH literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_add_playlist.png b/res/screen-density-xhigh/T02_option_add_playlist.png new file mode 100755 index 0000000000000000000000000000000000000000..8cfdc335c84bb14d9347edd39b90437b03731430 GIT binary patch literal 3306 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_add_playlist_focus.png b/res/screen-density-xhigh/T02_option_add_playlist_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..5985f337267de2dbae4261f92945506e8be1f54a GIT binary patch literal 2733 zcmbVO2~<+~9>ygrNn5nC#k`?8J{7niqTmXGxS@u)j+zK4j0y;-ST>oKW1I7|#9hWR zC)38Mv@CPUXPTykYicf8*)nRTrSsbKVP)^Vb2{_RdH0-q|I7Wp@3;JazjN;qPj`xj z`c`!a1ft>WM4~B1x21cPn&R1#wcA87Y!Q?F#9sU`aU4U)h7ef%P&VKk#RzB9*bG*D zbSv8$0#OO$(*4AKR5v`6ABA8nVGxoifr1TzSldYi3}ysd41}`7xjY-#bWJ@B;IeFB zzUEYrDsW(PxK4Y8Y_GlUbmra&CXNNOvjwarc!fX|Tg(6?QIR|mUSb3Lq>ER~m$s2G z;1fg~VFUZ@lpoa-aNrBsfH?w$GeIm0z+w<642Z+vOaU~A0+A>*610G$K)ksH9z+3O zE||iakQIifksQC+QmkxX9I;q{MZFi-R)QHqoyB@6))g#eLJQA=@s zLW{&S_P^cuCR#*~7qF2uwum1iWGc=hOn;fI$lYHXS^_G(!Fvd~ibG*UlK9M+C^k>* zOtOI~-XK_97M?&PV~OVGXsn|nnv6oBh*%7oNWfX(a0Hw=h(;}Ie2WX35iE$77?LB} zf`~$qQAE(3K*kZUXo4e_Kqgo&bDeo2F@wisFWcoR?0(@o{3RFfAY?Pdd?B6Bk6f+* zPYz$q7jgIkz`@HLfdYKFJQhDrv~)b5qb0G0+*mftQOJ)1KIIqB{f7Pj9rtH0>;K6a zQsE48sW|?lSeCaG6}UA0TKbB`*XCjK6dfZ}v_{0(J~;%UHtb9y&?SSDfz-%tWbKil z#h%#Li`~`g+ADU^ihW$P&z`R~;AwMAc4{kc7XnT;(WZj2rhDl-)QbDxFMpZZHU;AIM-2OkLf zPyNrq098Pb1Lv4=CgvvY?>XvtCa!~Gn(p*O>-ohv_a(aXt}Yx zt+uvyx;D6C&!LCgHGdlYt+e!7bG1>HPRT$jLsPBNMZR@+1MJc3w}maX>I4(|4QW$3 z^LcJ2Ok=T?MT0wAdgd&^0qEmD(|`>K6bKi{!F`f&xAN zF6|oP$}JW`dkV4-orLbc3 za_Z7ss;-Tg&>EZqo)irv|6@$4^WHJ+h9bH?2QXyWP6FqU74^Sa~*C zrwWd^61%2STOQx#VE#zy>m42*&KqN_*6<4mi2kFeG(1&`w=_%4fhjjDDVLj27BBS?dMdSRw>C=)?@b-%b;8R%b7Zo`>s3{A#>#)^EvVH-3j--2 zJu=47hZdqMX@8=WD@Y8gOL%K`IOlTo>!%%;D_s~D0)SeHpnY7pCAh-3;@r7ZZ*T8g zz|7B6lauZ9b8{VIPViHQ2R5yGRCbj&JV=fc@ggIKI2_LN%J;SQ{NReRviC_8H?5;D zrl+SXLS<<^RqkkC?l_7 zfxd43w~6ak57ypoZ~xHW-TfNA^LKrH{X20lhu&6ekI?B*6ELQsL7lTu-J2uph9#AX%kT)ifWU}9#>a;3wPd2I!%QzluVq&uG zGYt7P-CbL59dkEPR90cfpHTOF%NZ-o)g!&~H%2EV);orY?swEd zL;=InyKT0g84(e2prKB6z@yKDeoq5_UIj?fgBEfc#mPZ5W!i$sD^9_v) z$_K;NnztP<$2X()nkLD-R9YJw8x8nSt@9-^?uMa;2K)NiS7M_1&jh;ZWxUe_%6vC(-t2q* z`t`kSHyb(5*~(fJSJAltzSHzXA2cVZFmO62KR>@tFxCjgl}}UYyGcNO3UL7bRu*S12qbh zTK82JyF?z$a9yJ{ej&Zo`opEnx>LP6zFts?%3xS4F^3;`PF~n{4^ujRU@kc0 v0d+McQ14m2(kW5kuK)Uy?8D4fKvW>536(XCYbZCDejuI6?xf#{AxZxNvwVki literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_add_playlist_press.png b/res/screen-density-xhigh/T02_option_add_playlist_press.png new file mode 100755 index 0000000000000000000000000000000000000000..d88f05442855f56a66d30f0c8e6cd27b0867ea4e GIT binary patch literal 1494 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 rncQgq2Pod%lrC4nx+4M~ElYm@ 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_A.png b/res/screen-density-xhigh/T02_option_rep_A.png new file mode 100644 index 0000000000000000000000000000000000000000..ad65f3901e4edaaffe7d51858ff4d9e67f6cbf3a GIT binary patch literal 4259 zcmZ`*cQo9M68$OBdx20K;+Nu2!tEbx#y-_N^Nev~StQX@*CJ{(#XD7)mj0UraF)6qbx)x|j z_JrrN$;QajuHZ%ipd^F&W?CFR3{6vyMk}NuX&y;zegp z;!@4*a8(kx-_^Uj`^4T4DN906UwJjrYPA3*TNpcBz`xq)m8PTS=hxTPei-%XIJyqo zMO{I99(CE_pZtwhyF5K!`SMF3M%FpTfcR{sXY|OVjB`Ab{H5E%?=*wUR?6#3u4%qL zup7!=lxfwHAuv_9AO$B|#+Rg%Dbjy;>e}PiviJp&#_~Pj<6{ki$P9@}XLq6#V<9^G zkgi{+0C3n2?fx!IMg;eM@pBw@eV~aqD7g#3y}+4)0Ps*(K+0MEBXCQCl! zjC+PMR>?LzwuW4X>Oq9c2~PTL8LC5oZ0u!xhk;CXOp~Shcd8Z;s#1~trT#n036Bt& zg0$Nug%d%a*ws@MN;f8IylF9M8lXYxu1!`_xxOdTk^{XujY{I=S?(i^e6>_H1MDB~ z*AlfS9lMV=!iX7S^t#9uh+#TBuH4#&_9pgbKMX5*I0fYCG31KmL@zCSg!r;5jXw#t z(f{pZb(57zus0OvpJhm6l%k7F1obHjFeHIwg;42);KmO&Qw&r3Q~p-`TjEuP@`mjE zS>G@ozD=ac+2TB6Lvd?}wca(kHI6mjLq`gPn^xe5GwWZ%R>O~t*w*RR<=06(^JKMc z-xpXdR+ie(-%ER-Q&)<#YOqYGWRwprP#$}68*E%w_bz9e-J8Yx)Td!Hq>X+thubW7 z!ftA0%V0BiljsOWMIF!lVlWXR%vQ)s$_inFu{PwHl(S90VjHxPR+QPv+sLQQhuYeU zB1NAuXAD#18084&aEMCTR8^N(FI7|8;%rB3(yAU>N7d`w%2}^gk$-@}mzWMjeu;3D%bTEN zJe_>2-{iiruQ9B#tTEW>RH)ypK$LgtwL4tI&}a`D2{{QFK+@2+5F6I>){7Ms6}L^* zRgUW=t9{EjO51f|U;Qig^NPPbgcqAYE0)4LH_kbur0_O)zw?S?11fuxW-0*^EESqn zt^ZyiRE!|=tu7D39*83=k)J)mO=}Oz z9rlqO{&5eK9m?!&A2>Jb*CFce&bHUJSI}3W%(BdCif19cAO9e~A*)*1KCb^D!PX=F zkWsD>Hx@{1e|_(MR%cdJThwd3Iw^I+JWUPP1Fq=cPeDv7_f?h(&_(;2QT<16wxl5T z<8uwG38$>UzMUaiS6Qc2#3lO>s$f$>GtcVpr=>>xg+TwD?inGUz$~wa0bD^(0UM zze@liN{Z2raU{Gri+INSHC0mu>v_^Nzo(s2g3@NzPK&LJUGJ{r^&Z+yuj4)4$U|qK zeQ4q=qBmzJNL_!szUqyp5{gTRvy0bE4M?%P%lDul?GD>q0O z-4oTQmVB&+QEZcM(;SfWau}VlN7#d(7;`F1iqiD`mV*QZQm1^==7I2>C}|VK)6VPbSkkcao0?*= zvAxmeVQji$(ZSp6J%%2JpP9(Acw;*WF8kk|wU3pX)B?k?6syd)#NzLh)T(_>MvD5) znAhyt<<>`c3Pzav#yspEj_qzC@ZF)brC5)P+F6*}b2hh^a#(J0J lXfP)w*E3;R za+#n15MBsd=SYAKf6ZUW{!~@dhw>Qrn)2HEy(CfWNb{yT_jfLhKlME36ZP`_PkYBF zdRVF4F=1@`3nU2j{;S&O4$q2j=rL7In-4ZeHs>}9`%{Z8u5)MpllvTz9Vha;Gg!xt zQ@qBvFIZawThke@8P5ywMf0g6KMisY^?inGO5MgP zZB}f@fM)Q{mn*~pOoCd0+V*wPz%Tv)-SD-oQ}X3gZfX_G)0D{CpQO`wo^nCBq#o-O z92V#oS{Gb6x;eI)k7`WLZZAb#8es3x7RjqQgd5>(zWHFbVyCkphvO-T97I&K^o%ShC6!sF)j3Qi zMePOkC?{Xkene+Wq}S;dN3kM$@u)NW&+Y5knPO%2#ZFuV^tAui8 z6WXuqFz0a7q&QV*D!OIE@x`D=j~5B%V5c zr&vitS^1Y{5Ps{j0yOS1E?CTR_3mnLkVGA&>gZIm{=4;P*o(o@l|7|?Bo~XFUV#~_9CML?mUAoIj zU~m3S9(O}4Qvis#3jpvJ0Py$v2DbnpR2l%bT>wBO4**!8nUDJQ0pJ!ItgCGkhS^1o z`(nLV2fsFcFlu-rW`^gNKNjXUEzD3M?kV!z+D>=U2R|SbscWBFy&z4wB8n-F7>e39 zi&Id|?)lBFFX_v>CcWwR{(T%x8y%~uYO9faMNF>SS-bgZHP{P7IqX> zd>YPN=IQ50{o!0pmyAq4Mv&f{(6j_hT%eWpFPjkfA7k`p_#Y#ePts!ao>~%6I44~x zg0}wU0Pyt(BydV}yVO)De!?Imfm9aIC7`m_y{HlU=5hE^0Q@+#3%NHuH8ph{gmU6Z zI{`O|Ki`U{0!l3mm4em`@4&5zF?Xot1~jT#co~v7Z%ONy;3xCMM%rQII5y{WL?9{4NAw6`Ht~E3mcoJ3b5TCu%z`nKxL`8fjA7YI!|5IjPwRwzQq0 zuOJqfxYouui9@S}&CMs(xoHyINkyt(kVK@&+zzG<2@Pcf%G=x9a~D@L z1*)3F%^5a3#Y9IAJ)sPotgK5mC;cX#aYKP0Imw#H>|QTIy?)p zVe0o?5BkfkcSHlWu*}B26BfP4hk4`aQ1^vcJ6$vkFp z&u?q7NXvHSeZ1=$feHO)UDitIfr)g6VK$RqW2>satE+aXke;3;I@hSo=j`+OlzfTu z23K|UNt_O^YnJN*xuch|Mlmr zK~?W}z8r)Bhr@x*t*CaljX~PRnetnvu~AV`P=bY(A}N2^?pUEBWU-{CMru6>MbyP- z%XN(z2vg#`8nUjomCZMC6&eE4jmq|6PoMfHM{I0=)>&WlS}*$2gr!*`4EsE?dZ$<; z3iFS^eZ9;NV8Tvi@`p!)-8Z4Bw2}5SJhlIc!bK;{vI}KIsA&Bp+rS_`K0X@i=eJnN zelsj%QXgKuc;nCJ=4QWJuGS?()ZTAlarHZ_9WfR3`2o@LjjG{!Brni zrn`V0g0owB!;)~X*~1~V+^Q<8(Y{uliK3s=5jCRR5UIS`ZV-%4a3-%TeGG+Oo6xG+Xr6J4o0_%V%hmjrx|W~pcXZ9jQVA%R&#s`pomf- zz<;xCzvlS`g6e|J-4be0?>fC?VTkd$qfPh0UVN7RwSHE=TVP;lXv;DkMG&CP=(VZ_bTZXes6Zzbjn^*~Ha1RLh zhcfKyrP;Ln&hC73L(_b1dr_edBKK=S+gz#eaJA|rH8r&a;%0+hQ-0jP_si2wQ{ae;2hfBkV2RQH?&=w3)NXFup=zqtYcSkFwiUdJW&KY6nZ Apa1{> literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_A_dim.png b/res/screen-density-xhigh/T02_option_rep_A_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7d6103ced6921b4b0d2988d4b03a709ff0ebd8 GIT binary patch literal 4224 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 Q7V&^K)Ihxk{387S0J+)gegFUf literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_A_focus.png b/res/screen-density-xhigh/T02_option_rep_A_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..59674cbc5d253644a86a04af460a1320de4d7a31 GIT binary patch literal 4986 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 Eg85ZR7XSbN literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_A_press.png b/res/screen-density-xhigh/T02_option_rep_A_press.png new file mode 100644 index 0000000000000000000000000000000000000000..fd71f0221959315c5ac28fb20691a7d1bc73ff45 GIT binary patch literal 4160 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 F{U77m(Q^O* literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_all.png b/res/screen-density-xhigh/T02_option_rep_all.png new file mode 100644 index 0000000000000000000000000000000000000000..57a174526eba9096729cfc037e9080a8f90dfcc3 GIT binary patch literal 4295 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_all_dim.png b/res/screen-density-xhigh/T02_option_rep_all_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..ac21004fda5cf88a3770987e6b7f09839f9032fc GIT binary patch literal 4256 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_all_press.png b/res/screen-density-xhigh/T02_option_rep_all_press.png new file mode 100644 index 0000000000000000000000000000000000000000..27a5452b851dacdea63fbda869aae9731fe52e36 GIT binary patch literal 4209 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_section copy_dim.png b/res/screen-density-xhigh/T02_option_rep_section copy_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc97efdab5edbe1a4fd0fb0d0b8eef5d5704851 GIT binary patch literal 4242 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_rep_section copy_press.png b/res/screen-density-xhigh/T02_option_rep_section copy_press.png new file mode 100644 index 0000000000000000000000000000000000000000..61a589abdabb79bffb831ba27d198d69761e88d7 GIT binary patch literal 4247 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_shuffle_on.png b/res/screen-density-xhigh/T02_option_shuffle_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3141542ef9cee97b503a6c365d04f555f9b9d035 GIT binary patch literal 4296 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_shuffle_on_dim.png b/res/screen-density-xhigh/T02_option_shuffle_on_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..de946448362705489a1f41445d00f22f42e68bf4 GIT binary patch literal 4278 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 D!AcL7 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_shuffle_on_focus.png b/res/screen-density-xhigh/T02_option_shuffle_on_focus.png new file mode 100755 index 0000000000000000000000000000000000000000..19f974e372f2f7c8560d693a7e3d3e407af257c0 GIT binary patch literal 5522 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 NR28)p>gB8={s*R^Xv_cr literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_shuffle_on_press.png b/res/screen-density-xhigh/T02_option_shuffle_on_press.png new file mode 100644 index 0000000000000000000000000000000000000000..e85c0432247b5183274f4f30ecfe3a07ab0d452c GIT binary patch literal 4200 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 T-35|c1Ou8+^i*q9Y~K7Ixn#^_ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_option_volume_press.png b/res/screen-density-xhigh/T02_option_volume_press.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f65321b1a37db1b183edf169212242ce8b131f GIT binary patch literal 4633 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_player_line.png b/res/screen-density-xhigh/T02_player_line.png new file mode 100755 index 0000000000000000000000000000000000000000..a18fb42bf24f18fe858c49a4ae451a14dae8458e GIT binary patch literal 2801 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 Dh>I|O literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_player_progress_bar.png b/res/screen-density-xhigh/T02_player_progress_bar.png new file mode 100755 index 0000000000000000000000000000000000000000..a7bf3ca1ea838f0b02aa1530331bc809eaf8180f GIT binary patch literal 2808 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_title_icon_option.png b/res/screen-density-xhigh/T02_title_icon_option.png new file mode 100755 index 0000000000000000000000000000000000000000..e75b80abd8aa3623003fc7ab05a350c440917a45 GIT binary patch literal 3900 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 KMNUMnLSTaXenSZW literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_volume_icon_01.png b/res/screen-density-xhigh/T02_volume_icon_01.png new file mode 100755 index 0000000000000000000000000000000000000000..932d74b80b003ac1b9480f7666c95dc7585fde0a GIT binary patch literal 3685 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 D$Mxir literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_volume_icon_02.png b/res/screen-density-xhigh/T02_volume_icon_02.png new file mode 100755 index 0000000000000000000000000000000000000000..b6e01db55dc9280edebc9fdf43e1b1af9c111ab6 GIT binary patch literal 5201 zcmV-X6t3%uP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000SmNkl_S!-+7kH*#hfzjPi zs<9;)YPy&;q!LXvx@qZZtYnAAt)iActRc49qzZ^pKwRSoFlZD6b|}NZj5Ex<_xi`4 zJ2{Rc5fp69-sEN`@7#Od`JJzO&zX@_RmGbyGgnMO5!tfvPs0YEH(gq)n5B{rMw9_P{4 z*7i97BPmMvs^VN?E+MQip{1o|r!33;s?Pv0l>`l8LIeN^zIpRzrqk)XJUBRb!DKS6 z0x$sp z7IZqDm$|SzcI@~Nz(N2y1qB7a;(Tm2TRngu0SIT-eJKzDq+P>>3m2BT-R_6#FoU!_ zg#-}6uLof4?Cd3=1+P`snZEfwR6#Sv1IS+kZ$*&OphN37c zfO!C>G4~1vU?AgNC%KuSy{PKQ537Hs;bp${X2l^fytNRC| zEnT~IZ4}A=y{}s=mfxvkG!#Wq-EOxEU=e`i!otE89*@Vy*Bm@}a07r;0GR-mc6WE* z5VZF8_J7jeB^x(x+|2h~ym)atB@l!HnCNggYR3Uc7Jw80^GZugKX$v_17b~2PtP}$ z4CVt^Tvb)IU(noc_W%J|3}9(rUtgP`na$=30MooF)Z_7J$Md>gR8-W~+}vC#9z;b& zW#{MT$C3-VPoF;B=&dz$y0GHn;sgK+0OjGshc^Um!h{L40O$meAX%2j6bKbp3Y%(P zUS1_%vu@qGH2SJkR8&0jcszrGHfPS97(r`qZ*LXP!@|N61rRNOKv|YG;{?P5zzx8C z_3G9Bo}Qj&v1ZbwNwGp$07_q9Uz?yMBqYqFWT3RSw?F3A0-*J#T}4qeV+n!*kqO8U z0C!JMPb&kGK*xbfYrR8J6ls`pSF01}h^ngNQFW-G9jL3BEuc1ptv09BGC zzcso>qw#$%ja$u577_KfObV2ZMq|8KW3^hlcĠR?~Ub#-+yUe5q|t?i(lJ9kcr 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 DoqPSt literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/T02_volume_popup_bg.png b/res/screen-density-xhigh/T02_volume_popup_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7e323e81b12b966b90f0626ff684ef53c050e941 GIT binary patch literal 5520 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/blank_normal_background.png b/res/screen-density-xhigh/blank_normal_background.png new file mode 100755 index 0000000000000000000000000000000000000000..25271c73f2789b44afdc087ff5c9aebf2999085d GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaOClDyqr82*Fc zg1yTp14TFsJR*x37`TN&n2}-D90{Nxdx@v7EBhU80S*Cy>+R0pfkKict`Q~9`MJ5N zc_j?aMX8A;sVNHOnI#zt?w-B@;f;LaKt;TsE{-7_*OL=~0LW!!V2t~$Wd&q0c)I$z JtaD0e0s!i9D=Gj0 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/blank_pressed_background.png b/res/screen-density-xhigh/blank_pressed_background.png new file mode 100755 index 0000000000000000000000000000000000000000..a4a1da1ab292c53dc8d8fe2e3addf26473803ff8 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaMs(j9#r85lP9 zbN@+X1@buyJR*x382FBWFymBhK53vJTavfC3&Vd9T(EcfWS|IpiKnkC`yFlp4grDd z?atqULXst}5hc#~xw)x%B@E6*sfi`2DGKG8B^e6tp1uL$jeO!jMZBIajv*4^$t%{c b|Ig3BTFq2@-Z5(xP=dkJ)z4*}Q$iB}-oY}U literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/music_btn_back.png b/res/screen-density-xhigh/music_btn_back.png new file mode 100644 index 0000000000000000000000000000000000000000..d9162e64900a37e09ff5477928cb849089eb2b59 GIT binary patch literal 4814 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/music_btn_back_press.png b/res/screen-density-xhigh/music_btn_back_press.png new file mode 100644 index 0000000000000000000000000000000000000000..888e57f373deabba6f2c2578e095dde6bc6a69d0 GIT binary patch literal 5143 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 FV1oU!zykmP literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/music_play_grid_thumb_loading.png b/res/screen-density-xhigh/music_play_grid_thumb_loading.png new file mode 100755 index 0000000000000000000000000000000000000000..10bb7557cae5931bdac5ead81cb375c39be61f16 GIT binary patch literal 1145 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1SE5RJ;(=Ak|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+Sfo8&978H@y_u8g|H?t4b?Fw42=R~}O-@4z-=6>fuV?TW zYCYgv5!+a8BwW?m7`3b7_Pt^|0i$is&u5lrTPMH#@};CXO1G7RqoVakys4BX8G_Bw`sh@E$eP_%u z@dXo?FG#hJiJBH_;@}V<7Svk9^-tX76mvm}gT2L$u+^4*#&i9Oc{qys`VVAi7yq1c;v4M~4 z)A}RKE(;k{_iETdM>^UEf#@w z6Z{X(Jw4m|P}9#7Spo}vuYYA?I`qM9@x;toMSmu>`X^e2OC0wx-SyYlVQ<{}+i#m% z`xQP}a7#2FVBLOqTdwh0{pq?#tX6QC3eMLM5?~aBp+FWF2RNz>d({6Z!;wYAe`n<4 z6&hVJ>8jI3eAR?+Z__f+g1v)EYXJ)gPEQid-+ zF0SZj9FMSEy;1hoS&0(t?CiVN>2GW9P}{P3b8$(@6lsSY7v8>oyLPRv&(>9|7Cg2% zcl`MA3Y%&92d_zaZoc`Z#Oj6a4}%}Et0H}TPsQ=^^BXR?dp9=bqY?)The1_EMMYJW z(*us14?lkVc=M)Y&JqqssmV1(MNAIf;VDhBGK_Yc_V53nyDgkEt%Gl~gF2&w#Gj)_ zkM{R5_;83R{uOaQypnV^flzW(Ic*~-rOWnC{{v??w8_2-Yx$En^$<&Im5CkhM2 z3oksvX*+THSGMJwPh?8pRB&z(C|R5<@nd4FiG#;<4JqRieKGZ*9qV>y?e~20NhtK| z?c3393`cLKef;^evtr{H{~hfe57Z9S*4OtJ8?$im$-i~sVGG`S$|oUa{rdH-jAf+<(7b)R(Qhr#BT8vmbu>wJNh^-u_6_bN>Tbr0x`Kzx~#rhkogC%+pb8rzJ`pEcY*PyKpdPy=!{r*B_^~Qx@-@QNNR8SBJY1*N;@W zTMs!hWcrT-`6B)O{re3bM%LU>WHxg+q5I~?6jdQ7W+he`#u-JsB6E}vs&_dgaQ=KZ zAzou8gV+1U!}~?=cf*q)kb#m4MHpMJ%QLbu$O{B=Y}m9?0a%tWc)I$ztaD0e0su8^ B?v4Ne literal 0 HcmV?d00001 diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..f1cffdd --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..e369e4c --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..0f837d5 --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..3e8fc67 --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..51e1935 --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..6b110bd --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..abf554e --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..22eb4fc --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..1a34a9b --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..b732da3 --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_ALBUM_INFO_PANEL.xml b/res/screen-size-normal/IDL_ALBUM_INFO_PANEL.xml new file mode 100644 index 0000000..82f8fb0 --- /dev/null +++ b/res/screen-size-normal/IDL_ALBUM_INFO_PANEL.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..d7688b9 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..7eebdbd --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..255152c --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..d870b22 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..bf416d4 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_DELETE_POPUP.xml b/res/screen-size-normal/IDL_CONTENTS_DELETE_POPUP.xml new file mode 100644 index 0000000..eb00064 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_DELETE_POPUP.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_DETAIL_FORM.xml b/res/screen-size-normal/IDL_CONTENTS_DETAIL_FORM.xml new file mode 100755 index 0000000..cbb9e8d --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_DETAIL_FORM.xml @@ -0,0 +1,87 @@ + + + + + 720 +
    + + + + +
    + + +
    + + + + + + + + + + + + + + +
    diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..0f7d79d --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..bc4f49a --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..337626d --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..07e5eff --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..5b72c09 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..0f112b1 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..ead2936 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..798b4a3 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..6f867a1 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..9ba41b7 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_PANEL.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_PANEL.xml new file mode 100644 index 0000000..f84ac4b --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_EDITOR_PANEL.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..2e4a9d7 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..820834c --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..d87a1a5 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..518c8c1 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..7a7e141 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT.xml new file mode 100644 index 0000000..96b89d1 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..ee30a46 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..b22967c --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..931b57e --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..05578ee --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,34 @@ + + + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..3b90235 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..eb6e9de --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..425b740 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..b19ac30 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..904e76a --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENTS_UPDATE_POPUP.xml b/res/screen-size-normal/IDL_CONTENTS_UPDATE_POPUP.xml new file mode 100644 index 0000000..b082e1f --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENTS_UPDATE_POPUP.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_FORM.xml b/res/screen-size-normal/IDL_CONTENT_FORM.xml new file mode 100644 index 0000000..97648d9 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_FORM.xml @@ -0,0 +1,22 @@ + + + + + + 720 +
    + + + + +
    + + +
    +
    + + +
    +
    diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_ALL_LIST_PANEL.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_ALL_LIST_PANEL.xml new file mode 100644 index 0000000..c50138a --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_ALL_LIST_PANEL.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_COMMON_PANEL.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_COMMON_PANEL.xml new file mode 100644 index 0000000..0ab0cef --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_COMMON_PANEL.xml @@ -0,0 +1,37 @@ + + + + 720 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..3878cde --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..60a4441 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..e84eb92 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..dcfaf96 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..d7e6a31 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..2908f78 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..5720f00 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..eb61189 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..5176740 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..726392d --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_ALBUM_INFO_PANEL.xml b/res/screen-size-normal/IDL_CONTENT_LIST_ALBUM_INFO_PANEL.xml new file mode 100644 index 0000000..4cb6368 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_ALBUM_INFO_PANEL.xml @@ -0,0 +1,42 @@ + + + + 720 + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_EDITOR_GROUPITEM_PANEL.xml b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_EDITOR_GROUPITEM_PANEL.xml new file mode 100644 index 0000000..dd52be3 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_EDITOR_GROUPITEM_PANEL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_FORM.xml b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_FORM.xml new file mode 100644 index 0000000..5694081 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_FORM.xml @@ -0,0 +1,46 @@ + + + + + 720 +
    + + + + +
    + + +
    +
    + + +
    + + + + + + + + + + + + + +
    diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL.xml b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL.xml new file mode 100644 index 0000000..14f33e3 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..64e4b38 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..7e6a978 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..9d1314c --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..795656a --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..079a20f --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..25b9b94 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..1b9b039 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..c757111 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..34b79cd --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..67d9a11 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_LIST_FORM.xml b/res/screen-size-normal/IDL_CONTENT_LIST_FORM.xml new file mode 100644 index 0000000..eb5a156 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_LIST_FORM.xml @@ -0,0 +1,51 @@ + + + + + 720 +
    + + + + +
    + + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + +
    diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..dfdb0b1 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100755 index 0000000..021ae4b --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..f31b456 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..0bb50ea --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..7d342a3 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..e15a720 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..8e40e18 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..b7a3c2b --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..a631d51 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL.xml b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL.xml new file mode 100644 index 0000000..610c7c2 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL.xml @@ -0,0 +1,24 @@ + + + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CONTEXT_ITEM_PLAYALL_ADDTO.xml b/res/screen-size-normal/IDL_CONTEXT_ITEM_PLAYALL_ADDTO.xml new file mode 100644 index 0000000..8072e01 --- /dev/null +++ b/res/screen-size-normal/IDL_CONTEXT_ITEM_PLAYALL_ADDTO.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_CREATE_PLAYLIST_POPUP.xml b/res/screen-size-normal/IDL_CREATE_PLAYLIST_POPUP.xml new file mode 100755 index 0000000..09f42d1 --- /dev/null +++ b/res/screen-size-normal/IDL_CREATE_PLAYLIST_POPUP.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_GROUPEDTABLEVIEW_ITEM_PANEL.xml b/res/screen-size-normal/IDL_GROUPEDTABLEVIEW_ITEM_PANEL.xml new file mode 100644 index 0000000..40a9cbd --- /dev/null +++ b/res/screen-size-normal/IDL_GROUPEDTABLEVIEW_ITEM_PANEL.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_MINI_PLYAER_PANEL.xml b/res/screen-size-normal/IDL_MINI_PLYAER_PANEL.xml new file mode 100644 index 0000000..f1e89cb --- /dev/null +++ b/res/screen-size-normal/IDL_MINI_PLYAER_PANEL.xml @@ -0,0 +1,57 @@ + + + + 720 + + + + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL.xml b/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL.xml new file mode 100644 index 0000000..4e53955 --- /dev/null +++ b/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL.xml b/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL.xml new file mode 100644 index 0000000..29dcd55 --- /dev/null +++ b/res/screen-size-normal/IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_MUSIC_PLAYER_FORM.xml b/res/screen-size-normal/IDL_MUSIC_PLAYER_FORM.xml new file mode 100644 index 0000000..acd670f --- /dev/null +++ b/res/screen-size-normal/IDL_MUSIC_PLAYER_FORM.xml @@ -0,0 +1,94 @@ + + + + + + 720 +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/res/screen-size-normal/IDL_NOTIFICATION_TICKER_PANEL.xml b/res/screen-size-normal/IDL_NOTIFICATION_TICKER_PANEL.xml new file mode 100644 index 0000000..9b9b515 --- /dev/null +++ b/res/screen-size-normal/IDL_NOTIFICATION_TICKER_PANEL.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + diff --git a/res/screen-size-normal/IDL_PLAYLIST_CREATOR_FORM.xml b/res/screen-size-normal/IDL_PLAYLIST_CREATOR_FORM.xml new file mode 100644 index 0000000..b35ad4a --- /dev/null +++ b/res/screen-size-normal/IDL_PLAYLIST_CREATOR_FORM.xml @@ -0,0 +1,29 @@ + + + + + + 720 +
    + + + + +
    + + + + +
    +
    + + +
    + + + + + +
    diff --git a/res/screen-size-normal/IDL_PLAYLIST_RENAME_FORM.xml b/res/screen-size-normal/IDL_PLAYLIST_RENAME_FORM.xml new file mode 100644 index 0000000..212f612 --- /dev/null +++ b/res/screen-size-normal/IDL_PLAYLIST_RENAME_FORM.xml @@ -0,0 +1,29 @@ + + + + + + 720 +
    + + + + +
    + + + + +
    +
    + + +
    + + + + + +
    diff --git a/res/screen-size-normal/IDL_SETTING_FORM.xml b/res/screen-size-normal/IDL_SETTING_FORM.xml new file mode 100644 index 0000000..1b54e01 --- /dev/null +++ b/res/screen-size-normal/IDL_SETTING_FORM.xml @@ -0,0 +1,22 @@ + + + + + 720 +
    + + + + +
    + + +
    + + + + + +
    diff --git a/res/screen-size-normal/IDL_SETTING_OFF_SET_ITEM_PANEL.xml b/res/screen-size-normal/IDL_SETTING_OFF_SET_ITEM_PANEL.xml new file mode 100644 index 0000000..0bca1b3 --- /dev/null +++ b/res/screen-size-normal/IDL_SETTING_OFF_SET_ITEM_PANEL.xml @@ -0,0 +1,27 @@ + + + + 720 + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SETTING_PLAYLIST_SET_ITEM_PANEL.xml b/res/screen-size-normal/IDL_SETTING_PLAYLIST_SET_ITEM_PANEL.xml new file mode 100644 index 0000000..4d5f6e7 --- /dev/null +++ b/res/screen-size-normal/IDL_SETTING_PLAYLIST_SET_ITEM_PANEL.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SET_AS_POPUP.xml b/res/screen-size-normal/IDL_SET_AS_POPUP.xml new file mode 100755 index 0000000..11f5ac6 --- /dev/null +++ b/res/screen-size-normal/IDL_SET_AS_POPUP.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SHARE_VIA_POPUP.xml b/res/screen-size-normal/IDL_SHARE_VIA_POPUP.xml new file mode 100644 index 0000000..1355bb9 --- /dev/null +++ b/res/screen-size-normal/IDL_SHARE_VIA_POPUP.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..0f1fece --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..79bcb39 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..8520028 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..328e3e1 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT.xml new file mode 100644 index 0000000..61abb1d --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..17264c0 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..72da3a6 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..ba175de --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,22 @@ + + + + 720 + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..8121dc2 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..e370bbf --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..fe4743a --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..fe161ce --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,32 @@ + + + + 720 + + + + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT.xml new file mode 100644 index 0000000..9a245c6 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT.xml new file mode 100644 index 0000000..1249f2a --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE.xml new file mode 100644 index 0000000..f0a2081 --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + diff --git a/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE.xml b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE.xml new file mode 100644 index 0000000..fa1bf2a --- /dev/null +++ b/res/screen-size-normal/IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE.xml @@ -0,0 +1,17 @@ + + + + 720 + + + + + + + diff --git a/res/slk-SK.xml b/res/slk-SK.xml new file mode 100644 index 0000000..453f358 --- /dev/null +++ b/res/slk-SK.xml @@ -0,0 +1,221 @@ + + + + Roky + Reč + Náhlavná súprava BT + 1 vybratá položka + Typ + Stará + Skladateľ + Odstrániť? + Správy + Album + Už pridané + SoundAlive + Nálady + Piesne + Umiestnenie + Uložiť ako zoznam skladieb + Dynamický + Zoznam skladieb sa nedá premenovať + Rock + Zdieľať cez + Nastavenia hudby + Posledne pridané + Automatické vypnutie hudby + Interpreti + Nedá sa nastaviť ako vyzváňací tón + Pri používaní 5.1-kanálového zvuku sa nedajú zmeniť zvukové efekty + Zoznamy skladieb + Vytvoriť zoznam skladieb + Klasika + Preposlanie + Rock + Vytvoriť zoznam skladieb + Informácie o médiách + Moje priečinky + Obal albumu + Odstrániť? + Podcasty + Po 1 hodine + Zvýraznenie basov + Široký + Prehrávač hudby + Kaviareň + Upraviť + Tanec + 5.1-kanálový zvuk môžete aktivovať iba po vypnutí zvukových efektov + Počet použití k dispozícii + Číslo skladby + Žiadne priečinky + Pridať do zoz. prehr. + Autor + Interpret + Pridať + Pridať zoznam skladieb + Zobraz. priečin. + Platnosť + Vášeň + Hudobné menu + Formát + Vášnivá + Slúchadlá + Zvýraznenie výšok + Pop + Nepoužité + Neznáma + Vybrali ste maximálny počet položiek (%d) + Zvonenie volajúceho + Skladby: %d + Dirigen. + B + Odstránené + Obľúbené + Virtuálny 7.1-kanálový zvuk + Položka sa nedá odstrániť + Najčastejšie prehrávané + Normál. + Nič nie je vybrané + Popis + Wha-wha + Naživo + Veľkosť + Všetko + Formát + E-mail + Odstrániť + Pridať do + Dátum vytvorenia + Naživo + 5,1-kanálový zvukový efekt funguje iba v režime slúchadiel + Albumy + Všetky piesne + Vytvoriť + Zdieľať + Žiadne zoznamy skladieb + Vlastné + Premenovať + Použitím funkcie AllShare môžete prenášať hudbu cez streaming do zariadení + Posledne prehrávané + Sprievodca nastavením hudby + Zvýraznenie basov + Možné + Pridané do %s + Počas hovoru sa nedá prehrávať + Názov je príliš dlhý + Upraviť názov + Nedá sa získať značka + Poďakovanie + Zvonenie hovoru + Pop + Nastaviť ako + Žiadne albumy + Klasika + Správa + Roky + Nemožné + Diskografia + Zoznam skladieb sa nedá vytvoriť + Aktualizácia... + Používateľ + Rodičovské hodnotenie + Po 2 hodinách + Vyberte zariadenie + Ekvalizér + Nastaviť + Prejsť do knižnice + Uložiť + Zdieľať + Jazz + Albumy + Zastaviť + Nastaviť ako + Po 15 min. + Text + Žiadni interpreti + House + Hľadať značku + Jazz + Zrušiť + Po 1 hodine a 30 minútach + Žiadne položky + Tremolo + Nedá sa prehrať. Nepodporovaný typ súboru + História + Vybrať všetky + Súbor DRM sa nedá zdieľať + Aktualizácia knižnice + Zoznam skladieb + Dĺžka skladby + Žánre + Radosť + Priečinky + Odstrániť + Zmeniť os + Žiadny text + Pridať + Vybraté položky: %d + Pridať na úv. obrazovku + %s bol odstránený + Hudobný blok + Skladatelia + Aktualizovať knižnicu? + Životopis + Zmeniť poradie + Zavrieť + Žiadne skladby + Pokojný + Tento zvukový efekt funguje iba v režime slúchadiel a v režime náhlavnej súpravy Bluetooth + Nedá sa pridať + Autorské práva + Tón budíka + Už nezobrazovať + 1 skladba + Prehrať všetko + Nedá sa vymazať. Vybratá hudba sa prehráva + Normálny + Sklad. + Pridané + Prezrieť + Externalizácia + Odstrániť + Vyp. + Dokončené + Posledne prehrávané + Zoznam skladieb + Vybraný zoznam je prázdny + Všetko + Nedá sa prehrať. Vyskytla sa chyba + Prekročil sa maximálny počet súborov + Čistota hudby + Roky + Žánre + Nastaviť ako + Po 30 min. + Zoznamy skladieb + Efekt + Podrobnosti + Nastavenia + Tanec + Vysoká hlasitosť môže pri dlhodobom počúvaní poškodiť sluch + Reproduk. + Vybrané + Bluetooth je odpojený + Zbor + O. z. skl. + Hľadať + Automaticky + Meno + Nemôžete pridať viac hudobných súborov ako %d + Nedostatok hudobných súborov na prehrávanie v Hudobnom bloku. Vyžadujú sa hudobné súbory v počte aspoň %d + Albumy + Zobr. ako + 5,1-kanálový + Informácie o médiách + Žáner + Dynamické + Pridať do zoznamu skladieb + diff --git a/res/slv-SI.xml b/res/slv-SI.xml new file mode 100644 index 0000000..7326ed2 --- /dev/null +++ b/res/slv-SI.xml @@ -0,0 +1,221 @@ + + + + Leta + Vokal + Slušalke BT + 1 predmet je izbran + Vrsta + Staro + Skladatelj + Izbrišem? + Sporočanje + Album + Že dodano + SoundAlive + Razpoloženja + Skladbe + Lokacija + Shrani kot seznam predvajanja + Dinamično + Seznama za predvajanje ni mogoče preimenovati + Rock + Souporaba preko + Glasbene nastavitve + Dodano pred kratkim + Samodejna izklj. glasbe + Izvajalci + Ni mogoče nastaviti za melodijo zvonjenja + Med uporabo postaje 5.1 ni mogoče spremeniti zvočnih učinkov + Seznami predvajanja + Ustvari seznam predvajanja + Klasično + Posredovanje + Rock + Ustvari seznam predvajanja + Informacije o mediju + Moje mape + Slika albuma + Odstranim? + Spletne oddaje + Čez 1 uro + Izboljšani basi + Široko + Predvajalnik glasbe + Barska + Uredi + Ples + Postajo 5.1 lahko vklopite samo, če so zvočni učinki izklopljeni + Število uporab + Številka skladbe + Ni map + Dodaj na seznam + Avtor + Izvajalec + Dodaj + Dodaj seznam predvajanja + Pogled mape + Veljavnost + Strast + Glasbeni meni + Formatiraj + Strastna + Slušalke + Poudari visoke tone + Pop + Ni v uporabi + Neznano + Izbrano je največje število elementov (%d) + Melodija kličočega + %d skladb + Dirigent + Bajt + Odstranjeno + Priljubljene + Zvočna kartica Virtual 7.1 ch + Predmeta ni mogoče odstraniti + Najpogosteje predvajano + Normalno + Nič ni izbrano + Opis + Va-va + V živo + Velikost + Vse + Format + E-pošta + Odstrani + Dodaj v + Datum ustvarjanja + V živo + 5.1-kanalni zvočni učinek deluje samo v načinu slušalk + Albumi + Vse skladbe + Ustvari + Soupor. + Ni seznama predvajanja + Po meri + Preimenuj + S programom AllShare lahko svojo glasbo pretočno predvajate v napravah + Nazadnje predvajano + Čarovnik za nastavitev glasbe + Poudari base + Mogoče + Dodano v %s + Ni mogoče predvajati med klicem + Ime je predolgo + Uredi naslov + Ni mogoče pridobiti oznake + Zasluge + Zvonjenje za klic + Pop + Nastavi kot + Ni albumov + Klasično + Sporočilo + Let + Nemogoče + Diskografija + Seznama za predvajanje ni mogoče ustvariti + Posodabljam... + Uporabnik + Starševska ocena + Čez 2 uri + Izberite napravo + Izenačevalnik + Nastavi + Pojdi v knjižnico + Shrani + Souporab. + Jazz + Albumi + Ustavi + Nastavi kot + Po 15 min + Besedilo + Ni izvajalcev + House + Poišči oznako + Jazz + Prekliči + Po 1 h in 30 min + Ni predmetov + Tremolo + Predvajanje ni mogoče. Nepodprta vrsta datoteke + Zgodovina + Izberi vse + Datoteke DRM ni mogoče souporabljati + Posodobitev knjižnice + Seznam skladb + Dolžina skladbe + Zvrsti + Veselje + Mape + Izbriši + Spremeni os + Ni besedila + Dodaj + %d predmetov izbranih + Dodaj na domači zaslon + %s je odstranjeno + Glasbeni kotiček + Skladatelji + Posodobim knjižnico? + Življenjepis + Spremeni zaporedje + Zapri + Ni skladb + Umirjen + Ta zvočni učinek deluje samo v načinu slušalk in v načinu slušalk Bluetooth + Ni mogoče dodati. + Avtorske pravice + Ton alarma + Ne kaži več + 1 skladba + Predvajaj vse + Ni mogoče zbrisati. Izbrana glasba se predvaja + Normalno + Sklad. + Dodano + Pregled + Eksternalizacija + Izbriši + Izključ. + Uspeh + Nazadnje predvajano + Seznam predvajanja + Izbrani seznam je prazen + Vse + Ni mogoče predvajati. Prišlo je do napake + Največje dovoljeno število datotek je preseženo + Jasnost glasbe + Leta + Zvrsti + Nastavi kot + Čez 30 minut + Sezn.predvajanja + Učinek + Podrobnosti + Nastavitve + Ples + Če glasno glasbo poslušate daljši čas, lahko to škoduje vašem sluhu + Zvočnik + Izbrano + Povezava Bluetooth je prekinjena + Zbor + Od.sez. + Iskanje + Samodejno + Ime + Ni mogoče dodati več kot %d glasbenih datotek + Ni dovolj glasbenih datotek za predvajanje v glasbenem kotičku. Zahtevanih je vsaj %d glasbenih datotek + Albumi + Prik. kot + 5.1-kanalno + Informacije o mediju + Zvrst + Dinamično + Dodaj na seznam predvajanja + diff --git a/res/spa-ES.xml b/res/spa-ES.xml new file mode 100644 index 0000000..c174526 --- /dev/null +++ b/res/spa-ES.xml @@ -0,0 +1,221 @@ + + + + Años + Vocal + Auricular BT + 1 elemento seleccionado + Tipo + Antiguo + Compositor + ¿Eliminar? + Mensajes + Álbum + Ya se ha añadido + SoundAlive + Estado + Canciones + Ubicación + Guardar como lista de reproducción + Dinámico + No se puede cambiar el nombre de la lista de reproducción + Rock + Compartir + Configuración de música + Añadidas recientemente + Música automática desactivada + Artistas + No se puede definir como melodía + No se pueden cambiar los efectos de sonido con el canal 5.1 en uso + Listas de reproducción + Crear lista de reproducción + Clásica + Reenviando + Rock + Crear lista de reproducción + Info multimedia + Mis carpetas + Álbum artístico + ¿Eliminar? + Podcasts + Después de 1 hora + Mejora de bajos + Amplio + Reproductor de música + Café + Editar + Dance + El canal 5.1 sólo puede activarse con efectos de sonido desactivados + Usos disponibles + Número de pista + No hay carpetas + Añadir a lista repr + Autor + Artista + Añadir + Añadir lista reproducción + Vista carpetas + Validez + Pasión + Menú de música + Formatear + Apasionado + Auriculares + Ecualizar agudos + Pop + No usado + Desconocido + Número máximo de elementos (%d) seleccionados + Melodía del llamante + %d canciones + Directores + Byte + Eliminado + Favoritos + Canales 7.1 virtuales + No se puede quitar elemento + Las más escuchadas + Normal + No se ha seleccionado nada + Descripción + Wha-wha + Live + Tamaño + Todos + Formato + Correo electrónico + Eliminar + Añadir a + Fecha de creación + Live + El efecto de sonido del canal 5.1 sólo funciona en modo auricular + Álbumes + Todas las canciones + Crear + Compartir + Sin listas de reproducción + Personalizar + Renombrar + Puede transmitir su música en dispositivos usando AllShare + Reproducidas recientemente + Asistente para la configuración de música + Ecualizar graves + Posible + Añadido a %s + No se puede reproducir durante la llamada + Nombre demasiado largo + Editar título + No se puede obtener etiqueta + Créditos + Melodía de llamada + Pop + Definir como + No hay álbumes + Clásica + Mensajes + Años + Imposible + Discografía + No se puede crear la lista de reproducción + Actualizando... + Usuario + Clasificación parental + Después de 2 horas + Seleccione dispositivo + Ecualizador + Aceptar + Ir a biblioteca + Guardar + Compartir + Jazz + Álbumes + Parar + Definir como + Después de 15 min + Letra + Ningún artista + House + Buscar etiqueta + Jazz + Cancelar + Después de 1 hora 30 min + Ningún elemento + Trémolo + No se puede reproducir. Tipo de archivo no admitido + Historial + Seleccionar todo + No se puede compartir el archivo DRM + Actualizar biblioteca + Lista de pistas + Duración de pista + Géneros + Alegría + Carpetas + Eliminar + Cambiar eje + Sin letra + Añadir + %d elementos seleccionados + Añadir a inicio + %s eliminado + Music square + Compositores + ¿Actualizar biblioteca? + Biografía + Reordenar + Cerrar + Ninguna canción + Tranquilo + Este efecto de sonido sólo funciona en los modos de auricular y auricular Bluetooth + No se puede añadir + Copyright + Tono de alarma + No mostrar de nuevo + 1 canción + Reproducir todo + Imposible eliminar. La canción seleccionada se está reproduciendo + Normal + Composit + Añadido + Revisar + Externalización + Eliminar + Desactivado + Finalizado + Reproducidas recientemente + Lista de reproducción + Lista seleccionada vacía + Todos + No se puede reproducir. Se ha producido un error + Alcanzado el número máximo de archivos + Claridad de la música + Años + Géneros + Definir como + Después de 30 min + Listas reproducc + Efecto + Detalles + Ajustes + Dance + El volumen alto durante un tiempo prolongado puede dañar sus oídos + Altavoz + Seleccionado + Bluetooth desconectado + Coros + Ab ls rep + Buscar + Automático + Nombre + No se pueden añadir más de %d archivos de música + No hay suficientes archivos de música para reproducir en Music square. Hacen falta al menos %d + Álbumes + Ver como + Canal 5.1 + Info multimedia + Género + Dinámico + Añadir a lista de reproducción + diff --git a/res/spa-MX.xml b/res/spa-MX.xml new file mode 100644 index 0000000..c117464 --- /dev/null +++ b/res/spa-MX.xml @@ -0,0 +1,221 @@ + + + + Años + Vocal + Auricular Bluetooth + 1 elemento seleccionado + Tipo + Anterior + Compositor + ¿Eliminar? + Mensajes + Álbum + Ya añadido + SoundAlive + Estado + Canciones + Ubicación + Guardar como lista de reproducción + Dinámico + No se puede renombrar la lista de reproducción + Rock + Compartir vía + Configuración de música + Añadidas recientemente + Desactivación automática de música + Artistas + No se puede definir como melodía + No se pueden cambiar los efectos de sonido con el canal 5.1 en uso + Listas de reproducción + Crear lista de reproducción + Clásica + Reenvío + Rock + Crear lista de reproducción + Información multimedia + Mis carpetas + Portada del álbum + ¿Eliminar? + Podcasts + Después de 1 hora + Mejora de bajos + Amplio + Reproductor de Música + Café + Editar + Dance + El canal 5.1 solo puede activarse con efectos de sonido desactivados + Usos disponibles + Número de pista + No hay carpetas + Añadir a lista reprod + Autor + Artista + Añadir + Añadir lista de reproducción + Ver por carpetas + Validez + Pasión + Menú del Reproductor de Música + Formatear + Apasionado + Auricular + Ecualizar agudos + Pop + Sin utilizar + Desconocido + Número máximo de elementos (%d) seleccionados + ID del llamante + %d canciones + Directores + Byte + Eliminado + Favoritos + Virtual 7.1 ch + No se puede eliminar el elemento + Más reproducidas + Normal + No se ha seleccionado nada + Descripción + Wha-wha + En vivo + Tamaño + Todo + Formato + Correo + Eliminar + Añadir a + Fecha de creación + En vivo + El efecto de sonido del canal 5.1 sólo funciona en modo auricular + Álbumes + Todas las canciones + Crear + Compartir + Vacío + Personalizar + Renombrar + Puede transmitir su música a dispositivos mediante AllShare + Reproducidas recientemente + Asistente de configuración de música + Ecualizar graves + Posible + Añadido a %s + No se puede reproducir durante la llamada + Nombre demasiado largo + Editar título + No se puede obtener etiqueta + Créditos + Tono de llamada + Pop + Definir como + No hay álbumes + Clásica + Mensaje + Años + Imposible + Discografía + No se puede crear la lista de reproducción + Actualizando... + Usuario + Evaluar pista + Después de 2 horas + Seleccionar dispositivo + EQ + Definir + Ir a biblioteca + Guardar + Compartir + Jazz + Álbumes + Detener + Definir como + Después de 15 min. + Letra + Vacío + House + Buscar etiq. + Jazz + Cancelar + Después de 1 hora 30 min. + Ningún elemento + Trémolo + No se puede reproducir. Tipo de archivo no soportado + Historial + Todo + No se puede compartir el archivo DRM + Actualización de biblioteca + Lista de pistas + Duración + Géneros + Alegría + Carpetas + Eliminar + Cambiar eje + Sin letra + Añadir + %d elementos seleccionados + Añadir a inicio + %s eliminado + Cuadro musical + Compositores + ¿Actualizar biblioteca? + Biografía + Reordenar + Cerrar + Vacío + Tranquilo + Este efecto de sonido sólo funciona en los modos de auricular y auricular Bluetooth + No se puede añadir + Copyright + Tono de alarma + No mostrar de nuevo + 1 canción + Reproducir todo + No se puede eliminar. La canción seleccionada se está reproduciendo + Normal + Composi. + Añadido + Revisar + Externalización + Eliminar + Desactivado + Exitoso + Reproducidas recientemente + Lista de reproducción + Lista seleccionada vacía + Todo + No se puede reproducir. Se ha producido un error + Se ha excedido el número máximo de archivos + Claridad de música + Años + Géneros + Definir como + Después de 30 min. + List reproducc + Efectos + Detalles + Configuración + Dance + Volúmenes elevados pueden dañar su oído si los escucha durante un tiempo prolongado + Altavoz + Seleccionado + Bluetooth desactivado + Coros + Abr lista rep + Buscar + Automático + Nombre + No se pueden añadir más de %d archivos de música + No hay suficientes archivos de música para reproducir. Se necesitan al menos %d archivos de música. + Álbumes + Ver como + Canal 5.1 + Información multimedia + Género + Dinámico + Añadir a lista de reproducción + diff --git a/res/srp-RS.xml b/res/srp-RS.xml new file mode 100644 index 0000000..65af3c9 --- /dev/null +++ b/res/srp-RS.xml @@ -0,0 +1,221 @@ + + + + Godine + Vokalna + Bluetooth slušalica + 1 stavka izabrana + Tip + Stara + Kompozitor + Obriši? + Poruke + Album + Već dodato + SoundAlive + Raspoloženja + Pesme + Lokacija + Sačuvaj kao listu za reprodukciju + Dinamičan + Nemoguće preimenovati listu za reprodukciju + Rok + Podeli putem + Podešavanja muzike + Nedavno dodato + Muzika automatski isključena + Umetnici + Nemoguće postaviti kao ton zvona + Nije moguće menjati zvučne efekte kad se koristi 5.1-kanalni sistem + Liste za reprodukciju + Kreiraj listu za reprodukciju + Klasika + Prosleđivanje + Rok + Kreiraj listu za reprodukciju + Informacije o mediju + Moji folderi + Omoti albuma + Ukloni? + Podkasti + Nakon jednog sata + Pojačanje basova + Široko + Muzički plejer + Kafić + Izmeni + Dens + 5.1-kanalni sistem se može uključiti samo kad su zvučni efekti isključeni + Moguće upotrebe + Broj numere + Nema foldera + Dodaj u listu za repr. + Autor + Umetnik + Dodaj + Dodaj listu za reprodukciju + Prikaz foldera + Važenje + Strast + Muzički meni + Format + Strastvena + Slušalice + Pojačanje visokih tonova + Pop + Ne koristi se + Nepoznato + Izabran maksimalan broj stavki (%d) + Ton zvona pozivaoca + %d pesama + Dirigenti + bajta + Uklonjeno + Omiljeni + Virtuelni 7.1 kanal + Nemoguće ukloniti stavku + Najčešće puštano + Normalan + Ništa nije izabrano + Opis + Va-va + Uživo + Veličina + Sve + Format + E-pošta + Ukloni + Dodaj u + Datum kreiranja + Uživo + 5.1-kanalni zvuk je dostupan samo u režimu slušalice + Albumi + Sve pesme + Kreiraj + Podeli + Nema listi za reprodukciju + Prilagođeno + Preimenuj + Možeš strimovati muziku na uređaju pomoću AllShare-a + Nedavno puštano + Konfiguracioni čarobnjak za muziku + Pojačanje basova + moguće + Dodato u %s + Nemoguće reprodukovati tokom poziva + Ime predugačko + Izmeni naslov + Nemoguće dobiti oznaku + Zahvalnice + Ton zvona + Pop + Postavi kao + Nema albuma + Klasika + Poruka + Godina + Nemoguće + Diskografija + Nemoguće kreirati listu za reprodukciju + Ažuriranje... + Korisnik + Roditeljski rejting + Nakon 2 sata + Izaberi uređaj + Ekvilajzer + Podesi + Idi u biblioteku + Sačuvaj + Podeli + Džez + Albumi + Prekini + Postavi kao + Nakon 15 min. + Stihovi + Nema izvođača + Haus + Nađi oznaku + Džez + Poništi + Nakon jednog sata i 30 minuta + Nema stavki + Tremolo + Nemoguće reprodukovati. Nepodržani tip fajla + Istorija + Izaberi sve + Nemoguće deliti DRM fajl + Ažuriranje biblioteke + Lista numera + Dužina numere + Žanrovi + Radost + Folderi + Obriši + Promeni osu + Nema stihova + Dodaj + %d stavke/i označene/o + Dodaj na početnu + %s uklonjeno + Muzički kvadrat + Kompozitori + Ažuriraj biblioteku? + Biografija + Preuredi + Zatvori + Nema pesama + Miran/na + Ovaj zvučni efekat je dostupan samo u režimu slušalice i režimu Bluetooth slušalica + Nemoguće dodati + Autorska prava + Ton alarma + Ne prikazuj ponovo + 1 pesma + Preslušaj sve + Nemoguće obrisati. Izabrana muzika se reprodukuje + Normalno + Kompoz. + Dodato + Pregled + Eksternalizacija + Obriši + Isključ. + Uspeh + Nedavno puštano + Lista za reprodukciju + Izabrana lista je prazna + Sve + Nemoguće reprodukovati. Nastala je greška + Dostignut je maksimalan broj fajlova + Razgovetnost muzike + Godine + Žanrovi + Postavi kao + Nakon 30 min + Liste za reprod. + Efekat + Detalji + Podešavanja + Dens + Velika jačina zvuka može da ošteti sluh ukoliko tako slušate duže vreme + Zvučnik + Označeno + Bluetooth veza otkačena + Hor + Otv. listu + Pretraži + Automatski + Ime + Nemoguće dodati više od %d muzičkih fajlova + Nema dovoljno muzičkih datoteka za reprodukciju u muzičkom kvadratu. Potrebno je najmanje %d muzičkih datoteka + Albumi + Prik. kao + 5.1-kanalni zvuk + Informacije o mediju + Žanr + Dinamička + Dodaj u listu za reprodukciju + diff --git a/res/swe-SE.xml b/res/swe-SE.xml new file mode 100644 index 0000000..2b5dca5 --- /dev/null +++ b/res/swe-SE.xml @@ -0,0 +1,221 @@ + + + + År + Sång + BT-headset + 1 valt objekt + Typ + Tidigare + Kompositör + Radera? + Meddelande + Album + Redan tillagd + SoundAlive + Stämningar + Låtar + Plats + Spara som spellista + Dynamisk + Det går inte att byta namn på spellistan + Rock + Dela via + Musikinställningar + Senast tillagda + Musik auto av + Artister + Det går inte att ange som ringsignal + Kan inte ändra ljudeffekter när 5.1-kanalen används + Spellistor + Skapa spellista + Klassisk + Vidarebefordra + Rock + Skapa spellista + Mediainfo + Mina mappar + Albumomslag + Ta bort? + Podsändn + Efter 1 timme + Basförstärkning + Bred + Musikspelare + Café + Redigera + Dans + 5.1-kanal kan bara aktiveras om ljudeffekterna är av + Tillgängliga tillämpningar + Spårnummer + Inga mappar + Lägg till i spellista + Författare + Artist + Lägg till + Lägg till spellista + Mappvy + Giltighet + Passionerad + Musikmeny + Format + Passionerad + Hörlurar + Diskantförstärkning + Pop + Används inte + Okänd + Högsta tillåtna antal objekt (%d) har valts + Ringsignal till Foto-ID + %d låtar + Dirigenter + Byte + Borttagen + Favoriter + Virtuellt 7.1-kanal + Det går inte att ta bort objekt + Mest spelade + Normal + Inget markerat + Beskrivning + Wha-wha + Live + Storlek + Alla + Format + E-post + Ta bort + Lägg till i + Skapat den + Live + 5.1-kanalsljudeffekten fungerar bara i hörlursläge + Album + Alla låtar + Skapa + Dela + Inga spellistor + Egen + Byt namn + Du kan strömma musik till enheter med AllShare + Senast spelade + Inställningsguide för musik + Basförstärkning + Möjlig + Tillagt till %s + Kan inte spela upp under samtal + Namnet är för långt + Redigera rubrik + Det går inte att hämta taggen + Medverkande + Ringsignal för samtal + Pop + Ange som + Inga album + Klassisk + Meddelande + År + Ej möjlig + Diskografi + Det går inte att skapa spellista + Uppdaterar... + Användare + Förälderrankning + Efter 2 timmar + Välj enhet + Equalizer + Ange + Gå till bibliotek + Spara + Dela + Jazz + Album + Stopp + Använd som + Efter 15 min + Lyrik + Inga artister + House + Sök efter etikett + Jazz + Avbryt + Efter 1 timme och 30 min + Inga objekt + Tremolo + Det går inte att spela. Filtypen stöds inte + Tidigare + Välj alla + Det går inte att dela DRM-fil + Biblioteksuppdatering + Spårlista + Spårlängd + Genre + Glad + Mappar + Radera + Ändra axel + Ingen text + Lägg till + %d objekt valda + Lägg till start + %s borttagen + Musik-väljare + Kompositörer + Uppdatera bibliotek? + Biografi + Ändra ordningsföljd + Stäng + Inga låtar + Lugn + Den här ljudeffekten fungerar bara i hörlurs- och Bluetooth-headsetläge + Det går inte att lägga till + Copyright + Larmsignal + Visa inte igen + 1 låt + Spela upp alla + Kan inte radera. Den valda musiken spelas + Normal + Komp. + Tillagd + Granska + Externalisering + Radera + Av + Slutfört + Senast spelade + Spellista + Den valda listan är tom + Alla + Det går inte att spela upp. Ett fel inträffade + Högstsa antal filer har överskridits + Klarhet + År + Genre + Använd som + Efter 30 min + Spellistor + Effekt + Detaljer + Inställningar + Dans + Hög volym kan skada din hörsel om du lyssnar för länge + Högtalare + Markerade + Bluetooth frånkopplat + Korus + Spellista + Sök + Auto + Namn + Kan inte lägga till fler än %d musikfiler + Det finns inte tillräckligt med musikfiler att spela med musikväljaren. Det krävs minst %d musikfiler + Album + Visa som + 5.1-kanal + Mediainfo + Genre + Dynamisk + Lägg till i spellista + diff --git a/res/tha-TH.xml b/res/tha-TH.xml new file mode 100644 index 0000000..c1800f6 --- /dev/null +++ b/res/tha-TH.xml @@ -0,0 +1,221 @@ + + + + ปี + Vocal + หู​ฟัง BT + เลือก 1 ​รายการ + ชนิด + เก่า + Composer + ลบ? + ข้อ​ความ + อัลบั้ม + เพิ่ม​แล้ว + SoundAlive + อารมณ์ + เพลง + ตำแหน่ง + บัน​ทึก​เป็นรายการเพลง + ไดนามิก + ไม่​สามารถ​เปลี่ยน​ชื่อ​รายการเพลง + Rock + แชร์​ผ่าน + การ​ตั้ง​ค่า​เพลง + ที่​เพิ่ม​เร็วๆ นี้ + ปิด​เพลง​อัตโนมัติ + ศิลปิน + ไม่​สามารถ​ตั้ง​เป็น​เสียง​เรียก​เข้า + ไม่​สามารถ​เปลี่ยน​เอ​ฟเฟ็กต์​เสียง​ได้​เมื่อ​ใช้ 5.1 แชนแนล + รายการ​เพลง + สร้าง​รายการ​เพลง + Classic + ส่ง​ต่อ + Rock + สร้าง​รายการ​เพลง + ข้อ​มูล​มี​เดีย + แฟ้ม​ส่วน​ตัว + อัลบั้ม​อา​ร์ท + ลบ? + พอดแคสต์ + หลัง​จาก 1 ​ชั่วโมง + Bass enhancement + Wide + เครื่องเล่นเพลง + Cafe + แก้ไข + Dance + สามารถ​เปิด​ใช้​งาน 5.1 ​ช่อง​ทาง​ได้​เฉพาะ​เมื่อ​เอ​ฟเฟ็กต์​เสียง​ปิด​อยู่​เท่า​นั้น + อนุญาต​ใช้ + หมาย​เลข​แทร็ก + ไม่​มี​โฟลเดอร์ + เพิ่ม​ในรายการเพลง + ผู้​ประพันธ์ + ศิลปิน + เพิ่ม + เพิ่ม​รายการเพลง + แสดงแฟ้ม + การอนุมัติ + หลงใหล + เมนู​เพลง + ฟอร์แมต + สะเทือนอารมณ์ + หู​ฟัง + เพิ่ม​เสียง​สูง + Pop + ไม่​ใช้ + ไม่​รู้จัก + เลือก​จำนวน​รายการ​สูง​สุด (%d) ​แล้ว + เสียง​เรียก​เข้า​ผู้​โทร + %d ​เพลง + ผู้ควบคุม + ไบต์ + ลบเรียบร้อย + รายการ\nที่ชอบ + Virtual 7.1 ch + ไม่​สามารถ​ลบ​รายการ + เล่น​บ่อย​ที่​สุด + ปกติ + ยังไม่ได้เลือก + ลักษณะ + Wha-wha + Live + ขนาด + ทั้ง​หมด + ฟอร์แมต + อีเมล์ + ลบ + เพิ่ม​ใน + วัน​ที่​ผลิต + Live + เอฟเฟ็กส์เสียง 5.1 แชนแนลทำงานในโหมดหูฟัง\nเท่านั้น + อัลบั้ม + เพลง​ทั้ง​หมด + สร้าง + แชร์ + ไม่​มี​รายการ​เพลง + กำหนด​เอง + เปลี่ยน​ชื่อ + คุณ​สามารถ​สต​รีม​เพลง​ของ​คุณ​กับ​อุปกรณ์​โดย​ใช้ AllShare + ที่เล่นไม่นานมานี้ + การ​ตั้ง​ค่า​เพลงแบบ wizard + เพิ่ม​เสียง​เบส + ได้ + เพิ่ม​ไป​ที่ %s + เล่น​ไม่​ได้ ขณะ​โทร + ชื่อ​ยาว​เกิน​ไป + แก้ไข​ชื่อ + ไม่​สา​มา​รถ​รับ​แท็ก​ได้ + เครดิต + เสียง​เรียก​เข้า + Pop + ตั้ง​เป็น + ไม่​มี​อัลบั้ม + Classic + ข้อ​ความ + ปี + ไม่​ได้ + ดิสโก้​กรา​ฟี + สร้างรายการเพลงไม่​ได้ + อัพ​เด​ท... + ผู้​ใช้ + เรต​หลัก + หลัง​จาก 2 ​ชั่วโมง + เลือก​อุปกรณ์ + อี​ควอ​ไล​เซอร์ + กำหนด + ไป​ที่​เก็บเพลง + บันทึก + แชร์ + Jazz + อัลบั้ม + หยุด + ตั้ง​เป็น + หลัง​จาก 15 ​นาที + เนื้อ​เพลง + ไม่​มี​ศิลปิน + เฮ้าส์ + ค้น​หา​แท็ก + Jazz + ยก​เลิก + หลัง​จาก 1 ​ชั่วโมง 30 ​นาที + ไม่มีรายการ + เสียง​สั่น + เล่น​ไม่​ได้ ไม่​รอง​รับ​ชนิด​ไฟล์ + ประวัติ + เลือก​ทั้ง​หมด + ไม่​สามารถ​ใช้​ไฟล์ DRM ​ร่วม​กัน​ได้ + อัพ​เด​ทไลบ​รา​รี + ราย​การ​แทร็ก + ความ​ยาว​แทร็ก + ประเภท + สนุก​สนาน + โฟลเดอร์ + ลบ + เปลี่ยน​แกน + ไม่​มี​เนื้อ​เพลง + เพิ่ม + เลือก %d ​รายการแล้ว + เพิ่มไปยังโฮม + %s ​ถูกลบ​แล้ว + มิวสิค​สแควร์ + ผู้​แต่ง + อัพ​เด​ตไลบ​รา​รี? + ชีวประวัติ + เรียง​ลำดับ​ใหม่ + ปิด + ไม่​มี​เพลง + สงบ + เอฟเฟ็กต์เสียงนี้จะใช้งานได้\nในโหมดหูฟังและโหมด\nหูฟังบลูทูธเท่านั้น + ไม่​สามารถ​เพิ่ม + ลิขสิทธิ์ + เสียง​เตือน + ห้าม​แสดง​อีก + 1 ​เพลง + เล่น​ทั้ง​หมด + ลบ​ไม่​ได้ กำลัง​เล่น​เพลง​ที่​เลือก + ปกติ + ตัว​เขียน + เพิ่ม​แล้ว + แสดง + Externalisation + ลบ + ปิด + เสร็จสิ้น + ที่เล่นไม่นานมานี้ + รายการ​เพลง + ไม่​มี​รายการ​ที่​เลือก + ทั้ง​หมด + เล่น​ไม่​ได้ มี​ข้อ​ผิด​พลาด​เกิด​ขึ้น + เกิน​จำนวน​ไฟล์​สูง​สุด​แล้ว + Music clarity + ปี + ประเภท + ตั้ง​เป็น + หลัง​จาก 30 ​นาที + รายการเพลง + เอ​ฟเฟ็ก​ต์ + ข้อมูล + การตั้งค่า + Dance + ระดับ​เสียง​ที่​สูง​อาจ​เป็น​อันตราย​ต่อ​การ​ฟัง​ของ​คุณ​ได้ หาก​คุณ​ฟัง​เป็น​เวลา​นาน + Speaker + เลือก + หยุด​เชื่อม​ต่อ​กับบลูทูธ​แล้ว + ลูก​คู่ + เปิด​รายการเพลง + ค้น​หา + ออโต้ + ชื่อ + ไม่​สามารถ​เพิ่ม​ไฟล์​เพลง​ได้​มากกว่า %d ​ไฟล์ + ไฟล์​เพลง​ไม่​เพียง​พอ​ที่​จะ​เล่น​ใน​มิวสิค​สแควร์ ต้อง​มี​ไฟล์​เพลงอย่าง​น้อย %d ​ไฟล์ + อัลบั้ม + แสดงเป็น + 5.1 ​แชนแนล + ข้อ​มูล​มี​เดีย + ประเภท + Dynamic + เพิ่มในรายการเพลง + diff --git a/res/tur-TR.xml b/res/tur-TR.xml new file mode 100644 index 0000000..0c994b8 --- /dev/null +++ b/res/tur-TR.xml @@ -0,0 +1,221 @@ + + + + Yıl + Vokal + BT kulaklık + 1 öğe seçildi + Tür + Eski + Bestekar + Sil? + Mesajlaşma + Albüm + Zaten eklenmiş + SoundAlive + Ruh halleri + Şarkılar + Konum + Parça listesi olarak kaydet + Dinamik + Parça listesi yeniden adlandırılamıyor + Rock + Şununla paylaş + Müzik ayarları + Son eklenenler + Müziği otomatik kapat + Sanatçılar + Zil sesi olarak ayarlanamadı + 5.1 kanalı kullanılırken ses efektleri değiştirilemiyor + Parça listeleri + Çalma listesi oluştur + Klasik + İletme + Rock + Çalma listesi oluştur + Medya bilgisi + Klasörlerim + Albüm kapağı + Kaldır? + Pod cast’ler + 1 saat sonra + Bas iyileştirme + Geniş + Müzik Çalar + Kafe + Düzenle + Dans + 5.1 kanalı sadece ses efektleri kapalı olduğunda etkinleştirilebilir + Mevcut kullanımlar + Parça numarası + Klasör yok + Parça listesine ekle + Yazar + Sanatçı + Ekle + Parça listesi ekle + Klasör görünümü + Geçerlilik + Tutku + Müzik menüsü + Biçimlendir + Tutkulu + Kulaklıklar + Tiz güçlendirme + Pop + Kullanılmıyor + Bilinmeyen + Maksimum seçilen öğe sayısı (%d) + Arayan zil sesi tonu + %d şarkı + Kondüktor + Bayt + Kaldırıldı + Favorilerim + Virtual 7.1 ch + Öğe kaldırılamıyor + En sık çalınanlar + Normal + Bir şey seçilmedi + Açıklama + Wha-wha + Canlı + Boyut + Tümü + Biçim + E-posta + Kaldır + Ekle + Oluşturma tarihi + Canlı + 5.1 kanal ses efekti sadece kulaklık modunda çalışır + Albümler + Tüm şarkılar + Oluştur + Paylaş + Çalma listesi yok + Özel + Yeniden adlandır + AllShare kullanarak, müziğinizi cihazlara yayınlayabilirsiniz + Son çalınanlar + Müzik kurulum sihirbazı + Bas güçlendirme + Mümkün + %s öğesine eklendi + Görüşme sırasında çalınamaz + Ad çok uzun + Başlığı düzenle + İm alınamıyor + Krediler + Arayan zil sesi + Pop + Ayarla + Albüm yok + Klasik + Mesaj + Yıl + İmkansız + Diskografi + Parça listesi oluşturulamıyor + Güncelleniyor... + Kullanıcı + Ebeveyn sıralaması + 2 saat sonra + Cihaz seçin + Ekolayzer + Ayarla + Kütüphaneye git + Kaydet + Paylaş + Jazz + Albümler + Durdur + Yap + 15 dakika sonra + Lirik + Sanatçı yok + House + Etiket bul + Jazz + İptal + 1 saat 30 dakika sonra + Öğe yok + Titreklik + Çalınamıyor. Desteklenmeyen dosya türü + Geçmiş + Hepsini seç + DRM dosyası paylaşılamıyor + Kütüphane güncellemesi + Parça listesi + Parça uzunluğu + Tarzlar + Eğlence + Klasörler + Sil + Ekseni değiştir + Söz yok + Ekle + %d öğe seçildi + Ana sayfaya ekle + %s kaldırıldı + Müzik meydanı + Bestekarlar + Kütüphane güncellensin mi? + Biyografi + Yeniden düzenle + Kapat + Hiç şarkı yok + Sakin + Bu ses efekti sadece kulaklık ve Bluetooth kulaklık modlarında çalışır + Eklenemiyor + Telif hakkı + Alarm sesi + Bir daha gösterme + 1 şarkı + Tümünü çal + Silinemiyor. Seçilen müzik çalıyor + Normal + Besteci + Eklendi + İzleme + Dışsallaştırma + Sil + Kapalı + Başarılı + Son çalınanlar + Çalma listesi + Seçilen liste boş + Hepsi + Çalınamıyor. Hata meydana geldi + Maksimum dosya sayısı aşıldı + Müzik netliği + Yıl + Tarzlar + Farklı ayarla + 30 dakika sonra + Parça listeleri + Efekt + Ayrıntılar + Ayarlar + Dans + Yüksek ses düzeyi, uzun süre dinlemeniz durumunda işitme duyunuza zarar verebilir + Hoparlör + Seçili + Bluetooth bağlantısı kesildi + Koro + Yür lst aç + Arama + Otomatik + İsim +  %d müzik dosyasından fazlası eklenemiyor + Müzik meydanında çalmak için yeterli müzik dosyası yok. En az %d müzik dosyası gerekli + Albümler + Göster + 5.1 kanal + Medya bilgisi + Tarz + Dinamik + Çalma listesine ekle + diff --git a/res/ukr-UA.xml b/res/ukr-UA.xml new file mode 100644 index 0000000..50e59d9 --- /dev/null +++ b/res/ukr-UA.xml @@ -0,0 +1,221 @@ + + + + Роки + Вокальна + Гарнітура BT + Вибрано 1 об’єкт + Тип + Старе + Композитор + Видалити? + Повідомлення + Альбом + Вже додано + SoundAlive + Настрої + Пісні + Розташування + Зберегти як список відтворення + Динамічна + Неможливо перейменувати список відтворення + Рок + Відкрити доступ через + Установки музики + Останні додані + Автоматичне вимк. музики + Виконавці + Неможливо встановити як звук дзвінка + Неможливо змінити звукові ефекти під час використання 5.1-канального звуку + Списки відтворення + Створити список відтворення + Класика + Переадресація + Рок + Створити список відтворення + Інформація про медіадані + Мої папки + Альбом зображень + Видалити? + Подкасти + Через 1 годину + Підсилення басів + Широкий діапазон + Музичний плеєр + Для кафе + Редагувати + Танцювальний + 5.1-канальний звук доступний лише за вимкнених звукових ефектів + Доступні використання + Номер запису + Немає папок + Дод. до сп. відтв. + Автор + Виконавець + Додати + Додати список відтворення + Перегл. папки + Термін дії + Пристрасть + Музичне меню + Форматувати + Пристрасна + Навушники + Підсилення сопрано + Поп-музика + Не використовується + Невідома + Вибрано максимальну кількість об’єктів: %d + Звук дзвінка абонента + %d композицій + Дириг. + Байт + Видалено + Обране + Віртуальний 7.1 + Неможливо вилучити об’єкт + Найчастіше відтворювані + Звичайний + Нічого не вибрано + Опис + Вау-ва + Пряма трансляція + Розмір + Усі + Формат + Email + Видалити + Додати до + Дату створено + Пряма трансляція + 5.1-канальний звуковий ефект працює лише в режимі навушників + Альбоми + Всі композиції + Створити + Надісл. + Немає списків відтворення + Особливий + Перейменувати + Можна здійснити потокову передачу музики на пристрій за допомогою AllShare + Останні відтворені + Майстер інсталяції музики + Підсилення баса + Можливо + Додано до %s + Неможливо відтворити під час виклику + Задовге ім'я + Редагувати назву + Неможливо отримати тег + Титри + Звук дзвінка + Поп-музика + Встано-/nвити як + Немає альбомів + Класика + Повідомлення + Роки + Неможливо + Дискографія + Неможливо створити список відтворення + Оновлення... + Користувач + Основний рейтинг + Через 2 години + Вибрати пристрій + Еквалайзер + Встанов. + Перейти до бібліотеки + Зберегти + Відкр.д-п + Джаз + Альбоми + Стоп + Встановити як + Через 15 хв. + Лірика + Немає виконавців + Хауз + Пошук тегів + Джаз + Скасувати + Через 1 год. 30 хв. + Немає об’єктів + Тремоло + Неможливо відтворити. Формат не підтримується + Історія + Вибрати всі + Неможливо відкрити спільний доступ до файла DRM + Оновлення бібліотеки + Список записів + Тривалість запису + Жанри + Радість + Папки + Видалити + Змінити вісь + Без тексту + Додати + Вибрано %d об’єктів + Додати на головний екран + %s видалено + Музичний квадрат + Композитори + Оновити бібліотеку? + Біографія + Упорядкувати + Закрити + Немає композицій + Врівноважений + Цей звуковий ефект працює лише в режимах навушників і гарнітури Bluetooth + Неможливо додати + Авторське право + Сигнал будильника + Більше не показувати + %d композиція + Відтворити всі + Неможливо видалити. Вибрана музика відтворюється + Звичайний + Композ. + Додано + Огляд + Уособлення + Видалити + Вимкнено + Успішно + Останні відтворені + Список відтвор. + Вибраний список пустий + Всі + Неможливо відтворити. Сталася помилка + Перевищено максимальну кількість файлів + Ясність музики + Роки + Жанри + Встановити як + Через 30 хв. + Сп. відтв. + Ефект + Деталі + Установки + Танцювальний + Тривале прослуховування за високого рівня гучності може призвести до погіршення слуху + Динамік + Вибране + Bluetooth відключено + Хор + В.сп + Пошук + Авто + Назва + Неможливо додати більше %d музичних файлів + Недостатньо музичних файлів для відтворення в Музичному квадраті. Мінімальна кількість музичних файлів: %d + Альбоми + Перег. як + 5.1-канальний + Інформація про медіадані + Жанр + Динамічний + Додати до списку + diff --git a/res/urd-IN.xml b/res/urd-IN.xml new file mode 100644 index 0000000..4b83fb3 --- /dev/null +++ b/res/urd-IN.xml @@ -0,0 +1,222 @@ + + + + سال + آواز کے متعلق + BT ہیڈسیٹ + 1 شے منتخب ہوگئی + قسم + پرانا + نغمہ ساز + مٹانا؟ + پیغام + البم + پہلے ہی اضافہ ہوچکا ہے + SoundAlive + مزاج + گانے + لوکیشن + بطور پلے لسٹ محفوظ کریں + متحرک + پلے لسٹ کو نیا نام دینے سے قاصر + راک + شراکت بذریعہ + میوزک کی ترتیبات + حالیہ اضافہ + موسیقی آٹوآف + فنکار + بطور گھنٹی ٹون سیٹ کرنے سے قاصر + 5.1 چینل استعمال کرتے وقت صوتی تاثرات تبدیل کرنے سے قاصر + چلانے کی فہرست + چلانے کی فہرست بنائیں + کلاسک + آگے بھیجنا + راک + چلانے کی فہرست بنائیں + میڈيا معلومات + میرے فولڈر + البم آدٹ + مٹائیں؟ + پوڈ کاسٹس + بعد 1 گھنٹہ + بیس کا اضافہ + چوڑا + میوزک پلیر + کیفے + تبدیلی + ڈانس + 5.1 چینل صرف اس وقت زیر عمل ہوسکتے ہیں جب صوتی اثرات آف ہوں + استعمال کرنے کی سہولیات + ٹریک نمبر + کوئی فولڈرز نہیں + پلے فہرست +اضافہ کریں + لکھنے والا + فنکار + اضافہ + پلے فہرست اضافہ کریں + فولڈر منظر + معیادی + جذبہ + میوزک مینیو + فارمیٹ + پرجوش + ھیڈفونز + ٹریبل بڑھانا + پاپ + استعمال میں نہیں + نامعلوم + اشیا کی انتہائی تعداد (%d) منتخب ہوگئی + کالر رنگ ٹون + %d گانے + ہدایت کار + بائٹ + ہٹا دیا + پسند کردہ + مجازی 7.1 چینل + آئیٹم ہٹانے سے قاصر + سب سے زیادہ چلایا گیا + معمولی + کچھ پسند نہیں کیا + تفصیل + واہ واہ + لائیو + سائز + سب + فارمیٹ + ای میل + ہٹانا + میں اضافہ + تخلیق کی تاریخ + لائیو + 5.1 چینل کی آواز کا اثر صرف ائیرفون وضع میں کام کرتا ہے + البمز + سب گانے + تخلیق + شراکت + چلانے کی فہرست نہیں + کسٹم + نام بدلیں + آپ AllShare استعمال کرتے ہوئے اپنی موسیقی آلے کو سٹریم کرسکتے ہیں + حالیہ چلایا گیا + میوزک سیٹ اپ وزرڈ + باس بڑھانا + ممکن + %s پر اضافہ کردیا گیا + کال کے دوران چلانے سے قاصر + نام لمبا ہے + ٹائیٹل تبدیل کریں + ٹیگ حاصل کرنے سے قاصر + کریڈٹس + کالر رنگٹون + پاپ + بطور + کوئی البم نہیں + کلاسک + پیغام + سال + ناممکن + ڈسکو گرافی + پلے لسٹ بنانے سے قاصر + اپ ڈیٹ کر رہا ہے... + استمعال کرنے والا + ماں باپ کیلیے ریٹینگ + 2 گھنٹوں بعد + آلہ منتخب کریں + برابر کرنے والا + سیٹ + لائبریری کو جائیں + محفوظ + حصہ داری + جیز + البمز + روکیں + بطور + 15 منٹ بعد + گیت کے بول + کوئی فنکار نہیں ہیں + ہاؤس + ٹیگ ڈھونڈیے + جیز + منسوخ + 1 گھنٹہ 30 منٹ بعد + ائیٹمز نہیں ہے + ٹریمولو + پلے کرنے سے قاصر۔ غیرسہولت یافتہ فائل کی قسم + تاریخ نامہ + تمام منتخب کریں + DRM فائل شراکت کرنے سے قاصر + لائبریری تازہ کاری + ٹریک لسٹ + ٹریک کی لمبائی + موسیقی قسم + مسرت + فولڈرز + مٹانا + محور تبدیل کریں + گیت کے بول نہیں + اضافہ + %d اشیا منتخب ہوگئیں + گھر پر اضافہ کریں + %s ہٹایا گیا + میوزک اسکوائر + کمپوزر + لائبریری تازہ کاری کریں؟ + سوانح عمری + پھر سے ترتیب + بند کرنا + کوئی گانے نہیں + پرسکون + صوتی تاثرات صرف ایئر فون اور بلیو ٹوتھ ھیڈسیٹ موڈز میں کام کرتا ہے + اضافہ کرنے سے قاصر + کاپی رائیٹ + الارم کی ٹون + دوبارہ نہیں دکھا‏‏ئيں + 1 گانا + چلایں تمام + حذف کرنے سے قاصر۔ منتخب کردہ میوزک پلے ہورہا ہے + معمولی + کمپوزرز + اضافہ ہو گیا + دوبارہ دیکھیں + بیرونی بنانا + مٹانا + آف + کامیابی + حالیہ چلایا گیا + چلانے کی فہرست + منتخب کردہ فہرست خالی + تمام + پلے کرنے سے قاصر۔ غلطی واقع ہوگئی + فائلوں کی زیادہ سے زیادہ تعداد تجاوز کرگئی + میوزک کی وضاحت + سالہا سال + موسیقی قسم + سیٹ بطور + بعد 30 منٹ + پلے فہرستیں + اثر + تفصیل + سیٹنگز + ڈانس + اگر آپ لمبے عرصے تک سنیں تو اونچا لیول آپ کی سماعت کو نقصان پہنچا سکتا ہے + اسپیکر + انتخاب ہوگیا + Bluetooth غیر متصل کردیا گیا + کورس + پلےلسٹ + سرچ + آٹو + نام + اضافہ نہیں کر سکا%d میوزک فائیل + میوزک اسکوائر میں پلے کرنے کے لئے کافی فائلیں نہیں ہیں۔ کم از کم %d میوزک فائلیں درکار ہیں + البمیں + منظر بطور + 5.1 چینل + میڈيا معلومات + جینیر + ڈائی نیمک + پلے لسٹ میں اضافہ کریں + diff --git a/res/uzb-UZ.xml b/res/uzb-UZ.xml new file mode 100644 index 0000000..e5c3998 --- /dev/null +++ b/res/uzb-UZ.xml @@ -0,0 +1,221 @@ + + + + Yillar + Vokal + BT karnaylari + 1 element tanlangan + Tur + Eski + Muallifi + O'chirilsinmi? + Xabar + Albom + Avvaldan qo‘shilgan + SoundAlive + Kayfiyatlar + Qo‘shiqlar + Joylashuv + Musiqa sifatida saqlash + Dinamik + Musiqalar ro‘yxati nomini o‘zgartirib bo‘lmaydi + Rok + Quyidagi orqali ulashish + Musiqa parametrlari + Oxirgi qo‘shilgan + Musiqani avt. o‘chirish + Ijrochilar + Rington sifatida o‘rnatib bo‘lmaydi + 5.1 kanal ishlatilayotganda, ovoz effektlarini o‘zgartirib bo‘lmaydi + Musiqa ro‘yxatlari + Mus. ro‘yxatini yaratish + Klassik + Boshqaga yo‘naltirish + Rok + Mus. ro‘yxatini yaratish + Media ma’lumoti + Mening jildlarim + Albom dizayni + Olib tashlansinmi? + Podkastlar + 1 soatdan keyin + Bass ko‘tarilishi + Keng + Musiqa pleyeri + Kafe + Tahrirlash + Raqs + 5.1 kanalini ovoz effektlari o‘chirilgandagina faollashtirish mumkin + Mavjud foydalanishlar + Trek raqami + Jildlar yo‘q + Qo‘shiq ro‘y-ga qo‘shish + Muallif + Ijrochi + Qo‘shish + Qo‘shiqlar ro‘yxati qo‘shish + Jild ko‘rinishi + Amal qilish + Ehtiros + Musiqa menyusi + Format + Ehtirosli + Quloqliklar + Yuqori chastota + Pop janri + Foydalanilmaydi + Noma’lum + Elementlarning maksimal miqdori (%d) tanlangan + Qo‘ng‘iroq qiluvchi ringtoni + %d qo‘shiq + Konduktorlar + Bayt + Olib tashlandi + Tanlanganlar + Virtual 7.1 k + Elementni olib tashlab bo‘lmaydi + Eng ko‘p o‘ynalgan + Normal + Hech narsa tanlanmagan + Tavsif + Ha-ha + Jonli + O‘lcham + Barcha + Format + E-pochta + Olib tashlash + Qo‘shish + Yaratilgan sana + Jonli + 5.1 kanal ovozi effekti faqat quloq karnaylari rejimida ishlaydi + Albomlar + Barcha qo‘shiqlar + Yaratish + Ulash. + Musiqalar ro‘yxati yo‘q + Maxsus + Nom o‘zgartirish + AllShare yordamida musiqangizni qurilmalaringizga uzatishingiz mumkin + Oxirgi o‘ynatilgan + Musiqa o‘rnatish ustasi + Quyi chastota + Taxminiy + %sga qo‘shildi + Qo‘ng‘iroq mobaynida o‘ynatib bo‘lmaydi + Nom juda uzun + Sarlavhani tahrirlash + Tegni olib bo‘lmadi + Kreditlar + Qo‘ng‘iroq ringtoni + Pop janri + Quyidagidek o‘r. + Albomlar yo‘q + Klassik + Xabar + Yillar + Imkonsiz + Diskografiya + Musiqalar ro‘yxatini yaratib bo‘lmaydi + Yangilanmoqda... + Foydalanuvchi + Qo'shimcha baholash + 2 soatdan keyin + Qurilma tanlang + Ekvalayzer + O‘rnatish + Kutubxonaga o‘tish + Saqlash + Um. foyd. + Jaz + Albomlar + To‘xtat + O‘rnatish + 15 daqi-dan so‘ng + Lirik asar + Ijrochilar yo‘q + Uy + Teg topish + Jaz + Bekor qilish + 1 soat 30 daqiqadan so‘ng + Elementlar yo‘q + Tremolo + O‘ynatib bo‘lmaydi. Qo‘llab-quvvatlanmaydigan fayl turi + Jurnal + Barchasini tanlash + DRM faylni ulashib bo‘lmaydi + Kutubxonani yangilash + Treklar ro‘yxati + Trek uzunligi + Janrlar + Xursandchilik + Jildlar + O'chirish + Koordinata chizig‘ini o‘zgartirish + Matnsiz + Qo‘shish + %d element tanlangan + Asosiyga qo‘shish + %s olib tashlandi + Musiqa kvadrati + Bastakor + Kutubxona yangilansinmi? + Tarjimai hol + Qayta saralash + Yopish + Qo‘shiqlar yo‘q + Osuda + Ushbu effekt faqatgina quloqliklar va Bluetooth karnaylari rejimida ishlaydi + Qo‘shib bo‘lmaydi + Mualliflik huquqi + Budilnik ohangi + Boshqa ko‘rsatilmasin + 1 qo‘shiq + Barchasini o'ynat. + O'chirib bo‘lmaydi. Tanlangan musiqa o‘ynamoqda + Normal + Bastakor + Qo‘shilgan + Ko‘rib chiqish + Tashqariga chiqarish + O'chirish + O‘ch. + Muvaffaqiyat + Oxirgi o‘ynatilgan + Musiqalar ro‘yxati + Tanlangan ro‘yxat bo‘sh + Barcha + O‘ynatib bo‘lmaydi. Xato yuz berdi + Fayllar soni maksimal miqdordan oshib ketdi + Musiqa aniqligi + Yillar + Janrlar + O‘rnatish + 30 daqiqadan keyin + Musiqa ro‘yx. + Effekt + Tafsilotlar + Parametrlar + Raqs + Musiqani baland ovozda uzoq vaqt davomida tinglash eshitish a’zolaringizga zarar yetkazishi mumkin + Speaker + Tanlangan + Bluetooth uzildi + Xor + Mus/ro‘y. och + Qidirish + Avtomatik + Nom + %ddan ko‘p musiqiy fayllarni qo‘shib bo‘lmaydi + Musiqa kvadratida o‘ynatish uchun musiqa fayllari yetarli emas. Kamida %d musiqa fayli talab etiladi + Albomlar + Ko‘rish: + 5.1 kanal + Media ma’lumoti + Janri + Dinamik + Qo‘shiqlar ro‘yxatiga qo‘shish + diff --git a/res/zho-CN.xml b/res/zho-CN.xml new file mode 100644 index 0000000..07999d6 --- /dev/null +++ b/res/zho-CN.xml @@ -0,0 +1,221 @@ + + + + 年 + 声乐 + 蓝牙耳机 + 已选择1个项目 + 类型 + 旧的 + 作曲者 + 删除? + 信息 + 专辑 + 已添加 + SoundAlive + 基调 + 音乐 + 位置 + 另存为播放列表 + 动态 + 无法重命名播放列表 + 摇滚 + 共享通过 + 音乐设定 + 最近添加的 + 音乐自动关 + 艺术家 + 无法设置为铃声 + 使用5.1声道时无法更改声音效果 + 播放列表 + 新建播放列表 + 古典 + 转发 + 摇滚 + 新建播放列表 + 媒体信息 + 我的文件夹 + 专辑艺术 + 移除? + 播客 + 1 小时后 + 低音增加 + 宽广 + 音乐播放器 + 咖啡馆 + 编辑 + 舞曲 + 5.1声道仅在关闭声音效果时才能激活 + 可用于 + 曲目号 + 没有文件夹 + 添加到播放列表 + 作者 + 艺术家 + 添加 + 添加播放列表 + 文件夹视图 + 有效 + 激情 + 音乐菜单 + 格式化 + 充满激情的 + 耳机 + 高音增强 + 流行 + 未使用 + 未知 + 已达到项目最大数量上限(%d) + 来电铃声 + %d 首歌 + 乐队指挥 + 字节 + 已移除 + 我的收藏 + 虚拟7.1 声道 + 无法移除项目 + 多次播放的 + 正常 + 未选择 + 说明 + 哇哇音 + 直播 + 大小 + 全部 + 格式 + 电子邮件 + 移除 + 添加到 + 创建日期 + 直播 + 5.1 声道声音效果只适用于耳机模式 + 专辑 + 全部音乐 + 新建 + 共享 + 无播放列表 + 自定义 + 重命名 + 您可使用 AllShare 将您的音乐导入至设备 + 最近播放的 + 音乐设定向导 + 低音增强 + 可以 + 已添加到%s + 通话中无法播放 + 姓名太长 + 编辑标题 + 无法获取标签 + 制作 + 手机铃声 + 流行 + 设定为 + 无专辑 + 古典 + 信息 + 年 + 不可以 + 唱片目录 + 无法创建播放列表 + 正在更新 + 用户 + 父速率 + 2 小时后 + 选择设备 + 均衡器 + 设置 + 转到音乐库 + 存储 + 共享 + 爵士 + 专辑 + 停止 + 设定为 + 15 分钟后 + 抒情 + 没有艺术家 + 居家音乐 + 查找标签 + 爵士 + 取消 + 1 小时 30 分钟后 + 无项目 + 颤音 + 无法播放。不支持的文件类型 + 历史记录 + 全选 + 无法共享DRM文件 + 音乐库更新 + 曲目列表 + 曲目长度 + 流派 + 欢乐 + 文件夹 + 删除 + 更改轴线 + 没有歌词 + 添加 + 已选择%d个项目 + 添加到主页 + %s 已移除 + 音乐广场 + 作曲家 + 更新库 + 传记 + 重新排序 + 关闭 + 没有歌曲 + 平静的 + 此声音效果仅在耳机和蓝牙耳机模式下有效 + 无法添加 + 版权 + 闹钟铃声 + 不要再显示 + 1 首歌 + 全部播放 + 无法删除。选择的音乐正在播放 + 普通 + 作曲家 + 已添加 + 查看 + 具体化 + 删除 + 关 + 成功 + 最近播放的 + 播放列表 + 选择的列表为空 + 全部 + 无法播放。出错 + 已超过最大文件数 + 音乐清晰 + 年代 + 流派 + 设定为 + 30 分钟后 + 播放列表 + 效果 + 详情 + 设定 + 舞曲 + 如果长时间用高音量收听,可能会损坏听力 + Speaker + 已选择 + 蓝牙连接已断开 + 合唱 + 打开播放列表 + 搜索 + 自动 + 名称 + 不能添加超过 %d 的音乐文件 + 音乐文件不足以在音乐广场中播放。需要至少 %d 个音乐文件 + 专辑 + 查看 + 5.1 声道 + 媒体信息 + 流派 + 动态 + 添加到播放列表 + diff --git a/res/zho-HK.xml b/res/zho-HK.xml new file mode 100644 index 0000000..a52f669 --- /dev/null +++ b/res/zho-HK.xml @@ -0,0 +1,221 @@ + + + + 年份 + 聲樂 + 藍牙耳機 + 已選擇 1 個項目 + 類型 + 舊的 + 作曲者 + 刪除嗎? + 訊息 + 專輯 + 已加入 + SoundAlive + 基調 + 歌曲 + 位置 + 另存為播放清單 + 動態 + 無法重新命名播放清單 + 搖滾 + 分享透過 + 音樂設定 + 最近加入 + 音樂自動關 + 演出者 + 無法設定為鈴聲 + 當使用 5.1 頻道時無法更改音效 + 播放清單 + 建立播放清單 + 古典 + 轉寄中 + 搖滾 + 建立播放清單 + 媒體資料 + 我的資料夾 + 專輯封面 + 要移除嗎? + Podcasts + 1 小時後 + 重低音 + 狂放 + 音樂播放器 + 咖啡廳 + 編輯 + 跳舞 + 只有在關閉音效時,才可啟動 5.1 聲道 + 可供使用 + 曲目編號 + 無資料夾 + 加到播放清單 + 作家 + 演出者 + 加入 + 加入播放清單 + 資料夾檢視 + 有效期 + 熱情 + 音樂目錄 + 格式化 + 熱情 + 耳機 + 高音增強 + 流行 + 未有使用 + 未知 + 已選擇項目數目上限 (%d) + 聯絡人來電鈴聲 + %d 首歌 + 指揮者 + 位元組 + 已移除 + 我的最愛 + 虛擬數位 7.1 聲道 + 無法移除項目 + 最常播放 + 正常 + 無已選擇項目 + 描述 + 嘩嘩聲 + 現場 + 大小 + 全部 + 格式 + 電子郵件 + 移除 + 加到 + 建立日期 + 現場 + 5.1 聲道音效只適用於耳機模式 + 專輯 + 所有歌曲 + 建立 + 共享 + 無播放清單 + 自訂 + 重新命名 + 您可以使用 AllShare 將音樂串流至裝置 + 最近播放 + 音樂設定精靈 + 低音增強 + 可以 + 已加到%s + 通話期間無法播放 + 名稱太長 + 編輯標題 + 無法取得標籤 + 製作 + 來電鈴聲 + 流行 + 設定為 + 無專輯 + 古典 + 訊息 + 年份 + 不可以 + 專輯目錄 + 無法建立播放清單 + 正在更新... + 用戶 + 家長評分 + 2 小時後 + 選擇裝置 + 均衡器 + 設定 + 前往資料庫 + 儲存 + 分享 + 爵士 + 專輯 + 停止 + 設定為 + 15 分鐘後 + 歌詞 + 無演出者 + 家居音樂 + 尋找標籤 + 爵士 + 取消 + 1 小時 30 分鐘後 + 無項目 + 震音 + 無法播放。不支援的檔案類型 + 歷程記錄 + 選擇全部 + 無法分享 DRM 檔案 + 資料庫更新 + 曲目清單 + 曲目長度 + 類型 + 喜悅 + 資料夾 + 刪除 + 變更軸 + 無歌詞 + 新增 + 已選擇 %d 個項目 + 加到首頁 + 已移除 %s + 音樂廣場 + 作曲家 + 更新資料庫? + 簡介 + 重新排序 + 關閉 + 無歌曲 + 平靜 + 此音效只在耳筒及藍牙耳機模式中有效 + 無法加入 + 版權 + 鬧鐘鈴聲 + 不再顯示 + 1 首歌 + 全部播放 + 無法刪除。所選音樂正在播放 + 正常 + 作曲家 + 已加入 + 檢視 + 外化 + 刪除 + 關 + 成功 + 最近播放 + 播放清單 + 選擇的清單為空 + 全部 + 無法播放。發生錯誤 + 已超過檔案數量上限 + 清晰音樂 + 年 + 類型 + 設定為 + 30 分鐘後 + 播放列表 + 效果 + 詳細資料 + 設定 + 跳舞 + 長期聆聽高音量會損害您的聽力 + Speaker + 已選擇 + 藍牙連接已中斷 + 合唱 + 開啟播放清單 + 搜尋 + 自動 + 名稱 + 無法加入超過 %d 個音樂檔案 + 音樂廣場中要播放的音樂檔案不足。至少需要 %d 首音樂檔案 + 專輯 + 檢視方式 + 5.1 聲道 + 媒體資料 + 類型 + 動態 + 加到播放清單 + diff --git a/res/zho-SG.xml b/res/zho-SG.xml new file mode 100644 index 0000000..293303a --- /dev/null +++ b/res/zho-SG.xml @@ -0,0 +1,221 @@ + + + + 年 + Vocal + 蓝牙耳机 + 已选择1个项目 + 类型 + 旧的 + 作曲者 + 删除? + 讯息 + 相册 + 已添加 + SoundAlive + 喜怒無常 + 音乐 + 位置 + 另存为播放列表 + 动态 + 无法重命名播放列表 + 摇滚 + 共享通过 + 音乐设定 + 最近添加的 + 音乐自动关 + 艺术家 + 无法设置为铃声 + 使用5.1声道时无法更改声音效果 + 播放列表 + 新建播放列表 + 古典 + 转发中 + 摇滚 + 新建播放列表 + 媒体信息 + 我的文件夹 + 艺术相册 + 移除? + 播客 + 1小时之后 + 低音增加 + 宽 + 音乐播放器 + 咖啡馆 + 编辑 + 舞曲 + 5.1声道仅在关闭声音效果时才能激活 + 适用用法 + 磁道数 + 无文件夹 + 添加到播放列表 + 作家 + 演出者 + 添加 + 添加播放列表 + 文件夹视图 + 有效 + 激情 + 音乐菜单 + 格式化 + 充满激情的 + 耳机 + 高音增强 + 流行 + 未使用 + 未知 + 已达到项目最大数量上限(%d) + 来电人铃声 + %d 首歌 + 乐队指挥 + 字节 + 已移除 + 收藏夹 + Virtual 7.1 ch + 无法移除项目 + 多次播放的 + 正常 + 未选择 + 描述 + 哇哇 + 直播 + 大小 + 全部 + 格式 + 电邮 + 移除 + 添加到 + 创建日期 + 直播 + 5.1 声道声音效果只适用于耳机模式 + 唱片 + 全部音乐 + 创建 + 共享 + 无播放列表 + 自定义 + 重命名 + 您可使用 AllShare 将您的音乐串流至设备 + 最近播放的 + 音乐设定向导 + 低音增强 + 可能 + 已添加到 %s + 通话中无法播放 + 姓名太长 + 编辑标题 + 无法获取标签 + 余额 + 来电铃声 + 流行 + 设定为 + 无相册 + 古典 + 讯息 + 年 + 不可能 + 唱片目录 + 无法创建播放列表 + 更新中… + 用户 + Parent rating + 2小时之后 + 选择设备 + 均衡器 + 设定 + 转到音乐库 + 储存 + 共享 + 爵士 + 唱片 + 停止 + 设定为 + 15 分钟后 + 抒情 + 没有艺术家 + 居家音乐 + 查找标记 + 爵士 + 取消 + 1 小时 30 分钟后 + 无项目 + 颤音 + 无法播放。不支持的文件类型 + 历史记录 + 全选 + 无法共享DRM文件 + 音乐库更新 + 曲目列表 + 轨道长度 + 流派 + 欢乐 + 文件夹 + 删除 + 更改轴线 + 没有歌词 + 添加 + 已选择%d个项目 + 添加到主页 + %s 已移除 + 音乐广场 + 作曲家 + 更新库 + 传记 + 重新排序 + 关闭 + 无歌曲 + 平静 + 仅声音效果仅在耳机和蓝牙耳机模式下有效 + 无法添加 + 版权 + 闹钟铃声 + 不要再显示 + 1 首歌 + 全部播放 + 无法删除。正在播放选择的音乐 + 普通 + 作曲家 + 已添加 + 检查 + 具体化 + 删除 + 关 + 成功 + 最近播放的 + 播放列表 + 选择的列表空 + 全部 + 无法播放。出错 + 已超过最大文件数 + 音乐清晰 + 年 + 流派 + 设定为 + 30分钟之后 + 播放列表 + 效果 + 详细内容 + 设定 + 舞曲 + 如果长时间用高音量收听,可能会损坏听力 + Speaker + 已选定 + 蓝牙连接已断开 + 合唱 + 打开播放列表 + 搜寻 + 自动 + 名称 + 不能添加超过 %d 的音乐文件 + 音乐文件不足以在音乐广场中播放。需要至少 %d 个音乐文件 + 音乐库 + 视为 + 5.1 声道 + 媒体信息 + 类型 + 动态 + 添加到播放列表 + diff --git a/res/zho-TW.xml b/res/zho-TW.xml new file mode 100644 index 0000000..f9518a8 --- /dev/null +++ b/res/zho-TW.xml @@ -0,0 +1,221 @@ + + + + 年份 + 聲樂 + 藍牙耳機 + 已選擇 1 項目 + 類型 + 舊 + 撰寫器 + 要刪除嗎? + 訊息 + 專輯 + 已新增 + SoundAlive + 基調 + 歌曲 + 位置 + 另存為播放清單 + 動態 + 無法重新命名播放清單 + 搖滾 + 分享經由 + 音樂設定 + 最近加入 + 音樂自動關閉 + 演出者 + 無法設定為鈴聲 + 當使用5.1聲道時無法改變聲音效果 + 播放清單 + 建立播放清單 + 古典 + 正在轉寄 + 搖滾 + 建立播放清單 + 媒體資訊 + 我的資料夾 + 專輯封面 + 要移除嗎? + 播客 + 1 小時後 + 低音增強 + 狂放 + 音樂播放器 + 咖啡廳 + 編輯 + 舞曲 + 5.1聲道只能關閉音效時啟動 + 可供使用 + 曲目編號 + 無資料夾 + 加入到播放清單 + 作者 + 演出者 + 新增 + 新增播放清單 + 文件匣式瀏覽 + 有效期 + 熱情 + 音樂選單 + 格式化 + 熱情 + 耳機 + 高音增強 + 流行音樂 + 未使用 + 未知 + 達到最大選擇數量(%) + 來電者鈴聲 + %d 首歌 + 導體 + 位元 + 已移除 + 我的最愛 + 虛擬數位 7.1 聲道 + 無法移除項目 + 最常播放 + 正常 + 未選擇任何項目 + 說明 + 嘩嘩 + 現場 + 大小 + 全部 + 格式 + 電子郵件 + 移除 + 加到 + 建立日期 + 現場 + 5.1 聲道音效只適用於耳機模式 + 專輯 + 所有歌曲 + 建立 + 分享 + 無播放清單 + 自訂 + 重新命名 + 您可以使用數位連結將音樂串流至裝置 + 最近播放 + 音樂設定精靈 + 低音增強 + 可能 + 已加到%s + 通話期間無法播放 + 名稱太長 + 編輯標題 + 無法取得標籤 + 製作人員名單 + 來電鈴聲 + 流行音樂 + 設定為 + 無專輯 + 古典 + 訊息 + 年 + 不可能 + 唱片分類目錄 + 無法建立播放清單 + 正在更新... + 使用者 + 父級評分 + 2 小時後 + 選擇裝置 + 等化器 + 設定 + 轉至媒體庫 + 儲存 + 分享 + 爵士樂 + 專輯 + 停止 + 設定為 + 15 分鐘後 + 歌詞 + 無演出者 + 浩室 + 尋找標籤 + 爵士樂 + 取消 + 1小時30分鐘後 + 無項目 + 顫音 + 無法播放。不支援的檔案類型 + 歷程記錄 + 全選 + 無法共享 DRM 文件 + 媒體庫更新 + 曲目清單 + 曲目長度 + 類型 + 喜悅 + 資料夾 + 刪除 + 變更軸 + 沒有歌詞 + 新增 + 已選擇 %d 項目 + 新增至首頁 + 已移除 %s + 音樂廣場 + 作曲者 + 更新資料庫? + 傳記 + 重新排序 + 關閉 + 無歌曲 + 冷靜 + 音效只適用耳機或是藍牙耳機模式 + 無法加入 + 版權 + 鬧鐘鈴聲 + 不再顯示 + 1 首歌 + 全部播放 + 無法刪除。選擇的音樂正在播放 + 正常 + 作曲家 + 已新增 + 查看 + 立體聲 + 刪除 + 關 + 成功 + 最近播放 + 播放清單 + 所選擇的清單是空的 + 全部 + 無法播放。發生錯誤 + 已超過檔案數量上限 + 音樂清晰度 + 年 + 類型 + 設定為 + 30 分鐘後 + 播放清單 + 效果 + 詳細資料 + 設定 + 舞曲 + 長期聆聽過大音量會損害您的聽力 + Speaker + 已選擇 + 藍牙已中斷 + 合音 + 開啟播放清單 + 搜尋 + 自動 + 名稱 + 無法加入超過 %d 個音樂檔案 + 音樂廣場中要播放的音樂檔案不足。至少需要 %d 首音樂 + 專輯 + 檢視方式 + 5.1 聲道 + 媒體資訊 + 類型 + 動態 + 加到播放清單 + diff --git a/shared/data/nofile.dummy b/shared/data/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/shared/res/screen-density-xhigh/mainmenu.png b/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..be6bde5f26d3fafe79dc99fe2f62d85b4fbb3457 GIT binary patch literal 57662 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 aYK8_2QCxfuuTO+lm^wQ%KfO1#yzv30pdYFL literal 0 HcmV?d00001 diff --git a/shared/trusted/nofile.dummy b/shared/trusted/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/src/MpAlbumContentListForm.cpp b/src/MpAlbumContentListForm.cpp new file mode 100644 index 0000000..136c1c0 --- /dev/null +++ b/src/MpAlbumContentListForm.cpp @@ -0,0 +1,892 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumContentListForm.cpp + * @brief This is the implementation file for AlbumContentListForm class. + */ + +#include +#include "MpAlbumContentListForm.h" +#include "MpAlbumListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AlbumContentListForm::AlbumContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pContentListTableView(null) + , __pThumbnail(null) + , __pPresentationModel(null) + , __checkedItemCount(0) + , __currentAlbumIndex(-1) + , __activatedStateContextItem(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumContentListForm::~AlbumContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +AlbumContentListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_CONTENT_LIST_FORM))) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return false; + } + + AppLogDebug("EXIT"); + return Construct(); +} + +result +AlbumContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView = static_cast(GetControl(IDC_TABLEVIEW_CONTENT_LIST)); + __pContentListTableView->AddTableViewItemEventListener(*this); + __pContentListTableView->SetItemProvider(this); + + SetContentList(__pContentListTableView); + AppLogDebug("EXIT"); + return ContentListForm::Construct(); +} + +result +AlbumContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +AlbumContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return ContentListForm::OnTerminating(); +} + +void +AlbumContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + bool isChecked = true; + if (__checkedItemCount == __pContentListTableView->GetItemCount()) + { + isChecked = false; + } + SetItemCheckedAll(isChecked); + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + Point anchorPoint(X_POINT_FOOTER_MORE, Y_POINT_PORTRAIT_FOOTER_MORE); + if ((GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE) || (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)) + { + anchorPoint.y = Y_POINT_LANDSCAPE_FOOTER_MORE; + } + + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + ToggleScreenState(SCREEN_STATE_SHARE_VIA); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + ToggleScreenState(SCREEN_STATE_EDITOR); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL),this); + } + break; + case IDA_COMMON_POPUP_DELETE: + { + RemoveCheckedTableviewItem(true); + } + break; + default: + break; + } + + TryRemoveCommonPopup(actionId); + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + if (GetScreenState() == SCREEN_STATE_NORMAL && IsEmptyContentList() == false) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } +} +void +AlbumContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + __prevSceneId.Clear(); + __prevSceneId.Append(*static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME))); + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + + if (__prevSceneId.Equals(IDSCN_SEARCH, false)) + { + __pPresentationModel->UpdateAlbumList(); + __ablumName = *(static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME))); + __currentAlbumIndex = __pPresentationModel->SearchAlbumIndex(__ablumName); + } + else if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false)) + { + SetItemCheckedAll(false); + } + else + { + __currentAlbumIndex = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + } + + __pPresentationModel->InitializeContentList(__currentAlbumIndex); + String* pAlbumName = __pPresentationModel->GetAlbumName(__currentAlbumIndex); + if (pAlbumName != null) + { + __ablumName = *pAlbumName; + __headerTitle.Format(255, pAlbumName->GetPointer()); + } + + ContentInformation* pContentInfo = __pPresentationModel->GetAlbumInfoN(__currentAlbumIndex); + if (pContentInfo != null) + { + Panel* pContentInfoPanel = new (std::nothrow) Panel(); + pContentInfoPanel->Construct(IDL_CONTENT_LIST_ALBUM_INFO_PANEL); + + static_cast(pContentInfoPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + static_cast(pContentInfoPanel->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(pContentInfo->AlbumName); + static_cast(pContentInfoPanel->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(pContentInfo->ArtistName); + static_cast(pContentInfoPanel->GetControl(IDC_PLAY_CONTENT_COUNT))->SetText(CommonUtil::SetSongsString(__pPresentationModel->GetContentCount(__currentAlbumIndex))); + + Bitmap* pBgBitmap = ResourceManager::GetBitmapN(L"T02_album_bg.png"); + Label* pBgLabel = static_cast(pContentInfoPanel->GetControl(IDC_LABEL_ALBUM_BACKGROUND)); + pBgLabel->SetBackgroundBitmap(*pBgBitmap); + pContentInfoPanel->SetControlAlwaysAtBottom(*pBgLabel, true); + delete pBgBitmap; + + SetExtraInformaionArea(*pContentInfoPanel); + RequestThumbnail(pContentInfo->contentId); + delete pContentInfo; + } + + pArgs->RemoveAll(true); + delete pArgs; + + if (GetScreenState() == SCREEN_STATE_EDITOR) + { + CommonUtil::SetEditHeaderStyle(*GetHeader(), ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + } + else + { + SetHeader(); + } + + UpdateScreenState(); + UpdateTableView(); + } + + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +AlbumContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + int itemCount = INIT_VALUE; + String* pAlbum = __pPresentationModel->GetAlbumName(__currentAlbumIndex); + if (pAlbum != null && pAlbum->Equals(__ablumName, false)) + { + itemCount = __pPresentationModel->GetContentCount(__currentAlbumIndex); + } + AppLogDebug("EXIT"); + return itemCount; +} + +void +AlbumContentListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (itemIndex >= 0) + { + AppLogDebug("INDEX %d", itemIndex); + __activatedStateContextItem = itemIndex; + } + AppLogDebug("EXIT"); +} + +int +AlbumContentListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +AlbumContentListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +AlbumContentListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + + +Tizen::Ui::Controls::TableViewItem* +AlbumContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewAnnexStyle tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_NORMAL; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_MARK; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), tableViewAnnexStyle); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +AlbumContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetItemCheckedStateChanged(status); + AppLogDebug("EXIT"); + return; + } + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pSceneArg = MakePlayerSceneParam(itemIndex); + if (pSceneArg != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pSceneArg); + } + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +AlbumContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + if (pTempList == null) + { + AppLogDebug("EXIT"); + return null; + } + + ArrayList* pSelectedMusicContent = null; + + pSelectedMusicContent = __pPresentationModel->GetContentPathListN(__currentAlbumIndex); + if (pSelectedMusicContent == null) + { + delete pTempList; + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pSelectedMusicContent)); + + AppLogDebug("EXIT"); + return pTempList; +} + +bool +AlbumContentListForm::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + String* pAlbum = __pPresentationModel->GetAlbumName(__currentAlbumIndex); + if (pAlbum != null && pAlbum->Equals(__ablumName, false)) + { + if (__pPresentationModel->GetContentCount(__currentAlbumIndex) != INIT_VALUE) + { + return false; + } + } + AppLogDebug("EXIT"); + return true; +} + +result +AlbumContentListForm::SetHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), __headerTitle); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +AlbumContentListForm::CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + else + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfo.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENT_TOTAL_COUNT))->SetText(CommonUtil::GetFormatDate(contentInfo.Duration)); + + parent.AddControl(pTableViewItem); + parent.SetIndividualSelectionEnabled(pTableViewItem, true); + + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +AlbumContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(PROVIDER_ID_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + const String* pResultString = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_SOCIAL_ITEM_ID))); + + AppLogDebug("%ls", pResultString->GetPointer()); + int contactId; + Integer::Parse(*pResultString, contactId); + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + ShowDelayedMessageBox(ResourceManager::GetString(L"IDS_COM_POP_SUCCESS")); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + Panel* pItemPanel = static_cast(GetExtraInformaionAreaControl()); + + if (pItemPanel == null) + { + AppLogDebug("pItemPanel is null"); + return; + } + + Label* pThumbnailLabel = static_cast(pItemPanel->GetControl(IDC_CONTENTS_THUMBNAIL)); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + delete pThumbnailInfo; + + if (__pThumbnail == null || pThumbnailLabel == null) + { + if ( __pThumbnail != null) + { + AppLogDebug("pThumbnailLabel is null"); + } + else + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + } + + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentListForm::OnUserEventReceivedN(requestId, pArgs); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + ContentListForm::OnMusicContentUpdateCompleted(); + UpdateExtraInformaionArea(); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::UpdateExtraInformaionArea(void) +{ + AppLogDebug("ENTER"); + String albumCount; + Panel* pItemPanel = static_cast(GetExtraInformaionAreaControl()); + + if (pItemPanel == null) + { + AppLogDebug("pItemPanel is null"); + return; + } + + albumCount.Format(255, L"%d songs", __pPresentationModel->GetContentCount(__currentAlbumIndex)); + Label* pAlbumCount = static_cast(pItemPanel->GetControl(IDC_PLAY_CONTENT_COUNT)); + pAlbumCount->SetText(albumCount); + + pAlbumCount->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::RemoveCheckedTableviewItem(bool itemRemove) +{ + AppLogDebug("ENTER"); + if (itemRemove) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + __pContentListTableView->SetItemChecked(iCount, false); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + RemoveContentAt(pContentInfo->contentId); + delete pContentInfo; + } + } +// __pPresentationModel->RefreshContentList(__currentAlbumIndex); + } + else + { + SetItemCheckedAll(false); + } + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::UpdateTableView(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView->UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + bool goback = true; + __currentAlbumIndex = __pPresentationModel->SearchAlbumIndex(__ablumName); + String* pAlbum = __pPresentationModel->GetAlbumName(__currentAlbumIndex); + if (pAlbum != null && pAlbum->Equals(__ablumName, true)) + { + __pPresentationModel->InitializeContentList(__currentAlbumIndex); + if (__pPresentationModel->GetContentCount(__currentAlbumIndex) > 0) + { + goback = false; + } + if (__prevSceneId.Equals(IDSCN_SEARCH, false) && __pPresentationModel->GetContentCount(__currentAlbumIndex) == 0) + { + goback = true; + } + } + if (goback) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_ALBUM_CONTENT_LIST,true)) + { + SetScreenState(SCREEN_STATE_NORMAL); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE,SCENE_DESTROY_OPTION_KEEP)); + } + } + + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + if (isChecked == true) + { + __checkedItemCount = __pContentListTableView->GetItemCount(); + } + else + { + __checkedItemCount = INIT_VALUE; + } + CommonUtil::SetItemCheckedAll(isChecked, *__pContentListTableView); + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +void +AlbumContentListForm::SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_UNCHECKED) + { + __checkedItemCount--; + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + } + else if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), true); + } + } + + __checkedItemCount++; + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +int +AlbumContentListForm::GetCheckedItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __checkedItemCount; +} + +Tizen::Base::Collection::IList* +AlbumContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pContentFilePathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pContentFilePathList->Construct())) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pContentFilePathList; + return null; + } + + if (argumentType == PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + delete pContentFilePathList; + AppLogDebug("GetContentInfoN(%d) is null", __activatedStateContextItem); + return null; + } + + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + else if (argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + AppLogDebug("GetContentInfoN(%d) is null", iCount); + delete pContentFilePathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + delete pContentInfo; + } + } + } + AppLogDebug("EXIT"); + return pContentFilePathList; +} + +void +AlbumContentListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + __pContentListTableView->UpdateTableView(); +} diff --git a/src/MpAlbumContentPickerPanel.cpp b/src/MpAlbumContentPickerPanel.cpp new file mode 100644 index 0000000..bd9e27d --- /dev/null +++ b/src/MpAlbumContentPickerPanel.cpp @@ -0,0 +1,342 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumContentPickerPanel.cpp + * @brief This is the implementation file for AlbumContentPickerPanel class. + */ + +#include "MpAlbumContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AlbumContentPickerPanel::AlbumContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumContentPickerPanel::~AlbumContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +AlbumContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +AlbumContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +AlbumContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +AlbumContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentAlbumIndex()); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentAlbumIndex()); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + String playlistName; + playlistName = CommonUtil::GetAddtoPlaylistName(); +// AppLogDebug("CATCH %ls", playlistName.GetPointer()); + __pPresentationModel->AddContent(playlistName, iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +AlbumContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + } + + __pPresentationModel->UpdateAlbumList(); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AlbumContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + AppLogDebug("EXIT"); +} + +int +AlbumContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentAlbumIndex()); +} + +Tizen::Ui::Controls::TableViewItem* +AlbumContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +AlbumContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +AlbumContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +AlbumContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +AlbumContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (tableView.IsItemChecked(itemIndex) == true) + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + else + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentAlbumIndex())) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +AlbumContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +AlbumContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpAlbumListEditorPanel.cpp b/src/MpAlbumListEditorPanel.cpp new file mode 100644 index 0000000..4494745 --- /dev/null +++ b/src/MpAlbumListEditorPanel.cpp @@ -0,0 +1,511 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListEditorPanel.cpp + * @brief This is the implementation file for AlbumListEditorPanel class. + */ + +#include "MpAlbumListEditorPanel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AlbumListEditorPanel::AlbumListEditorPanel(void) + : ContentEditPanel::ContentEditPanel() + , ThumbnailBase::ThumbnailBase() + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumListEditorPanel::~AlbumListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +AlbumListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + SetLayoutFitToForm(); + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + UpdateContentList(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +AlbumListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return ContentEditPanel::OnTerminating(); +} + +void +AlbumListEditorPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +void +AlbumListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER %d",actionId); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllAlbumCount(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + SetItemCheckedAll(false); + } + else + { + SetItemCheckedAll(true); + } + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ShowCommonDeletePopup(this); + } + break; + + case IDA_DELETE_POPUP_DELETE: + { + int totalCount = __pPresentationModel->GetAllAlbumCount(); + for (int iCount = totalCount - 1; iCount >= 0; iCount--) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->RemoveAlbumList(iCount); + } + } + + HideCommonDeletePopup(false); + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + HideCommonDeletePopup(false); + } + break; + default: + break; + } + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + Form* pForm = dynamic_cast(GetParent()); + Footer* pFooter = null; + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + SetEditHeaderStyle(); + + SetFooterStyle(STYLE_ADDTO_DELETE_ADD); + SetFormStyle(); + pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_ADDTO_DELETE_ADD); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + UpdateContentEditScreenState(); + + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, true)) + { + if (pArgs != null) + { + int totalCount = 0; + __pContentTableView->UpdateTableView(); + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetAllAlbumCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + else + { + if (pFooter != null && __checkedItemCount != 0) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + if (!(nextSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false))) + { + Footer* pFooter = pForm->GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + int totalCount = __pPresentationModel->GetAllAlbumCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +AlbumListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + int retCount = INIT_VALUE; + if (__pPresentationModel == null) + { + return retCount; + } + retCount = __pPresentationModel->GetAllAlbumCount(); + AppLogDebug("EXIT"); + return retCount; +} + +Tizen::Ui::Controls::TableViewItem* +AlbumListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetAlbumInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +AlbumListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + if (__checkedItemCount > INIT_VALUE) + { + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + else + { + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + Invalidate(true); + AppLogDebug("EXIT"); +} + +result +AlbumListEditorPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.AlbumName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +AlbumListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateAlbumList(); + } + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::SetEditHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + String titleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +AlbumListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +bool +AlbumListEditorPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetAllAlbumCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Base::Collection::IList* +AlbumListEditorPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + ArrayList* pContentPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = pContentPathList->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(r)); + delete pContentPathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER && argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pPresentationModel->GetAllAlbumCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pContentPathList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + } + else + { + AppLogDebug("EXIT"); + delete pContentPathList; + return null; + } + + AppLogDebug("EXIT"); + return pContentPathList; +} diff --git a/src/MpAlbumListPanel.cpp b/src/MpAlbumListPanel.cpp new file mode 100644 index 0000000..0212785 --- /dev/null +++ b/src/MpAlbumListPanel.cpp @@ -0,0 +1,523 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListPanel.cpp + * @brief This is the implementation file for AlbumListPanel class. + */ + +#include "MpAlbumListPanel.h" +#include "MpMusicPlayerApp.h" +#include "MpSettingPresentationModel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AlbumListPanel::AlbumListPanel(void) + : ContentLibaryPanel::ContentLibaryPanel() + , ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __pLaunchPlayerTimer(null) + , __pContextItem(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumListPanel::~AlbumListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +AlbumListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = AlbumListPresentationModel::GetInstance(); + __pContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_02); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + SetFormStyle(); + SetLayoutFitToForm(); + UpdateContentList(); + __pLaunchPlayerTimer = new (std::nothrow) Timer(); + __pLaunchPlayerTimer->Construct(*this); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +void +AlbumListPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +result +AlbumListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + delete __pContextItem; + __pContextItem = null; + + if (__pLaunchPlayerTimer != null) + { + __pLaunchPlayerTimer->Cancel(); + delete __pLaunchPlayerTimer; + __pLaunchPlayerTimer = null; + } + AppLogDebug("EXIT"); + return ContentLibaryPanel::OnTerminating(); +} + +void +AlbumListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_FLICK_MENU_ITEM_PLAYALL: + { + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + // Need to launch the Player after a delay because launching Player in this case needs some DB operations + // these DB operations needs some time to be completed, so in such cases Player's Drawing might be delayed + // resulting behaviours as "Not Showing error message" etc + __pLaunchPlayerTimer->Cancel(); + __pLaunchPlayerTimer->Start(MESSAGE_BOX_DELAY); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + if (__pPresentationModel->GetAllAlbumCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_LIST_EDITOR)); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_LIST)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SETTINGS: + { +// SettingPresentationModel::GetInstance()->InitializeSettingValue(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_MUSIC_SETTING)); + } + break; + + case IDA_FOOTER_BUTTON_BACK: + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (CommonUtil::GetAddtoPlaylistState() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + CommonUtil::SetAddtoPlaylistState(false); + } + else if(IsExistMiniPlayer()) + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + AppLogDebug("EXIT"); +} +void +AlbumListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + GetHeader()->SetItemSelected(2); + GetHeader()->Invalidate(true); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + CancelAllThumbnailRequest(); + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + AppLogDebug("EXIT"); +} + +int +AlbumListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllAlbumCount(); +} + +Tizen::Ui::Controls::TableViewItem* +AlbumListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetAlbumInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo, __pPresentationModel->GetContentCount(itemIndex)); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + pItem->SetContextItem(__pContextItem); + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +AlbumListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_CONTENT_LIST), GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::OnTimerExpired(Timer& timer) +{ + if (timer.Equals(*__pLaunchPlayerTimer)) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add((new (std::nothrow) String(MUSIC))); + pData->Add((new (std::nothrow) Integer(0))); + pData->Add((__pPresentationModel->GetContentPathListN(__itemIndex))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pData); + __itemIndex = -1; + } + } +} + +result +AlbumListPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct, + const int itemTotalCount) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + //static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.AlbumName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); + static_cast(pTableViewItem->GetControl(IDC_PLAY_CONTENT_COUNT))->SetText(CommonUtil::SetSongsString(itemTotalCount)); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::ArrayList* +AlbumListPanel::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetAlbumInfoN(itemIndex); + if (pContentInfoStruct == null) + { + AppLogDebug("EXIT"); + return null; + } + + String albumName = pContentInfoStruct->AlbumName; + //albumName = CommonUtil::SpecialReplaceChange(albumName); + albumName = CommonUtil::MakeQuery(STRING_SORT_ALBUM, albumName); + + ArrayList* pRetList = new (std::nothrow) ArrayList(); + pRetList->Construct(); + + pRetList->Add(*(new (std::nothrow) String(IDSCN_ALBUM_LIST))); + pRetList->Add(*(new (std::nothrow) String(albumName))); + pRetList->Add(*(new (std::nothrow) Integer(itemIndex))); + + delete pContentInfoStruct; + AppLogDebug("EXIT"); + return pRetList; +} + +void +AlbumListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateAlbumList(); + __pPresentationModel->RefreshContentList(INIT_VALUE); + } + AppLogDebug("EXIT"); +} + +bool +AlbumListPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + int countAllAlbum = INIT_VALUE; + countAllAlbum = __pPresentationModel->GetAllAlbumCount(); + + if (countAllAlbum > INIT_VALUE) + { + AppLogDebug("EXIT"); + return false; + } + AppLogDebug("EXIT"); + return true; +} + +void +AlbumListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +AlbumListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::IList* +AlbumListPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + if (pickerType != PICKER_TYPE_PLAY_LIST_PICKER || argumentType != PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + AppLogDebug("EXIT"); + return null; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentPathListN(__itemIndex); +} diff --git a/src/MpAlbumListPresentationModel.cpp b/src/MpAlbumListPresentationModel.cpp new file mode 100644 index 0000000..6714a24 --- /dev/null +++ b/src/MpAlbumListPresentationModel.cpp @@ -0,0 +1,423 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListPresentationModel.cpp + * @brief This is the implementation file for AlbumListPresentationModel class. + */ + +#include "MpAlbumListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +AlbumListPresentationModel* AlbumListPresentationModel::pAlbumListPresentationModelInstance = null; + +AlbumListPresentationModel* +AlbumListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pAlbumListPresentationModelInstance == null) + { + result r = E_SUCCESS; + pAlbumListPresentationModelInstance = new (std::nothrow) AlbumListPresentationModel(); + TryReturn(pAlbumListPresentationModelInstance != null, null, "AlbumListPresentationModel instance is not created."); + + if (pAlbumListPresentationModelInstance != null) + { + r = pAlbumListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "AlbumListPresentationModel instance is not constrcuted."); + } + } + AppLogDebug("EXIT"); + return pAlbumListPresentationModelInstance; + +CATCH: + delete pAlbumListPresentationModelInstance; + return null; +} + +int +AlbumListPresentationModel::GetContentCount(int albumIndex) +{ + AppLogDebug("ENTER"); + int totalCount = INIT_VALUE; + + if (__pAlbumList == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + if ((__pContentList != null) && (__currentAlbumIndex == albumIndex)) + { + totalCount = __pContentList->GetCount(); + } + else + { + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return INIT_VALUE; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + totalCount = pContentSearchResultList->GetCount(); + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + } + + AppLogDebug("EXIT"); + return totalCount; +} + +int +AlbumListPresentationModel::GetAllAlbumCount(void) +{ + AppLogDebug("ENTER"); + if (__pAlbumList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pAlbumList->GetCount(); +} + +AlbumListPresentationModel::AlbumListPresentationModel(void) + : __pAlbumList(null) + , __pContentList(null) + , __currentAlbumIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumListPresentationModel::~AlbumListPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (__pAlbumList != null) + { + __pAlbumList->RemoveAll(true); + delete __pAlbumList; + } + + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + + __currentAlbumIndex = -1; + } + AppLogDebug("EXIT"); +} + +result +AlbumListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + UpdateAlbumList(); + RefreshContentList(INIT_VALUE); + result r = E_SUCCESS; + AppLogDebug("EXIT"); + return r; +} + +ContentInformation* +AlbumListPresentationModel::GetAlbumInfoN(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pAlbumList == null) + { + AppLogDebug("__pAlbumList is null"); + return null; + } + + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if(pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +ContentInformation* +AlbumListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList == null || contentIndex < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pContentList is null)", contentIndex); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(contentIndex)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInformation; +} + +void +AlbumListPresentationModel::RemoveAlbumList(int albumIndex) +{ + AppLogDebug("ENTER"); + IList* pRemoveAlbumList = null; + int totalCount = 0; + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = null; + + ContentManager contentManager; + contentManager.Construct(); + + if (__pAlbumList == null) + { + AppLogDebug("EXIT"); + return ; + } + + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + pRemoveAlbumList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + totalCount = pRemoveAlbumList->GetCount(); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + pResult = static_cast(pRemoveAlbumList->GetAt(iCount)); + if (pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + contentManager.DeleteContent(pContentInformation->contentId); + delete pContentInformation; + } + } + + pRemoveAlbumList->RemoveAll(true); + delete pRemoveAlbumList; + AppLogDebug("EXIT"); +} + +Tizen::Base::String* +AlbumListPresentationModel::GetAlbumName(int albumIndex) +{ + AppLogDebug("ENTER"); + + if (__pAlbumList == null) + { + return null; + } + + AppLogDebug("EXIT"); + return static_cast(__pAlbumList->GetAt(albumIndex)); +} + +void +AlbumListPresentationModel::InitializeContentList(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + __currentAlbumIndex = albumIndex; + + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + __pContentList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +AlbumListPresentationModel::GetContentPathListN(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pAlbumList == null) + { + AppLogDebug("EXIT"); + return null; + } + + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + int totalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentPath; +} +void +AlbumListPresentationModel::RefreshContentList(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + String* pContentFileName = static_cast(__pAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + __pContentList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (__pContentList != null && __pContentList->GetCount() == INIT_VALUE) + { + delete __pContentList; + __pContentList = null; + } + __currentAlbumIndex = albumIndex; + AppLogDebug("EXIT"); +} + +int +AlbumListPresentationModel::GetCurrentAlbumIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentAlbumIndex; +} + +void +AlbumListPresentationModel::AddContent(String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + pPlayList->AddItem(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +result +AlbumListPresentationModel::UpdateAlbumList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pAlbumList != null) + { + __pAlbumList->RemoveAll(true); + delete __pAlbumList; + __pAlbumList = null; + } + + __pAlbumList = CommonUtil::SearchContentList(STRING_SORT_ALBUM); + TryCatch(__pAlbumList != null, r = E_FAILURE, "__pAlbumList is null"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} + +int +AlbumListPresentationModel::SearchAlbumIndex(Tizen::Base::String& albumName) +{ + AppLogDebug("ENTER"); + int albumIndex = 0; + String* pTemp = null; + TryReturn(__pAlbumList != null, -1, "pAlbumList is null"); + for (int i = 0; i < __pAlbumList->GetCount(); i++) + { + pTemp = static_cast(__pAlbumList->GetAt(i)); + if (albumName.Equals(*pTemp,true)) + { + return i; + } + } + AppLogDebug("EXIT"); + return albumIndex; +} diff --git a/src/MpAlbumPickerPanel.cpp b/src/MpAlbumPickerPanel.cpp new file mode 100644 index 0000000..c9f8d41 --- /dev/null +++ b/src/MpAlbumPickerPanel.cpp @@ -0,0 +1,103 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumPickerPanel.cpp + * @brief This is the implementation file for AlbumPickerPanel class. + */ + +#include "MpAlbumPickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AlbumPickerPanel::AlbumPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AlbumPickerPanel::~AlbumPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +AlbumPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + __pPresentationModel->UpdateAlbumList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AlbumPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + } + AppLogDebug("EXIT"); +} + +void +AlbumPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + __pPresentationModel->InitializeContentList(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_CONTENT_PICKER)); + } + AppLogDebug("EXIT"); +} \ No newline at end of file diff --git a/src/MpAllContentPickerPanel.cpp b/src/MpAllContentPickerPanel.cpp new file mode 100644 index 0000000..fa57ed4 --- /dev/null +++ b/src/MpAllContentPickerPanel.cpp @@ -0,0 +1,200 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllContentPickerPanel.cpp + * @brief This is the implementation file for AllContentPickerPanel class. + */ + +#include "MpAllContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int INDEX_ALL_SONG_TAB = 0; +static const int INDEX_PLAY_LIST_TAB = 1; + +AllContentPickerPanel::AllContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AllContentPickerPanel::~AllContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +AllContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + int totalCount = __pPresentationModel->GetTotalCount(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + SetCheckedCountBallonTooltip(__checkedItemCount); + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + break; + } + + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + SetCheckedCountBallonTooltip(__checkedItemCount); + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + break; + + case IDA_FOOTER_BUTTON_ADD: + { + ArrayList* pList = new (std::nothrow) ArrayList(); + pList->Construct(); + + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAddtoPlaylistState(false); + Invalidate(true); + pSceneManager->GoBackward(BackwardSceneTransition(),pList); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +AllContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + GetHeader()->SetItemSelected(INDEX_ALL_SONG_TAB); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + pForm->SetFormBackEventListener(this); + + SetFooterStyle(STYLE_ADD_ADD); + SetFormStyle(); + Footer* pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_ADD_ADD); + + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + } + + int totalCount = __pPresentationModel->GetTotalCount(); + bool addButtonEnable = false; + for (int i = 0; i < totalCount; i++) + { + if (__pContentTableView->IsItemChecked(i) == true) + { + addButtonEnable = true; + break; + } + } + + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, addButtonEnable); + } + + SetAddHeaderStyle(); + UpdateContentEditScreenState(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AllContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + + GetHeader()->SetItemSelected(INDEX_PLAY_LIST_TAB); + + Footer* pFooter = GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + AppLogDebug("EXIT"); +} + +void +AllContentPickerPanel::SetAddHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + String titleText(ResourceManager::GetString(L"IDS_MUSIC_TAB4_ALL")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpAllListEditorPanel.cpp b/src/MpAllListEditorPanel.cpp new file mode 100644 index 0000000..8e04ec3 --- /dev/null +++ b/src/MpAllListEditorPanel.cpp @@ -0,0 +1,574 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListEditorPanel.cpp + * @brief This is the implementation file for AllListEditorPanel class. + */ + +#include "MpAllListEditorPanel.h" +#include "MpAllListPresentationModel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AllListEditorPanel::AllListEditorPanel(void) + : ContentEditPanel::ContentEditPanel() + , ThumbnailBase::ThumbnailBase() + , __pThumbnail(null) + , __editType(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AllListEditorPanel::~AllListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +AllListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = AllListPresentationModel::GetInstance(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + UpdateContentList(); + SetLayoutFitToForm(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +AllListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); + return ContentEditPanel::OnTerminating(); +} + +void +AllListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return; + } + + int totalCount = __pPresentationModel->GetTotalCount(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + SetItemCheckedAll(false); + } + else + { + SetItemCheckedAll(true); + } + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ShowCommonDeletePopup(this); + } + break; + case IDA_DELETE_POPUP_DELETE: + { + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = totalCount - 1; iCount >= 0; iCount--) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->RemoveContent(iCount); + } + } + + HideCommonDeletePopup(false); + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + HideCommonDeletePopup(false); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + Form* pForm = dynamic_cast(GetParent()); + Footer* pFooter = null; + AppAssert(pForm); + + pForm->SetFormBackEventListener(this); + if (pArgs != null && (previousSceneId.Equals(IDSCN_ALL_LIST, true))) + { + __editType = static_cast(pArgs->GetAt(0))->ToInt(); + } + + SetEditHeaderStyle(); + + if (__editType == IDA_CONTEXT_MENU_ITEM_EDIT) + { + SetFooterStyle(STYLE_ADDTO_DELETE_ADD); + SetFormStyle(); + pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_ADDTO_DELETE_ADD); + } + else + { + SetFooterStyle(STYLE_SHARE_ADD); + SetFormStyle(); + pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_SHARE_ADD); + } + + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + UpdateContentEditScreenState(); + + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, true)) + { + if (pArgs != null) + { + int totalCount = 0; + __pContentTableView->UpdateTableView(); + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetTotalCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + else + { + if (pFooter != null && __checkedItemCount != 0) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + + if (!(nextSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false))) + { + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + } + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +int +AllListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + int musicItem = INIT_VALUE; + if (__pPresentationModel == null) + { + return musicItem; + } + + musicItem = __pPresentationModel->GetTotalCount(); + AppLogDebug("EXIT"); + return musicItem; +} + +Tizen::Ui::Controls::TableViewItem* +AllListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +AllListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + if (__checkedItemCount > INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + Invalidate(true); + AppLogDebug("EXIT"); +} + +result +AllListEditorPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +AllListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateContentList(); + } + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::SetEditHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + if(__editType == IDA_CONTEXT_MENU_ITEM_EDIT) + { + String titleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + } + else + { + String titleText(ResourceManager::GetString(L"IDS_IV_BODY_SHARE_VIA")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + } + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + if (CommonUtil::GetAddtoPlaylistState()) + { + ArrayList* pList = new (std::nothrow) ArrayList(); + pList->Construct(); + + CommonUtil::SetAddtoPlaylistState(false); + pSceneManager->GoBackward(BackwardSceneTransition(),pList); + } + else + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + AppLogDebug("EXIT"); +} + +void +AllListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +bool +AllListEditorPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetTotalCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Base::Collection::IList* +AllListEditorPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + ArrayList* pContentPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = pContentPathList->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(r)); + delete pContentPathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER && argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pContentPathList->Add(__pPresentationModel->GetCheckedContent(iCount)); + } + } + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER && argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + pContentPathList->RemoveAll(true); + delete pContentPathList; + + AppLogDebug("EXIT"); + return null; + } + pContentPathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + } + } + else + { + AppLogDebug("EXIT"); + delete pContentPathList; + return null; + } + + AppLogDebug("EXIT"); + return pContentPathList; +} diff --git a/src/MpAllListPanel.cpp b/src/MpAllListPanel.cpp new file mode 100644 index 0000000..da61975 --- /dev/null +++ b/src/MpAllListPanel.cpp @@ -0,0 +1,843 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListPanel.cpp + * @brief This is the implementation file for AllListPanel class. + */ + +#include +#include +#include "MpAllListPanel.h" +#include "MpAllListPresentationModel.h" +#include "MpMiniPlayer.h" +#include "MpMusicPlayerApp.h" +#include "MpSettingPresentationModel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +AllListPanel::AllListPanel(void) + : ContentLibaryPanel::ContentLibaryPanel() + , ThumbnailBase::ThumbnailBase() + , __pContextItem(null) + , __pDeletePopup(null) + , __pThumbnail(null) + , __itemIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AllListPanel::~AllListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +AllListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Panel::Construct(IDL_CONTENT_LIBARY_ALL_LIST_PANEL); + if (IsFailed(r)) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_PANEL) failed(%s)", GetErrorMessage(r)); + return false; + } + AppLogDebug("EXIT"); + return ContentLibaryPanel::Construct(); +} + +result +AllListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = AllListPresentationModel::GetInstance(); + __pContentTableView->AddFastScrollListener(*this); + + __pContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_01); + if (__pContextItem == null) + { + delete __pContextItem; + __pContextItem = null; + AppLogDebug("CommonUtil::CreateContentDeletePopup failed"); + return E_FAILURE; + } + + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + SetFormStyle(); + SetLayoutFitToForm(); + UpdateContentList(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +AllListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + + if (__pDeletePopup != null) + { + delete __pDeletePopup; + __pDeletePopup = null; + } + if (__pContextItem != null) + { + delete __pContextItem; + __pContextItem = null; + } + + AppLogDebug("EXIT"); + return ContentLibaryPanel::OnTerminating(); +} + +void +AllListPanel::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + result r = E_SUCCESS; + + if (appId.Equals(String(PROVIDER_ID_CONTACT))/* && operationId.Equals(String(OPERATION_ID_PICK))*/) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + int contactId = -1; + String* pKey = null; + ArrayList* pArrayListValue = null; + String* pResultString = null; + if (pExtraData != null) + { + IMapEnumerator* pEnum = pExtraData->GetMapEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast(pEnum->GetKey()); + if (pKey->Equals(APPCONTROL_KEY_SOCIAL_ITEM_ID, true)) + { + pArrayListValue = static_cast(pEnum->GetValue()); + } + } + delete pEnum; + + if (pArrayListValue != null && pArrayListValue->GetCount() > 0) + { + for (int iCount = 0; iCount < pArrayListValue->GetCount(); iCount++) + { + pResultString = static_cast(pArrayListValue->GetAt(iCount)); + AppLogDebug("extraData : %ls:%ls total contacts %d", pKey->GetPointer(), pResultString->GetPointer(),pArrayListValue->GetCount()); + Integer::Parse(*pResultString, contactId); + pResultString->Clear(); + if (contactId < 0) + { + AppLogDebug("pKey is invaild"); + break; + } + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pContentInfoStruct == null) + { + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->Tizen::Social::Contact::SetValue(CONTACT_PROPERTY_ID_RINGTONE, pContentInfoStruct->ContentFilePath); + r = pAddressbook->UpdateContact(*pContact); + + delete pContentInfoStruct; + delete pContact; + delete pAddressbook; + } + } + + } + + else + { + AppLogDebug("pExtraData is null"); + return; + } + + if (r == E_SUCCESS) + { + GetParent()->SendUserEvent(ID_SHOW_SUCCESS_MESSAGE,null); + } + } + } + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_MENU_ITEM_SHARE: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_EMAIL | CONTEXT_MENU_ITEM_STYLE_MESSAGE); + } + break; + + case IDA_FLICK_MENU_ITEM_SET_AS: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_CALL | CONTEXT_MENU_ITEM_STYLE_CALLER); + } + break; + + case IDA_DELETE_POPUP_DELETE: + // fall through + case IDA_DELETE_POPUP_CANCEL: + { + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(false); + //delete __pDeletePopup; + //__pDeletePopup = null; + } + + if (actionId == IDA_DELETE_POPUP_DELETE) + { + __pPresentationModel->RemoveContent(__itemIndex); + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_EMAIL: + // fall through + case IDA_CONTEXT_MENU_ITEM_MESSAGE: + { + result r = E_FAILURE; + String providerID = ((actionId == IDA_CONTEXT_MENU_ITEM_EMAIL) ? PROVIDER_ID_EMAIL : PROVIDER_ID_MESSAGE); + AppControl* pAppControl = AppManager::FindAppControlN(providerID, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + AppLogDebug("AppManager::FindAppControlN is null"); + return; + } + + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pContentInfoStruct == null) + { + AppLogDebug("PresentationModel->GetContentInfoN is null"); + delete pAppControl; + pAppControl = null; + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + + Tizen::Base::Collection::ArrayList* pValueList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pValueList->Construct(); + pValueList->Add(*(new (std::nothrow) String(pContentInfoStruct->ContentFilePath))); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), pValueList); + + r = pAppControl->Start(null, null, pDataList, this); + + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + + delete pContentInfoStruct; + delete pAppControl; + + if(__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALL: + { + result r = __pPresentationModel->SetCallRingtone(__itemIndex); + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), MSGBOX_STYLE_OK, 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + if(__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALLER: + { + result r = E_FAILURE; + AppControl* pAppControl = AppManager::FindAppControlN(PROVIDER_ID_CONTACT, OPERATION_ID_SOCIAL_PICK); + if (pAppControl == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTION_MODE), new (std::nothrow) String(APPCONTROL_OPTION_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_ITEM_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_PERSON)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_RESULT_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_ITEM_ID)); + + r = pAppControl->Start(null, null, pDataList, this); + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + delete pAppControl; + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_FLICK_MENU_ITEM_DELETE: + { + if (__pDeletePopup == null) + { + __pDeletePopup = CommonUtil::CreateContentDeletePopup(*this, IDA_DELETE_POPUP_DELETE, IDA_DELETE_POPUP_CANCEL); + __pDeletePopup->SetPropagatedKeyEventListener(this); + } + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + // fall through + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + if (__pPresentationModel->GetTotalCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) Integer(actionId))); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_LIST_EDITOR),pData); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + } + break; + + case IDA_FOOTER_BUTTON_BACK: + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + break; + + case IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_LIST)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SETTINGS: + { +// SettingPresentationModel::GetInstance()->InitializeSettingValue(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_MUSIC_SETTING)); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if(IsExistMiniPlayer()) + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + + AppLogDebug("EXIT"); +} +void +AllListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + GetHeader()->SetItemSelected(0); + GetHeader()->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + ContentLibaryPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + AppLogDebug("EXIT"); +} + +int +AllListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetTotalCount(); +} + +TableViewItem* +AllListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + pItem->SetContextItem(__pContextItem); + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +AllListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + AppLogDebug("ENTER"); + int totalCount = __pPresentationModel->GetTotalCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + String name = __pPresentationModel->GetContentName(iCount); + if (name.GetLength()) + { + String firstCharacter; + + name.SubString(0, 1, firstCharacter); + firstCharacter.ToUpper(); + + mchar language; + firstCharacter.GetCharAt(0, language); + + if (Character::GetUnicodeCategory(language) == UNICODE_HANGUL) + { + Tizen::Base::String HangulIndex[] = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ" , "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + + wchar_t songName; + name.GetCharAt(0, songName); + + wchar_t UnicodeValue = (songName - 0xAC00); + wchar_t InitialConsonant = ((UnicodeValue - (UnicodeValue % 28)) / 28) / 21; + int tempIndex = static_cast(InitialConsonant); + + if (HangulIndex[tempIndex].CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + else if (index.CompareTo("0") == 0 && Character::IsDigit(language) == true) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + else if (firstCharacter.CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + } + AppLogDebug("EXIT"); +} + +bool +AllListPanel::OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + return true; + } + AppLogDebug("EXIT"); + return false; + +} + +bool +AllListPanel::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null && (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC)) + { + __pDeletePopup->SetShowState(false); + return true; + } + AppLogDebug("EXIT"); + return false; + +} + +Tizen::Base::Collection::ArrayList* +AllListPanel::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(itemIndex))); + pTempList->Add(*(__pPresentationModel->GetContentListN())); + + AppLogDebug("EXIT"); + return pTempList; +} + +void +AllListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateContentList(); + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::IList* +AllListPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + if (pickerType != PICKER_TYPE_PLAY_LIST_PICKER || argumentType != PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + AppLogDebug("EXIT"); + return null; + } + + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pContentInfo == null) + { + AppLogDebug("EXIT"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + result r = pContentPath->Construct(); + if (IsFailed(r)) + { + AppLogDebug("EXIT"); + delete pContentInfo; + delete pContentPath; + return null; + } + + pContentPath->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pContentPath; +} + +bool +AllListPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null || __pPresentationModel->GetTotalCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +result +AllListPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + //static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +AllListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null && __pDeletePopup->GetShowState() == true) + { + __pDeletePopup->SetShowState(false); +// delete __pDeletePopup; +// __pDeletePopup = null; + } + ContentLibaryPanel::OnMusicContentUpdateCompleted(); + AppLogDebug("EXIT"); +} + +void +AllListPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +void +AllListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpAllListPresentationModel.cpp b/src/MpAllListPresentationModel.cpp new file mode 100644 index 0000000..8699c22 --- /dev/null +++ b/src/MpAllListPresentationModel.cpp @@ -0,0 +1,291 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAllListPresentationModel.cpp + * @brief This is the implementation file for AllListPresentationModel class. + */ + +#include "MpAllListPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +AllListPresentationModel* AllListPresentationModel::pAllListPresentationModelInstance = null; + +AllListPresentationModel::AllListPresentationModel(void) + : __pContentList(null) + , __pAutoOffTimer(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +AllListPresentationModel::~AllListPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (__pAutoOffTimer != null) + { + __pAutoOffTimer->Cancel(); + delete __pAutoOffTimer; + __pAutoOffTimer = null; + } + AppLogDebug("EXIT"); +} + +result +AllListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + __pAutoOffTimer = new (std::nothrow) Timer(); + result r = __pAutoOffTimer->Construct(*this); + if (IsFailed(r)) + { + delete __pAutoOffTimer; + __pAutoOffTimer = null; + } + + AppLogDebug("EXIT"); + return r; +} + +AllListPresentationModel* +AllListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pAllListPresentationModelInstance == null) + { + pAllListPresentationModelInstance = new (std::nothrow) AllListPresentationModel(); + TryReturn(pAllListPresentationModelInstance != null, null, "AllListPresentationModel instance is not created."); + + result r = pAllListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "AllListPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pAllListPresentationModelInstance; + +CATCH: + delete pAllListPresentationModelInstance; + return null; +} + +int AllListPresentationModel::GetTotalCount(void) +{ + AppLogDebug("ENTER"); + if (__pContentList == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pContentList->GetCount(); +} + +ContentInformation* +AllListPresentationModel::GetContentInfoN(int index) +{ + AppLogDebug("ENTER"); + if (__pContentList == null || index < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pContentList is null)", index); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(index)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInformation; +} + +result +AllListPresentationModel::RemoveContent(int index) +{ + AppLogDebug("ENTER"); + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(index)); + TryReturn(pResult != null, E_INVALID_ARG, "index is invalid value"); + + ContentManager manager; + manager.Construct(); + + AudioContentInfo* pAudioContentInfo = static_cast(pResult->GetContentInfo()); + manager.DeleteContent(pAudioContentInfo->GetContentId()); + + __pContentList->RemoveAt(index); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +Tizen::Base::String +AllListPresentationModel::GetContentName(int index) +{ + AppLogDebug("ENTER"); + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(index)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + AppLogDebug("EXIT"); + AudioContentInfo* pAudioContentInfo = static_cast(pResult->GetContentInfo()); + return pAudioContentInfo->GetTitle(); + } + + AppLogDebug("EXIT"); + return String(); +} + +Tizen::Base::String* +AllListPresentationModel::GetCheckedContent(int index) +{ + AppLogDebug("ENTER"); + if (__pContentList == null) + { + return null; + } + + Tizen::Base::String* pContent = null; + +// for (int iCount = 0; iCount < __pContentList->GetCount(); iCount++) +// { + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(index)); + if(pResult != null) + { + pContent = new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()); + } +// } + AppLogDebug("EXIT"); + return pContent; +} + +Tizen::Base::Collection::ArrayList* +AllListPresentationModel::GetContentListN(void) +{ + AppLogDebug("ENTER"); + if (__pContentList == null) + { + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + for (int iCount = 0; iCount < __pContentList->GetCount(); iCount++) + { + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(iCount)); + if(pResult != null) + { + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + } + AppLogDebug("EXIT"); + return pContentPath; +} + +result +AllListPresentationModel::SetCallRingtone(int index) +{ + AppLogDebug("ENTER"); + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(index)); + AppLogDebug("EXIT"); + return Tizen::System::SettingInfo::SetValue(CALL_RINGTONE_KEY, pResult->GetContentInfo()->GetContentPath()); +} + +void +AllListPresentationModel::AddContent(String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfo = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + if (pContentInfo != null && pPlayList != null) + { + pPlayList->AddItem(pContentInfo->contentId); + } + + delete pContentInfo; + delete pPlayList; + AppLogDebug("EXIT"); +} + +result +AllListPresentationModel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __pContentList = CommonUtil::SearchContentList(STRING_SORT_GAP, STRING_SORT_TITLE); + TryCatch(__pContentList != null, r = E_FAILURE, "__pContentList is null"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} + +void +AllListPresentationModel::OnTimerExpired(Tizen::Base::Runtime::Timer& timer) +{ + AppLogDebug("ENTER"); + if (__pAutoOffTimer == &timer) + { + Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +result +AllListPresentationModel::StartAutoOffTimer(int autoOffValue) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (__pAutoOffTimer != null) + { + if (autoOffValue == 0) + { + r = __pAutoOffTimer->Cancel(); + AppLogDebug("%s", GetErrorMessage(r)); + } + else + { + __pAutoOffTimer->Cancel(); + r = __pAutoOffTimer->Start(autoOffValue); + AppLogDebug("%s", GetErrorMessage(r)); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to Start __pAutoOffTimer.\n"); + } + AppLogDebug("EXIT"); + return r; + } + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} diff --git a/src/MpArtistAlbumListEditorForm.cpp b/src/MpArtistAlbumListEditorForm.cpp new file mode 100644 index 0000000..40600db --- /dev/null +++ b/src/MpArtistAlbumListEditorForm.cpp @@ -0,0 +1,399 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAlbumListEditorForm.cpp + * @brief This is the implementation file for ArtistAlbumListEditorForm class. + */ + +#include "MpArtistAlbumListEditorForm.h" +#include "MpArtistListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ArtistAlbumListEditorForm::ArtistAlbumListEditorForm(void) + : ThumbnailBase::ThumbnailBase() + , __pContentTableView(null) + , __pCheckedCountLabel(null) + , __pSelectAllCheckedButton(null) + , __pThumbnail(null) + , __checkedItemCount(0) + , __pPlayListPickerPopup(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistAlbumListEditorForm::~ArtistAlbumListEditorForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ArtistAlbumListEditorForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + if (IsFailed(r)) + { + return false; + } + + AppLogDebug("EXIT"); + return true; +} + +result +ArtistAlbumListEditorForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Rectangle tableViewRect = GetClientAreaBounds(); + tableViewRect.x = 0; + tableViewRect.y = H_SELECT_ALL_BUTTON; + tableViewRect.height = tableViewRect.height - H_SELECT_ALL_BUTTON; + + __pContentTableView = new (std::nothrow) TableView(); + __pContentTableView->Construct(tableViewRect, true, TABLE_VIEW_SCROLL_BAR_STYLE_FADE_OUT); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(GetClientAreaBounds().width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(GetClientAreaBounds().width, GetClientAreaBounds().height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ArtistAlbumListEditorForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ArtistAlbumListEditorForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetArtistAlbumListCount(); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::SetButtonEnabled(*this, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::SetButtonEnabled(*this, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + + int totalCount = __pPresentationModel->GetArtistAlbumListCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pDataList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount, SEARCH_MODE_ARTIST_ALBUM))); + __pContentTableView->SetItemChecked(iCount, false); + } + } + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + + Invalidate(true); + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + CommonUtil::SetButtonEnabled(*this, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + pSceneManager->GoBackward(BackwardSceneTransition()); + CommonUtil::SetButtonEnabled(*this, __checkedItemCount, actionId); + } + break; + + default: + break; + } + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*this); + pFooter->AddActionEventListener(*this); + + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistAlbumInfoN(0); + if (pContentInfoStruct == null) + { + return; + } + + Header* pHeader = GetHeader(); + pHeader->SetStyle(HEADER_STYLE_TITLE); + pHeader->SetTitleText(pContentInfoStruct->ArtistName); + + CommonUtil::SetButtonEnabled(*this, __checkedItemCount); + + if (pContentInfoStruct != null) + { + delete pContentInfoStruct; + pContentInfoStruct = null; + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + pHeader->RemoveAllButtons(); + pHeader->RemoveAllItems(); + + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +ArtistAlbumListEditorForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistAlbumListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistAlbumListEditorForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistAlbumInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) Integer(itemIndex))); + CommonUtil::CreateEditListTableViewItem(*pItem, *(GetDefaultThumbnail()), pContentInfoStruct->AlbumName, __pPresentationModel->GetArtistAlbumContentCount(itemIndex)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +int +ArtistAlbumListEditorForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +ArtistAlbumListEditorForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ArtistAlbumListEditorForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + bool selectAllCheckedState = __checkedItemCount == __pPresentationModel->GetArtistAlbumListCount(); + __pSelectAllCheckedButton->SetSelected(selectAllCheckedState); + __pSelectAllCheckedButton->Invalidate(true); + + CommonUtil::SetButtonEnabled(*this, __checkedItemCount); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListEditorForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + diff --git a/src/MpArtistAlbumListForm.cpp b/src/MpArtistAlbumListForm.cpp new file mode 100644 index 0000000..6bf4da2 --- /dev/null +++ b/src/MpArtistAlbumListForm.cpp @@ -0,0 +1,502 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAlbumListForm.cpp + * @brief This is the implementation file for ArtistAlbumListForm class. + */ + +#include "MpArtistAlbumListForm.h" +#include "MpArtistListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +#define ALL_SONG_INDEX_COUNT_PLUS(n) (n + 1) +#define ALL_SONG_INDEX_COUNT_MINUS(n) (n - 1) + +ArtistAlbumListForm::ArtistAlbumListForm(void) + : ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __deleteItem(false) + , __pKeyword(null) + , __pContentTableView(null) + , __pContextItem(null) + , __pPlayListPickerPopup(null) + , __pNoContentImageLabel(null) + , __pNoContentTextLabel(null) + , __pThumbnail(null) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) + , __fontSize(FONT_MAIN_TEXT_SIZE_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistAlbumListForm::~ArtistAlbumListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ArtistAlbumListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + if (IsFailed(r)) + { + return false; + } + + AppLogDebug("EXIT"); + return true; +} + +result +ArtistAlbumListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pContentTableView = new (std::nothrow) TableView(); + __pContentTableView->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), + true, + TABLE_VIEW_SCROLL_BAR_STYLE_FADE_OUT); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(GetClientAreaBounds().width, ITEM_HEIGHT)); + CommonUtil::CreateTableViewContextItem(*__pContextItem, *this); + + __pNoContentImageLabel = new (std::nothrow) Label(); + __pNoContentImageLabel->Construct(Rectangle((GetWidth() - W_NO_CONTENT) / 2, Y_GAP_NO_CONTENT, W_NO_CONTENT, H_NO_CONTENT), L""); + __pNoContentImageLabel->SetBackgroundBitmap(*(ResourceManager::GetBitmapN(IDB_NO_CONTENTS))); + + __pNoContentTextLabel = new (std::nothrow) Label(); + __pNoContentTextLabel->Construct(Rectangle(0, + __pNoContentImageLabel->GetHeight() + __pNoContentImageLabel->GetY(), + GetWidth(), + H_TEXT_NO_CONTENT), + ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pNoContentTextLabel->SetTextConfig(FONT_SIZE_NO_CONTENT, LABEL_TEXT_STYLE_BOLD); + + AddControl(__pContentTableView); + AddControl(__pNoContentImageLabel); + AddControl(__pNoContentTextLabel); + + __pNoContentImageLabel->SetShowState(false); + __pNoContentTextLabel->SetShowState(false); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __fontSize = CommonUtil::GetFontSize(__fontSizeValue); + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ArtistAlbumListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + delete __pContextItem; + __pContextItem = null; + +// __pPresentationModel->DeleteArtistAlbum(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ArtistAlbumListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_ALBUM_LIST_EDITOR)); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, __pPresentationModel->GetContentPathListN(__itemIndex)); + //__pPlayListPickerPopup->SetCollectedContent(__pPresentationModel->GetContentPathListN(__itemIndex)); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + /*case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break;*/ + + default: + break; + } + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pData = null; + + if (__deleteItem == true) + { + pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) Boolean(__deleteItem))); + } + + pSceneManager->GoBackward(BackwardSceneTransition(), pData); + +// for (int iCount = 0; iCount < pSceneManager->GetSceneHistoryN()->GetCount(); iCount++) +// { +// String* pTemp = new (std::nothrow) String(); +// pSceneManager->GetSceneHistoryN()->GetAt(iCount, *pTemp); +// AppLogDebug( "pTemp : %ls", pTemp->GetPointer()); +// } + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + SetFormBackEventListener(this); + + Header* pHeader = GetHeader(); + pHeader->SetStyle(HEADER_STYLE_TITLE); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistFooter(*this); + pFooter->SetBackButton(); + pFooter->AddActionEventListener(*this); + + if (pArgs != null && (previousSceneId.Equals(IDSCN_ARTIST_LIST, true) || previousSceneId.Equals(IDSCN_SEARCH, true))) + { + String* pTemp = static_cast(pArgs->GetAt(0)); + __pKeyword = new (std::nothrow) String(*pTemp); + __pPresentationModel->UpdateArtistList(); + __pPresentationModel->InitializeArtistAlbumList(*__pKeyword); + } + + if (previousSceneId.Equals(IDSCN_ARTIST_CONTENT_LIST, true)) + { + __deleteItem = true; + __pPresentationModel->UpdateArtistList(); + __pPresentationModel->InitializeArtistAlbumList(*__pKeyword); + + if (__pPresentationModel->GetArtistAlbumListCount() == 0) + { +// CommonUtil::ShowNoContentImage(__pPresentationModel->GetArtistAlbumListCount(), *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + CommonUtil::SetButtonEnabled(*this, __pPresentationModel->GetArtistAlbumListCount()); + pHeader->SetTitleText(ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + pFooter->SetItemEnabled(INDEX_ADDTOPLAYLIST_FOOTER_ADDTOPLAYLIST, false); + } + __pContentTableView->UpdateTableView(); + } + + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistAlbumInfoN(0); + if (pContentInfoStruct == null) + { + return; + } + + pHeader->SetTitleText(pContentInfoStruct->ArtistName); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + pHeader->RemoveAllButtons(); + pHeader->RemoveAllItems(); + + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + CancelAllThumbnailRequest(); + + AppLogDebug("EXIT"); +} + +int +ArtistAlbumListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return ALL_SONG_INDEX_COUNT_PLUS(__pPresentationModel->GetArtistAlbumListCount()); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistAlbumListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); +// pItem->SetBackgroundColor(COLOR_ITEM); + + if (itemIndex == INIT_VALUE) + { + AllSongCreateTableViewItem(*pItem, __pPresentationModel->GetArtistContentListCount()); + } + else + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistAlbumInfoN(ALL_SONG_INDEX_COUNT_MINUS(itemIndex)); + if (pContentInfoStruct == null) + { + delete pItem; + pItem = null; + + return null; + } + + int itemTotalCount = __pPresentationModel->GetArtistAlbumContentCount(ALL_SONG_INDEX_COUNT_MINUS(itemIndex)); + RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) Integer(itemIndex))); + + CommonUtil::CreateTableViewItem(*pItem, *GetDefaultThumbnail(), pContentInfoStruct->ArtistName, itemTotalCount); + pItem->SetContextItem(__pContextItem); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + + AppLogDebug("EXIT"); + return pItem; +} + +int +ArtistAlbumListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +ArtistAlbumListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ArtistAlbumListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status != TABLE_VIEW_ITEM_STATUS_SELECTED) + { + return; + } + + if (itemIndex == 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_ALL_SONG_LIST)); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_CONTENT_LIST), GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistAlbumListForm::AllSongCreateTableViewItem(Tizen::Ui::Container& parent, int totalCount) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Label* pAllSongLabel = new (std::nothrow) Label(); + pAllSongLabel->Construct(Rectangle(0, 0, 520, 128), L""); + pAllSongLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pAllSongLabel->SetText(ResourceManager::GetString("IDS_MUSIC_BODY_ALL_SONGS")); + pAllSongLabel->SetTextConfig(__fontSize, LABEL_TEXT_STYLE_NORMAL); + pAllSongLabel->SetBounds(pAllSongLabel->GetX(), pAllSongLabel->GetY(), pAllSongLabel->GetWidth(), __itemHeight - (ITEM_HEIGHT_MAIN_TEXT_NORMAL - pAllSongLabel->GetHeight())); + + Label* pAllSongCountLabel = new (std::nothrow) Label(); + pAllSongCountLabel->Construct(Rectangle(520, 0, 200, 128), L""); + pAllSongCountLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pAllSongCountLabel->SetText(CommonUtil::SetSongsString(totalCount)); + pAllSongCountLabel->SetTextConfig(__fontSize, LABEL_TEXT_STYLE_NORMAL); + pAllSongCountLabel->SetBounds(pAllSongCountLabel->GetX(), pAllSongCountLabel->GetY(), pAllSongCountLabel->GetWidth(), __itemHeight - (ITEM_HEIGHT_MAIN_TEXT_NORMAL - pAllSongCountLabel->GetHeight())); + + parent.AddControl(pAllSongCountLabel); + parent.AddControl(pAllSongLabel); + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::ArrayList* +ArtistAlbumListForm::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistAlbumInfoN(ALL_SONG_INDEX_COUNT_MINUS(itemIndex)); + if (pContentInfoStruct == null) + { + return null; + } + + String albumName = pContentInfoStruct->AlbumName; + //albumName = CommonUtil::SpecialReplaceChange(albumName); + albumName = CommonUtil::MakeQuery(STRING_SORT_ALBUM, albumName); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(IDSCN_ARTIST_ALBUM_LIST))); + pData->Add(*(new (std::nothrow) String(albumName))); + pData->Add(*(new (std::nothrow) Integer(ALL_SONG_INDEX_COUNT_MINUS(itemIndex)))); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pData; +} + +void +ArtistAlbumListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ArtistAlbumListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __fontSize = CommonUtil::GetFontSize(__fontSizeValue); + __pContentTableView->UpdateTableView(); +} diff --git a/src/MpArtistAllSongListForm.cpp b/src/MpArtistAllSongListForm.cpp new file mode 100644 index 0000000..dbf984b --- /dev/null +++ b/src/MpArtistAllSongListForm.cpp @@ -0,0 +1,388 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistAllSongListForm.cpp + * @brief This is the implementation file for ArtistAllSongListForm class. + */ + +#include "MpArtistAllSongListForm.h" +#include "MpArtistListPresentationModel.h" +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int W_SONG_TIME = 120; +static const int Y_GAP_LABEL = 10; + +ArtistAllSongListForm::ArtistAllSongListForm(void) + : ThumbnailBase::ThumbnailBase() + , __pContentTableView(null) + , __pThumbnail(null) + , __pPlayListPickerPopup(null) + , __fontSize(FONT_MAIN_TEXT_SIZE_NORMAL) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistAllSongListForm::~ArtistAllSongListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ArtistAllSongListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + + result r = Form::Construct(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + if (IsFailed(r)) + { + return false; + } + + AppLogDebug("EXIT"); + return true; +} + +result +ArtistAllSongListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + +// Header* pHeader = GetHeader(); +// pHeader->SetStyle(HEADER_STYLE_TITLE); +// pHeader->SetTitleText(ResourceManager::GetString("IDS_MUSIC_BODY_ALL_SONGS")); + + __pContentTableView = new (std::nothrow) TableView(); + __pContentTableView->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), + true, + TABLE_VIEW_SCROLL_BAR_STYLE_FADE_OUT); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + AddControl(__pContentTableView); + + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __fontSize = CommonUtil::GetFontSize(__fontSizeValue); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ArtistAllSongListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ArtistAllSongListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + Tizen::Base::Collection::IList* pDataList = null; + pDataList = __pPresentationModel->GetAllContentPathListN(); + + if (pDataList == null) + { + break; + } + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + } + break; + + /*case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break;*/ + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Footer* pFooter = CommonUtil::CreateAddtoPlaylistFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + + SetFormBackEventListener(this); + + Header* pHeader = GetHeader(); + pHeader->SetStyle(HEADER_STYLE_TITLE); + pHeader->SetTitleText(ResourceManager::GetString("IDS_MUSIC_BODY_ALL_SONGS")); + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + pHeader->RemoveAllButtons(); + pHeader->RemoveAllItems(); + + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +ArtistAllSongListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistContentListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistAllSongListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfo = __pPresentationModel->GetArtistContentInfoN(itemIndex); + if (pContentInfo == null) + { + AppLogDebug("EXIT"); + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + CreateTableViewItem(*pItem, *pContentInfo); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +ArtistAllSongListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +ArtistAllSongListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ArtistAllSongListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(itemIndex))); + pTempList->Add(*(__pPresentationModel->GetAllContentPathListN())); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER),pTempList); + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistAllSongListForm::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Label* pSongThumbnailBGLabel = new (std::nothrow) Label(); + pSongThumbnailBGLabel->Construct(Rectangle(X_GAP_THUMBNAIL - 1, Y_GAP_THUMBNAIL - 1, W_THUMBNAIL + 1, W_THUMBNAIL + 1), L""); + + Label* pSongThumbnailLabel = new (std::nothrow) Label(); + pSongThumbnailLabel->Construct(Rectangle(X_GAP_THUMBNAIL, Y_GAP_THUMBNAIL, W_THUMBNAIL, H_THUMBNAIL), L""); + pSongThumbnailLabel->SetBackgroundBitmap(*GetDefaultThumbnail()); + pSongThumbnailLabel->SetName(L"pSongThumbnailLabel"); + + int X_Gap = W_THUMBNAIL + (X_GAP_THUMBNAIL * 2); + int W_Label = W_CLIENT_AREA - X_Gap; + + Label* pSongTitleLabel = new (std::nothrow) Label(); + pSongTitleLabel->Construct(Rectangle(X_Gap,Y_GAP_LABEL, W_Label - W_SONG_TIME, (ITEM_HEIGHT - (Y_GAP_LABEL * 2)) / 2), L""); + pSongTitleLabel->SetTextColor(COLOR_MAIN_TEXT); + pSongTitleLabel->SetTextConfig(MAIN_TEXT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongTitleLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pSongTitleLabel->SetText(contentInfoStruct.TitleName); + + Label* pSongTimeLabel = new (std::nothrow) Label(); + pSongTimeLabel->Construct(Rectangle(pSongTitleLabel->GetWidth() + X_Gap, pSongTitleLabel->GetY(), W_SONG_TIME, pSongTitleLabel->GetHeight()) , L""); + pSongTimeLabel->SetTextColor(COLOR_SUB_TEXT); + pSongTimeLabel->SetTextConfig(SUB_TEXT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER); + pSongTimeLabel->SetText(CommonUtil::GetFormatDate(contentInfoStruct.Duration)); + + Label* pSongArtistLabel = new (std::nothrow) Label(); + pSongArtistLabel->Construct(Rectangle(X_Gap, pSongTimeLabel->GetHeight() + Y_GAP_LABEL, W_Label, pSongTitleLabel->GetHeight()), L""); + pSongArtistLabel->SetTextColor(COLOR_SUB_TEXT); + pSongArtistLabel->SetTextConfig(SUB_TEXT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongArtistLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pSongArtistLabel->SetText(contentInfoStruct.ArtistName); + + parent.AddControl(pSongThumbnailBGLabel); + parent.AddControl(pSongThumbnailLabel); + parent.AddControl(pSongTitleLabel); + parent.AddControl(pSongTimeLabel); + parent.AddControl(pSongArtistLabel); + + AppLogDebug("EXIT"); + return r; +} + +void +ArtistAllSongListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ArtistAllSongListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpArtistContentListForm.cpp b/src/MpArtistContentListForm.cpp new file mode 100644 index 0000000..aedb04f --- /dev/null +++ b/src/MpArtistContentListForm.cpp @@ -0,0 +1,1433 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistContentListForm.cpp + * @brief This is the implementation file for ArtistContentListForm class. + */ + +#include +#include "MpArtistContentListForm.h" +#include "MpArtistListPresentationModel.h" +#include "MpMusicPlayerApp.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::System; +using namespace Tizen::Social; + + +#define ALL_SONG_INDEX_COUNT_PLUS(n) (n + 1) +#define ALL_SONG_INDEX_COUNT_MINUS(n) (n - 1) + +ArtistContentListForm::ArtistContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pContentGroupedTableView(null) + , __pTableViewContextItem(null) + , __pCheckedItemCountMultiHashMap(null) + , __pThumbnail(null) + , __activatedStateContextItem(0) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistContentListForm::~ArtistContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistContentListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_CONTENT_LIST_ARTIST_FORM))) + { + AppLogDebug("Form::Construct(IDL_CONTENT_LIST_ARTIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return GetLastResult(); + } + + AppLogDebug("EXIT"); + return Construct(); +} + +result +ArtistContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentGroupedTableView = static_cast(GetControl(IDC_GROUPEDTABLEVIEW_CONTENT_LIST)); + __pContentGroupedTableView->AddGroupedTableViewItemEventListener(*this); + __pContentGroupedTableView->SetItemProvider(this); + + SetContentList(__pContentGroupedTableView); + + result r = InitCheckedItemMultiHashMap(); + if (IsFailed(r)) + { + AppLogDebug("InitCheckedItemMultiHashMap failed(%s)", GetErrorMessage(r)); + return r; + } + + AppLogDebug("EXIT"); + return ContentListForm::Construct(); +} + +result +ArtistContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + __pTableViewContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_01); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ArtistContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + RemoveCheckedItemMultiHashMap(); + + delete __pTableViewContextItem; + __pTableViewContextItem = null; + + __pContentGroupedTableView = null; + __pPresentationModel = null; + AppLogDebug("EXIT"); + return ContentListForm::OnTerminating(); +} + +void +ArtistContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false)) + { + SetItemCheckedAll(false); + } + else + { + __prevSceneId.Clear(); + __headerTitle.Clear(); + __prevSceneId.Append(*static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME))); + __headerTitle.Append(*static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME))); + __artistName = __headerTitle; + __pPresentationModel->UpdateArtistList(); + __pPresentationModel->InitializeArtistAlbumList(__artistName); + __pPresentationModel->InitializeContentList(INIT_VALUE); + } + if (GetScreenState() == SCREEN_STATE_EDITOR) + { + CommonUtil::SetEditHeaderStyle(*GetHeader(), ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + } + else + { + SetHeader(); + } + + UpdateScreenState(); + UpdateTableView(); + + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + bool isChecked = true; + if (GetCheckedItemCount() == GetTotalItemCount()) + { + isChecked = false; + } + SetItemCheckedAll(isChecked); + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + ToggleScreenState(SCREEN_STATE_EDITOR); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + ToggleScreenState(SCREEN_STATE_SHARE_VIA); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } + break; + + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + + case IDA_FLICK_MENU_ITEM_SHARE: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_EMAIL | CONTEXT_MENU_ITEM_STYLE_MESSAGE); + } + break; + + case IDA_FLICK_MENU_ITEM_SET_AS: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_CALL | CONTEXT_MENU_ITEM_STYLE_CALLER); + } + break; + + case IDA_FLICK_MENU_ITEM_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL)); + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + + case IDA_COMMON_POPUP_DELETE: + { +// RemoveCheckedTableviewItem(true); + RemoveConentCheckedAll(); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EMAIL: + { + ContentInformation* pContentInfo = GetContentInformationActivatedStateContextItem(); + if (pContentInfo != null) + { + EventHandlerContextMenuItemMessageEmail(*pContentInfo, PROVIDER_ID_EMAIL); + delete pContentInfo; + } + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_MESSAGE: + { + ContentInformation* pContentInfo = GetContentInformationActivatedStateContextItem(); + if (pContentInfo != null) + { + EventHandlerContextMenuItemMessageEmail(*pContentInfo, PROVIDER_ID_MESSAGE); + delete pContentInfo; + } + + SetItemCheckedAll(false); + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALL: + { + ContentInformation* pContentInfo = GetContentInformationActivatedStateContextItem(); + if (pContentInfo != null) + { + EventHandlerContextMenuItemCall(*pContentInfo); + delete pContentInfo; + } + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALLER: + { + EventHandlerContextMenuItemCaller(); + + if (__pContentGroupedTableView->IsContextItemOpened(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex)) + { + __pContentGroupedTableView->CloseContextItem(__activatedStateContextItem.__groupIndex,__activatedStateContextItem.__itemIndex); + } + } + break; + +// case IDA_FOOTER_BUTTON_DELETE: +// { +// RemoveConentCheckedAll(); +// } +// break; + case IDA_FOOTER_BUTTON_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL),this); + } + break; + + default: + break; + } + + TryRemoveCommonPopup(actionId); + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + if (GetScreenState() == SCREEN_STATE_NORMAL && IsEmptyContentList() == false) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } +} +void +ArtistContentListForm::OnGroupedTableViewGroupItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, + Tizen::Ui::Controls::TableViewGroupItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED && GetScreenState() != SCREEN_STATE_NORMAL) + { + bool ischeck = true; + if (tableView.GetItemCountAt(groupIndex) == GetCheckedItemCountAt(groupIndex)) + { + ischeck = false; + } + + SetItemCheckedAt(groupIndex, ischeck); + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + tableView.Invalidate(true); + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), ischeck); + } + } + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::OnGroupedTableViewItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetItemCheckedStateChanged(status, groupIndex, itemIndex); + AppLogDebug("EXIT"); + return; + } + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pSceneArg = MakePlayerSceneParam(groupIndex, itemIndex); + if (pSceneArg != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pSceneArg); + } + } + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::OnGroupedTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, + int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __activatedStateContextItem.__groupIndex = groupIndex; + __activatedStateContextItem.__itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +int +ArtistContentListForm::GetGroupCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistAlbumListCount(); +} + +int +ArtistContentListForm::GetItemCount(int groupIndex) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistAlbumContentCount(groupIndex); +} + +Tizen::Ui::Controls::TableViewGroupItem* +ArtistContentListForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + FloatDimension size = CoordinateSystem::AlignToDevice(FloatDimension(itemWidth,H_TABLEVIEW_GROUP_ITEM)); + TableViewGroupItem* pGroupItem = new (std::nothrow) TableViewGroupItem(); + if (IsFailed(pGroupItem->Construct(layout, FloatDimension(size.width, size.height)))) + { + AppLogDebug("TableViewGroupItem.Construct() failed(%s)", GetErrorMessage(GetLastResult())); + delete pGroupItem; + return null; + } + + ContentInformation* pContentInfo = __pPresentationModel->GetArtistAlbumInfoN(groupIndex); + if (pContentInfo != null) + { + CreateTableViewGroupItem(*pGroupItem, *pContentInfo); + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) TableviewItemTag(groupIndex, -1))); + delete pContentInfo; + } + + AppLogDebug("EXIT"); + return pGroupItem; +} + +bool +ArtistContentListForm::DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ArtistContentListForm::UpdateGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem) +{ + AppLogDebug("ENTER"); + Panel* pItemPanel = static_cast(pItem->GetControl(IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL)); + if (pItemPanel == null) + { + AppLogDebug("pItemPanel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItemPanel->GetControl(IDC_LABEL_CONTENT_THUMBNAIL)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistContentListForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewAnnexStyle tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_NORMAL; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_MARK; + } + + if (__pPresentationModel->GetCurrentArtistAlbumIndex() != groupIndex) + { + __pPresentationModel->InitializeContentList(groupIndex); + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetArtistAlbumContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), tableViewAnnexStyle); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +bool +ArtistContentListForm::DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ArtistContentListForm::UpdateItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +ArtistContentListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return H_TABLEVIEW_IITEM; +} + +int +ArtistContentListForm::GetDefaultGroupItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return H_TABLEVIEW_GROUP_ITEM; +} + +void +ArtistContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + TableviewItemTag* pTableviewItemTag = static_cast(pParam); + __pContentGroupedTableView->RefreshItem(pTableviewItemTag->__groupIndex, pTableviewItemTag->__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +bool +ArtistContentListForm::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pPresentationModel->GetArtistContentListCount() != INIT_VALUE) + { + AppLogDebug("EXIT"); + return false; + } + + AppLogDebug("EXIT"); + return true; +} + +result +ArtistContentListForm::SetHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), __headerTitle); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ArtistContentListForm::CreateTableViewGroupItem(Tizen::Ui::Controls::TableViewGroupItem& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + RelativeLayout* pLayOutPortrait = null; + Label* pTitleLabel = null; + Label* pInnerThumbStroke = null; + RelativeLayout* pLayOutLandscape = null; + Panel* pItem = new (std::nothrow) Panel(); + result r = pItem->Construct(IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL); + if (IsFailed(r)) + { + AppLogDebug("pItem->Construct() failed(%s)", GetErrorMessage(r)); + delete pItem; + return r; + } + + pLayOutPortrait = dynamic_cast(pItem->GetPortraitLayoutN()); + pTitleLabel = static_cast(pItem->GetControl(IDC_LABEL_CONTENT_TITLE_NAME)); + pInnerThumbStroke = static_cast(pItem->GetControl(IDC_LABEL_THUMBNAIL_INNER_STROKE)); + + if (pLayOutPortrait != null) + { + pLayOutPortrait->SetMargin(*pInnerThumbStroke,CoordinateSystem::ConvertToLogicalX(MARGIN_LEFT_THUMBNAIL_INNER_STROKE),0.0f,CoordinateSystem::ConvertToPhysicalY(MARGIN_TOP_THUMBNAIL_INNER_STROKE),0.0f); + pLayOutPortrait->Update(); + delete pLayOutPortrait; + } + + pLayOutLandscape = dynamic_cast(pItem->GetLandscapeLayoutN()); + if (pLayOutLandscape != null) + { + pLayOutLandscape->SetMargin(*pInnerThumbStroke,CoordinateSystem::ConvertToLogicalX(MARGIN_LEFT_THUMBNAIL_INNER_STROKE),0.0f,CoordinateSystem::ConvertToPhysicalY(MARGIN_TOP_THUMBNAIL_INNER_STROKE),0.0f); + pLayOutLandscape->Update(); + delete pLayOutLandscape; + } + if (CoordinateSystem::GetPhysicalResolution().width == W_WVGA_RESOLUTION) + { + FloatRectangle rect = CoordinateSystem::AlignToDevice(pTitleLabel->GetBoundsF()); + pTitleLabel->SetPosition(pTitleLabel->GetXF(),pTitleLabel->GetYF()-Y_GAP_THUMBNAIL); + pTitleLabel->SetSize(CoordinateSystem::AlignToDevice(FloatDimension(pTitleLabel->GetWidthF(),pTitleLabel->GetHeightF()))); + } + + (static_cast(pItem->GetControl(IDC_LABEL_CONTENT_THUMBNAIL)))->SetBackgroundBitmap(*GetDefaultThumbnail()); + pTitleLabel->SetText(contentInfo.AlbumName); + + parent.AddControl(pItem); + parent.SetEnabled(false); + + CommonUtil::SetLayoutFitToContainer(parent, *pItem); + + AppLogDebug("EXIT"); + return r; +} + +result +ArtistContentListForm::CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + Panel* pItem = new (std::nothrow) Panel(); + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + else + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pItem->Construct(IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + + (static_cast(pItem->GetControl(IDC_LABEL_CONTENT_TITLE_NAME)))->SetText(contentInfo.TitleName); + (static_cast(pItem->GetControl(IDC_LABEL_CONTENT_ADDITIONAL_INFO)))->SetText(CommonUtil::GetFormatDate(contentInfo.Duration)); + + parent.AddControl(pItem); + parent.SetIndividualSelectionEnabled(pItem, true); + + CommonUtil::SetLayoutFitToContainer(parent, *pItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ArtistContentListForm::InitCheckedItemMultiHashMap(void) +{ + AppLogDebug("ENTER"); + __pCheckedItemCountMultiHashMap = new (std::nothrow) MultiHashMapT(); + result r = __pCheckedItemCountMultiHashMap->Construct(); + if (IsFailed(r)) + { + delete __pCheckedItemCountMultiHashMap; + __pCheckedItemCountMultiHashMap = null; + return r; + } + AppLogDebug("EXIT"); + return r; +} + +void +ArtistContentListForm::RemoveCheckedItemMultiHashMap(void) +{ + AppLogDebug("ENTER"); + if (__pCheckedItemCountMultiHashMap != null) + { + __pCheckedItemCountMultiHashMap->RemoveAll(); + delete __pCheckedItemCountMultiHashMap; + __pCheckedItemCountMultiHashMap = null; + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +ArtistContentListForm::MakePlayerSceneParam(int albumIndex, int startIndex) +{ + AppLogDebug("ENTER"); +#if 0 + ArrayList* pSelectedMusicContent = __pPresentationModel->GetContentPathListN(albumIndex, SEARCH_MODE_ARTIST_ALBUM); +#else + ArrayList* pRetList = new (std::nothrow) ArrayList(); + pRetList->Construct(); + + for (int i = 0; i < __pPresentationModel->GetArtistAlbumListCount(); i++) + { + if (__pPresentationModel->GetCurrentArtistAlbumIndex() != i) + { + __pPresentationModel->InitializeContentList(i); + } + + for (int j = 0; j < __pPresentationModel->GetArtistAlbumContentCount(i); j++ ) + { + ContentInformation* pContentInfo = __pPresentationModel->GetArtistAlbumContentInfoN(j); + pRetList->Add(new String(pContentInfo->ContentFilePath)); + delete pContentInfo; + } + } + //ArrayList* pSelectedMusicContent = __pPresentationModel->GetAllContentPathListN(); + startIndex = startIndex + GetOffsetContentIndex(albumIndex); +#endif + if (pRetList->GetCount() == 0) + { + AppLogDebug("EXIT"); + delete pRetList; + return null; + } + + ArrayList* pTempList = new (std::nothrow) ArrayList(); + if (IsFailed(pTempList->Construct())) + { + AppLogDebug("Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pTempList; + + pRetList->RemoveAll(); + delete pRetList; + return null; + } + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pRetList)); + + AppLogDebug("EXIT"); + return pTempList; +} + +void +ArtistContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(PROVIDER_ID_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + int contactId = -1; + String* pKey = null; + ArrayList* pArrayListValue = null; + String* pResultString = null; + if (pExtraData != null) + { + IMapEnumerator* pEnum = pExtraData->GetMapEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast(pEnum->GetKey()); + if (pKey->Equals(APPCONTROL_KEY_SOCIAL_ITEM_ID, true)) + { + pArrayListValue = static_cast(pEnum->GetValue()); + pResultString = static_cast(pArrayListValue->GetAt(0)); + AppLogDebug("extraData : %ls:%ls", pKey->GetPointer(), pResultString->GetPointer()); + Integer::Parse(*pResultString, contactId); + break; + } + } + delete pEnum; + + if (contactId < 0) + { + AppLogDebug("pKey is invaild"); + return; + } + } + else + { + AppLogDebug("pExtraData is null"); + return; + } + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = GetContentInformationActivatedStateContextItem(); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + ShowDelayedMessageBox(ResourceManager::GetString(L"IDS_COM_POP_SUCCESS")); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + AppLogDebug("EXIT"); +} + +result +ArtistContentListForm::AddCheckedItem(int groupIndex, int itemIndex) +{ + AppLogDebug("ENTER"); + bool isFind = false; + __pCheckedItemCountMultiHashMap->Contains(groupIndex, itemIndex, isFind); + if (isFind == true) + { + AppLogDebug("This item Already Set (groupIndex:%d, itemIndex:%d)", groupIndex, itemIndex); + return E_ALREADY_SET; + } + AppLogDebug("EXIT"); + return __pCheckedItemCountMultiHashMap->Add(groupIndex, itemIndex); +} + +result +ArtistContentListForm::RemoveCheckedItem(int groupIndex, int itemIndex) +{ + AppLogDebug("ENTER"); + bool isFind = false; + __pCheckedItemCountMultiHashMap->Contains(groupIndex, itemIndex, isFind); + if (isFind == false) + { + AppLogDebug("This item not found(groupIndex:%d, itemIndex:%d)", groupIndex, itemIndex); + return E_DATA_NOT_FOUND; + } + AppLogDebug("EXIT"); + return __pCheckedItemCountMultiHashMap->Remove(groupIndex, itemIndex); +} + +result +ArtistContentListForm::SetItemChecked(int groupIndex, int itemIndex, bool check) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (check == true) + { + r = AddCheckedItem(groupIndex, itemIndex); + } + else + { + r = RemoveCheckedItem(groupIndex, itemIndex); + } + AppLogDebug("EXIT"); + return r; +} + +int +ArtistContentListForm::GetCheckedItemCountAt(int groupIndex) +{ + AppLogDebug("ENTER"); + int itemCount = 0; + __pCheckedItemCountMultiHashMap->GetCount(groupIndex, itemCount); + AppLogDebug("EXIT"); + return itemCount; +} + +int +ArtistContentListForm::GetTotalItemCount(void) +{ + AppLogDebug("ENTER"); + int totalItemCount = 0; + int groupCount = __pContentGroupedTableView->GetGroupCount(); + for (int iCount = 0; iCount < groupCount; iCount++) + { + totalItemCount = totalItemCount + __pContentGroupedTableView->GetItemCountAt(iCount); + } + AppLogDebug("EXIT"); + return totalItemCount; +} + +int +ArtistContentListForm::GetCheckedItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pCheckedItemCountMultiHashMap->GetCount(); +} + +void +ArtistContentListForm::SetItemCheckedAt(int groupIndex, bool check) +{ + AppLogDebug("ENTER"); + int groupItemCount = __pContentGroupedTableView->GetItemCountAt(groupIndex); + if (check == true) + { + groupItemCount = __pContentGroupedTableView->GetItemCountAt(groupIndex); + for (int iCount= 0; iCount < groupItemCount; iCount++) + { + __pContentGroupedTableView->SetItemChecked(groupIndex, iCount, check); + SetItemChecked(groupIndex, iCount, check); + } + } + else + { + __pCheckedItemCountMultiHashMap->Remove(groupIndex); + for (int iCount= 0; iCount < groupItemCount; iCount++) + { + __pContentGroupedTableView->SetItemChecked(groupIndex, iCount, check); + } + } + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + int groupCount = __pContentGroupedTableView->GetGroupCount(); + for (int iCount= 0; iCount < groupCount; iCount++) + { + SetItemCheckedAt(iCount, isChecked); + } + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + __pContentGroupedTableView->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::UpdateTableView(void) +{ + AppLogDebug("ENTER"); + __pContentGroupedTableView->UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->UpdateArtistList(); + __pPresentationModel->InitializeArtistAlbumList(__artistName); + __pPresentationModel->InitializeContentList(INIT_VALUE); + + if (__pPresentationModel->GetArtistAlbumListCount() == 0) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_ARTIST_CONTENT_LIST,true)) + { + __headerTitle = L""; + AppAssert(pSceneManager); + SetScreenState(SCREEN_STATE_NORMAL); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE,SCENE_DESTROY_OPTION_KEEP)); + } + + } + else + { + __headerTitle = __artistName; + } + + if (GetScreenState() == SCREEN_STATE_NORMAL) + { + SetHeader(); + } + + + UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +ArtistContentListForm::RemoveCheckedTableviewItem(bool itemRemove) +{ + if (itemRemove) + { + ContentInformation* pContentInfo = GetContentInformationActivatedStateContextItem(); + + if (pContentInfo != null) + { + RemoveContentAt(pContentInfo->contentId); + __pPresentationModel->InitializeArtistAlbumList(__artistName); + __pPresentationModel->InitializeContentList(INIT_VALUE); + + SetItemCheckedAll(false); + __pContentGroupedTableView->RefreshItem(__activatedStateContextItem.__groupIndex, __activatedStateContextItem.__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE);; + delete pContentInfo; + } + } + else + { + SetItemCheckedAll(false); + } +} + +ContentInformation* +ArtistContentListForm::GetContentInformationActivatedStateContextItem(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetCurrentArtistAlbumIndex() != __activatedStateContextItem.__groupIndex) + { + __pPresentationModel->InitializeContentList(__activatedStateContextItem.__groupIndex); + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistAlbumContentInfoN(__activatedStateContextItem.__itemIndex); +} + +result +ArtistContentListForm::EventHandlerContextMenuItemCaller(void) +{ + AppLogDebug("ENTER"); + AppControl* pAppControl = AppManager::FindAppControlN(PROVIDER_ID_CONTACT, OPERATION_ID_SOCIAL_PICK); + if (pAppControl == null) + { + AppLogDebug("AppManager::FindAppControlN is null"); + return E_FAILURE; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + result r = pDataList->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pDataList->Construct() failed(%s)", GetErrorMessage(r)); + delete pDataList; + return r; + } + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTION_MODE), new (std::nothrow) String(APPCONTROL_OPTION_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_ITEM_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_PERSON)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_RESULT_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_ITEM_ID)); + + r = pAppControl->Start(null, null, pDataList, this); + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + + delete pAppControl; + pAppControl = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ArtistContentListForm::EventHandlerContextMenuItemCall(ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + result r = SettingInfo::SetValue(CALL_RINGTONE_KEY, contentInfo.ContentFilePath); + if (IsFailed(r)) + { + AppLogDebug("SettingInfo::SetValue failed(%s)", GetErrorMessage(r)); + return r; + } + + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + + AppLogDebug("EXIT"); + return r; +} + +result +ArtistContentListForm::EventHandlerContextMenuItemMessageEmail(ContentInformation& contentInfo, Tizen::Base::String providerId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (!providerId.Equals(PROVIDER_ID_EMAIL, false) && !providerId.Equals(PROVIDER_ID_MESSAGE, false)) + { + AppLogDebug("worng providerId(%s)", providerId.GetPointer()); + return E_FAILURE; + } + + AppControl* pAppControl = AppManager::FindAppControlN(providerId, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + AppLogDebug("AppManager::FindAppControlN is null"); + return E_FAILURE; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + + Tizen::Base::Collection::ArrayList* pValueList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pValueList->Construct(); + pValueList->Add(*(new (std::nothrow) String(contentInfo.ContentFilePath))); + + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), pValueList); + + r = pAppControl->Start(null, null, pDataList, this); + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + + delete pAppControl; + pAppControl = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ArtistContentListForm::RemoveConentCheckedAll(void) +{ + AppLogDebug("ENTER"); + IMapEnumeratorT< int, int >* pMapEnum = __pCheckedItemCountMultiHashMap->GetMapEnumeratorN(); + while (pMapEnum->MoveNext() == E_SUCCESS) + { + int key = 0; + int value = 0; + pMapEnum->GetKey(key); + pMapEnum->GetValue(value); + + if (__pPresentationModel->GetCurrentArtistAlbumIndex() != key) + { + __pPresentationModel->InitializeContentList(key); + } + + ContentInformation* pContentInfo = __pPresentationModel->GetArtistAlbumContentInfoN(value); + if (pContentInfo != null) + { + RemoveContentAt(pContentInfo->contentId); + delete pContentInfo; + } + } + delete pMapEnum; +// +// SetItemCheckedAll(false); +// +// __pPresentationModel->InitializeArtistAlbumList(__headerTitle); +// __pPresentationModel->InitializeContentList(INIT_VALUE); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +Tizen::Base::Collection::IList* +ArtistContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + ArrayList* pContentFilePathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pContentFilePathList->Construct())) + { + AppLogDebug("pContentFilePathList->Construct() failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + if (argumentType == PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + ContentInformation* pContentInfo = GetContentInformationActivatedStateContextItem(); + if (pContentInfo != null) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + AppLogDebug("EXIT"); + return pContentFilePathList; + } + + int key = 0; + int value = 0; + + IMapEnumeratorT* pMapEnum = __pCheckedItemCountMultiHashMap->GetMapEnumeratorN(); + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pMapEnum->GetKey(key); + pMapEnum->GetValue(value); + +#if 1 + if (__pPresentationModel->GetCurrentArtistAlbumIndex() != key) + { + __pPresentationModel->InitializeContentList(key); + } + + ContentInformation* pContentInfo = __pPresentationModel->GetArtistAlbumContentInfoN(value); +#else + int offset = GetOffsetContentIndex(iCount); + ContentInformation* pContentInfo = __pPresentationModel->GetArtistContentInfoN(offset + value); +#endif + if (pContentInfo == null) + { + AppLogDebug("__pPresentationModel->GetArtistAlbumContentInfoN(%d) is null", value); + delete pContentFilePathList; + return null; + } + + if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + else if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + pContentFilePathList->Add(new (std::nothrow) String(pContentInfo->ContentFilePath)); + } + delete pContentInfo; + } + delete pMapEnum; + + AppLogDebug("EXIT"); + return pContentFilePathList; +} + +void +ArtistContentListForm::SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status, int groupIndex, int itemIndex) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + SetItemChecked(groupIndex, itemIndex, true); + if (GetCheckedItemCount() == 1) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), true); + } + } + } + else if (status == TABLE_VIEW_ITEM_STATUS_UNCHECKED) + { + SetItemChecked(groupIndex, itemIndex, false); + if (GetCheckedItemCount() == 0) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + } + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +int +ArtistContentListForm::GetOffsetContentIndex(const int groupIndex) +{ + AppLogDebug("ENTER"); + if (__pContentGroupedTableView == null) + { + AppLogDebug("__pContentGroupedTableView is null"); + return INIT_VALUE; + } + + int contentIndex = INIT_VALUE; + for (int iCount = 0; iCount < groupIndex; iCount++) + { + contentIndex = contentIndex + __pContentGroupedTableView->GetItemCountAt(iCount); + } + + AppLogDebug("EXIT"); + return contentIndex; +} + +void +ArtistContentListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentGroupedTableView->UpdateTableView(); +} diff --git a/src/MpArtistContentPickerPanel.cpp b/src/MpArtistContentPickerPanel.cpp new file mode 100644 index 0000000..6bb1ff1 --- /dev/null +++ b/src/MpArtistContentPickerPanel.cpp @@ -0,0 +1,347 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistContentPickerPanel.cpp + * @brief This is the implementation file for ArtistContentPickerPanel class. + */ + +#include "MpArtistContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ArtistContentPickerPanel::ArtistContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistContentPickerPanel::~ArtistContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ArtistContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +ArtistContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ArtistContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ArtistContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetArtistContentListCount(); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetArtistContentListCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + + __checkedItemCount = 0; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ArtistContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + if (pArgs != null && (previousSceneId.Equals(IDSCN_ARTIST_PICKER, true))) + { + String* pTemp = static_cast(pArgs->GetAt(0)); + __pPresentationModel->InitializeArtistAlbumList(*pTemp); + } + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ArtistContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + AppLogDebug("EXIT"); +} + +int +ArtistContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistContentListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +ArtistContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ArtistContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +ArtistContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ArtistContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetArtistContentListCount()) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +ArtistContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} +void +ArtistContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpArtistListEditorPanel.cpp b/src/MpArtistListEditorPanel.cpp new file mode 100644 index 0000000..6d88b95 --- /dev/null +++ b/src/MpArtistListEditorPanel.cpp @@ -0,0 +1,505 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListEditorPanel.cpp + * @brief This is the implementation file for ArtistListEditorPanel class. + */ + +#include "MpArtistListEditorPanel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ArtistListEditorPanel::ArtistListEditorPanel(void) + : ContentEditPanel::ContentEditPanel() + , ThumbnailBase::ThumbnailBase() + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistListEditorPanel::~ArtistListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + UpdateContentList(); + SetLayoutFitToForm(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +void +ArtistListEditorPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +result +ArtistListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return ContentEditPanel::OnTerminating(); +} + +void +ArtistListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetArtistListCount(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + SetItemCheckedAll(false); + } + else + { + SetItemCheckedAll(true); + } + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ShowCommonDeletePopup(this); + } + break; + + case IDA_DELETE_POPUP_DELETE: + { + for (int iCount = totalCount - 1; iCount >= 0; iCount--) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->RemoveArtistList(iCount); + } + } + + HideCommonDeletePopup(false); + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + HideCommonDeletePopup(false); + } + break; + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + SetEditHeaderStyle(); + + SetFooterStyle(STYLE_ADDTO_DELETE_ADD); + SetFormStyle(); + Footer* pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_ADDTO_DELETE_ADD); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + UpdateContentEditScreenState(); + + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, true)) + { + if (pArgs != null) + { + int totalCount = 0; + __pContentTableView->UpdateTableView(); + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetArtistListCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + else + { + if (pFooter != null && __checkedItemCount != 0) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + if (!(nextSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false))) + { + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + int totalCount = __pPresentationModel->GetArtistListCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + } + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +ArtistListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pContentTableView == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetArtistnIfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +ArtistListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + if (__checkedItemCount > INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + Invalidate(true); + AppLogDebug("EXIT"); +} + +result +ArtistListEditorPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return r; +} + +void +ArtistListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateArtistList(); + } + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::SetEditHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + String titleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +ArtistListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +bool +ArtistListEditorPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetArtistListCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Base::Collection::IList* +ArtistListEditorPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + ArrayList* pContentPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = pContentPathList->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(r)); + delete pContentPathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER && argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pPresentationModel->GetArtistListCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pContentPathList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + } + else + { + AppLogDebug("EXIT"); + delete pContentPathList; + return null; + } + + AppLogDebug("EXIT"); + return pContentPathList; +} diff --git a/src/MpArtistListPanel.cpp b/src/MpArtistListPanel.cpp new file mode 100644 index 0000000..4091df1 --- /dev/null +++ b/src/MpArtistListPanel.cpp @@ -0,0 +1,553 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListPanel.cpp + * @brief This is the implementation file for ArtistListPanel class. + */ + +#include "MpArtistListPanel.h" +#include "MpSettingPresentationModel.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ArtistListPanel::ArtistListPanel(void) + : ContentLibaryPanel::ContentLibaryPanel() + , ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __pLaunchPlayerTimer(null) + , __pContextItem(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistListPanel::~ArtistListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = ArtistListPresentationModel::GetInstance(); + __pContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_02); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + SetFormStyle(); + SetLayoutFitToForm(); + UpdateContentList(); + __pLaunchPlayerTimer = new (std::nothrow) Timer(); + __pLaunchPlayerTimer->Construct(*this); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +void +ArtistListPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +result +ArtistListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + delete __pContextItem; + __pContextItem = null; + + if (__pLaunchPlayerTimer != null) + { + __pLaunchPlayerTimer->Cancel(); + delete __pLaunchPlayerTimer; + __pLaunchPlayerTimer = null; + } + AppLogDebug("EXIT"); + return ContentLibaryPanel::OnTerminating(); +} + +void +ArtistListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_FLICK_MENU_ITEM_PLAYALL: + { + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + // Need to launch the Player after a delay because launching Player in this case needs some DB operations + // these DB operations needs some time to be completed, so in such cases Player's Drawing might be delayed + // resulting behaviours as "Not Showing error message" etc + __pLaunchPlayerTimer->Cancel(); + __pLaunchPlayerTimer->Start(MESSAGE_BOX_DELAY); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + if (__pPresentationModel->GetArtistListCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_LIST_EDITOR)); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_LIST)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SETTINGS: + { +// SettingPresentationModel::GetInstance()->InitializeSettingValue(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_MUSIC_SETTING)); + } + break; + + case IDA_FOOTER_BUTTON_BACK: + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (CommonUtil::GetAddtoPlaylistState() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + CommonUtil::SetAddtoPlaylistState(false); + } + else if(IsExistMiniPlayer()) + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SETTINGS | CONTEXT_MENU_ITEM_STYLE_SEARCH | + CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW); + AppLogDebug("EXIT"); +} +void +ArtistListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + GetHeader()->SetItemSelected(3); + GetHeader()->Invalidate(true); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + ContentLibaryPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + AppLogDebug("EXIT"); +} + +int +ArtistListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetArtistListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ArtistListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetArtistnIfoN(itemIndex); + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo, __pPresentationModel->GetArtistContentCount(itemIndex)); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + pItem->SetContextItem(__pContextItem); + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +ArtistListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + ContentInformation* pContentInfo = __pPresentationModel->GetArtistnIfoN(itemIndex); + if (pContentInfo == null) + { + return; + } + + ArrayList* pArgs = new (std::nothrow) ArrayList(); + pArgs->Construct(); + pArgs->Add(*(new (std::nothrow) String(IDSCN_ARTIST_LIST))); + pArgs->Add(*(new (std::nothrow) String(pContentInfo->ArtistName))); + delete pContentInfo; + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_CONTENT_LIST), pArgs); + } + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::OnTimerExpired(Timer& timer) +{ + if (timer.Equals(*__pLaunchPlayerTimer)) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add((new (std::nothrow) String(MUSIC))); + pData->Add((new (std::nothrow) Integer(0))); + pData->Add((__pPresentationModel->GetContentPathListN(__itemIndex))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pData); + __itemIndex = -1; + } + } +} + +void +ArtistListPanel::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + AppLogDebug("ENTER"); + int totalCount = __pPresentationModel->GetArtistListCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + String* pName = __pPresentationModel->GetArtistName(iCount); + String firstCharacter; + + pName->SubString(0, 1, firstCharacter); + firstCharacter.ToUpper(); + + mchar language; + firstCharacter.GetCharAt(0, language); + + if (Character::GetUnicodeCategory(language) == UNICODE_HANGUL) + { + Tizen::Base::String HangulIndex[] = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ" , "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + + wchar_t songName; + pName->GetCharAt(0, songName); + + wchar_t UnicodeValue = (songName - 0xAC00); + wchar_t InitialConsonant = ((UnicodeValue - (UnicodeValue % 28)) / 28) / 21; + int tempIndex = static_cast(InitialConsonant); + + if (HangulIndex[tempIndex].CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + else if (index.CompareTo("0") == 0 && Character::IsDigit(language) == true) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + else if (firstCharacter.CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + AppLogDebug("EXIT"); +} + +result +ArtistListPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct, + const int itemTotalCount) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Panel* pTableViewItem = new (std::nothrow) Panel(); + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.ArtistName); + static_cast(pTableViewItem->GetControl(IDC_CONTENT_TOTAL_COUNT))->SetText(CommonUtil::SetSongsString(itemTotalCount)); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return r; +} + +void +ArtistListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateArtistList(); + } + AppLogDebug("EXIT"); +} + +bool +ArtistListPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + int countArtist = INIT_VALUE; + countArtist = __pPresentationModel->GetArtistListCount(); + + if (countArtist > INIT_VALUE) + { + AppLogDebug("EXIT"); + return false; + } + AppLogDebug("EXIT"); + return true; +} + +Tizen::Base::Collection::IList* +ArtistListPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + if (pickerType != PICKER_TYPE_PLAY_LIST_PICKER || argumentType != PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + AppLogDebug("EXIT"); + return null; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentPathListN(__itemIndex); +} + +void +ArtistListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +ArtistListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpArtistListPresentationModel.cpp b/src/MpArtistListPresentationModel.cpp new file mode 100644 index 0000000..9e80496 --- /dev/null +++ b/src/MpArtistListPresentationModel.cpp @@ -0,0 +1,672 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistListPresentationModel.cpp + * @brief This is the implementation file for ArtistListPresentationModel class. + */ + +#include "MpArtistListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +ArtistListPresentationModel* ArtistListPresentationModel::pArtistListPresentationModelInstance = null; + +ArtistListPresentationModel* +ArtistListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pArtistListPresentationModelInstance == null) + { + pArtistListPresentationModelInstance = new (std::nothrow) ArtistListPresentationModel(); + TryReturn(pArtistListPresentationModelInstance != null, null, "ArtistListPresentationModel instance is not created."); + + result r = pArtistListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "ArtistListPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pArtistListPresentationModelInstance; + +CATCH: + delete pArtistListPresentationModelInstance; + return null; +} + +ArtistListPresentationModel::ArtistListPresentationModel(void) + : __pArtistList(null) + , __pArtistContentList(null) + , __pArtistAlbumContentList(null) + , __pArtistAlbumList(null) + , __keyWord(null) + , __currentArtistAlbumIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistListPresentationModel::~ArtistListPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ArtistListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppLogDebug("EXIT"); + return r; +} + +int +ArtistListPresentationModel::GetArtistContentCount(int artistIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistList == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + if (__pArtistList->GetCount() == 0) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + String* pContentFileName = static_cast(__pArtistList->GetAt(artistIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return INIT_VALUE; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ARTIST, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + int totalCount = pContentSearchResultList->GetCount(); + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return totalCount; +} + +int +ArtistListPresentationModel::GetArtistAlbumContentCount(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumList == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } +/* + if ((__pArtistAlbumContentList != null) && __currentArtistAlbumIndex == albumIndex) + { + totalCount = __pArtistAlbumContentList->GetCount(); + AppLogDebug("%d %d %d", totalCount, __currentArtistAlbumIndex, albumIndex); + } + else +*/ + + String* pContentFileName = static_cast(__pArtistAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return INIT_VALUE; + } + + IList* pContentSearchResultList = null; + if (__keyWord == null) + { + pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + } + else + { + String WhereExpr = __keyWord; + WhereExpr.Replace(L"'", L"\\'"); + // WhereExpr = CommonUtil::SpecialReplaceChange(__keyWord); + WhereExpr = CommonUtil::MakeQuery(STRING_SORT_ARTIST, WhereExpr); + + String SearchKeyword(WhereExpr); + SearchKeyword.Append(L" AND "); + + WhereExpr = *pContentFileName; + WhereExpr.Replace(L"'", L"\\'"); + //WhereExpr = CommonUtil::SpecialReplaceChange(*pContentFileName); + WhereExpr = CommonUtil::MakeQuery(STRING_SORT_ALBUM, WhereExpr); + + SearchKeyword.Append(WhereExpr); + pContentSearchResultList = CommonUtil::SearchContentList(SearchKeyword, STRING_SORT_TITLE); + } + + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + int totalCount = pContentSearchResultList->GetCount(); + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return totalCount; +} + +int +ArtistListPresentationModel::GetArtistListCount(void) +{ + AppLogDebug("ENTER"); + if (__pArtistList == null) + { + return INIT_VALUE; + } + + int retValue = __pArtistList->GetCount(); + AppLogDebug("EXIT"); + return retValue; +} + +int +ArtistListPresentationModel::GetArtistAlbumListCount(void) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pArtistAlbumList->GetCount(); +} + +ContentInformation* +ArtistListPresentationModel::GetArtistnIfoN(const int artistIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistList == null) + { + AppLogDebug("__pArtistList is null"); + return null; + } + + String* pContentFileName = static_cast(__pArtistList->GetAt(artistIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ARTIST, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +ContentInformation* +ArtistListPresentationModel::GetArtistAlbumInfoN(const int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumList == null || __pArtistAlbumList->GetCount() == 0) + { + AppLogDebug("__pArtistAlbumList is null or GetCount() is zero"); + return null; + } + + String* pContentFileName = static_cast(__pArtistAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +ContentInformation* +ArtistListPresentationModel::GetArtistContentInfoN(const int contentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInformation = null; + + ContentSearchResult* pResult = static_cast(__pArtistContentList->GetAt(contentIndex)); + if (pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInformation; +} + +void +ArtistListPresentationModel::InitializeArtistAlbumList(Tizen::Base::String& keyWord) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumList == null) + { + __pArtistAlbumList = new (std::nothrow) ArrayList(); + __pArtistAlbumList->Construct(); + } + else + { + __pArtistAlbumList->RemoveAll(true); + } + + if (__pArtistContentList != null) + { + __pArtistContentList->RemoveAll(true); + delete __pArtistContentList; + __pArtistContentList = null; + } + + __keyWord = keyWord; + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN(keyWord, STRING_SORT_ARTIST, STRING_SORT_ALBUM); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return; + } + + __pArtistContentList = pContentSearchResultList; + + String tempAlbumName; + int contentTotalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < contentTotalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + if (pResult == null) + { + continue; + } + + if (tempAlbumName != static_cast(pResult->GetContentInfo())->GetAlbumName()) + { + tempAlbumName = static_cast(pResult->GetContentInfo())->GetAlbumName(); + __pArtistAlbumList->Add(*(new (std::nothrow) String(tempAlbumName))); + } + } + +// pContentSearchResultList->RemoveAll(true); +// delete pContentSearchResultList; + +// __pArtistContentList = CommonUtil::ContentSearchResultListN(keyWord, STRING_SORT_ARTIST, /*STRING_SORT_TITLE*/ STRING_SORT_ALBUM); + AppLogDebug("EXIT"); +} + +int +ArtistListPresentationModel::GetArtistContentListCount(void) +{ + AppLogDebug("ENTER"); + if (__pArtistContentList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pArtistContentList->GetCount(); +} + +void +ArtistListPresentationModel::DeleteArtistAlbum(void) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumList != null) + { + __pArtistAlbumList->RemoveAll(true); + } + if (__pArtistContentList != null) + { + __pArtistContentList->RemoveAll(true); + } + AppLogDebug("EXIT"); +} + +void +ArtistListPresentationModel::InitializeContentList(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumContentList != null) + { + __pArtistAlbumContentList->RemoveAll(true); + delete __pArtistAlbumContentList; + __pArtistAlbumContentList = null; + } + + String* pContentFileName = static_cast(__pArtistAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + if (__keyWord == null) + { + __pArtistAlbumContentList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + } + else + { + String WhereExpr = __keyWord; + // WhereExpr = CommonUtil::SpecialReplaceChange(__keyWord); + WhereExpr.Replace(L"'", L"\\'"); + WhereExpr = CommonUtil::MakeQuery(STRING_SORT_ARTIST, WhereExpr); + + String SearchKeyword(WhereExpr); + SearchKeyword.Append(L" AND "); + + WhereExpr = *pContentFileName; + WhereExpr.Replace(L"'", L"\\'"); + //WhereExpr = CommonUtil::SpecialReplaceChange(*pContentFileName); + WhereExpr = CommonUtil::MakeQuery(STRING_SORT_ALBUM, WhereExpr); + + SearchKeyword.Append(WhereExpr); + __pArtistAlbumContentList = CommonUtil::SearchContentList(SearchKeyword, STRING_SORT_TITLE); + } + __currentArtistAlbumIndex = albumIndex; + AppLogDebug("EXIT"); +} + +ContentInformation* +ArtistListPresentationModel::GetArtistAlbumContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumContentList == null) + { + AppLogDebug("EXIT"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(__pArtistAlbumContentList->GetAt(contentIndex)); + + if (pResult!= null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInformation; +} + +void +ArtistListPresentationModel::RemoveArtistList(int artistIndex) +{ + AppLogDebug("ENTER"); + IList* pRemoveArtistList = null; + int totalCount = 0; + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = null; + + ContentManager contentManager; + contentManager.Construct(); + + if (__pArtistList == null) + { + AppLogDebug("EXIT"); + return; + } + + String* pContentFileName = static_cast(__pArtistList->GetAt(artistIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + pRemoveArtistList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ARTIST, STRING_SORT_TITLE); + if (pRemoveArtistList == null) + { + AppLogDebug("EXIT(pRemoveArtistList is null"); + return; + } + + totalCount = pRemoveArtistList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + pResult = static_cast(pRemoveArtistList->GetAt(iCount)); + if (pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + contentManager.DeleteContent(pContentInformation->contentId); + delete pContentInformation; + } + } + + pRemoveArtistList->RemoveAll(true); + delete pRemoveArtistList; + AppLogDebug("EXIT"); +} + +Tizen::Base::String* +ArtistListPresentationModel::GetArtistName(int artistIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistList == null) + { + AppLogDebug("EXIT"); + return null; + } + + AppLogDebug("EXIT"); + return static_cast(__pArtistList->GetAt(artistIndex)); +} + +Tizen::Base::Collection::ArrayList* +ArtistListPresentationModel::GetContentPathListN(int index, SearchMode mode) +{ + AppLogDebug("ENTER"); + + if (__pArtistList == null) + { + AppLogDebug("EXIT"); + return null; + } + + String* pContentFileName = static_cast(__pArtistList->GetAt(index)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return null; + } + + IList* pContentSearchResultList = null; + switch (mode) + { + case SEARCH_MODE_ARTIST: + { + pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ARTIST, STRING_SORT_TITLE); + } + break; + + case SEARCH_MODE_ARTIST_ALBUM: + { + pContentSearchResultList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + } + break; + + default: + break; + } + + if (pContentSearchResultList == null) + { + AppLogDebug("pContentSearchResultList is null"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + int totalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentPath; +} + +Tizen::Base::Collection::ArrayList* +ArtistListPresentationModel::GetAllContentPathListN(void) +{ + AppLogDebug("ENTER"); + if (__pArtistContentList == null) + { + AppLogDebug("EXIT"); + return null; + } + + ArrayList* pTempPath = new (std::nothrow) ArrayList(); + pTempPath->Construct(); + + for (int iCount = INIT_VALUE; iCount < __pArtistContentList->GetCount(); iCount++) + { + ContentSearchResult* pResult = static_cast(__pArtistContentList->GetAt(iCount)); + if (pResult != null) + { + String StrTemp = pResult->GetContentInfo()->GetContentPath(); + pTempPath->Add(*(new (std::nothrow) String(StrTemp))); + } + } + AppLogDebug("EXIT"); + return pTempPath; +} + +void +ArtistListPresentationModel::RefreshContentList(int albumIndex) +{ + AppLogDebug("ENTER"); + if (__pArtistAlbumContentList != null) + { + __pArtistAlbumContentList->RemoveAll(true); + delete __pArtistAlbumContentList; + __pArtistAlbumContentList = null; + } + + __currentArtistAlbumIndex = albumIndex; + + String* pContentFileName = static_cast(__pArtistAlbumList->GetAt(albumIndex)); + if (pContentFileName == null) + { + AppLogDebug("EXIT(pContentFileName is null"); + return; + } + + __pArtistAlbumContentList = CommonUtil::ContentSearchResultListN(*pContentFileName, STRING_SORT_ALBUM, STRING_SORT_TITLE); + if (__pArtistAlbumContentList != null && __pArtistAlbumContentList->GetCount() == INIT_VALUE) + { + __pArtistAlbumContentList->RemoveAll(true); + delete __pArtistAlbumContentList; + __pArtistAlbumContentList = null; + AppLogDebug("__pArtistAlbumContentList->GetCount() is zero"); + } + AppLogDebug("EXIT"); +} + +int +ArtistListPresentationModel::GetCurrentArtistAlbumIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentArtistAlbumIndex; +} + +void +ArtistListPresentationModel::AddContent(String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetArtistContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + pPlayList->AddItem(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +result +ArtistListPresentationModel::UpdateArtistList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pArtistList != null) + { + __pArtistList->RemoveAll(true); + delete __pArtistList; + } + __pArtistList = CommonUtil::SearchContentList(STRING_SORT_ARTIST); + TryCatch(__pArtistList != null, r = E_FAILURE, "__pArtistList is null"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} diff --git a/src/MpArtistPickerPanel.cpp b/src/MpArtistPickerPanel.cpp new file mode 100644 index 0000000..54cf03a --- /dev/null +++ b/src/MpArtistPickerPanel.cpp @@ -0,0 +1,113 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpArtistPickerPanel.cpp + * @brief This is the implementation file for ArtistPickerPanel class. + */ + +#include "MpArtistPickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ArtistPickerPanel::ArtistPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ArtistPickerPanel::~ArtistPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ArtistPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + __pPresentationModel->UpdateArtistList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ArtistPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + } + AppLogDebug("EXIT"); +} + +void +ArtistPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetArtistnIfoN(itemIndex); + if (pContentInfoStruct == null) + { + return; + } + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(pContentInfoStruct->ArtistName))); + delete pContentInfoStruct; + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_CONTENT_PICKER), pData); + } + AppLogDebug("EXIT"); +} diff --git a/src/MpCommonUtil.cpp b/src/MpCommonUtil.cpp new file mode 100644 index 0000000..1cfd2a3 --- /dev/null +++ b/src/MpCommonUtil.cpp @@ -0,0 +1,2397 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpCommonUtil.cpp + * @brief This is the implementation file for CommonUtil class. + */ + +#include +#include "MpCommonUtil.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_CREATE_TABLE_VIEW_ITEM = 70; +static const int Y_CREATE_TABLE_VIEW_ITEM = 29; +static const int W_CREATE_TABLE_VIEW_ITEM_COUNT_LABEL_ITEM = 170; +static const int DEPTH = 3; + +const wchar_t* SECTION_MUSIC_SETTING = L"MUSIC_SETTING"; +const wchar_t* INITIAL_TAB = L"INITIAL_TAB"; // 0 - 7 +const wchar_t* SONGS_TAB = L"SONGS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* ALBUMS_TAB = L"ALBUMS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* ARTISTS_TAB = L"ARTISTS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* GENRES_TAB = L"GENRES_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* COMPOSERS_TAB = L"COMPOSERS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* YEARS_TAB = L"YEARS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* FOLDERS_TAB = L"FOLDERS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* PLAYERLISTS_TAB = L"PLAYERLISTS_TAB"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* AUTO_OFF_LEVEL = L"AUTO_OFF_LEVEL"; // 0 - 5 (OFF, 15 MIN, 30 MIN, 1 HOUR, 1 HOUR 30 MIN, 2 HOURS) +const wchar_t* MOST_PLAYED = L"MOST_PLAYED"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* RECENTLY_PLAYED = L"RECENTLY_PLAYED"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* RECENTLY_ADD = L"RECENTLY_ADD"; // 0 - 1 (UNCHECKED, CHECKED) +const wchar_t* REPEAT_MODE = L"REPEAT_MODE"; // 0 - 2 (OFF, ONE, ALL) +const wchar_t* SHUFFLE_MODE = L"SHUFFLE_MODE"; // 0 - 1 (OFF, ON) +const wchar_t* VOLUME_LEVEL = L"VOLUME_LEVEL"; // 0 - 15 + +static const wchar_t* IDS_ORIGINAL_QUOTATION = L"'"; +static const wchar_t* IDS_REPLACE_QUOTATION = L"\\'"; +static const wchar_t* STRING_QUERY_PREFIX = L" ='"; +static const wchar_t* STRING_QUERY_SUFFIX = L"'"; +static const wchar_t* IDS_ORIGIONAL_PERCENTAGE = L"%"; +static const wchar_t* IDS_REPLACE_PERCENTAGE = L"\\%"; +static const wchar_t* IDS_ORIGIONAL_DOUBLESLASH = L"\\"; +static const wchar_t* IDS_REPLACE_DOUBLESLASH = L"\\\\"; + + + +static bool __addToPlaylistState = false; +static Tizen::Base::String __AddToPlaylistName = null; + +static const int Y_GAP_CONTENT_PIKER_ITEM = 16; +static const int W_SONG_TITLE_CONTENT_PIKER_ITEM = 440; +static const int H_SONG_TITLE_CONTENT_PIKER_ITEM = 88; +static const int W_SONG_TIME_CONTENT_PIKER_ITEM = 155; + +Tizen::Graphics::Bitmap* +CommonUtil::GetContentAlbumArtN(Tizen::Base::String& path) +{ + AppLogDebug("ENTER"); + Tizen::Graphics::Bitmap* pBitmap = null; + + AppLogDebug("path(%ls)", path.GetPointer()); + Tizen::Content::AudioMetadata* pAudioMeta = Tizen::Content::ContentManagerUtil::GetAudioMetaN(path); + if (pAudioMeta == null) + { + AppLogDebug("EXIT"); + return null; + } + + pBitmap = pAudioMeta->GetAlbumArtN(); + delete pAudioMeta; + + AppLogDebug("EXIT"); + return pBitmap; +} + +Tizen::Content::AudioContentInfo* +CommonUtil::GetAudioContentInfoN(const Tizen::Base::String& filePath) +{ + AppLogDebug("ENTER"); + ContentId contentId = GetContentId(filePath); + AppLogDebug("Audio ContentID = %ls for file = %ls", contentId.ToString().GetPointer(),filePath.GetPointer()); + + if (IsFailed(GetLastResult())) + { + AppLogDebug("filePath(%ls) failed", filePath.GetPointer()); + SetLastResult(E_FAILURE); + return null; + } + + ContentInfo* pContentInfo = GetContentInfoN(contentId); + if (pContentInfo == null || pContentInfo->GetContentType() != CONTENT_TYPE_AUDIO) + { + AppLogDebug("GetContentInfoN(%ls) failed", contentId.ToString().GetPointer()); + delete pContentInfo; + SetLastResult(E_FAILURE); + return null; + } + + AppLogDebug("EXIT"); + return static_cast(pContentInfo); +} + +Tizen::Base::Collection::IList* +CommonUtil::ContentSearchResultListN(const Tizen::Base::String& contentFileName, + const Tizen::Base::String& ColumnName, + const Tizen::Base::String& sortColumn, + Tizen::Base::SortOrder sortOrder) +{ + AppLogDebug("ENTER"); + String WhereExpr = contentFileName; + WhereExpr.Replace(IDS_ORIGIONAL_DOUBLESLASH, IDS_REPLACE_DOUBLESLASH); + WhereExpr.Replace(IDS_ORIGINAL_QUOTATION, IDS_REPLACE_QUOTATION); + WhereExpr.Replace(IDS_ORIGIONAL_PERCENTAGE, IDS_REPLACE_PERCENTAGE); + //WhereExpr = CommonUtil::SpecialReplaceChange(contentFileName); + WhereExpr = CommonUtil::MakeQuery(ColumnName, WhereExpr); + + Tizen::Base::Collection::IList* pSearchList = CommonUtil::SearchContentList(WhereExpr, sortColumn); + if (pSearchList == null) + { + SetLastResult(E_FAILURE); + AppLogDebug("CommonUtil::SearchContentList failed"); + return null; + } + AppLogDebug("EXIT"); + return pSearchList; +} + +Tizen::Base::String +CommonUtil::FilePathToContentFileName(const Tizen::Base::String& filePath) +{ + AppLogDebug("ENTER"); + String tempWhereClause = filePath; + int indexOf = -1; + String contentFileName; + + tempWhereClause.LastIndexOf(L"/", tempWhereClause.GetLength() - 1, indexOf); + tempWhereClause.SubString(indexOf + 1, contentFileName); + + AppLogDebug("EXIT"); + return contentFileName; +} + +Tizen::Content::ContentId +CommonUtil::GetContentId(const Tizen::Base::String& filePath) +{ + AppLogDebug("ENTER"); + String contentFileName = FilePathToContentFileName(filePath); + AppLogDebug("filePath(%ls), contentFileName(%ls)",filePath.GetPointer(), contentFileName.GetPointer() ); + IList* pContentSearchResultList = ContentSearchResultListN(contentFileName, STRING_SORT_FILE_NAME, STRING_SORT_TITLE); + if (pContentSearchResultList == null || pContentSearchResultList->GetCount() == 0) + { + SetLastResult(E_FAILURE); + delete pContentSearchResultList; + AppLogDebug("CommonUtil::ContentSearchResultListN(%ls) failed", filePath.GetPointer()); + return ContentId(); + } + + ContentSearchResult* pResult = null; + ContentInfo* pContentInfo = null; + + IEnumerator* pEnum = pContentSearchResultList->GetEnumeratorN(); + if (pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + pResult = static_cast(pEnum->GetCurrent()); + ContentInfo* pTempContentInfo = pResult->GetContentInfo(); + + AppLogDebug("filePath(%ls), pTempContentInfo(%ls)", filePath.GetPointer(), pTempContentInfo->GetContentPath().GetPointer()); + if (filePath.Equals(pTempContentInfo->GetContentPath()) == true) + { + pContentInfo = pTempContentInfo; + break; + } + } + + delete pEnum; + } + + ContentId contentId = ContentId(); + + if (pContentInfo == null) + { + SetLastResult(E_FAILURE); + AppLogDebug("Content search failed"); + } + else + { + contentId = pContentInfo->GetContentId(); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return contentId; +} + +Tizen::Content::ContentInfo* +CommonUtil::GetContentInfoN(const Tizen::Content::ContentId& contentId) +{ + AppLogDebug("ENTER"); + ContentManager contentManager; + result r = contentManager.Construct(); + if (IsFailed(r)) + { + AppLogDebug("contentManager.Construct() failed(%s)", GetErrorMessage(r)); + return null; + } + + ContentInfo* pContentInfo = contentManager.GetContentInfoN(contentId); + AppLogDebug("EXIT"); + return pContentInfo; +} + +result +CommonUtil::StringToContentId(const Tizen::Base::String& contentIdString, Tizen::Content::ContentId& outContentId) +{ + AppLogDebug("ENTER"); + ContentId pcontentId; + UuId uuId; + result r = pcontentId.Parse(contentIdString, uuId); + if (IsFailed(r)) + { + AppLogDebug("pcontentId.Parse(%s, outContentId) failed", contentIdString.GetPointer()); + return r; + } + + outContentId = uuId; + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +Tizen::Base::String +CommonUtil::GetFormatDate(long dateValue) +{ +// AppLogDebug("ENTER"); + String fTime; + if (dateValue < 0) + { +// fTime.Format(20, L"%02d:%02d:%02d", 0, 0, 0); + fTime.Format(20, L"%02d:%02d", 0, 0); + } + else + { + DateTime dateTime; +// dateTime.AddSeconds(dateValue / 1000); +// dateTime.SetValue(dateValue); + dateTime.AddMilliseconds(dateValue); +// fTime.Format(20, L"%02d:%02d:%02d", dateTime.GetHour(), dateTime.GetMinute(), dateTime.GetSecond()); + if(dateTime.GetHour()) + { + fTime.Format(20, L"%d:%02d:%02d",dateTime.GetHour(), dateTime.GetMinute(), dateTime.GetSecond()); + } + else + { + fTime.Format(20, L"%02d:%02d",dateTime.GetMinute(), dateTime.GetSecond()); + } + } +// AppLogDebug("EXIT"); + return fTime; +} + +Tizen::Base::String +CommonUtil::SpecialReplaceChange(const Tizen::Base::String& text) +{ + AppLogDebug("ENTER"); + String retStr(L""); + retStr.Append(text); + + retStr.Replace(IDS_ORIGIONAL_DOUBLESLASH, IDS_REPLACE_DOUBLESLASH); + retStr.Replace(IDS_ORIGINAL_QUOTATION, IDS_REPLACE_QUOTATION); + retStr.Replace(IDS_ORIGIONAL_PERCENTAGE, IDS_REPLACE_PERCENTAGE); + + AppLogDebug("EXIT"); + return retStr; +} + +Tizen::Base::Collection::IList* +CommonUtil::SearchContentList(const Tizen::Base::String& whereExpr, + const Tizen::Base::String& sortColumn, + Tizen::Base::SortOrder sortOrder) +{ + AppLogDebug("ENTER"); + AppLogDebug("%ls, %ls", whereExpr.GetPointer(), sortColumn.GetPointer()); + int totalPage = 0; + int totalCount = 0; + + ContentSearch search; + search.Construct(CONTENT_TYPE_AUDIO); + IList* pSearchList = search.SearchN(SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, totalPage, totalCount, whereExpr, sortColumn, sortOrder); + if (pSearchList == null) + { + AppLogDebug("pSearchList is null"); + return null; + } + + AppLogDebug("%d", pSearchList->GetCount()); + AppLogDebug("EXIT"); + return pSearchList; +} + +Tizen::Base::Collection::IList* +CommonUtil::SearchContentList(const Tizen::Base::String& columnName) +{ + AppLogDebug("ENTER"); + int totalPage = 0; + int totalCount = 0; + + ContentSearch search; + search.Construct(CONTENT_TYPE_AUDIO); + + IList* pSearchList = search.GetValueListN(SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, totalPage, totalCount, columnName, SORT_ORDER_ASCENDING); + if (pSearchList == null) + { + AppLogDebug("pSearchList is null"); + return null; + } + + AppLogDebug("EXIT"); + return pSearchList; +} + +Tizen::Base::String +CommonUtil::MakeQuery(const Tizen::Base::String& ColumnName, + const Tizen::Base::String& SerachName) +{ + AppLogDebug("ENTER"); + String makeQueryName; + result r = E_SUCCESS; + + r = makeQueryName.Append(ColumnName); + TryCatch(r == E_SUCCESS, , "String::MakeQuery() fail[%s]", GetErrorMessage(r)); + + r = makeQueryName.Append(STRING_QUERY_PREFIX); + TryCatch(r == E_SUCCESS, , "String::MakeQuery() fail[%s]", GetErrorMessage(r)); + + r = makeQueryName.Append(SerachName); + TryCatch(r == E_SUCCESS, , "String::MakeQuery() fail[%s]", GetErrorMessage(r)); + + r = makeQueryName.Append(STRING_QUERY_SUFFIX); + TryCatch(r == E_SUCCESS, , "String::MakeQuery() fail[%s]", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return makeQueryName; + +CATCH: + makeQueryName.Clear(); + return makeQueryName; +} + +int +CommonUtil::GetValue(const Tizen::Base::String& entryName) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + int value = 0; + AppRegistry* pAppRegistry = null; + pAppRegistry = UiApp::App::GetInstance()->GetAppRegistry(); + TryCatch(pAppRegistry != null, , "Failed to Find AppRegistry!"); + r = pAppRegistry->Get(entryName, value); + if (r == E_KEY_NOT_FOUND) + { + AppLogDebug("registry initialize."); + r = pAppRegistry->Add(MOST_PLAYED, 1); + r = pAppRegistry->Add(RECENTLY_PLAYED, 1); + r = pAppRegistry->Add(RECENTLY_ADD, 1); + r = pAppRegistry->Add(AUTO_OFF_LEVEL, 0); + r = pAppRegistry->Add(REPEAT_MODE, 2); + r = pAppRegistry->Add(SHUFFLE_MODE, 0); + r = pAppRegistry->Add(VOLUME_LEVEL, 5); + r = pAppRegistry->Save(); + + pAppRegistry->Get(entryName, value); + } + AppLogDebug("EXIT"); + return value; + +CATCH: + //AppLogDebug("CATCH : %s", GetErrorMessage(r)); + return r; +} + +result +CommonUtil::SetValue(const Tizen::Base::String& entryName, const int value) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppRegistry* pAppRegistry = null; + pAppRegistry = UiApp::App::GetInstance()->GetAppRegistry(); + TryCatch(pAppRegistry != null, , "Failed to Find AppRegistry!"); + r = pAppRegistry->Set(entryName, value); + if (r == E_KEY_NOT_FOUND) + { + AppLogDebug("registry initialize."); + r = pAppRegistry->Add(MOST_PLAYED, 1); + r = pAppRegistry->Add(RECENTLY_PLAYED, 1); + r = pAppRegistry->Add(RECENTLY_ADD, 1); + r = pAppRegistry->Add(AUTO_OFF_LEVEL, 0); + r = pAppRegistry->Add(REPEAT_MODE, 2); + r = pAppRegistry->Add(SHUFFLE_MODE, 0); + r = pAppRegistry->Add(VOLUME_LEVEL, 5); + r = pAppRegistry->Set(entryName, value); + r = pAppRegistry->Save(); + } + else + { + pAppRegistry->Save(); + } + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogDebug("CATCH : %s", GetErrorMessage(r)); + return r; +} + +void +CommonUtil::ShowNowPlayPanel(Tizen::Ui::Controls::TableView& tableView, + const bool playStatus, + Tizen::Graphics::Rectangle clientBounds) +{ + AppLogDebug("ENTER"); + if (playStatus == true) + { + tableView.SetBounds(Rectangle(0, H_NOW_PLAY_BAR, clientBounds.width, clientBounds.height - H_NOW_PLAY_BAR)); + tableView.Invalidate(true); + } + else + { + tableView.SetBounds(Rectangle(0, 0, clientBounds.width, clientBounds.height)); + tableView.Invalidate(true); + } + AppLogDebug("EXIT"); +} + +Tizen::Base::String +CommonUtil::GetContentInfo(const ContentInformation& contentInfoStruct, + const Tizen::Base::String& SceneId) +{ + AppLogDebug("ENTER"); + String retString; + + if (SceneId.Equals(IDSCN_ALBUM_LIST, true) || SceneId.Equals(IDSCN_SEARCH, true)) + { + retString = contentInfoStruct.AlbumName; + } + else if (SceneId.Equals(IDSCN_ARTIST_ALBUM_LIST, true)) + { + retString = contentInfoStruct.AlbumName; + } + else if (SceneId.Equals(IDSCN_GENRE_LIST, true)) + { + retString = contentInfoStruct.GenreName; + } + else if (SceneId.Equals(IDSCN_COMPOSER_LIST, true)) + { + retString = contentInfoStruct.ComposerName; + } + else if (SceneId.Equals(IDSCN_YEAR_LIST, true)) + { + retString = Integer::ToString(contentInfoStruct.ReleaseYear);; + if (retString.Equals(L"0", true)) + { + retString = STRING_UNKNOWN; + } + } + else if (SceneId.Equals(IDSCN_FOLDER_LIST, true)) + { + retString = contentInfoStruct.ContentFilePath; + } + else if (SceneId.Equals(IDSCN_PLAYLIST_LIST, true)) + { + retString = contentInfoStruct.TitleName; + } + AppLogDebug("EXIT"); + return retString; +} + +Tizen::Base::String +CommonUtil::SetSongsString(const int temp) +{ + AppLogDebug("ENTER"); + String strSongs; + String strFormat; + if (temp == 1) + { + strSongs.Append(ResourceManager::GetString("IDS_GC_BODY_1_SONG")); + strFormat.Append(strSongs); + } + else + { + strSongs.Append(ResourceManager::GetString("IDS_GC_BODY_PD_SONGS")); + strFormat.Format(STRING_LENGTH, strSongs.GetPointer(), temp); + } + + AppLogDebug("EXIT"); + return strFormat; +} + +void +CommonUtil::ShowCheckedCountLabel(Tizen::Ui::Controls::Label& checkCountLabel, int itemCount, Tizen::Ui::Controls::TableView& tableView, const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + String resSelect; + String strSelectStr; + int width = form.GetClientAreaBounds().width; + int height = form.GetClientAreaBounds().height; + + if (itemCount == INIT_VALUE) + { + checkCountLabel.SetShowState(false); + checkCountLabel.Invalidate(true); + tableView.SetBounds(Rectangle(INIT_VALUE, H_SELECT_ALL_BUTTON, width, height - H_SELECT_ALL_BUTTON)); + AppLogDebug("EXIT"); + return; + } + + resSelect = ResourceManager::GetString("IDS_COM_BODY_SELECTED"); + resSelect.Append(L"(%d)"); + + strSelectStr.Format(STRING_LENGTH, resSelect.GetPointer(), itemCount); + + checkCountLabel.SetText(strSelectStr); + checkCountLabel.SetShowState(true); + checkCountLabel.Invalidate(true); + +// tableView.SetBounds(Rectangle(INIT_VALUE, H_SELECT_ALL_BUTTON, width, height - H_SELECT_ALL_BUTTON - checkCountLabel.GetBounds().height)); + tableView.Invalidate(true); + AppLogDebug("EXIT"); +} + +void +CommonUtil::ShowSelectAllCheckButton(Tizen::Ui::Controls::CheckButton& checkButton) +{ + AppLogDebug("ENTER"); + if (checkButton.IsEnabled() == true) + { + checkButton.SetSelected(false); + checkButton.Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetAllCheckState(bool state, + Tizen::Ui::Controls::TableView& tableView, + int totalCount) +{ + AppLogDebug("ENTER"); + + for (int iCount = INIT_VALUE; iCount < totalCount; iCount++) + { + tableView.SetItemChecked(iCount, state); + } + tableView.Invalidate(true); + AppLogDebug("EXIT"); +} + +result +CommonUtil::SetFastScrollIndex(Tizen::Ui::Controls::TableView& tableview) +{ + AppLogDebug("ENTER"); + String indexText; + String retCountry; + Tizen::System::SettingInfo::GetValue("http://tizen.org/setting/locale.country", retCountry); + + if (retCountry.CompareTo("eng_GB") == 0) + { + indexText.Append(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } + else if(retCountry.CompareTo("kor_KR") == 0) + { +// indexText.Append(L"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ"); + indexText.Append(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ#0"); + } + + indexText.Append(L"#"); + indexText.Append(L"0"); + + tableview.SetFastScrollIndex(indexText, false); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +CommonUtil::SetLayoutFitToContainer(const Tizen::Ui::Container& container, Tizen::Ui::Control& childControl) +{ + AppLogDebug("ENTER"); + RelativeLayout* pLayout = dynamic_cast(container.GetPortraitLayoutN()); + if (pLayout != null) + { + pLayout->SetHorizontalFitPolicy(childControl, FIT_POLICY_PARENT); + pLayout->SetVerticalFitPolicy(childControl, FIT_POLICY_PARENT); + pLayout->Update(); + delete pLayout; + } + pLayout = dynamic_cast(container.GetLandscapeLayoutN()); + if (pLayout != null) + { + pLayout->SetHorizontalFitPolicy(childControl, FIT_POLICY_PARENT); + pLayout->SetVerticalFitPolicy(childControl, FIT_POLICY_PARENT); + pLayout->Update(); + delete pLayout; + } + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetFooterItemEnabled(Tizen::Ui::Controls::Footer& pFooter, bool enable) +{ + AppLogDebug("ENTER"); + for (int iCount = 0; iCount < pFooter.GetItemCount(); iCount++) + { + pFooter.SetItemEnabled(iCount, enable); + } + pFooter.Invalidate(true); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetTabHeaderStyle(Tizen::Ui::Controls::Header& pHeader) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TAB); + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + + for (int iCount = 0; iCount < HEAD_ITEM_COUNT; iCount++) + { + HeaderItem pTabHeaderItem; + pTabHeaderItem.Construct(IDA_HEADER_BUTTON_SONG + iCount); + pTabHeaderItem.SetText(ResourceManager::GetString(TabNameId[iCount])); + + pHeader.AddItem(pTabHeaderItem); + } + pHeader.SetTabEditModeEnabled(false); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetEditHeaderStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TITLE); + pHeader.SetTitleText(titleText); + + ButtonItem buttonItem; + buttonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_HEADER_BUTTON_SELECTE_ALL); + + Bitmap* normal = ResourceManager::GetBitmapN(L"00_icon_select_all_web.png"); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, normal); + + Bitmap* pressed = ResourceManager::GetBitmapN(L"00_icon_select_all_press_web.png"); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_PRESSED, pressed); + + Bitmap* disable = ResourceManager::GetBitmapN(L"00_icon_select_all_dim_web.png"); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_DISABLED, disable); + + pHeader.SetButton(BUTTON_POSITION_RIGHT, buttonItem); + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + + delete normal; + delete pressed; + delete disable; + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetButtonItemUnCheckedIcon(Tizen::Ui::Controls::Header& header) +{ + AppLogDebug("ENTER"); + header.RemoveAllButtons(); + ButtonItem buttonItem; + buttonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_HEADER_BUTTON_CHECK_BOX_CHECKED_ICON); + + Bitmap* pBgNormal = ResourceManager::GetBitmapN(L"00_check_bg.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_NORMAL, pBgNormal); + + Bitmap* pBgPressed = ResourceManager::GetBitmapN(L"00_check_bg_press.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_PRESSED, pBgPressed); + + Bitmap* pBgDisabled = ResourceManager::GetBitmapN(L"00_check_bg_press.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_DISABLED, pBgDisabled); + + header.SetButton(BUTTON_POSITION_RIGHT, buttonItem); + header.Invalidate(true); + + delete pBgNormal; + delete pBgPressed; + delete pBgDisabled; + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetItemCheckedAll(bool isChecked, Tizen::Ui::Controls::TableView& tableView) +{ + AppLogDebug("ENTER"); + int totalCount = tableView.GetItemCount(); + for (int iCount = INIT_VALUE; iCount < totalCount; iCount++) + { + tableView.SetItemChecked(iCount, isChecked); + } + tableView.Invalidate(true); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetButtonItemCheckedIcon(Tizen::Ui::Controls::Header& header) +{ + AppLogDebug("ENTER"); + header.RemoveAllButtons(); + ButtonItem buttonItem; + buttonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_HEADER_BUTTON_CHECK_BOX_UNCHECKED_ICON); + + Bitmap* pBgNormal = ResourceManager::GetBitmapN(L"00_check_bg.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_NORMAL, pBgNormal); + + Bitmap* pBgPressed = ResourceManager::GetBitmapN(L"00_check_bg_press.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_PRESSED, pBgPressed); + + Bitmap* pBgDisabled = ResourceManager::GetBitmapN(L"00_check_bg_press.png"); + buttonItem.SetBackgroundBitmap(BUTTON_ITEM_STATUS_DISABLED, pBgDisabled); + + Bitmap* pIconChecked = ResourceManager::GetBitmapN(L"00_check_checking.png"); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pIconChecked); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_PRESSED, pIconChecked); + buttonItem.SetIcon(BUTTON_ITEM_STATUS_DISABLED, pIconChecked); + + header.SetButton(BUTTON_POSITION_RIGHT, buttonItem); + header.Invalidate(true); + + delete pBgNormal; + delete pBgPressed; + delete pBgDisabled; + delete pIconChecked; + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::Popup* +CommonUtil::CreateContentDeletePopup(Tizen::Ui::IActionEventListener& listener, int deleteActionId, int cancelActionId) +{ + AppLogDebug("ENTER"); + Popup* pDeletePopup = new (std::nothrow) Popup(); + if (IsFailed(pDeletePopup->Construct(IDL_CONTENTS_DELETE_POPUP))) + { + delete pDeletePopup; + AppLogDebug("Construct(IDL_CONTENTS_DELETE_POPUP))) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + Button* pDeleteButton = static_cast(pDeletePopup->GetControl(IDC_DELETE_BUTTON)); + pDeleteButton->SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_DELETE")); + pDeleteButton->SetActionId(deleteActionId); + pDeleteButton->AddActionEventListener(listener); + + Button* CancelButton = static_cast(pDeletePopup->GetControl(IDC_CANCEL_BUTTON)); + CancelButton->SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT_CANCEL")); + CancelButton->SetActionId(cancelActionId); + CancelButton->AddActionEventListener(listener); + + Label* pDeleteQustionLabel = static_cast(pDeletePopup->GetControl(IDC_LABEL_DELETE_Q)); + pDeleteQustionLabel->SetText(ResourceManager::GetString(L"IDS_MUSIC_POP_DELETE_Q")); + + AppLogDebug("EXIT"); + return pDeletePopup; +} + +Tizen::Ui::Controls::TableViewContextItem* +CommonUtil::CreateTableViewContextItemN(Tizen::Ui::IActionEventListener& listener, int itemWidth, FlickMenuStyle menuStyle) +{ + AppLogDebug("ENTER"); + Panel* pItem = CommonUtil::CreateFlickMenuN(listener, menuStyle); + if (pItem == null) + { + AppLogDebug("CommonUtil::CreateSweepMenuItemN failed"); + return null; + } + + TableViewContextItem* pTableViewContextItem = new (std::nothrow) TableViewContextItem(); + String fontSizeValue = GetFontSizeValue(); + int itemHeight = GetItemHeight(fontSizeValue); + + if (IsFailed(pTableViewContextItem->Construct(Dimension(itemWidth, itemHeight)))) + { + AppLogDebug("Construct(Dimension(GetWidth(), ITEM_HEIGHT) failed(%s)", GetErrorMessage(GetLastResult())); + delete pItem; + delete pTableViewContextItem; + return null; + } + + pTableViewContextItem->AddControl(pItem); + pTableViewContextItem->SetIndividualSelectionEnabled(pItem, true); + + Form* pForm = dynamic_cast(UiApp::GetInstance()->GetAppFrame()->GetFrame()->GetCurrentForm()); + if (pForm != null) + { + if (pForm->GetBounds().width == 1200 || pForm->GetBounds().height == 1200) + { + int controlCount = pItem->GetControlCount(); + if (controlCount != INIT_VALUE) + { + Tizen::Ui::GridLayout* pGridLayout = dynamic_cast(pItem->GetLandscapeLayoutN()); + if (pGridLayout != null) + { + int margin = 80; + if (controlCount == 1) + { + margin = 106; + } + + pGridLayout->SetColumnSpacing(controlCount, margin); + pGridLayout->Update(); + delete pGridLayout; + } + } + } + } + + AppLogDebug("EXIT"); + return pTableViewContextItem; +} + +Tizen::Ui::Controls::Panel* +CommonUtil::CreateFlickMenuN(Tizen::Ui::IActionEventListener& listener, FlickMenuStyle menuStyle) +{ + AppLogDebug("ENTER"); + Panel* pFlickMenuPanel = new (std::nothrow) Panel(); + String fontSizeValue = GetFontSizeValue(); + + if (menuStyle ==FLICK_MENU_STYLE_TYPE_01) + { + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + } + else if (menuStyle == FLICK_MENU_STYLE_TYPE_02) + { + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + } + else if (menuStyle == FLICK_MENU_STYLE_TYPE_03) + { + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + } + else if (menuStyle == FLICK_MENU_STYLE_TYPE_04) + { + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + else + { + if (IsFailed(pFlickMenuPanel->Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT) failed(%s)", GetErrorMessage(GetLastResult())); + return null; + } + } + } + else + { + AppLogDebug("EXIT"); + delete pFlickMenuPanel; + return null; + } + + if (menuStyle & FLICK_MENU_ITEM_SHARE) + { + Button* pShareButton = static_cast(pFlickMenuPanel->GetControl(IDC_SHARE_BUTTON)); + pShareButton->SetText(ResourceManager::GetString(L"IDS_MUSIC_BUTTON_SHARE")); + pShareButton->SetActionId(IDA_FLICK_MENU_ITEM_SHARE); + pShareButton->AddActionEventListener(listener); + } + + if (menuStyle & FLICK_MENU_ITEM_SET_AS) + { + Button* pSetButton = static_cast(pFlickMenuPanel->GetControl(IDC_SET_AS_BUTTON)); + pSetButton->SetText(ResourceManager::GetString(L"IDS_COM_SK_SET_AS")); + pSetButton->SetActionId(IDA_FLICK_MENU_ITEM_SET_AS); + pSetButton->AddActionEventListener(listener); + } + + if (menuStyle & FLICK_MENU_ITEM_ADDTO) + { + Button* pAddToPlaylistButton = static_cast(pFlickMenuPanel->GetControl(IDC_ADD_TO_BUTTON)); + pAddToPlaylistButton->SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_ADD_TO")); + pAddToPlaylistButton->SetActionId(IDA_FLICK_MENU_ITEM_ADDTO); + pAddToPlaylistButton->AddActionEventListener(listener); + } + + if (menuStyle & FLICK_MENU_ITEM_DELETE) + { + Button* pDeleteButton = static_cast(pFlickMenuPanel->GetControl(IDC_BUTTON_DELETE)); + pDeleteButton->SetText(ResourceManager::GetString("IDS_MUSIC_SK3_DELETE")); + pDeleteButton->SetActionId(IDA_FLICK_MENU_ITEM_DELETE); + pDeleteButton->AddActionEventListener(listener); + } + + if (menuStyle & FLICK_MENU_ITEM_PLAYALL) + { + Button* pDeleteButton = static_cast(pFlickMenuPanel->GetControl(IDC_PLAY_ALL_BUTTON)); + pDeleteButton->SetText(ResourceManager::GetString("IDS_MUSIC_OPT_MOREMENU_PLAY_ALL")); + pDeleteButton->SetActionId(IDA_FLICK_MENU_ITEM_PLAYALL); + pDeleteButton->AddActionEventListener(listener); + } + + AppLogDebug("EXIT"); + return pFlickMenuPanel; +} + +Tizen::Base::String +CommonUtil::GetStringItemSelected(int itemCount) +{ + AppLogDebug("ENTER"); + String strSelectStr; + + if (itemCount > INIT_VALUE) + { + if (itemCount == 1) + { + String ResSelect = ResourceManager::GetString("IDS_VR_POP_1_ITEM_SELECTED"); + strSelectStr.Format(STRING_LENGTH, ResSelect.GetPointer()); + } + else + { + String ResSelect = ResourceManager::GetString("IDS_VR_POP_PD_ITEMS_SELECTED"); + strSelectStr.Format(STRING_LENGTH, ResSelect.GetPointer(), itemCount); + } + } +// else +// { +// StrSelectStr.Format(STRING_LENGTH, L"Select s");//NEED STRING +// } + AppLogDebug("EXIT"); + return strSelectStr; +} + +result +CommonUtil::SetShowStateVariableHeightSizeControl(Tizen::Ui::Control& control, int controlHeight, bool isShow) +{ + AppLogDebug("ENTER"); + CommonUtil::SetShowStateControl(control, isShow); + CommonUtil::SetVariableHeightSizeControl(control, controlHeight); + control.Invalidate(true); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +CommonUtil::SetVariableHeightSizeControl(Tizen::Ui::Control& control, int controlHeight) +{ + AppLogDebug("ENTER"); + if (control.GetHeight() != controlHeight) + { + control.SetSize(control.GetWidth(), controlHeight); + } + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::ContextMenu* +CommonUtil::CreateContextMenuN(const Tizen::Ui::Control& source, Tizen::Ui::IActionEventListener& listener) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + Scene* pScene = pSceneManager->GetCurrentScene(); + AppAssert(pScene); + Form *pForm = pScene->GetForm(); + AppAssert(pForm); + + Point convertPosition = source.ConvertToScreenPosition(Point(source.GetWidth() / 2, INIT_VALUE)); + convertPosition.y = convertPosition.y + source.GetHeight(); + + ContextMenuAnchorDirection direction = CONTEXT_MENU_ANCHOR_DIRECTION_DOWNWARD; + if (convertPosition.y > pForm->GetHeight() / 2) + { + convertPosition.y = convertPosition.y - source.GetHeight(); + direction = CONTEXT_MENU_ANCHOR_DIRECTION_UPWARD; + } + + ContextMenu* pContextMenu = new (std::nothrow) ContextMenu(); + pContextMenu->Construct(Point(INIT_VALUE, INIT_VALUE), CONTEXT_MENU_STYLE_LIST, direction); + pContextMenu->SetName(L"IDC_CONTEXT_MENU"); + pContextMenu->AddActionEventListener(listener); + pContextMenu->SetAnchorPosition(convertPosition); + pContextMenu->SetMaxVisibleItemsCount(5); + pContextMenu->SetShowState(true); + + AppLogDebug("EXIT"); + return pContextMenu; +} + +void +CommonUtil::AddContextMenuItem(Tizen::Ui::Controls::ContextMenu& contextMenu, unsigned int contextMenuItemStyle) +{ + AppLogDebug("ENTER"); + if (CONTEXT_MENU_ITEM_STYLE_CALL & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CALL + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_CALL_RINGTONE"), IDA_CONTEXT_MENU_ITEM_CALL); + } + + if (CONTEXT_MENU_ITEM_STYLE_SEARCH & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SEARCH + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH"), IDA_CONTEXT_MENU_ITEM_SEARCH); + } + + if (CONTEXT_MENU_ITEM_STYLE_BLUETOOTH & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_BLUETOOTH + contextMenu.AddItem(L"Bluetooth", IDA_CONTEXT_MENU_ITEM_BLUETOOTH);//NEED STRING + } + + if (CONTEXT_MENU_ITEM_STYLE_MESSAGE & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_MESSAGE + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_MESSAGE"), IDA_CONTEXT_MENU_ITEM_MESSAGE); + } + + if (CONTEXT_MENU_ITEM_STYLE_ALARM & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_ALARM + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_SETAS_ALARM_TONE"), IDA_CONTEXT_MENU_ITEM_ALARM); + } + + if (CONTEXT_MENU_ITEM_STYLE_EMAIL & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_EMAIL + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EMAIL"), IDA_CONTEXT_MENU_ITEM_EMAIL); + } + + if (CONTEXT_MENU_ITEM_STYLE_SETTINGS & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SETTINGS + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_SETTINGS"), IDA_CONTEXT_MENU_ITEM_SETTINGS); + } + + if (CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MSGF_SK3_FOLDER_VIEW"), IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW); + } + + if (CONTEXT_MENU_ITEM_STYLE_CREATE_PLAYLIST & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_CREATE_PLAYLIST"), IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST); + } + + if (CONTEXT_MENU_ITEM_STYLE_SHARE_VIA & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SHARE_VIA + contextMenu.AddItem(ResourceManager::GetString(L"IDS_IV_BODY_SHARE_VIA"), IDA_CONTEXT_MENU_ITEM_SHARE_VIA); + } + + if (CONTEXT_MENU_ITEM_STYLE_EDIT & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_EDIT + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EDIT"), IDA_CONTEXT_MENU_ITEM_EDIT); + } + + if (CONTEXT_MENU_ITEM_STYLE_CALLER & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CALLER + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_SETAS_CALLER_RINGTONE"), IDA_CONTEXT_MENU_ITEM_CALLER); + } + + if (CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_GO_TO_LIBRARY"), IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY); + } + + if (CONTEXT_MENU_ITEM_STYLE_ADD & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_ADD + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_ADD"), IDA_CONTEXT_MENU_ITEM_STYLE_ADD); + } + + if (CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST"), IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST); + } + + if (CONTEXT_MENU_ITEM_STYLE_SET_AS & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS + contextMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_SK3_SET_AS"), IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS); + } + + if (CONTEXT_MENU_ITEM_STYLE_DETAILS & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS + contextMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_DETAILS"), IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS); + } + + if (CONTEXT_MENU_ITEM_STYLE_SOUND_PATH & contextMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH + contextMenu.AddItem(L"Sound Path", IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH);//NEED STRING + } + contextMenu.SetFocusable(true); + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::OptionMenu* +CommonUtil::CreateOptionMenuN(const Tizen::Ui::Control& source, Tizen::Ui::IActionEventListener& listener) +{ + AppLogDebug("ENTER"); + + OptionMenu* pOptionMenu = new (std::nothrow) OptionMenu(); + pOptionMenu->Construct(); + pOptionMenu->SetName(L"IDC_OPTION_MENU"); + pOptionMenu->AddActionEventListener(listener); + pOptionMenu->SetMaxVisibleItemsCount(5); + pOptionMenu->SetShowState(true); + pOptionMenu->SetFocusable(true); + AppLogDebug("EXIT"); + return pOptionMenu; +} + +void +CommonUtil::AddOptionMenuItem(Tizen::Ui::Controls::OptionMenu& optionMenu, unsigned int optionMenuItemStyle) +{ + AppLogDebug("ENTER"); + if (CONTEXT_MENU_ITEM_STYLE_CALL & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CALL + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_CALL_RINGTONE"), IDA_CONTEXT_MENU_ITEM_CALL); + } + + if (CONTEXT_MENU_ITEM_STYLE_SEARCH & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SEARCH + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH"), IDA_CONTEXT_MENU_ITEM_SEARCH); + } + + if (CONTEXT_MENU_ITEM_STYLE_BLUETOOTH & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_BLUETOOTH + optionMenu.AddItem(L"Bluetooth", IDA_CONTEXT_MENU_ITEM_BLUETOOTH);//NEED STRING + } + + if (CONTEXT_MENU_ITEM_STYLE_MESSAGE & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_MESSAGE + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_MESSAGE"), IDA_CONTEXT_MENU_ITEM_MESSAGE); + } + + if (CONTEXT_MENU_ITEM_STYLE_ALARM & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_ALARM + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_SETAS_ALARM_TONE"), IDA_CONTEXT_MENU_ITEM_ALARM); + } + + if (CONTEXT_MENU_ITEM_STYLE_EMAIL & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_EMAIL + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EMAIL"), IDA_CONTEXT_MENU_ITEM_EMAIL); + } + + if (CONTEXT_MENU_ITEM_STYLE_SETTINGS & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SETTINGS + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_SETTINGS"), IDA_CONTEXT_MENU_ITEM_SETTINGS); + } + + if (CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MSGF_SK3_FOLDER_VIEW"), IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW); + } + + if (CONTEXT_MENU_ITEM_STYLE_CREATE_PLAYLIST & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_CREATE_PLAYLIST"), IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST); + } + + if (CONTEXT_MENU_ITEM_STYLE_SHARE_VIA & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_SHARE_VIA + optionMenu.AddItem(ResourceManager::GetString(L"IDS_IV_BODY_SHARE_VIA"), IDA_CONTEXT_MENU_ITEM_SHARE_VIA); + } + + if (CONTEXT_MENU_ITEM_STYLE_EDIT & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_EDIT + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_EDIT"), IDA_CONTEXT_MENU_ITEM_EDIT); + } + + if (CONTEXT_MENU_ITEM_STYLE_CALLER & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_CALLER + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_SETAS_CALLER_RINGTONE"), IDA_CONTEXT_MENU_ITEM_CALLER); + } + + if (CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_GO_TO_LIBRARY"), IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY); + } + + if (CONTEXT_MENU_ITEM_STYLE_ADD & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_ADD + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_OPT_ADD"), IDA_CONTEXT_MENU_ITEM_STYLE_ADD); + } + + if (CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST"), IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST); + } + + if (CONTEXT_MENU_ITEM_STYLE_SET_AS & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS + optionMenu.AddItem(ResourceManager::GetString(L"IDS_MUSIC_SK3_SET_AS"), IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS); + } + + if (CONTEXT_MENU_ITEM_STYLE_DETAILS & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS + optionMenu.AddItem(ResourceManager::GetString(L"IDS_COM_BODY_DETAILS"), IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS); + } + + if (CONTEXT_MENU_ITEM_STYLE_SOUND_PATH & optionMenuItemStyle) + { +// IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH + optionMenu.AddItem(L"Sound Path", IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH);//NEED STRING + } + AppLogDebug("EXIT"); +} + +bool +CommonUtil::IsVaildContextMenuItemActionId(int actionId) +{ + AppLogDebug("ENTER"); + if (actionId >= IDA_CONTEXT_MENU_ITEM_BASE && actionId < IDA_CONTEXT_MENU_ITEM_MAX) + { + return true; + } + AppLogDebug("EXIT"); + return false; +} + +bool +CommonUtil::IsVaildCommonPopupActionId(int actionId) +{ + AppLogDebug("ENTER"); + if (actionId >= IDA_COMMON_POPUP_BASE && actionId < IDA_COMMON_POPUP_MAX) + { + return true; + } + AppLogDebug("EXIT"); + return false; +} + +void +CommonUtil::ShowContextMenu(Tizen::Ui::Controls::ContextMenu& contextMenu, bool isShow) +{ + AppLogDebug("ENTER"); + CommonUtil::SetShowStateControl(contextMenu, isShow); + if (isShow) + { + contextMenu.Show(); + } + AppLogDebug("EXIT"); +} + +void +CommonUtil::ShowOptionMenu(Tizen::Ui::Controls::OptionMenu& optionMenu, bool isShow) +{ + AppLogDebug("ENTER"); + CommonUtil::SetShowStateControl(optionMenu, isShow); + if (isShow) + { + optionMenu.Show(); + } + AppLogDebug("EXIT"); +} + +result +CommonUtil::SetShowStateControl(Tizen::Ui::Control& control, bool isShow) +{ + AppLogDebug("ENTER"); + if (control.GetShowState() != isShow) + { + control.SetShowState(isShow); + control.Invalidate(true); + return E_SUCCESS; + } + + AppLogDebug("EXIT"); + return E_FAILURE; +} + +void +CommonUtil::SetSimpleTitleStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TITLE); + pHeader.SetTitleText(titleText); + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + pHeader.Invalidate(true); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetTitleWithSearchIconStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, + const Tizen::Base::String& descriptionText, int actionId) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TITLE); + pHeader.SetTitleText(titleText); + + ButtonItem buttonItem; + buttonItem.Construct(BUTTON_ITEM_STYLE_ICON, actionId); + +// CommonUtil::SetButtonItemIcon(buttonItem, L"T02_icon_search.png", L"T02_icon_search.png", L"T02_icon_search.png"); + pHeader.SetButton(BUTTON_POSITION_RIGHT, buttonItem); + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetTitleDescriptionWithIconStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, + Tizen::Base::String& descriptionText, int actionId, Tizen::Graphics::Bitmap* icon) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TITLE); + pHeader.SetTitleText(titleText); + pHeader.SetDescriptionText(descriptionText); + + ButtonItem buttonItem; + buttonItem.Construct(BUTTON_ITEM_STYLE_ICON, actionId); + +// CommonUtil::SetIconButtonItem(buttonItem, icon, icon, null); +// CommonUtil::SetButtonItemIcon(buttonItem, L"T02_icon_search.png", L"T02_icon_search.png", L"T02_icon_search.png"); + pHeader.SetButton(BUTTON_POSITION_RIGHT, buttonItem); + + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + pHeader.SetDescriptionTextColor(COLOR_HEADER_DESCRIPTION_TEXT); + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetTitleDescriptionStyle(Tizen::Ui::Controls::Header& pHeader, const Tizen::Base::String& titleText, const Tizen::Base::String& descriptionText) +{ + AppLogDebug("ENTER"); + pHeader.RemoveAllButtons(); + pHeader.RemoveAllItems(); + + pHeader.SetStyle(HEADER_STYLE_TITLE); + pHeader.SetTitleText(titleText); + pHeader.SetDescriptionText(descriptionText); + + pHeader.SetTitleTextColor(COLOR_HEADER_TITLE_TEXT); + pHeader.SetDescriptionTextColor(COLOR_HEADER_DESCRIPTION_TEXT); + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateContentListFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + +#if 0 + ButtonItem AddButtonItem; + ButtonItem backButtonItem; + FooterItem searchButtonItem; + + AddButtonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pAddButtonImage); + + backButtonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FOOTER_BUTTON_BACK); + backButtonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pBackButtonImage); + + searchButtonItem.Construct(IDA_FOOTER_BUTTON_SEARCH); + searchButtonItem.SetIcon(FOOTER_ITEM_STATUS_NORMAL, pSearchButtonImage); + + pFooter->SetStyle(FOOTER_STYLE_SEGMENTED_ICON); + + pFooter->SetButton(BUTTON_POSITION_LEFT, AddButtonItem); + pFooter->SetButton(BUTTON_POSITION_RIGHT, backButtonItem); + pFooter->AddItem(searchButtonItem); +#else + FooterItem AddButtonItem; + FooterItem searchButtonItem; + + AddButtonItem.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + + searchButtonItem.Construct(IDA_FOOTER_BUTTON_SEARCH); + searchButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH")); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + pFooter->AddItem(AddButtonItem); + pFooter->AddItem(searchButtonItem); +#endif + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreatePlaylistEditFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + + FooterItem deleteButtonItem; + FooterItem cancelButtonItem; + + deleteButtonItem.Construct(IDA_FOOTER_BUTTON_DELETE); + deleteButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_DELETE")); + + cancelButtonItem.Construct(IDA_FOOTER_BUTTON_CANCEL); + cancelButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT_CANCEL")); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + pFooter->AddItem(deleteButtonItem); + pFooter->AddItem(cancelButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateDefaultPlaylistContentListFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + + FooterItem editButtonItem; + FooterItem createPlaylistButtonItem; + FooterItem searchButtonItem; + + editButtonItem.Construct(IDA_FOOTER_BUTTON_EDIT); + editButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + createPlaylistButtonItem.Construct(IDA_FOOTER_BUTTON_CREATE_PLAYLIST); + createPlaylistButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_CREATE_PLAYLIST")); + + searchButtonItem.Construct(IDA_FOOTER_BUTTON_SEARCH); + searchButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH")); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + pFooter->AddItem(editButtonItem); + pFooter->AddItem(createPlaylistButtonItem); + pFooter->AddItem(searchButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateUserPlaylistContentListFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + + FooterItem editButtonItem; + FooterItem AddButtonItem; +// FooterItem searchButtonItem; + + editButtonItem.Construct(IDA_FOOTER_BUTTON_EDIT); + editButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + + AddButtonItem.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + +// searchButtonItem.Construct(IDA_FOOTER_BUTTON_SEARCH); +// searchButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH")); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + pFooter->AddItem(editButtonItem); + pFooter->AddItem(AddButtonItem); +// pFooter->AddItem(searchButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateAddtoPlaylistPickerFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + +#if 0 + ButtonItem AddButtonItem; + ButtonItem CancelButtonItem; + + AddButtonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pAddButtonImage); + + CancelButtonItem.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FOOTER_BUTTON_CANCEL); + CancelButtonItem.SetIcon(BUTTON_ITEM_STATUS_NORMAL, pCancelButtonImage); + + pFooter->SetStyle(FOOTER_STYLE_SEGMENTED_ICON); + + pFooter->SetButton(BUTTON_POSITION_LEFT, AddButtonItem); + pFooter->SetButton(BUTTON_POSITION_RIGHT, CancelButtonItem); +#else + FooterItem AddButtonItem; + FooterItem CancelButtonItem; + + AddButtonItem.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + + CancelButtonItem.Construct(IDA_FOOTER_BUTTON_CANCEL); + CancelButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT_CANCEL")); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + pFooter->AddItem(AddButtonItem); + pFooter->AddItem(CancelButtonItem); +#endif + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateAddtoPlaylistFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + + FooterItem AddButtonItem; + + AddButtonItem.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + AddButtonItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + pFooter->AddItem(AddButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateEditContentListFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + FooterItem editButtonItem; + FooterItem searchButtonItem; + + editButtonItem.Construct(IDA_FOOTER_BUTTON_EDIT); + editButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + + searchButtonItem.Construct(IDA_FOOTER_BUTTON_SEARCH); + searchButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_SEARCH")); + + pFooter->AddItem(editButtonItem); + pFooter->AddItem(searchButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateEditFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + FooterItem editButtonItem; + editButtonItem.Construct(IDA_FOOTER_BUTTON_EDIT); + editButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + pFooter->AddItem(editButtonItem); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateDeleteFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + FooterItem deleteFooterItem; + deleteFooterItem.Construct(IDA_FOOTER_BUTTON_DELETE); + deleteFooterItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_SK3_DELETE")); + + FooterItem shareFooterItem; + shareFooterItem.Construct(IDA_FOOTER_BUTTON_SHARE); + shareFooterItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BUTTON_SHARE")); + + FooterItem addToPlaylistFooterItem; + addToPlaylistFooterItem.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + addToPlaylistFooterItem.SetText(ResourceManager::GetString(L"IDS_MUSIC_BUTTON2_ADD_TO_PLAYLIST")); + + FooterItem cancelFooterItem; + cancelFooterItem.Construct(IDA_FOOTER_BUTTON_CANCEL); + cancelFooterItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT_CANCEL")); + + pFooter->AddItem(deleteFooterItem); + pFooter->AddItem(shareFooterItem); + pFooter->AddItem(addToPlaylistFooterItem); + pFooter->AddItem(cancelFooterItem); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateCancelFooter(const Tizen::Ui::Controls::Form& form) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + + pFooter->SetBackButton(); + AppLogDebug("EXIT"); + return pFooter; +} + +Tizen::Ui::Controls::Footer* +CommonUtil::CreateBackButtonStyleFooter(const Tizen::Ui::Controls::Form& form, FooterButtonStyle style) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + AppLogDebug("EXIT"); + return null; + } + pFooter->SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + switch (style) + { + + case STYLE_ADDTO_DELETE_ADD: + { + FooterItem footerItemAddto; + footerItemAddto.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + footerItemAddto.SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_ADD_TO")); + + FooterItem footerItemDelete; + footerItemDelete.Construct(IDA_FOOTER_BUTTON_DELETE); + footerItemDelete.SetText(ResourceManager::GetString(L"IDS_MUSIC_SK3_DELETE")); + + pFooter->AddItem(footerItemAddto); + pFooter->AddItem(footerItemDelete); + } + break; + + case STYLE_SHARE_ADD: + { + FooterItem footerItemShare; + footerItemShare.Construct(IDA_FOOTER_BUTTON_SHARE); + footerItemShare.SetText(ResourceManager::GetString(L"IDS_MUSIC_BUTTON_SHARE")); + + pFooter->AddItem(footerItemShare); + } + break; + + case STYLE_DELETE_ADD: + { + FooterItem footerItemDelete; + footerItemDelete.Construct(IDA_FOOTER_BUTTON_DELETE); + footerItemDelete.SetText(ResourceManager::GetString(L"IDS_MUSIC_SK3_DELETE")); + + pFooter->AddItem(footerItemDelete); + } + break; + + case STYLE_ADD_ADD: + { + FooterItem footerItemAdd; + footerItemAdd.Construct(IDA_FOOTER_BUTTON_ADD); + footerItemAdd.SetText(ResourceManager::GetString(L"IDS_MUSIC_SK_ADD_LITE")); + + pFooter->AddItem(footerItemAdd); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); + return pFooter; +} + +void +CommonUtil::SetBackButtonStyleFooter(Tizen::Ui::Controls::Footer& footer, FooterButtonStyle style) +{ + AppLogDebug("ENTER"); + footer.RemoveAllButtons(); + footer.RemoveAllItems(); + footer.SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + switch(style) + { + case STYLE_ADDTO_DELETE_ADD: + { + FooterItem footerItemAddto; + footerItemAddto.Construct(IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + footerItemAddto.SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_ADD_TO")); + FooterItem footerItemDelete; + footerItemDelete.Construct(IDA_FOOTER_BUTTON_DELETE); + footerItemDelete.SetText(ResourceManager::GetString(L"IDS_MUSIC_SK3_DELETE")); + footer.AddItem(footerItemAddto); + footer.AddItem(footerItemDelete); + } + break; + + case STYLE_SHARE_ADD: + { + FooterItem footerItemShare; + footerItemShare.Construct(IDA_FOOTER_BUTTON_SHARE); + footerItemShare.SetText(ResourceManager::GetString(L"IDS_MUSIC_BUTTON_SHARE")); + footer.AddItem(footerItemShare); + } + break; + + case STYLE_MORE_EDIT_ADD: + { + footer.SetStyle(FOOTER_STYLE_BUTTON_ICON_TEXT); + + Bitmap* bitmapMore = ResourceManager::GetBitmapN(L"00_icon_more_web.png"); + Bitmap* bitmapMorePress = ResourceManager::GetBitmapN(L"00_icon_more_press_web.png"); + + ButtonItem buttonItemMore; + buttonItemMore.Construct(BUTTON_ITEM_STYLE_ICON, IDA_FOOTER_BUTTON_MORE); + buttonItemMore.SetIcon(BUTTON_ITEM_STATUS_NORMAL, bitmapMore); + buttonItemMore.SetIcon(BUTTON_ITEM_STATUS_PRESSED, bitmapMorePress); + footer.SetButton(BUTTON_POSITION_LEFT,buttonItemMore); + + delete bitmapMore; + delete bitmapMorePress; + + FooterItem editButtonItem; + editButtonItem.Construct(IDA_FOOTER_BUTTON_EDIT); + editButtonItem.SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + footer.AddItem(editButtonItem); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +ContentInformation* +CommonUtil::GetContentInformationN(const Tizen::Content::AudioContentInfo& audioContentInfo) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = new (std::nothrow) ContentInformation(); + + pContentInfoStruct->contentId = audioContentInfo.GetContentId(); + pContentInfoStruct->GenreName = audioContentInfo.GetGenre(); + pContentInfoStruct->ArtistName = audioContentInfo.GetArtist(); + pContentInfoStruct->ComposerName = audioContentInfo.GetComposer(); + pContentInfoStruct->AlbumName = audioContentInfo.GetAlbumName(); + pContentInfoStruct->TitleName = audioContentInfo.GetTitle(); + pContentInfoStruct->ContentFilePath = audioContentInfo.GetContentPath(); + + pContentInfoStruct->ReleaseYear = audioContentInfo.GetReleaseYear(); + pContentInfoStruct->Duration = audioContentInfo.GetDuration(); + pContentInfoStruct->contentId = audioContentInfo.GetContentId(); + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +void +CommonUtil::CreateTableViewItem(Tizen::Ui::Container& parent, + const Tizen::Graphics::Bitmap& thumbnail, + const Tizen::Base::String& itemName, + int itemCount) +{ + AppLogDebug("ENTER"); + + int X_Gap = W_THUMBNAIL + (X_GAP_THUMBNAIL * 2); + int W_Label = W_CLIENT_AREA - (X_Gap + W_CREATE_TABLE_VIEW_ITEM_COUNT_LABEL_ITEM); + + Label* pSongThumbnailLabel = new (std::nothrow) Label(); + pSongThumbnailLabel->Construct(Rectangle(X_GAP_THUMBNAIL, Y_GAP_THUMBNAIL, W_THUMBNAIL, H_THUMBNAIL), L""); + pSongThumbnailLabel->SetBackgroundBitmap(thumbnail); + pSongThumbnailLabel->SetName(L"pSongThumbnailLabel"); + + parent.AddControl(pSongThumbnailLabel); + + Label* pSongNameLabel = new (std::nothrow) Label(); + pSongNameLabel->Construct(Rectangle(X_Gap, Y_CREATE_TABLE_VIEW_ITEM, W_Label, H_CREATE_TABLE_VIEW_ITEM), L""); + pSongNameLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pSongNameLabel->SetText(itemName); + + parent.AddControl(pSongNameLabel); + + Label* pSongTimeLabel = new (std::nothrow) Label(); + pSongTimeLabel->Construct(Rectangle(pSongNameLabel->GetWidth() + X_Gap, pSongNameLabel->GetY(), W_CREATE_TABLE_VIEW_ITEM_COUNT_LABEL_ITEM, H_CREATE_TABLE_VIEW_ITEM), L""); + pSongTimeLabel->SetTextConfig(FONT_SIZE - 2, LABEL_TEXT_STYLE_NORMAL); + pSongTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pSongTimeLabel->SetText(CommonUtil::SetSongsString(itemCount)); + + parent.AddControl(pSongTimeLabel); + AppLogDebug("EXIT"); +} + +result +CommonUtil::CreateEditListTableViewItem(Tizen::Ui::Container& parent, + const Tizen::Graphics::Bitmap& thumbnail, + const Tizen::Base::String& itemName, + int itemCount) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + int W_Label = W_CLIENT_AREA - (W_TABLE_VIEW_MARK + W_THUMBNAIL + W_CREATE_TABLE_VIEW_ITEM_COUNT_LABEL_ITEM); + + Label* pSongThumbnailLabel = new (std::nothrow) Label(); + pSongThumbnailLabel->Construct(Rectangle(0, Y_GAP_THUMBNAIL, W_THUMBNAIL, H_THUMBNAIL), L""); + pSongThumbnailLabel->SetBackgroundBitmap(thumbnail); + pSongThumbnailLabel->SetName(L"pSongThumbnailLabel"); + + Label* pSongNameLabel = new (std::nothrow) Label(); + pSongNameLabel->Construct(Rectangle(pSongThumbnailLabel->GetWidth(), Y_CREATE_TABLE_VIEW_ITEM, W_Label, H_CREATE_TABLE_VIEW_ITEM), L""); + pSongNameLabel->SetTextConfig(FONT_SIZE + 2, LABEL_TEXT_STYLE_NORMAL); + pSongNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pSongNameLabel->SetText(itemName); + + Label* pSongCountLabel = new (std::nothrow) Label(); + pSongCountLabel->Construct(Rectangle(pSongNameLabel->GetWidth() + W_THUMBNAIL, pSongNameLabel->GetY(), W_CREATE_TABLE_VIEW_ITEM_COUNT_LABEL_ITEM, H_CREATE_TABLE_VIEW_ITEM), L""); + pSongCountLabel->SetTextConfig(FONT_SIZE - 2, LABEL_TEXT_STYLE_NORMAL); + pSongCountLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pSongCountLabel->SetText(CommonUtil::SetSongsString(itemCount)); + + parent.AddControl(pSongThumbnailLabel); + parent.AddControl(pSongNameLabel); + parent.AddControl(pSongCountLabel); + AppLogDebug("EXIT"); + return r; +} + +result +CommonUtil::CreateTableViewContextItem(Tizen::Ui::Controls::TableViewContextItem& parent, Tizen::Ui::IActionEventListener& listener) +{ + AppLogDebug("ENTER"); + Button* pAddToPlaylistButton = new (std::nothrow) Button(); + pAddToPlaylistButton->Construct(Rectangle(X_GAP_CONTEXT_ITME, Y_GAP_CONTEXT_ITEM, parent.GetWidth() - (X_GAP_CONTEXT_ITME * 2), parent.GetHeight() - (Y_GAP_CONTEXT_ITEM * 2))); + pAddToPlaylistButton->SetText(ResourceManager::GetString("IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + pAddToPlaylistButton->SetTextSize(FONT_SIZE); + pAddToPlaylistButton->SetActionId(IDA_FLICK_BUTTON_ADD_TO_PALYLIST); + pAddToPlaylistButton->AddActionEventListener(listener); + + parent.SetIndividualSelectionEnabled(pAddToPlaylistButton, true); + parent.AddControl(pAddToPlaylistButton); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +Tizen::Ui::Controls::TableView* +CommonUtil::CreateEditorTableView(int width, int height) +{ + AppLogDebug("ENTER"); + TableView* pTableView = new (std::nothrow) TableView(); + pTableView->Construct(Rectangle(INIT_VALUE, H_SELECT_ALL_BUTTON, width, height - H_SELECT_ALL_BUTTON), + true, + TABLE_VIEW_SCROLL_BAR_STYLE_FADE_OUT); + AppLogDebug("EXIT"); + return pTableView; +} + +Tizen::Ui::Controls::TableView* +CommonUtil::CreateTableView(int width, int height) +{ + AppLogDebug("ENTER"); + TableView* pTableView = new (std::nothrow) TableView(); + pTableView->Construct(Rectangle(0, 0, width, height), true, TABLE_VIEW_SCROLL_BAR_STYLE_FAST_SCROLL); + + String retCountry; + String indexText; + + Tizen::System::SettingInfo::GetValue("http://tizen.org/setting/locale.country", retCountry); + if (retCountry.CompareTo("eng_GB") == 0) + { + indexText.Append(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } + else if(retCountry.CompareTo("kor_KR") == 0) + { +// indexText.Append(L"ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ"); + indexText.Append(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + } + + indexText.Append(L"#"); + indexText.Append(L"0"); + + pTableView->SetFastScrollIndex(indexText, false); + AppLogDebug("EXIT"); + return pTableView; +} + +result +CommonUtil::CreateContentPikerTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const Tizen::Base::String& songName, const Tizen::Base::String& songTime) +{ + AppLogDebug("ENTER"); + Label* pSongNameLabel = new (std::nothrow) Label(); + pSongNameLabel->Construct(Rectangle(0, Y_GAP_CONTENT_PIKER_ITEM, W_SONG_TITLE_CONTENT_PIKER_ITEM, H_SONG_TITLE_CONTENT_PIKER_ITEM), songName); + pSongNameLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + + Label* pSongTimeLabel = new (std::nothrow) Label(); + pSongTimeLabel->Construct(Rectangle(pSongNameLabel->GetWidth(), Y_GAP_CONTENT_PIKER_ITEM, W_SONG_TIME_CONTENT_PIKER_ITEM, pSongNameLabel->GetHeight()), songTime); + pSongTimeLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pSongTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + + parent.AddControl(pSongNameLabel); + parent.AddControl(pSongTimeLabel); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +Tizen::Ui::Controls::CheckButton* +CommonUtil::CreateSelectAllCheckedButton(int width) +{ + AppLogDebug("ENTER"); + CheckButton* pCheckButton = new (std::nothrow) CheckButton(); + pCheckButton->Construct(Rectangle(INIT_VALUE, INIT_VALUE, width, H_SELECT_ALL_BUTTON), + CHECK_BUTTON_STYLE_MARK, + BACKGROUND_STYLE_DEFAULT, + false, + ResourceManager::GetString("IDS_COM_BODY_SELECT_ALL"), + GROUP_STYLE_BOTTOM); + pCheckButton->SetActionId(IDA_CHECK_BUTTON, IDA_UNCHECK_BUTTON, INIT_VALUE); + pCheckButton->SetColor(CHECK_BUTTON_STATUS_NORMAL, COLOR_SELECT_ALL); + AppLogDebug("EXIT"); + return pCheckButton; +} + +Tizen::Ui::Controls::Label* +CommonUtil::CreateCheckedCountLabel(int width, int height) +{ + AppLogDebug("ENTER"); + Label* pLabel = new (std::nothrow) Label(); + pLabel->Construct(Rectangle(INIT_VALUE, height - H_CHECKED_COUNT_LABEL, width, H_CHECKED_COUNT_LABEL), L""); + pLabel->SetBackgroundColor(COLOR_SMALL_POPUP); + pLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER); + pLabel->SetText(FONT_SIZE); + AppLogDebug("EXIT"); + return pLabel; +} + +void +CommonUtil::SetAddtoPlaylistState(bool state) +{ + AppLogDebug("ENTER"); + __addToPlaylistState = state; + AppLogDebug("EXIT"); +} + +bool +CommonUtil::GetAddtoPlaylistState(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __addToPlaylistState; +} + +void +CommonUtil::SetAddtoPlaylistName(const Tizen::Base::String& addToPlayName) +{ + AppLogDebug("ENTER"); + __AddToPlaylistName = addToPlayName; + AppLogDebug("EXIT"); +} + +Tizen::Base::String +CommonUtil::GetAddtoPlaylistName(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __AddToPlaylistName; +} + +void +CommonUtil::SetButtonEnabled(const Tizen::Ui::Controls::Form& form, int checkedItemCount, int actionId) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + return; + } + + if (actionId == IDA_CHECK_BUTTON + || actionId == IDA_UNCHECK_BUTTON + || actionId == IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST + || actionId == IDA_FOOTER_BUTTON_DELETE) + { + bool buttonState = checkedItemCount == 0 ? false : true; + for (int iCount = 0; iCount < pFooter->GetItemCount() - 1; iCount++) + { + pFooter->SetItemEnabled(iCount, buttonState); + pFooter->Invalidate(true); + } + } + else if (actionId == IDA_FOOTER_BUTTON_CANCEL) + { + for (int iCount = 0; iCount < pFooter->GetItemCount() - 1; iCount++) + { + pFooter->SetItemEnabled(iCount, true); + pFooter->Invalidate(true); + } + } + AppLogDebug("EXIT"); +} + +void +CommonUtil::SetButtonEnabled(const Tizen::Ui::Controls::Form& form, int checkedItemCount) +{ + AppLogDebug("ENTER"); + Footer* pFooter = form.GetFooter(); + if (pFooter == null) + { + return; + } + + bool buttonState = checkedItemCount == 0 ? false : true; + for (int iCount = 0; iCount < pFooter->GetItemCount() - 1; iCount++) + { + pFooter->SetItemEnabled(iCount, buttonState); + pFooter->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +Bitmap* +CommonUtil::GetColorizedBitmapN(const Tizen::Graphics::Bitmap& bitmap, const Tizen::Graphics::Color& color) +{ + AppLogDebug("ENTER"); + if (bitmap.GetPixelColorFormat() != BITMAP_PIXEL_FORMAT_ARGB8888) + { + return null; + } + std::unique_ptrpRet(new (std::nothrow) Bitmap()); + if (pRet == null) + { + return null; + } + result r = pRet->Construct(bitmap, Rectangle(0, 0, bitmap.GetWidth(), bitmap.GetHeight())); + if (r != E_SUCCESS) + { + return null; + } + BufferInfo bi; + pRet->Lock(bi); + { + typedef unsigned long Pixel; + Pixel* pDst = static_cast(bi.pPixels); + int dstPadding = bi.pitch / sizeof(Pixel) - bi.width; + Pixel replacing = color.GetRGB32() & 0x00FFFFFF; + for (int y = 0; y < bi.height; y++) + { + for (int x = 0; x < bi.width; x++) + { + *pDst = (*pDst & 0xFF000000) | replacing; + pDst++; + } + pDst += dstPadding; + } + } + pRet->Unlock(); + AppLogDebug("EXIT"); + return pRet.release(); +} + +void +CommonUtil::SetNoContentImage(Tizen::Ui::Controls::Label& source, Tizen::Base::String& resourceName, Tizen::Base::String& text) +{ + AppLogDebug("ENTER"); + Bitmap* pNoContentImage = ResourceManager::GetBitmapN(resourceName); + source.SetBackgroundBitmap(*pNoContentImage); + delete pNoContentImage; + source.SetText(text); + source.Invalidate(false); + AppLogDebug("EXIT"); +} + +Tizen::Base::String +CommonUtil::SetHighDepthToEllipsisPath(const Tizen::Base::String& fullFilePath) +{ + AppLogDebug("ENTER"); + StringTokenizer stringTokenizer(fullFilePath, IDS_SEPARATOR_SLASH); + int depthCount = stringTokenizer.GetTokenCount() - DEPTH; + if (depthCount <= INIT_VALUE) + { + AppLogDebug("EXIT"); + return fullFilePath; + } + + String folderPath(L"."); + int iLoopCount = 0; + while (stringTokenizer.HasMoreTokens()) + { + String token; + stringTokenizer.GetNextToken(token); + if (iLoopCount >= depthCount) + { + folderPath.Append(IDS_SEPARATOR_SLASH); + folderPath.Append(token); + } + iLoopCount++; + } + + AppLogDebug("EXIT"); + return folderPath; +} + +Tizen::Base::String +CommonUtil::GetFontSizeValue(void) +{ + AppLogDebug("ENTER"); + String fontSizeValue; + SettingInfo::GetValue(PARAM_FONT_SIZE, fontSizeValue); + AppLogDebug("EXIT"); + return fontSizeValue; +} + +int +CommonUtil::GetItemHeight(const Tizen::Base::String& fontSizeValue) +{ + int itemHeight; + + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + itemHeight = ITEM_HEIGHT_MAIN_TEXT_GIANT; + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + itemHeight = ITEM_HEIGHT_MAIN_TEXT_HUGE; + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + itemHeight = ITEM_HEIGHT_MAIN_TEXT_LARGE; + } + else if (fontSizeValue.Equals(L"medium", false)) + { + itemHeight = ITEM_HEIGHT_MAIN_TEXT_NORMAL; + } + else + { + itemHeight = ITEM_HEIGHT_MAIN_TEXT_SMALL; + } + return itemHeight; +} + +int +CommonUtil::GetFontSize(const Tizen::Base::String& fontSizeValue) +{ + int fontSize; + + if (fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + fontSize = FONT_MAIN_TEXT_SIZE_GIANT; + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + fontSize = FONT_MAIN_TEXT_SIZE_HUGE; + } + else if (fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + fontSize = FONT_MAIN_TEXT_SIZE_LARGE; + } + else if (fontSizeValue.Equals(L"medium", false)) + { + fontSize = FONT_MAIN_TEXT_SIZE_NORMAL; + } + else + { + fontSize = FONT_MAIN_TEXT_SIZE_SMALL; + } + + return fontSize; +} diff --git a/src/MpComposerContentListForm.cpp b/src/MpComposerContentListForm.cpp new file mode 100644 index 0000000..2a682ac --- /dev/null +++ b/src/MpComposerContentListForm.cpp @@ -0,0 +1,918 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerContentListForm.cpp + * @brief This is the implementation file for ComposerContentListForm class. + */ +#if 0 +#include +#include "MpComposerContentListForm.h" +#include "MpComposerListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int X_OFFSET_EDIT_STYLE_TABLE_VIEW = 96; + +static const Tizen::Graphics::Rectangle RECT_COMPOSER_ITEM_THUMBNAIL (16, 8, 112, 112); +static const Tizen::Graphics::Rectangle RECT_COMPOSER_ITEM_TITLE_NAME (144, 8, 300, 66); +static const Tizen::Graphics::Rectangle RECT_COMPOSER_ITEM_TIME (444, 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_COMPOSER_ITEM_ARTIST_NAME (144, 66, 560, 46); + +static const Tizen::Graphics::Rectangle RECT_COMPOSER_EDIT_ITEM_TITLE_NAME (144, 8, (300 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 66); +static const Tizen::Graphics::Rectangle RECT_COMPOSER_EDIT_ITEM_TIME ((444 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_COMPOSER_EDIT_ITEM_ARTIST_NAME (144, 66, (560 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 46); + + +ComposerContentListForm::ComposerContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pPresentationModel(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerContentListForm::~ComposerContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ComposerContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + CreateTableview(); + CreateSelectAllCheckedButton(); + CreateCheckedCountLabel(); + CreateNoContentImage(L"IDS_MUSIC_HEADER_NO_SONGS"); + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(GetClientAreaBounds().width, ITEM_HEIGHT)); + CreateTableViewContextItem(*__pContextItem); + CreateDeletePopup(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ComposerContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __checkedItemCount = 0; + RemovePlayListPicker(); + + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ComposerContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + __pStrSceneId = static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME)); + __pStrContentName = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME)); + __currentContentIndex = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + __pPresentationModel = ComposerListPresentationModel::GetInstance(); + __pPresentationModel->UpdateComposerList(); + __pPresentationModel->InitializeContentList(__currentContentIndex); + } + else + { + // Empty statement + } + + ContentInformation* pContentInfoStruct = null; + pContentInfoStruct = __pPresentationModel->GetContentInfoN(0); + if (pContentInfoStruct == null) + { + return; + } + + InitializeHeader(*pContentInfoStruct); + if (__checkEdit == true) + { + Footer* pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + } + else + { + Footer* pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + } + __pContentTableView->UpdateTableView(); + + delete pContentInfoStruct; + pContentInfoStruct = null; + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_BUTTON_SHARE: + // fall through + case IDA_FLICK_BUTTON_SET: + { + CreateContextMenu(source); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + ContentInformation* pContentInfo; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + + delete pContentInfo; + pContentInfo = null; + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + } + break; + + case IDA_FLICK_BUTTON_DELETE: + { + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + } + } + break; + + case IDA_DELETE_POPUP_DELETE: + // fall through + case IDA_DELETE_POPUP_CANCEL: + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + if (actionId == IDA_DELETE_POPUP_DELETE && __pPresentationModel != null) + { + ContentManager contentManager; + contentManager.Construct(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + contentManager.DeleteContent(pContentInfo->contentId); + Footer* pFooter = GetFooter(); + + delete pContentInfo; + pContentInfo = null; + + __pPresentationModel->RefreshContentList(__currentContentIndex); + if (__pPresentationModel->GetContentCount(__currentContentIndex) <= INIT_VALUE) + { + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_EDIT_FOOTER_EDIT, false); + pFooter->Invalidate(true); + } + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } + } + break; + + case IDA_SHARE_CONTEXT_MENU_EMAIL: + // fall through + case IDA_SHARE_CONTEXT_MENU_MESSAGE: + { + String providerID = ((actionId == IDA_SHARE_CONTEXT_MENU_EMAIL) ? PROVIDER_ID_EMAIL : PROVIDER_ID_MESSAGE); + AppControl* pAppControl = AppManager::FindAppControlN(providerID, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + return; + } + + ContentInformation* pContentInfo = null; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_ATTACHMENTS), new (std::nothrow) String(pContentInfo->ContentFilePath)); + + pAppControl->Start(null, null, pDataList, this); + + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + + delete pContentInfo; + pContentInfo = null; + } + break; + + case IDA_SET_CONTEXT_MENU_CALL: + { + result r = E_SUCCESS; + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + r = SettingInfo::SetValue(CALL_RINGTONE_KEY, pContentInfo->ContentFilePath); + + delete pContentInfo; + pContentInfo = null; + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + } + break; + + case IDA_SET_CONTEXT_MENU_CALLER: + { + AppControl* pAppControl = AppManager::FindAppControlN(TIZEN_APPCONTROL_PROVIDER_CONTACT, TIZEN_APPCONTROL_OPERATION_PICK); + if (pAppControl == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SINGLE_MODE), new (std::nothrow) String(APPCONTROL_VALUE_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_RETURNTYPE), new (std::nothrow) String(APPCONTROL_VALUE_CONTACTID)); + + pAppControl->Start(null, null, pDataList, this); + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + } + break; + + case IDA_FOOTER_BUTTON_EDIT: + { + ToggleViewMode(false); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + __checkedItemCount = INIT_VALUE; + __pSelectAllCheckedButton->SetSelected(false); + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + ToggleViewMode(true); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_CHECK_BUTTON: + { + __checkedItemCount = __pPresentationModel->GetContentCount(__currentContentIndex); + if (__checkedItemCount > INIT_VALUE) + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + } + CommonUtil::SetAllCheckState(true, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_UNCHECK_BUTTON: + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + int iCount = 0; + + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + pFooter->Invalidate(true); + + contentManager.Construct(); + for (iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pContentTableView->SetItemChecked(iCount, false); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + contentManager.DeleteContent(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + __pPresentationModel->RefreshContentList(__currentContentIndex); + __pContentTableView->UpdateTableView(); + __pContentTableView->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + + if (__pPresentationModel->GetContentCount(__currentContentIndex) > 0) + { + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + } + else + { + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pDataList->Construct(); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfoStruct == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(L"attachment:" + pContentInfoStruct->ContentFilePath))); + + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + Invalidate(true); + + if (__pSharePopup == null) + { + __pSharePopup = new (std::nothrow) SharePopup(); + __pSharePopup->Initialize(); + } + __pSharePopup->SetShowState(true); + __pSharePopup->Show(); + __pSharePopup->SetArguments(pDataList); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + int totalCount = 0; + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + + if (__checkedItemCount <= 0) + { + return; + } + + pDataList->Construct(); + contentManager.Construct(); + totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfoStruct == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + + pDataList->Add(*(new (std::nothrow) String(pContentInfoStruct->ContentFilePath))); + + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + Invalidate(true); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +int +ComposerContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__currentContentIndex); +} + +Tizen::Ui::Controls::TableViewItem* +ComposerContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = null; + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + if (__checkEdit) + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); + } + else + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); + pItem->SetContextItem(__pContextItem); + } +// pItem->SetBackgroundColor(COLOR_WHITE); + + pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + delete pItem; + pItem = null; + return null; + } + + RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CreateTableViewItem(*pItem, *pContentInfoStruct); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +void +ComposerContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + Footer* pFooter = GetFooter(); + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + if (__checkedItemCount == __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(true); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + Footer* pFooter = GetFooter(); + + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + + if (__checkedItemCount == INIT_VALUE) + { + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + } + + if (__checkedItemCount != __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(false); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_SELECTED: + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + ArrayList* tempArg; + AppAssert(pSceneManager); + tempArg = MakePlayerSceneParam(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), tempArg); + + if (tempArg != null) + { + tempArg->RemoveAll(); + delete tempArg; + tempArg = null; + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +ComposerContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + ArrayList* pSelectedMusicContent = null; + + pSelectedMusicContent = __pPresentationModel->GetContentPathListN(__currentContentIndex); + if (pTempList == null || pSelectedMusicContent == null) + { + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pSelectedMusicContent)); + + AppLogDebug("EXIT"); + return pTempList; +} + +result +ComposerContentListForm::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + Rectangle rectTitleName; + Rectangle rectPlayTime; + Rectangle rectArtistName; + + if (__checkEdit) + { + rectTitleName = RECT_COMPOSER_EDIT_ITEM_TITLE_NAME; + rectArtistName = RECT_COMPOSER_EDIT_ITEM_ARTIST_NAME; + rectPlayTime = RECT_COMPOSER_EDIT_ITEM_TIME; + } + else + { + rectTitleName = RECT_COMPOSER_ITEM_TITLE_NAME; + rectArtistName = RECT_COMPOSER_ITEM_ARTIST_NAME; + rectPlayTime = RECT_COMPOSER_ITEM_TIME; + } + + Label* pThumbnailLabel = new (std::nothrow) Label(); + pThumbnailLabel->Construct(RECT_COMPOSER_ITEM_THUMBNAIL, L""); + pThumbnailLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pThumbnailLabel->SetBackgroundBitmap(*GetDefaultThumbnail()); + pThumbnailLabel->SetName(L"pThumbnailLabel"); + + Label* pTitleLabel = new (std::nothrow) Label(); + pTitleLabel->Construct(rectTitleName, L""); + pTitleLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTitleLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pTitleLabel->SetText(contentInfoStruct.TitleName); + + Label* pArtistNameLabel = new (std::nothrow) Label(); + pArtistNameLabel->Construct(rectArtistName, L""); + pArtistNameLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pArtistNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pArtistNameLabel->SetText(contentInfoStruct.ArtistName); + + Label* pTimeLabel = new (std::nothrow) Label(); + pTimeLabel->Construct(rectPlayTime, L""); + pTimeLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pTimeLabel->SetText(CommonUtil::GetFormatDate(contentInfoStruct.Duration)); + + parent.AddControl(pThumbnailLabel); + parent.AddControl(pTitleLabel); + parent.AddControl(pArtistNameLabel); + parent.AddControl(pTimeLabel); + AppLogDebug("EXIT"); + return r; +} + +void +ComposerContentListForm::ToggleViewMode(bool editMode) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + + if (editMode) + { + int currentAlbumContentCount = 0; + currentAlbumContentCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + + if (currentAlbumContentCount > INIT_VALUE) + { + SetTitleText(__strHeaderName); + } + else + { + SetTitleText("No songs"); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_FOOTER_EDIT, false); + } + + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + + __checkEdit = false; + __pContentTableView->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height)); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + else + { + SetTitleText(ResourceManager::GetString("IDS_COM_BODY_EDIT")); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + + pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + + __pSelectAllCheckedButton->SetEnabled(true); + __pSelectAllCheckedButton->SetShowState(true); + + __checkEdit = true; + __pContentTableView->SetBounds(Rectangle(0, __pSelectAllCheckedButton->GetHeight(), GetClientAreaBounds().width, (GetClientAreaBounds().height - __pSelectAllCheckedButton->GetHeight()))); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(TIZEN_APPCONTROL_PROVIDER_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + const String* pContactId = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_RETURNTYPE))); + if (pContactId->Equals(APPCONTROL_VALUE_CONTACTID, true)) + { + const String* pResultString = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_VALUE))); + + AppLogDebug("%ls", pResultString->GetPointer()); + int contactId; + Integer::Parse(*pResultString, contactId); + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + } + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ComposerContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} +#endif diff --git a/src/MpComposerContentPickerPanel.cpp b/src/MpComposerContentPickerPanel.cpp new file mode 100644 index 0000000..f3f2916 --- /dev/null +++ b/src/MpComposerContentPickerPanel.cpp @@ -0,0 +1,343 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerContentPickerPanel.cpp + * @brief This is the implementation file for ComposerContentPickerPanel class. + */ + +#include "MpComposerContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ComposerContentPickerPanel::ComposerContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerContentPickerPanel::~ComposerContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ComposerContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +ComposerContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = ComposerListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ComposerContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ComposerContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentComposerIndex()); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentComposerIndex()); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ComposerContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + __pPresentationModel->UpdateComposerList(); + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ComposerContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + AppLogDebug("EXIT"); +} + +int +ComposerContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentComposerIndex()); +} + +Tizen::Ui::Controls::TableViewItem* +ComposerContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +ComposerContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ComposerContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +ComposerContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ComposerContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentComposerIndex())) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +ComposerContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} +void +ComposerContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpComposerListEditorPanel.cpp b/src/MpComposerListEditorPanel.cpp new file mode 100644 index 0000000..78407dc --- /dev/null +++ b/src/MpComposerListEditorPanel.cpp @@ -0,0 +1,423 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListEditorPanel.cpp + * @brief This is the implementation file for ComposerListEditorPanel class. + */ + +#include "MpComposerListEditorPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ComposerListEditorPanel::ComposerListEditorPanel(void) + : ThumbnailBase::ThumbnailBase() + , __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) + , __pThumbnail(null) + , __pPlayListPickerPopup(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerListEditorPanel::~ComposerListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ComposerListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Panel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +ComposerListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = ComposerListPresentationModel::GetInstance(); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ComposerListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ComposerListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllComposerCount(); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + + int totalCount = __pPresentationModel->GetAllComposerCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pDataList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + UpdateContentList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + int totalCount = __pPresentationModel->GetAllComposerCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +ComposerListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + int retCount = 0; + retCount = __pPresentationModel->GetAllComposerCount(); + + AppLogDebug("EXIT"); + return retCount; +} + +Tizen::Ui::Controls::TableViewItem* +ComposerListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetComposerInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateEditListTableViewItem(*pItem, *GetDefaultThumbnail(), pContentInfoStruct->ComposerName, __pPresentationModel->GetContentCount(itemIndex)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +ComposerListEditorPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +ComposerListEditorPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ComposerListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetAllComposerCount()) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateComposerList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ComposerListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpComposerListPanel.cpp b/src/MpComposerListPanel.cpp new file mode 100644 index 0000000..7c06fbd --- /dev/null +++ b/src/MpComposerListPanel.cpp @@ -0,0 +1,488 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListPanel.cpp + * @brief This is the implementation file for ComposerListPanel class. + */ + +#include "MpComposerListPanel.h" +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ComposerListPanel::ComposerListPanel(void) + : ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __pNowPlayContentPanel(null) + , __pPlayListPickerPopup(null) + , __pContextItem(null) + , __pContentTableView(null) + , __pNoContentImageLabel(null) + , __pNoContentTextLabel(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerListPanel::~ComposerListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ComposerListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = BasePanel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +ComposerListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = ComposerListPresentationModel::GetInstance(); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateTableView(width, height); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + + __pNoContentImageLabel = new (std::nothrow) Label(); + __pNoContentImageLabel->Construct(Rectangle((pForm->GetWidth() - W_NO_CONTENT) / 2, Y_GAP_NO_CONTENT, W_NO_CONTENT, H_NO_CONTENT), L""); + __pNoContentImageLabel->SetBackgroundBitmap(*(ResourceManager::GetBitmapN(IDB_NO_CONTENTS))); + + __pNoContentTextLabel = new (std::nothrow) Label(); + __pNoContentTextLabel->Construct(Rectangle(0, + __pNoContentImageLabel->GetHeight() + __pNoContentImageLabel->GetY(), + pForm->GetWidth(), + H_TEXT_NO_CONTENT), + ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pNoContentTextLabel->SetTextConfig(FONT_SIZE_NO_CONTENT, LABEL_TEXT_STYLE_BOLD); + + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(width, ITEM_HEIGHT)); + CommonUtil::CreateTableViewContextItem(*__pContextItem, *this); + + AddControl(__pNoContentImageLabel); + AddControl(__pNoContentTextLabel); + AddControl(__pContentTableView); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +ComposerListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ComposerListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__pPresentationModel->GetAllComposerCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS"), MSGBOX_STYLE_NONE, 500); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_COMPOSER_LIST_EDITOR)); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, __pPresentationModel->GetContentPathListN(__itemIndex)); + //__pPlayListPickerPopup->SetCollectedContent(__pPresentationModel->GetContentPathListN(__itemIndex)); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (CommonUtil::GetAddtoPlaylistState() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + CommonUtil::SetAddtoPlaylistState(false); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + + Footer* pFooter = CommonUtil::CreateContentListFooter(*pForm); + pFooter->SetBackButton(); + pFooter->AddActionEventListener(*this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + + OnMusicContentUpdateCompleted(); + if (__pPresentationModel != null) + { + int totalComposerCount = __pPresentationModel->GetAllComposerCount(); + CommonUtil::SetButtonEnabled(*pForm, totalComposerCount, IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + +// CommonUtil::ShowNoContentImage(totalComposerCount, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +ComposerListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllComposerCount(); +} + +Tizen::Ui::Controls::TableViewItem* +ComposerListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetComposerInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); +// pItem->SetBackgroundColor(COLOR_ITEM); + +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateTableViewItem(*pItem, *GetDefaultThumbnail(), pContentInfoStruct->ComposerName, __pPresentationModel->GetContentCount(itemIndex)); + pItem->SetContextItem(__pContextItem); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +ComposerListPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +ComposerListPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ComposerListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_COMPOSER_CONTENT_LIST), GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +ComposerListPanel::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetComposerInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + String _composerName = pContentInfoStruct->ComposerName; + _composerName = CommonUtil::SpecialReplaceChange(_composerName); + _composerName = CommonUtil::MakeQuery(STRING_SORT_COMPOSER, _composerName); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + + pData->Add(*(new (std::nothrow) String(IDSCN_COMPOSER_LIST))); + pData->Add(*(new (std::nothrow) String(_composerName))); + pData->Add(*(new (std::nothrow) Integer(itemIndex))); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pData; +} + +void +ComposerListPanel::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + AppLogDebug("ENTER"); + int totalCount = __pPresentationModel->GetAllComposerCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + String* pName = __pPresentationModel->GetComposerName(iCount); + String firstCharacter; + + pName->SubString(0, 1, firstCharacter); + firstCharacter.ToUpper(); + + mchar language; + firstCharacter.GetCharAt(0, language); + + if (Character::GetUnicodeCategory(language) == UNICODE_HANGUL) + { + Tizen::Base::String HangulIndex[] = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ" , "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + + wchar_t songName; + pName->GetCharAt(0, songName); + + wchar_t UnicodeValue = (songName - 0xAC00); + wchar_t InitialConsonant = ((UnicodeValue - (UnicodeValue % 28)) / 28) / 21; + int tempIndex = static_cast(InitialConsonant); + + if (HangulIndex[tempIndex].CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + else if (index.CompareTo("0") == 0 && Character::IsDigit(language) == true) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + else if (firstCharacter.CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateComposerList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d",requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ComposerListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpComposerListPresentationModel.cpp b/src/MpComposerListPresentationModel.cpp new file mode 100644 index 0000000..ac2d50f --- /dev/null +++ b/src/MpComposerListPresentationModel.cpp @@ -0,0 +1,298 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerListPresentationModel.cpp + * @brief This is the implementation file for ComposerListPresentationModel class. + */ + +#include "MpComposerListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +ComposerListPresentationModel* ComposerListPresentationModel::pComposerListPresentationModelInstance = null; + +ComposerListPresentationModel* +ComposerListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pComposerListPresentationModelInstance == null) + { + pComposerListPresentationModelInstance = new (std::nothrow) ComposerListPresentationModel(); + TryReturn(pComposerListPresentationModelInstance != null, null, "ComposerListPresentationModel instance is not created."); + + result r = pComposerListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "ComposerListPresentationModel instance is not constrcuted."); + } + return pComposerListPresentationModelInstance; + +CATCH: + delete pComposerListPresentationModelInstance; + return null; +} + +ComposerListPresentationModel::ComposerListPresentationModel(void) + : __pComposerList(null) + , __pContentList(null) + , __currentComposerIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerListPresentationModel::~ComposerListPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ComposerListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + if (__pComposerList != null) + { + __pComposerList->RemoveAll(true); + delete __pComposerList; + } + + __pComposerList = CommonUtil::SearchContentList(STRING_SORT_COMPOSER); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +int +ComposerListPresentationModel::GetContentCount(int composerIndex) +{ + AppLogDebug("ENTER"); + int totalCount = INIT_VALUE; + if (__pComposerList == null || (composerIndex > __pComposerList->GetCount())) + { + return INIT_VALUE; + } + + if ((__pContentList != null) && (__currentComposerIndex == composerIndex)) + { + totalCount = __pContentList->GetCount(); + } + else + { + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pComposerList->GetAt(composerIndex))), STRING_SORT_COMPOSER, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + totalCount = pContentSearchResultList->GetCount(); + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + } + AppLogDebug("EXIT"); + return totalCount; +} + +int +ComposerListPresentationModel::GetAllComposerCount(void) +{ + AppLogDebug("ENTER"); + if (__pComposerList == null) + { + return INIT_VALUE; + } + + int retValue = __pComposerList->GetCount(); + AppLogDebug("EXIT"); + return retValue; +} + +ContentInformation* +ComposerListPresentationModel::GetComposerInfoN(int composerIndex) +{ + AppLogDebug("ENTER"); + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pComposerList->GetAt(composerIndex))), STRING_SORT_COMPOSER, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +Tizen::Base::String* +ComposerListPresentationModel::GetComposerName(int composerIndex) +{ + AppLogDebug("ENTER"); + if (__pComposerList == null) + { + return null; + } + AppLogDebug("EXIT"); + return static_cast(__pComposerList->GetAt(composerIndex)); +} + +void +ComposerListPresentationModel::InitializeContentList(int composerIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __currentComposerIndex = composerIndex; + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pComposerList->GetAt(composerIndex))), STRING_SORT_COMPOSER, STRING_SORT_TITLE); + AppLogDebug("EXIT"); +} + +ContentInformation* +ComposerListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = null; + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(contentIndex)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInfoStruct = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +Tizen::Base::Collection::ArrayList* +ComposerListPresentationModel::GetContentPathListN(int composerIndex) +{ + AppLogDebug("ENTER"); + if (__pComposerList == null) + { + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pComposerList->GetAt(composerIndex))), STRING_SORT_COMPOSER, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + int totalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentPath; +} + +void +ComposerListPresentationModel::RefreshContentList(int composerIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pComposerList->GetAt(composerIndex))), STRING_SORT_COMPOSER, STRING_SORT_TITLE); + if (__pContentList != null && __pContentList->GetCount() == INIT_VALUE) + { + delete __pContentList; + __pContentList = null; + } + __currentComposerIndex = composerIndex; + AppLogDebug("EXIT"); +} + +int +ComposerListPresentationModel::GetCurrentComposerIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentComposerIndex; +} + +void +ComposerListPresentationModel::AddContent(String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + pPlayList->AddItem(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +result +ComposerListPresentationModel::UpdateComposerList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pComposerList != null) + { + __pComposerList->RemoveAll(true); + delete __pComposerList; + } + + __pComposerList = CommonUtil::SearchContentList(STRING_SORT_COMPOSER); + TryCatch(__pComposerList != null, r = E_FAILURE, "__pComposerList is null"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} \ No newline at end of file diff --git a/src/MpComposerPickerPanel.cpp b/src/MpComposerPickerPanel.cpp new file mode 100644 index 0000000..7e873d4 --- /dev/null +++ b/src/MpComposerPickerPanel.cpp @@ -0,0 +1,111 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpComposerPickerPanel.cpp + * @brief This is the implementation file for ComposerPickerPanel class. + */ + +#include "MpComposerPickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ComposerPickerPanel::ComposerPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ComposerPickerPanel::~ComposerPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ComposerPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + __pPresentationModel->UpdateComposerList(); +// CommonUtil::ShowNoContentImage(__pPresentationModel->GetAllComposerCount(), *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + AppLogDebug("EXIT"); +} + +void +ComposerPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + } + + AppLogDebug("EXIT"); +} + +void +ComposerPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + __pPresentationModel->InitializeContentList(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_COMPOSER_CONTENT_PICKER)); + } + AppLogDebug("EXIT"); +} diff --git a/src/MpContentDetailForm.cpp b/src/MpContentDetailForm.cpp new file mode 100644 index 0000000..3602bf3 --- /dev/null +++ b/src/MpContentDetailForm.cpp @@ -0,0 +1,352 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentDetailForm.cpp + * @brief This is the implementation file for ContentDetailForm class. + */ + +#include "MpMusicPlayerPresentationModel.h" +#include "MpContentDetailForm.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpCommonUtil.h" +#include "MpTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Locales; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const float SCALE_MBYTE = (1024 * 1024); +static const float SCALE_KBYTE = (1024); +//static const int DECIMAL_ROUNDING = 10; + +ContentDetailForm::ContentDetailForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentDetailForm::~ContentDetailForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ContentDetailForm::Initialize(void) +{ + AppLogDebug("ENTER"); + Construct(IDL_CONTENTS_DETAIL_FORM); + AppLogDebug("EXIT"); + return true; +} + +result +ContentDetailForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + SetFormBackEventListener(this); + + __pPlayerPresentationModel = PlayerPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return r; +} + +result +ContentDetailForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentDetailForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + int currentContentIndex = __pPlayerPresentationModel->GetCurrentContentIndex(); + String* tempPath = __pPlayerPresentationModel->GetContentPath(currentContentIndex); + AppLogDebug("CATCH %ls", tempPath->GetPointer()); + AudioContentInfo* pAudioInfo = CommonUtil::GetAudioContentInfoN(*(tempPath)); + + if (pAudioInfo != null) + { + GetHeader()->SetTitleText(pAudioInfo->GetTitle()); + + Label* pArtistName = static_cast(GetControl(IDC_ARTIST_NAME_LABEL)); + pArtistName->SetTextConfig(37,LABEL_TEXT_STYLE_NORMAL); + pArtistName->SetText(pAudioInfo->GetArtist()); + + Label* pMediaInfo = static_cast(GetControl(IDC_MEDIA_INFO_LABEL)); + pMediaInfo->SetTextConfig(52,LABEL_TEXT_STYLE_NORMAL); + pMediaInfo->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_MEDIA_INFO")); + + Label* pNameLabel = static_cast(GetControl(IDC_NAME_LABEL)); + pNameLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_DETAILS_NAME")); + + Label* pFormatLabel = static_cast(GetControl(IDC_FORMAT_LABEL)); + pFormatLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_FORMAT")); + + Label* pSizeLabel = static_cast(GetControl(IDC_SIZE_LABEL)); + pSizeLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_SIZE")); + + Label* pForwardingLabel = static_cast(GetControl(IDC_FORWARDING_LABEL)); + pForwardingLabel->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_FORWARDING")); + + Label* pDateLabel = static_cast(GetControl(IDC_DATE_LABEL)); + pDateLabel->SetText(ResourceManager::GetString(L"IDS_IV_BODY_DATE_CREATED")); + + Label* plocationLable= static_cast(GetControl(IDC_LOCATION_LABEL)); + plocationLable->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_MUSIC_LOCATION")); + + Label* pTitletNameInMediaInfo = static_cast(GetControl(IDC_NAME_DATA_LABEL)); + pTitletNameInMediaInfo->SetText(pAudioInfo->GetTitle()); + + Label* pFormatData = static_cast(GetControl(IDC_FORMAT_DATA_LABEL)); + pFormatData->SetText(pAudioInfo->GetMediaFormat()); + + unsigned long contentSize = 0; + String stringContentSize; + Label* pSize = static_cast(GetControl(IDC_SIZE_DATA_LABEL)); + contentSize = pAudioInfo->GetContentSize(); + + if (contentSize >= SCALE_MBYTE) + { + float contSize = contentSize; + float size = (contSize / SCALE_MBYTE); + stringContentSize.Format(256, L"%0.2f MB",size); + } + else if (contentSize >= SCALE_KBYTE) + { + float killoByte = (contentSize / SCALE_KBYTE); + //float bytes = (((contentSize % SCALE_KBYTE) * DECIMAL_ROUNDING) / SCALE_KBYTE); + stringContentSize.Format(256, L"%0.2f KB", killoByte); + } + else + { + stringContentSize.Format(256, L"%dB", contentSize); + } + pSize->SetText(stringContentSize); + + bool isDrmProtected = false; + isDrmProtected = pAudioInfo->IsDrmProtected(); + Label* pForwarding = static_cast(GetControl(IDC_FORWARDING_DATA_LABEL)); + if (isDrmProtected == true) + { + pForwarding->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_IMPOSSIBLE")); + } + else + { + pForwarding->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_POSSIBLE")); + } + + String stringDate; + LocaleManager localeManager; + int hour = 0; + bool is24HourFormat = false; + String amPmText; + localeManager.Construct(); + TimeZone timeZone = localeManager.GetSystemTimeZone(); + DateTime creationDateTime = timeZone.UtcTimeToStandardTime(pAudioInfo->GetDateTime()); + SettingInfo::GetValue(L"http://tizen.org/setting/locale.time.format.24hour", is24HourFormat); + hour = creationDateTime.GetHour(); + + if (!is24HourFormat) + { + if(hour > 12) + { + hour -= 12; + amPmText = L"PM"; + } + else if (hour == 12) + { + amPmText = L"PM"; + } + else + { + amPmText = L"AM"; + } + } + + if (is24HourFormat) + { + stringDate.Format(20, L"%04d.%02d.%02d %02d:%02d", + creationDateTime.GetYear(), + creationDateTime.GetMonth(), + creationDateTime.GetDay(), + hour, + creationDateTime.GetMinute()); + } + else + { + stringDate.Format(20, L"%04d.%02d.%02d %02d:%02d %ls", + creationDateTime.GetYear(), + creationDateTime.GetMonth(), + creationDateTime.GetDay(), + hour, + creationDateTime.GetMinute(), amPmText.GetPointer()); + } + + Label* pDate = static_cast(GetControl(IDC_DATE_DATA_LABEL)); + pDate->SetText(stringDate); + + String stringContentPath; + int indexOf = 0; + pAudioInfo->GetContentPath().LastIndexOf(L"/", (pAudioInfo->GetContentPath().GetLength() - 1), indexOf); + pAudioInfo->GetContentPath().SubString(0, indexOf, stringContentPath); + + Label* pLocation = static_cast(GetControl(IDC_LOCATION_DATA_LABEL)); + pLocation->SetText(stringContentPath); + Invalidate(true); + delete pAudioInfo; + } + else + { + Tizen::Content::AudioMetadata* pAudioMeta = Tizen::Content::ContentManagerUtil::GetAudioMetaN(*tempPath); + if (pAudioMeta == null) + { + AppLogDebug("EXIT"); + return; + } + + if (pAudioMeta->GetTitle() != null) + { + GetHeader()->SetTitleText(pAudioMeta->GetTitle()); + } + else + { + GetHeader()->SetTitleText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + Label* pArtistName = static_cast(GetControl(IDC_ARTIST_NAME_LABEL)); + pArtistName->SetTextConfig(37, LABEL_TEXT_STYLE_NORMAL); + if (pAudioMeta->GetArtist() != null) + { + pArtistName->SetText(pAudioMeta->GetArtist()); + } + else + { + pArtistName->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + Label* pMediaInfo = static_cast(GetControl(IDC_MEDIA_INFO_LABEL)); + pMediaInfo->SetTextConfig(52,LABEL_TEXT_STYLE_NORMAL); + pMediaInfo->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_MEDIA_INFO")); + + Label* pNameLabel = static_cast(GetControl(IDC_NAME_LABEL)); + pNameLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_DETAILS_NAME")); + + Label* pFormatLabel = static_cast(GetControl(IDC_FORMAT_LABEL)); + pFormatLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_FORMAT")); + + Label* pSizeLabel = static_cast(GetControl(IDC_SIZE_LABEL)); + pSizeLabel->SetText(ResourceManager::GetString(L"IDS_COM_BODY_SIZE")); + + Label* pForwardingLabel = static_cast(GetControl(IDC_FORWARDING_LABEL)); + pForwardingLabel->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_FORWARDING")); + + Label* pDateLabel = static_cast(GetControl(IDC_DATE_LABEL)); + pDateLabel->SetText(ResourceManager::GetString(L"IDS_IV_BODY_DATE_CREATED")); + + Label* plocationLable= static_cast(GetControl(IDC_LOCATION_LABEL)); + plocationLable->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_MUSIC_LOCATION")); + + Label* pTitletNameInMediaInfo = static_cast(GetControl(IDC_NAME_DATA_LABEL)); + if (pAudioMeta->GetTitle() != null) + { + pTitletNameInMediaInfo->SetText(pAudioMeta->GetTitle()); + } + else + { + pTitletNameInMediaInfo->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + Label* pFormatData = static_cast(GetControl(IDC_FORMAT_DATA_LABEL)); + pFormatData->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + + Label* pSize = static_cast(GetControl(IDC_SIZE_DATA_LABEL)); + pSize->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + + Label* pForwarding = static_cast(GetControl(IDC_FORWARDING_DATA_LABEL)); + pForwarding->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + + Label* pDate = static_cast(GetControl(IDC_DATE_DATA_LABEL)); + if (pAudioMeta->GetRecordingDate() != null) + { + pDate->SetText(pAudioMeta->GetRecordingDate()); + } + else + { + pDate->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + String stringContentPath; + int indexOf = 0; + tempPath->LastIndexOf(L"/", (tempPath->GetLength() - 1), indexOf); + tempPath->SubString(0, indexOf, stringContentPath); + Label* pLocation = static_cast(GetControl(IDC_LOCATION_DATA_LABEL)); + pLocation->SetText(stringContentPath); + Invalidate(true); + delete pAudioMeta; + pAudioMeta = null; + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ContentDetailForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentDetailForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentDetailForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} diff --git a/src/MpContentEditPanel.cpp b/src/MpContentEditPanel.cpp new file mode 100644 index 0000000..3ceec62 --- /dev/null +++ b/src/MpContentEditPanel.cpp @@ -0,0 +1,467 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentEditPanel.cpp + * @brief This is the implementation file for ContentEditPanel class. + */ + +#include "FUi.h" +#include "MpContentEditPanel.h" +#include "MpContentForm.h" +#include "MpCommonUtil.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_SHOW_CHECKED_COUNT_BALLOON_TOOL_TIP = 48; + +ContentEditPanel::ContentEditPanel(void) + : ContentPanel::ContentPanel() + , __checkedItemCount(0) + , __pPlayListPicker(null) + , __pSharePicker(null) + , __pBallonTooltip(null) + , __pDeletePopup(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentEditPanel::~ContentEditPanel(void) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(false); + delete __pDeletePopup; + __pDeletePopup = null; + } + AppLogDebug("EXIT"); +} + +bool +ContentEditPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Panel::Construct(IDL_CONTENTS_LIBARY_EDITOR_PANEL); + if (IsFailed(r)) + { + AppLogDebug("Construct(IDL_CONTENT_EDIT_PANEL) failed(%s)", GetErrorMessage(r)); + return false; + } + AppLogDebug("EXIT"); + return Construct(); +} + +result +ContentEditPanel::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentTableView = static_cast(GetControl(IDC_CONTENTS_EDIT_TABLEVIEW)); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + __pBallonTooltip = static_cast(GetControl(IDC_ITEM_SELECTED_COUNT_LABEL)); + __pNoContentLabel = static_cast(GetControl(IDC_NO_CONTENTS_PANEL)); + __pNoContentTextLabel = static_cast(__pNoContentLabel->GetControl(L"IDC_LABEL2")); + SetControlAlwaysOnTop(*__pBallonTooltip, true); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentEditPanel::OnTerminating(void) +{ + RemovePlayListPicker(); + RemoveSharePicker(); + return ContentPanel::OnTerminating(); +} + +result +ContentEditPanel::LanucherPicker(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + IList* pArgumentList = GetPickerArgumentListN(pickerType, argumentType); + if (pArgumentList == null) + { + AppLogDebug("GetPickerArgumentListN is null"); + return E_FAILURE; + } + + result r = E_FAILURE; + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + r = ShowPlayListPicker(pArgumentList); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + r = ShowSharePicker(pArgumentList); + } + + if (IsFailed(r)) + { + AppLogDebug("ShowPlayListPicker failed(%s)", GetErrorMessage(r)); + delete pArgumentList; + } + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::IList* +ContentEditPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return null; +} + +bool +ContentEditPanel::OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + return true; + } + AppLogDebug("EXIT"); + return false; + +} + +bool +ContentEditPanel::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null && __pDeletePopup->GetShowState() && (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC)) + { + __pDeletePopup->SetShowState(false); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +result +ContentEditPanel::ShowPlayListPicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + + __pPlayListPicker = new (std::nothrow) PlayListPickerPopup(); + if (IsFailed(__pPlayListPicker->Initialize(this, pIList))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemovePlayListPicker(); + return E_FAILURE; + } + + __pPlayListPicker->SetShowState(true); + __pPlayListPicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentEditPanel::RemoveSharePicker(const bool deleteInstance) +{ + AppLogDebug("ENTER"); + if (__pSharePicker != null) + { + CommonUtil::SetShowStateControl(*__pSharePicker, false); + if (deleteInstance) + { + delete __pSharePicker; + __pSharePicker = null; + } + } + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::RemovePlayListPicker(const bool deleteInstance) +{ + AppLogDebug("ENTER"); + if (__pPlayListPicker != null ) + { + CommonUtil::SetShowStateControl(*__pPlayListPicker, false); + if (deleteInstance) + { + delete __pPlayListPicker; + __pPlayListPicker = null; + } + } + AppLogDebug("EXIT"); +} + +result +ContentEditPanel::ShowSharePicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemoveSharePicker(); + + __pSharePicker = new (std::nothrow) SharePopup(); + if (IsFailed(__pSharePicker->Initialize(this))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemoveSharePicker(); + return E_FAILURE; + } + + __pSharePicker->SetArguments(pIList); + __pSharePicker->SetShowState(true); + __pSharePicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentEditPanel::SetShowStateBalloonTooltip(bool isShow) +{ + AppLogDebug("ENTER"); + int balloonTooltipHeight = INIT_VALUE; + if (isShow == true && __checkedItemCount != INIT_VALUE) + { + balloonTooltipHeight = H_SHOW_CHECKED_COUNT_BALLOON_TOOL_TIP; + } + else + { + isShow = false; + } + + AppLogDebug("EXIT"); + return CommonUtil::SetShowStateVariableHeightSizeControl(*__pBallonTooltip, balloonTooltipHeight, isShow); +} + +void +ContentEditPanel::SetCheckedCountBallonTooltip(unsigned int checkedItemCount) +{ + AppLogDebug("ENTER"); + if (checkedItemCount == INIT_VALUE) + { + SetShowStateBalloonTooltip(false); + return ; + } + + __pBallonTooltip->SetText(CommonUtil::GetStringItemSelected(checkedItemCount)); + SetShowStateBalloonTooltip(true); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::SetNoContentSongs(bool isNoContents) +{ + AppLogDebug("ENTER"); + if (isNoContents == true) + { + SetShowStateBalloonTooltip(false); + SetShowStateContentTableview(false); + + SetShowStateNoContent(true); + AppLogDebug("EXIT"); + return; + } + + SetShowStateNoContent(false); + SetShowStateContentTableview(true); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::SetContentEditHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetButtonItemUnCheckedIcon(*GetHeader()); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + if (isChecked == true) + { + __checkedItemCount = __pContentTableView->GetItemCount(); + } + else + { + __checkedItemCount = INIT_VALUE; + } + CommonUtil::SetItemCheckedAll(isChecked, *__pContentTableView); + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + SetCheckedCountBallonTooltip(__checkedItemCount); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + UpdateContentEditScreenState(); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + __checkedItemCount = INIT_VALUE; + + //just hide the popups and don't delete those + RemovePlayListPicker(false); + RemoveSharePicker(false); + + UpdateContentList(); + UpdateContentEditScreenState(); + HideCommonDeletePopup(false); + + if (__pContentTableView != null && IsEmptyContentList() == false) + { + SetItemCheckedAll(false); + __pContentTableView->UpdateTableView(); + } + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + + if ((requestId != ID_DESTORY_PLAY_LIST_PICKER_POPUP) && (requestId != ID_DESTORY_SHARE_POPUP)) + { + AppLogDebug("EXIT"); + return; + } + + if (pArgs != null) + { + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + Boolean* pIsInitialize = static_cast(pArgs->GetAt(0)); + + if (pIsInitialize->Equals(true)) + { + SetItemCheckedAll(false); + } + } + + pArgs->RemoveAll(true); + delete pArgs; + } + + RemovePlayListPicker(); + RemoveSharePicker(); + + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::ShowCommonDeletePopup(Tizen::Ui::IActionEventListener* pActionListener) +{ + AppLogDebug("ENTER"); + TryReturnVoid(pActionListener != null, "Action Listener is invalid"); + if (__pDeletePopup == null) + { + __pDeletePopup = CommonUtil::CreateContentDeletePopup(*pActionListener, IDA_DELETE_POPUP_DELETE, IDA_DELETE_POPUP_CANCEL); + __pDeletePopup->SetPropagatedKeyEventListener(this); + } + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::HideCommonDeletePopup(const bool isToDelete) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(false); + + if (isToDelete) + { + delete __pDeletePopup; + __pDeletePopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +ContentEditPanel::UpdateContentEditScreenState(void) +{ + AppLogDebug("ENTER"); + if (IsEmptyContentList() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + SetShowStateContentTableview(false); + SetShowStateNoContent(true); + SetShowStateBalloonTooltip(false); + + if(__pNoContentTextLabel != null) + { + __pNoContentTextLabel->SetText(GetNoContentText()); + } + + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, false); + GetHeader()->Invalidate(true); + AppAssert(pSceneManager); + ContentEditPanel* pEditPanel = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + if (pEditPanel != null) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + AppLogDebug("EXIT"); + return; + } + else + { + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, true); + GetHeader()->Invalidate(true); + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + SetShowStateNoContent(false); + SetShowStateContentTableview(true); + AppLogDebug("EXIT"); +} + +String +ContentEditPanel::GetNoContentText(void) +{ + return ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"); +} diff --git a/src/MpContentForm.cpp b/src/MpContentForm.cpp new file mode 100644 index 0000000..bfef0b4 --- /dev/null +++ b/src/MpContentForm.cpp @@ -0,0 +1,190 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentForm.cpp + * @brief This is the implementation file for ContentForm class. + */ + +#include "MpContentForm.h" +#include "MpContentPanel.h" +#include "MpSettingPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +ContentForm::ContentForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentForm::~ContentForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ContentForm::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Form::Construct(IDL_CONTENT_FORM); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +ContentForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + CommonUtil::SetTabHeaderStyle(*pHeader); + pHeader->SetTabEditModeEnabled(false); + pHeader->AddActionEventListener(*this); + AddOrientationEventListener(*this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + ArrayList* pList = new (std::nothrow) ArrayList(); + pList->Construct(); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + bool addToPlaylistState = CommonUtil::GetAddtoPlaylistState(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SONG: + { +// pHeader->AddActionEventListener(*this); + String sceneId = ((addToPlaylistState == true) ? IDSCN_ALL_CONTENT_PICKER : IDSCN_ALL_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_HEADER_BUTTON_PLAYLIST: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY), pList); + } + break; + + case IDA_HEADER_BUTTON_ALBUM: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_ALBUM_PICKER : IDSCN_ALBUM_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + break; + } + + case IDA_HEADER_BUTTON_ARTIST: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_ARTIST_PICKER : IDSCN_ARTIST_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_HEADER_BUTTON_GENRES: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_GENRE_PICKER : IDSCN_GENRE_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_HEADER_BUTTON_COMPOSERS: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_COMPOSER_PICKER : IDSCN_COMPOSER_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_HEADER_BUTTON_YEARS: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_YEAR_PICKER : IDSCN_YEAR_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_HEADER_BUTTON_FOLDER: + { + String sceneId = ((addToPlaylistState == true) ? IDSCN_FOLDER_PICKER : IDSCN_FOLDER_LIST); + pSceneManager->GoForward(ForwardSceneTransition(sceneId, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +ContentForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); +// Header* pHeader = GetHeader(); +// CommonUtil::SetTabHeaderStyle(*pHeader); +// pHeader->Draw(true); +// pHeader->Show(); + + if(requestId == ID_SHOW_SUCCESS_MESSAGE) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + AppLogDebug("EXIT"); +} + +void +ContentForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Scene* pCurrentScenelScene = pSceneManager->GetCurrentScene(); + ContentPanel* pContentPanel = dynamic_cast(pCurrentScenelScene->GetPanel()); + if (pContentPanel != null) + { + pContentPanel->OnOrientationPanelChanged(orientationStatus); + } + AppLogDebug("EXIT"); +} diff --git a/src/MpContentListForm.cpp b/src/MpContentListForm.cpp new file mode 100644 index 0000000..662c5f1 --- /dev/null +++ b/src/MpContentListForm.cpp @@ -0,0 +1,937 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentListForm.cpp + * @brief This is the implementation file for ContentListForm class. + */ + +#include "MpContentListForm.h" +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_SHOW_CHECKED_COUNT_BALLOON_TOOL_TIP = 48; + +ContentListForm::ContentListForm(void) + : __headerTitle(L"") + , __prevSceneId(L"") + , __footerButtonStyle(STYLE_MAX) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) + , __pMsgShowTimer(null) + , __pContentList(null) + , __pOptionMenu(null) + , __pContextMenu(null) + , __pCommonUtilPopupHandler(null) + , __pNoContent(null) + , __pExtraInformaionArea(null) + , __pBallonTooltip(null) + , __pPlayListPicker(null) + , __pSharePicker(null) + , __screenState(SCREEN_STATE_NORMAL) + , __heightExtraInformaionArea(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentListForm::~ContentListForm(void) +{ + AppLogDebug("ENTER"); + if (__pMsgShowTimer != null) + { + __pMsgShowTimer->Cancel(); + delete __pMsgShowTimer; + __pMsgShowTimer = null; + } + AppLogDebug("EXIT"); +} + +result +ContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + RemoveSharePicker(); + RemoveCommonPopup(); + RemoveOptionMenu(); + + __pContentList = null; + __pNoContent = null; + __pExtraInformaionArea = null; + __pBallonTooltip = null; + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +//result +//ContentListForm::Initialize(void) +//{ +// AppLogDebug("ENTER"); +// if (IsFailed(Form::Construct(IDL_CONTENT_LIST_FORM))) +// { +// AppLogDebug("Construct(IDL_CONTENT_LIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); +// return false; +// } +// +// AppLogDebug("EXIT"); +// return Construct(); +//} + +result +ContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pMsgShowTimer = new (std::nothrow) Timer(); + __pMsgShowTimer->Construct(*this); + __pNoContent = static_cast(GetControl(IDC_NO_CONTENTS_PANEL)); + __pNoContentText = static_cast(__pNoContent->GetControl(L"IDC_LABEL2")); + __pBallonTooltip = static_cast(GetControl(IDC_LABEL_BALLOON_TOOLTIP)); + + __pExtraInformaionArea = static_cast(GetControl(IDC_LABEL_CONTENT_ADDITIONAL_INFO)); + if (__pExtraInformaionArea != null) + { + __pExtraInformaionArea->SetSize(INIT_VALUE, INIT_VALUE); + } + + AddOrientationEventListener(*this); + GetHeader()->AddActionEventListener(*this); + if (GetFooter() != null) + { + GetFooter()->AddActionEventListener(*this); + } + + SetFormBackEventListener(this); + SetFormMenuEventListener(this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentListForm::SetCommonPopup(Tizen::Ui::Controls::Popup* commonUtilPopup, Tizen::Ui::IPropagatedKeyEventListener* pKeyListener) +{ + AppLogDebug("ENTER"); + __pCommonUtilPopupHandler = commonUtilPopup; + if (pKeyListener != null) + { + __pCommonUtilPopupHandler->SetPropagatedKeyEventListener(pKeyListener); + } + SetShowStateCommonPopup(true); + __pCommonUtilPopupHandler->Show(); + AppLogDebug("EXIT"); +} + +void +ContentListForm::SetContentList(Tizen::Ui::Container* pTableview) +{ + AppLogDebug("ENTER"); + __pContentList = pTableview; + AppLogDebug("EXIT"); +} + +result +ContentListForm::ShowSharePicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemoveSharePicker(); + + __pSharePicker = new (std::nothrow) SharePopup(); + if (IsFailed(__pSharePicker->Initialize(this))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemoveSharePicker(); + return E_FAILURE; + } + + __pSharePicker->SetArguments(pIList); + __pSharePicker->SetShowState(true); + __pSharePicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentListForm::LanucherPicker(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + IList* pArgumentList = GetPickerArgumentListN(pickerType, argumentType); + if (pArgumentList == null) + { + AppLogDebug("GetPickerArgumentListN is null"); + return E_FAILURE; + } + + result r = E_FAILURE; + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + r = ShowPlayListPicker(pArgumentList); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + r = ShowSharePicker(pArgumentList); + } + + if (IsFailed(r)) + { + AppLogDebug("ShowPlayListPicker failed(%s)", GetErrorMessage(r)); + delete pArgumentList; + } + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::IList* +ContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return null; +} + +result +ContentListForm::ShowPlayListPicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + + __pPlayListPicker = new (std::nothrow) PlayListPickerPopup(); + if (IsFailed(__pPlayListPicker->Initialize(this, pIList))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemovePlayListPicker(); + return E_FAILURE; + } + + __pPlayListPicker->SetShowState(true); + __pPlayListPicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentListForm::SetShowStateCommonPopup(bool isShow) +{ + AppLogDebug("ENTER"); + if (__pCommonUtilPopupHandler == null) + { + AppLogDebug("__pCommonUtilPopupHandler is null"); + return E_FAILURE; + } + + AppLogDebug("EXIT"); + return CommonUtil::SetShowStateControl(*__pCommonUtilPopupHandler, isShow); +} + +void +ContentListForm::RemoveCommonPopup(void) +{ + AppLogDebug("ENTER"); + if (__pCommonUtilPopupHandler != null) + { + CommonUtil::SetShowStateControl(*__pCommonUtilPopupHandler, false); + __pCommonUtilPopupHandler->SetPropagatedKeyEventListener(null); + delete __pCommonUtilPopupHandler; + __pCommonUtilPopupHandler = null; + } + AppLogDebug("EXIT"); +} + +result +ContentListForm::TryRemoveCommonPopup(int actionId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (CommonUtil::IsVaildCommonPopupActionId(actionId) == true) + { + SetShowStateCommonPopup(false); + RemoveCommonPopup(); + r = E_SUCCESS; + } + AppLogDebug("EXIT"); + return r; +} + +void +ContentListForm::RemoveSharePicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pSharePicker != null) + { + CommonUtil::SetShowStateControl(*__pSharePicker, false); + if(deletePopup) + { + delete __pSharePicker; + __pSharePicker = null; + } + } + AppLogDebug("EXIT"); +} + +void +ContentListForm::RemovePlayListPicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pPlayListPicker != null ) + { + CommonUtil::SetShowStateControl(*__pPlayListPicker, false); + if (deletePopup) + { + delete __pPlayListPicker; + __pPlayListPicker = null; + } + } + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + UpdateScreenState(); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ContentListForm::TryRemoveContextMenu(int actionId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (CommonUtil::IsVaildContextMenuItemActionId(actionId) == true) + { + RemoveContextMenu(); + r = E_SUCCESS; + } + AppLogDebug("EXIT"); + return r; +} + +void +ContentListForm::OnScrollPositionChanged (Tizen::Ui::Control& source, int scrollPos) +{ + AppLogDebug("ENTER"); +// __scrolledDistance = scrollPos; + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnScrollEndReached (Tizen::Ui::Control& source, Tizen::Ui::Controls::ScrollEndEvent type) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnScrollStopped (Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + AppLogDebug("EXIT"); + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoBackward(BackwardSceneTransition(), null); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("OK OnFormMenuRequested got called"); +} + +void +ContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if ((requestId != ID_DESTORY_PLAY_LIST_PICKER_POPUP) && (requestId != ID_DESTORY_SHARE_POPUP)) + { + AppLogDebug("EXIT"); + return; + } + + if (GetScreenState() != SCREEN_STATE_NORMAL && pArgs != null) + { + Integer* pLaunchRes = null; + + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + Boolean* pIsInitialize = static_cast(pArgs->GetAt(0)); + + if (pIsInitialize->Equals(true)) + { + SetItemCheckedAll(false); + } + } + + RemovePlayListPicker(); + RemoveSharePicker(); + pLaunchRes = static_cast(pArgs->GetAt(1)); + + if (pLaunchRes != null && pLaunchRes->ToInt() == E_MAX_EXCEEDED) + { + MessageBox messageBox; + messageBox.Construct(L"",ResourceManager::GetString(L"IDS_RCS_BODY_MAXIMUM_NUMBER_OF_FILES_EXCEEDED"), + MSGBOX_STYLE_NONE, + 1000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + UpdateScreenState(); + AppLogDebug("EXIT"); +} + +void +ContentListForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + SetItemCheckedAll(false); + + RemovePlayListPicker(false); //hide the popup + RemoveSharePicker(false); //hide the popup + RemoveOptionMenu(); + RemoveContextMenu(); + RemoveCommonPopup(); + + UpdateContentList(); + UpdateScreenState(); + + if (IsEmptyContentList() == false) + { + UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +result +ContentListForm::SetShowStateNoContent(bool isShow) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + CommonUtil::SetShowStateControl(*__pNoContent, isShow); + return E_SUCCESS; +} + +result +ContentListForm::SetShowStateBalloonTooltip(bool isShow) +{ + AppLogDebug("ENTER"); + int balloonTooltipHeight = INIT_VALUE; + if (isShow == true && GetCheckedItemCount() != INIT_VALUE) + { + balloonTooltipHeight = H_SHOW_CHECKED_COUNT_BALLOON_TOOL_TIP; + } + else + { + isShow = false; + } + + AppLogDebug("EXIT"); + return CommonUtil::SetShowStateVariableHeightSizeControl(*__pBallonTooltip, balloonTooltipHeight, isShow); +} + +void +ContentListForm::SetCheckedCountBallonTooltip(unsigned int checkedItemCount) +{ + AppLogDebug("ENTER"); + if (checkedItemCount == INIT_VALUE) + { + SetShowStateBalloonTooltip(false); + return; + } + + __pBallonTooltip->SetText(CommonUtil::GetStringItemSelected(checkedItemCount)); + if (__pBallonTooltip->GetShowState() == false) + { + SetShowStateBalloonTooltip(true); + } + else + { + __pBallonTooltip->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +result +ContentListForm::SetShowStatExtraInformaionArea(bool isShow) +{ + AppLogDebug("ENTER"); + if (__pExtraInformaionArea == null) + { + AppLogDebug("__pExtraInformaionArea is null"); + return E_FAILURE; + } + + int renewHeight = INIT_VALUE; + if (isShow == true) + { + renewHeight = __heightExtraInformaionArea; + } + + AppLogDebug("EXIT"); + return CommonUtil::SetShowStateVariableHeightSizeControl(*__pExtraInformaionArea, renewHeight, isShow); +} + +result +ContentListForm::SetShowStateContentList(bool isShow) +{ + AppLogDebug("ENTER"); + if (__pContentList == null) + { + AppLogDebug("__pContentList is null"); + return E_FAILURE; + } + + AppLogDebug("EXIT"); + return CommonUtil::SetShowStateControl(*__pContentList, isShow); +} + +result +ContentListForm::SetExtraInformaionArea(Tizen::Ui::Control& control) +{ + AppLogDebug("ENTER"); + RemoveExtraInformaionArea(); + if (IsExistExtraInformaionArea() == false) + { + Dimension dimension = control.GetSize(); + __heightExtraInformaionArea = dimension.height; + __pExtraInformaionArea->AddControl(control); + CommonUtil::SetLayoutFitToContainer(*__pExtraInformaionArea, control); + __pExtraInformaionArea->SetSize(dimension); + __pExtraInformaionArea->Invalidate(true); + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +result +ContentListForm::ShowDelayedMessageBox(const String& messageBody, const String& messageTitle) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + TryReturn((!messageBody.IsEmpty() && __pMsgShowTimer != null), E_INVALID_ARG, "Invalid arguments passed"); + __messageBody = messageBody; + __messageTitle = messageTitle; + __pMsgShowTimer->Cancel(); + r = __pMsgShowTimer->Start(MESSAGE_BOX_DELAY); + AppLogDebug("EXIT %s",GetErrorMessage(r)); + return r; +} + +Tizen::Ui::Control* +ContentListForm::GetExtraInformaionAreaControl(void) +{ + AppLogDebug("ENTER"); + if (IsExistExtraInformaionArea() == false) + { + AppLogDebug("AdditionalInforamtion is not Registered"); + return null; + } + + AppLogDebug("EXIT"); + return __pExtraInformaionArea->GetControl(INIT_VALUE); +} + +bool +ContentListForm::IsExistExtraInformaionArea(void) +{ + AppLogDebug("ENTER"); + if (__pExtraInformaionArea!= null && __pExtraInformaionArea->GetControlCount() != INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +void +ContentListForm::RemoveExtraInformaionArea(void) +{ + AppLogDebug("ENTER"); + if (__pExtraInformaionArea != null) + { + __heightExtraInformaionArea = INIT_VALUE; + __pExtraInformaionArea->RemoveAllControls(); + } + AppLogDebug("EXIT"); +} + +void +ContentListForm::UpdateScreenState(void) +{ + AppLogDebug("ENTER"); + if (IsEmptyContentList() == true) + { + SetShowStateContentList(false); + SetShowStateBalloonTooltip(false); + SetShowStatExtraInformaionArea(false); + SetShowStateNoContent(true); + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER); + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, false); + GetHeader()->Invalidate(true); + + AppLogDebug("EXIT"); + return; + } + else + { + GetHeader()->SetButtonEnabled(BUTTON_POSITION_RIGHT, true); + GetHeader()->Invalidate(true); + } + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetShowStateBalloonTooltip(true); + SetShowStatExtraInformaionArea(false); + Footer* pFooter = GetFooter(); + + if (pFooter == null) + { + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + pFooter = GetFooter(); + + if (__screenState == SCREEN_STATE_EDITOR) + { + CommonUtil::SetBackButtonStyleFooter(*pFooter, STYLE_ADDTO_DELETE_ADD); + } + else + { + CommonUtil::SetBackButtonStyleFooter(*pFooter, STYLE_SHARE_ADD); + } + + CommonUtil::SetFooterItemEnabled(*pFooter,false); + pFooter->AddActionEventListener(*this); + } + } + else + { + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER); + SetShowStateBalloonTooltip(false); + SetShowStatExtraInformaionArea(true); + } + + SetShowStateNoContent(false); + SetShowStateContentList(true); + AppLogDebug("EXIT"); +} + +result +ContentListForm::ToggleScreenState(ScreenState screenState) +{ + AppLogDebug("ENTER"); + if (IsFailed(SetScreenState(screenState))) + { + AppLogDebug("SetScreenState() failed(%s)", GetErrorMessage(E_FAILURE)); + return E_FAILURE; + } + + if (screenState == SCREEN_STATE_NORMAL) + { + SetHeader(); + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER); + SetItemCheckedAll(false); + } + else + { + if (screenState == SCREEN_STATE_EDITOR) + { + SetFooterStyle(STYLE_ADDTO_DELETE_ADD); + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + + CommonUtil::SetEditHeaderStyle(*GetHeader(), ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + if (GetFooter() != null) + { + CommonUtil::SetBackButtonStyleFooter(*GetFooter(), STYLE_ADDTO_DELETE_ADD); + GetFooter()->AddActionEventListener(*this); + } + } + else if (screenState == SCREEN_STATE_SHARE_VIA) + { + SetFooterStyle(STYLE_SHARE_ADD); + SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE | FORM_STYLE_HEADER | FORM_STYLE_FOOTER); + CommonUtil::SetEditHeaderStyle(*GetHeader(), ResourceManager::GetString(L"IDS_IV_BODY_SHARE_VIA")); + if (GetFooter() != null) + { + CommonUtil::SetBackButtonStyleFooter(*GetFooter(), STYLE_SHARE_ADD); + GetFooter()->AddActionEventListener(*this); + } + } + + GetHeader()->Invalidate(true); + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + + UpdateScreenState(); + if (IsEmptyContentList() == false) + { + UpdateTableView(); + } + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentListForm::CreateOptionMenuN(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + RemoveOptionMenu(); + __pOptionMenu = CommonUtil::CreateOptionMenuN(source, *this); + if (__pOptionMenu != null) + { + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +result +ContentListForm::CreateContextMenuN(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + RemoveContextMenu(); + __pContextMenu = CommonUtil::CreateContextMenuN(source, *this); + if (__pContextMenu != null) + { + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +result +ContentListForm::SetOptionMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + CommonUtil::AddOptionMenuItem(*__pOptionMenu, contextMenuItemStyle); + CommonUtil::ShowOptionMenu(*__pOptionMenu, true); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentListForm::SetContextMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition) +{ + AppLogDebug("ENTER"); + if (__pContextMenu == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + CommonUtil::AddContextMenuItem(*__pContextMenu, contextMenuItemStyle); + CommonUtil::ShowContextMenu(*__pContextMenu, true); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentListForm::RemoveOptionMenu(void) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu != null) + { + CommonUtil::SetShowStateControl(*__pOptionMenu, false); + delete __pOptionMenu; + __pOptionMenu = null; + } + AppLogDebug("EXIT"); +} + +void +ContentListForm::RemoveContextMenu(void) +{ + AppLogDebug("ENTER"); + if (__pContextMenu != null) + { + CommonUtil::SetShowStateControl(*__pContextMenu, false); + delete __pContextMenu; + __pContextMenu = null; + } + AppLogDebug("EXIT"); +} + + +ScreenState +ContentListForm::GetScreenState(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __screenState; +} + +result +ContentListForm::SetScreenState(ScreenState screenState) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (__screenState != screenState && screenState != SCREEN_STATE_MAX) + { + __screenState = screenState; + r = E_SUCCESS; + } + AppLogDebug("EXIT"); + return r; +} + +result +ContentListForm::RemoveContentAt(const Tizen::Content::ContentId& contentId) +{ + AppLogDebug("ENTER"); + ContentManager contentManager; + contentManager.Construct(); + + if (IsFailed(contentManager.DeleteContent(contentId))) + { + AppLogDebug("DeleteContent(%ls) failed", contentId.ToString().GetPointer()); + return GetLastResult(); + } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentListForm::UpdateExtraInformaionArea(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentListForm::SetFooterStyle(FooterButtonStyle footerButtonStyle) +{ + AppLogDebug("ENTER"); + __footerButtonStyle = footerButtonStyle; + AppLogDebug("EXIT"); +} + +FooterButtonStyle +ContentListForm::GetCurrentFooterStyle(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __footerButtonStyle; +} + +void +ContentListForm::OnFontSizeChanged(void) +{ + +} + +void +ContentListForm::OnTimerExpired(Timer& timer) +{ + TryReturnVoid((__pMsgShowTimer != null && !__pMsgShowTimer->Equals(timer)),"wrong timer instance has come"); + MessageBox messageBox; + messageBox.Construct(__messageTitle, __messageBody,MSGBOX_STYLE_OK, COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); +} + + +bool +ContentListForm::OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + return true; + } + AppLogDebug("EXIT"); + return false; + +} + +bool +ContentListForm::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (__pCommonUtilPopupHandler != null && __pCommonUtilPopupHandler->GetShowState() + && (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC)) + { + __pCommonUtilPopupHandler->SetShowState(false); + return true; + } + AppLogDebug("EXIT"); + return false; +} diff --git a/src/MpContentListPanel.cpp b/src/MpContentListPanel.cpp new file mode 100644 index 0000000..7b08ba7 --- /dev/null +++ b/src/MpContentListPanel.cpp @@ -0,0 +1,578 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentLibaryPanel.cpp + * @brief This is the implementation file for ContentLibaryPanel class. + */ + +#include "FUi.h" +#include "MpCommonUtil.h" +#include "MpContentLibaryPanel.h" +#include "MpMiniPlayer.h" +#include "MpNotificationTicker.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSceneRegister.h" +#include "MpSharePopup.h" +#include "MpTypes.h" + +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_SHOW_MINI_PLAYER_STATUS_PORTRAIT_REGISTER_BAR = 236; +static const int H_SHOW_MINI_PLAYER_STATUS_LANDSCAPE_REGISTER_BAR = 144; + +ContentLibaryPanel::ContentLibaryPanel(void) + : ContentPanel::ContentPanel() + , __pMiniPlayerRegisterBar(null) + , __pContextMenu(null) + , __pOptionMenu(null) + , __pPlayListPicker(null) + , __pSharePicker(null) + , __pNotificationTicker(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentLibaryPanel::~ContentLibaryPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +ContentLibaryPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Panel::Construct(IDL_CONTENT_LIBARY_COMMON_PANEL); + if (IsFailed(r)) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_PANEL) failed(%s)", GetErrorMessage(r)); + return false; + } + AppLogDebug("EXIT"); + return Construct(); +} + +result +ContentLibaryPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + RemoveSharePicker(); + RemoveOptionMenu(); + RemoveContextMenu(); + RemoveNotificationTicker(); + AppLogDebug("EXIT"); + return ContentPanel::OnTerminating(); +} + +result +ContentLibaryPanel::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentTableView = static_cast(GetControl(IDC_CONTENTS_TABLEVIEW)); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + + + __pMiniPlayerRegisterBar = static_cast(GetControl(IDC_MINI_PLAYER_REGISTER_BAR)); + __pNoContentLabel = static_cast(GetControl(IDC_NO_CONTENTS_PANEL)); + __pNoContentTextLabel = static_cast(__pNoContentLabel->GetControl(L"IDC_LABEL2")); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentLibaryPanel::ReSizingMiniPlayerRegisterBar(void) +{ + AppLogDebug("ENTER"); + if (IsExistMiniPlayer() == true) + { + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + return E_FAILURE; + } + __pMiniPlayerRegisterBar->SetSize(__pMiniPlayerRegisterBar->GetWidth(), + ((pForm->GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT) || (pForm->GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT_REVERSE)) + ? H_SHOW_MINI_PLAYER_STATUS_PORTRAIT_REGISTER_BAR : H_SHOW_MINI_PLAYER_STATUS_LANDSCAPE_REGISTER_BAR); + } + else + { + __pMiniPlayerRegisterBar->SetSize(__pMiniPlayerRegisterBar->GetWidth(), 0); + } + __pMiniPlayerRegisterBar->Invalidate(true); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +bool +ContentLibaryPanel::IsExistMiniPlayer(void) +{ + AppLogDebug("ENTER"); + if (__pMiniPlayerRegisterBar->GetControlCount() != INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Ui::OrientationStatus +ContentLibaryPanel::GetCurrentOrientationMode(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + return ORIENTATION_STATUS_NONE; + } + AppLogDebug("EXIT"); + return pForm->GetOrientationStatus(); +} + +void +ContentLibaryPanel::UpdateContentLibaryScreenState(void) +{ + AppLogDebug("ENTER"); + ReSizingMiniPlayerRegisterBar(); + if (IsEmptyContentList() == true) + { + SetShowStateContentTableview(false); + SetShowStateNoContent(true); + AppLogDebug("EXIT"); + return; + } + + SetShowStateNoContent(false); + SetShowStateContentTableview(true); + AppLogDebug("EXIT"); +} + +result +ContentLibaryPanel::SetMiniPlayer(Tizen::Ui::Control& control) +{ + AppLogDebug("ENTER"); + RemoveMiniPlayer(); + + result r = __pMiniPlayerRegisterBar->AddControl(control); + if (!IsFailed(r)) + { + CommonUtil::SetLayoutFitToContainer(*__pMiniPlayerRegisterBar, control); + } + AppLogDebug("EXIT"); + return r; +} + +void +ContentLibaryPanel::RemoveMiniPlayer(void) +{ + AppLogDebug("ENTER"); + __pMiniPlayerRegisterBar->RemoveAllControls(); + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + TryRegisterMiniPlayer(); + if (IsExistMiniPlayer() == true) + { + MiniPlayer* pMiniPlayer = static_cast(__pMiniPlayerRegisterBar->GetControl(IDL_MINI_PLYAER_PANEL)); + if (IsFailed(pMiniPlayer->MiniPlayerActivate())) + { + RemoveMiniPlayer(); + SetShowStateFooter(true); + } + else + { + SetShowStateFooter(false); + } + } + + UpdateContentLibaryScreenState(); + CommonUtil::SetTabHeaderStyle(*GetHeader()); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ContentLibaryPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + if (IsExistMiniPlayer() == true) + { + MiniPlayer* pMiniPlayer = static_cast(__pMiniPlayerRegisterBar->GetControl(IDL_MINI_PLYAER_PANEL)); + pMiniPlayer->MiniPlayerDeactivate(); + } + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + ReSizingMiniPlayerRegisterBar(); + __pContentTableView->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if ((requestId != ID_DESTORY_PLAY_LIST_PICKER_POPUP) && (requestId != ID_DESTORY_SHARE_POPUP)) + { + AppLogDebug("EXIT"); + return; + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + + RemovePlayListPicker(); + RemoveSharePicker(); + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + + RemovePlayListPicker(false);//hides playlist picker popup + RemoveSharePicker(false);//hides share picker popup + RemoveContextMenu(); + + UpdateContentLibaryScreenState(); + + if (__pContentTableView != null && IsEmptyContentList() == false) + { + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::OnFontSizeChanged(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::TryRegisterMiniPlayer(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (!pSceneManager->IsSceneAlive(IDSCN_PLAYER) || IsExistMiniPlayer() == true) + { + return; + } + + MiniPlayer* pMiniPlayer = new (std::nothrow) MiniPlayer(); + if (IsFailed(pMiniPlayer->Construct())) + { + AppLogDebug("MiniPlayer.Construct() failed"); + delete pMiniPlayer; + SetShowStateFooter(true); + return; + } + + SetMiniPlayer(*pMiniPlayer); + SetShowStateFooter(false); + AppLogDebug("EXIT"); +} + +result +ContentLibaryPanel::CreateContextMenuN(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + RemoveContextMenu(); + __pContextMenu = CommonUtil::CreateContextMenuN(source, *this); + if (__pContextMenu != null) + { + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +result +ContentLibaryPanel::CreateOptionMenuN(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + RemoveOptionMenu(); + __pOptionMenu = CommonUtil::CreateOptionMenuN(source, *this); + if (__pOptionMenu != null) + { + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +result +ContentLibaryPanel::SetContextMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition) +{ + AppLogDebug("ENTER"); + if (__pContextMenu == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + CommonUtil::AddContextMenuItem(*__pContextMenu, contextMenuItemStyle); + CommonUtil::ShowContextMenu(*__pContextMenu, true); + + Point prevAnchorPosition = __pContextMenu->GetAnchorPosition(); + if (anchorPosition.x != -1 && IsExistMiniPlayer() == false) + { + prevAnchorPosition.x = anchorPosition.x; + } + + if (anchorPosition.y != -1 && IsExistMiniPlayer() == false) + { +// prevAnchorPosition.y = anchorPosition.y; + } + + __pContextMenu->SetAnchorPosition(prevAnchorPosition); + AppLogDebug("EXIT(anchor.x=%d, anchor.y=%d", prevAnchorPosition.x, prevAnchorPosition.y); + return E_SUCCESS; +} + +result +ContentLibaryPanel::SetOptionMenuItem(unsigned int optionMenuItemStyle) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + CommonUtil::AddOptionMenuItem(*__pOptionMenu, optionMenuItemStyle); + CommonUtil::ShowOptionMenu(*__pOptionMenu, true); + return E_SUCCESS; +} + + +void +ContentLibaryPanel::RemoveContextMenu(void) +{ + AppLogDebug("ENTER"); + if (__pContextMenu != null) + { + CommonUtil::SetShowStateControl(*__pContextMenu, false); + delete __pContextMenu; + __pContextMenu = null; + } + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::RemoveOptionMenu(void) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu != null) + { + CommonUtil::SetShowStateControl(*__pOptionMenu, false); + delete __pOptionMenu; + __pOptionMenu = null; + } + AppLogDebug("EXIT"); +} + + +result +ContentLibaryPanel::TryRemoveContextMenu(int actionId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (CommonUtil::IsVaildContextMenuItemActionId(actionId) == true) + { + RemoveContextMenu(); + r = E_SUCCESS; + } + AppLogDebug("EXIT"); + return r; +} + +result +ContentLibaryPanel::LanucherPicker(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + IList* pArgumentList = GetPickerArgumentListN(pickerType, argumentType); + if (pArgumentList == null) + { + AppLogDebug("GetPickerArgumentListN is null"); + return E_FAILURE; + } + + result r = E_FAILURE; + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + r = ShowPlayListPicker(pArgumentList); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + r = ShowSharePicker(pArgumentList); + } + + if (IsFailed(r)) + { + AppLogDebug("ShowPlayListPicker failed(%s)", GetErrorMessage(r)); + pArgumentList->RemoveAll(); + delete pArgumentList; + } + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::IList* +ContentLibaryPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return null; +} + +result +ContentLibaryPanel::ShowPlayListPicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + + __pPlayListPicker = new (std::nothrow) PlayListPickerPopup(); + if (IsFailed(__pPlayListPicker->Initialize(this, pIList))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemovePlayListPicker(); + return E_FAILURE; + } + + __pPlayListPicker->SetShowState(true); + __pPlayListPicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +ContentLibaryPanel::ShowSharePicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemoveSharePicker(); + + __pSharePicker = new (std::nothrow) SharePopup(); + if (IsFailed(__pSharePicker->Initialize(this))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemoveSharePicker(); + return E_FAILURE; + } + + __pSharePicker->SetArguments(pIList); + __pSharePicker->SetShowState(true); + __pSharePicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentLibaryPanel::RemoveSharePicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pSharePicker != null) + { + CommonUtil::SetShowStateControl(*__pSharePicker, false); + if (deletePopup) + { + delete __pSharePicker; + __pSharePicker = null; + } + } + AppLogDebug("EXIT"); +} + +void +ContentLibaryPanel::RemovePlayListPicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pPlayListPicker != null) + { + CommonUtil::SetShowStateControl(*__pPlayListPicker, false); + if (deletePopup) + { + delete __pPlayListPicker; + __pPlayListPicker = null; + } + } + AppLogDebug("EXIT"); +} + +result +ContentLibaryPanel::ShowNotificationTicker(Tizen::Base::String text, int timeOut) +{ + AppLogDebug("ENTER"); + if (__pNotificationTicker == null) + { + __pNotificationTicker = new (std::nothrow) NotificationTicker(); + result r = __pNotificationTicker->Construct(); + if (IsFailed(r)) + { + __pNotificationTicker->DestoryTicker(); + __pNotificationTicker = null; + return E_FAILURE; + } + __pNotificationTicker->SetBoundTicker(Rectangle(0,0, GetWidth(), 96)); + } + + __pNotificationTicker->ShowTicker(text, timeOut); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ContentLibaryPanel::RemoveNotificationTicker(void) +{ + AppLogDebug("ENTER"); + if (__pNotificationTicker != null) + { + __pNotificationTicker->DestoryTicker(); + __pNotificationTicker = null; + } + AppLogDebug("EXIT"); +} diff --git a/src/MpContentPanel.cpp b/src/MpContentPanel.cpp new file mode 100644 index 0000000..dbdf3cf --- /dev/null +++ b/src/MpContentPanel.cpp @@ -0,0 +1,361 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpContentPanel.cpp + * @brief This is the implementation file for ContentPanel class. + */ + +#include "FUi.h" +#include "MpContentPanel.h" +#include "MpCommonUtil.h" +#include "MpMusicPlayerApp.h" + +using namespace Tizen::App; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +ContentPanel::ContentPanel(void) + : __pContentTableView(null) + , __pNoContentLabel(null) + , __pNoContentTextLabel(null) + , __footerButtonStyle(STYLE_MAX) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ContentPanel::~ContentPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +ContentPanel::SetShowStateNoContent(bool isShow) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (__pNoContentLabel != null && __pNoContentLabel->GetShowState() != isShow) + { + __pNoContentLabel->SetShowState(isShow); + __pNoContentLabel->Invalidate(true); + } + AppLogDebug("EXIT"); + return r; +} + +result +ContentPanel::SetShowStateContentTableview(bool isShow) +{ + AppLogDebug("ENTER"); + if ( __pContentTableView != null && __pContentTableView->GetShowState() != isShow) + { + __pContentTableView->SetShowState(isShow); + __pContentTableView->Invalidate(true); + return E_SUCCESS; + } + + AppLogDebug("EXIT"); + return E_FAILURE; +} + +Tizen::Ui::Controls::Header* +ContentPanel::GetHeader(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return pForm->GetHeader(); +} + +Tizen::Ui::Controls::Footer* +ContentPanel::GetFooter(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return pForm->GetFooter(); +} + +void +ContentPanel::SetShowStateFooter(bool isShow) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->SetShowState(isShow); + pFooter->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetBackEventListner(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("dynamic_cast(GetParent()) is null"); + return; + } + const_cast(pForm)->SetFormBackEventListener(this); + AppLogDebug("EXIT"); +} + +void +ContentPanel::RemoveBackEventListner(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("dynamic_cast(GetParent()) is null"); + return; + } + const_cast(pForm)->SetFormBackEventListener(static_cast(null)); + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetFormMenuEventListener(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("dynamic_cast(GetParent()) is null"); + return; + } + const_cast(pForm)->SetFormMenuEventListener(this); + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetLayoutFitToForm(void) +{ + AppLogDebug("ENTER"); + const Form* pForm = dynamic_cast(GetParent()); + if (pForm == null) + { + AppLogDebug("EXIT"); + return; + } + AppAssert(pForm); + + CommonUtil::SetLayoutFitToContainer(*pForm, *this); + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetFooter(FooterButtonStyle footerButtonStyle) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + CommonUtil::SetBackButtonStyleFooter(*pFooter, footerButtonStyle); + __footerButtonStyle = footerButtonStyle; + } + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetFooterStyle(FooterButtonStyle footerButtonStyle) +{ + AppLogDebug("ENTER"); + __footerButtonStyle = footerButtonStyle; + AppLogDebug("EXIT"); +} + +FooterButtonStyle +ContentPanel::GetCurrentFooterStyle(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __footerButtonStyle; +} + +int +ContentPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return INIT_VALUE; +} + +Tizen::Ui::Controls::TableViewItem* +ContentPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return null; +} + +bool +ContentPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +ContentPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +ContentPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +ContentPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnOrientationPanelChanged(Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + + SetBackEventListner(); + SetFormMenuEventListener(); + SetFooter(__footerButtonStyle); + SetFormStyle(); + + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + } + + Header* pHeader = GetHeader(); + pHeader->AddActionEventListener(*this); + + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + pHeader->RemoveActionEventListener(*this); + + Footer* pFooter = GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveActionEventListener(*this); + } + + RemoveBackEventListner(); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + Tizen::App::Application::GetInstance()->Terminate(); + AppLogDebug("EXIT"); +} + +void +ContentPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ContentPanel::SetFormStyle(void) +{ + if(GetCurrentFooterStyle() != STYLE_MAX) + { + const Form* pForm = dynamic_cast(GetParent()); + + if (pForm != null) + { + const_cast(pForm)->SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_INDICATOR | FORM_STYLE_FOOTER | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE); + } + } + else + { + const Form* pForm = dynamic_cast(GetParent()); + if (pForm != null) + { + const_cast(pForm)->SetFormStyle(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE); + } + } + + Invalidate(true); +} diff --git a/src/MpFolderContentListForm.cpp b/src/MpFolderContentListForm.cpp new file mode 100644 index 0000000..0db969e --- /dev/null +++ b/src/MpFolderContentListForm.cpp @@ -0,0 +1,1105 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderContentListForm.cpp + * @brief This is the implementation file for FolderContentListForm class. + */ + +#include +#include "MpFolderContentListForm.h" +#include "MpFolderListPresentationModel.h" +#include "MpMusicPlayerApp.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FolderContentListForm::FolderContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pTableViewContextItem(null) + , __pThumbnail(null) + , __pCurrentFolderPath(null) + , __pPresentationModel(null) + , __checkedItemCount(0) + , __currentFolderIndex(0) + , __activatedStateContextItem(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderContentListForm::~FolderContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +FolderContentListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_CONTENT_LIST_FORM))) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return false; + } + + AppLogDebug("EXIT"); + return Construct(); +} + +result +FolderContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView = static_cast(GetControl(IDC_TABLEVIEW_CONTENT_LIST)); + __pContentListTableView->AddTableViewItemEventListener(*this); + __pContentListTableView->SetItemProvider(this); + + SetContentList(__pContentListTableView); + AppLogDebug("EXIT"); + return ContentListForm::Construct(); +} + +result +FolderContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pTableViewContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_01); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +FolderContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + __pPresentationModel = null; + delete __pTableViewContextItem; + __pTableViewContextItem = null; + + delete __pCurrentFolderPath; + __pCurrentFolderPath = null; + AppLogDebug("EXIT"); + return ContentListForm::OnTerminating(); +} + +void +FolderContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false)) + { + SetItemCheckedAll(false); + } + else + { + __prevSceneId.Clear(); + __prevSceneId.Append(*static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME))); + __currentFolderIndex = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + __pCurrentFolderPath = new (std::nothrow) String(*(static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME)))); + + __pPresentationModel = FolderListPresentationModel::GetInstance(); + __pPresentationModel->UpdateFolderPathList(); + __pPresentationModel->InitializeContentList(__currentFolderIndex); + + int position = INIT_VALUE; + __pCurrentFolderPath->LastIndexOf(IDS_SEPARATOR_SLASH, __pCurrentFolderPath->GetLength() - 1, position); + __pCurrentFolderPath->SubString(position + 1, __headerTitle); + + String ellipisiPath = CommonUtil::SetHighDepthToEllipsisPath(*__pCurrentFolderPath); + Rectangle rect(INIT_VALUE, INIT_VALUE, GetWidth(), 42); + + Label* pAdditionalInfo = new (std::nothrow) Label(); + if (!IsFailed(pAdditionalInfo->Construct(rect, ellipisiPath))) + { + pAdditionalInfo->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pAdditionalInfo->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + pAdditionalInfo->SetTextConfig(32, LABEL_TEXT_STYLE_BOLD); + pAdditionalInfo->SetTextColor(COLOR_ITEM_SUB_TEXT); + + SetExtraInformaionArea(*pAdditionalInfo); + } + } + + if (GetScreenState() == SCREEN_STATE_EDITOR) + { + CommonUtil::SetEditHeaderStyle(*GetHeader(), ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + } + else + { + SetHeader(); + } + UpdateScreenState(); + UpdateTableView(); + + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY: + { + GoToLibrary(); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + ToggleScreenState(SCREEN_STATE_EDITOR); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + Point anchorPoint(X_POINT_FOOTER_MORE, Y_POINT_PORTRAIT_FOOTER_MORE); + if ((GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE) || (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)) + { + anchorPoint.y = Y_POINT_LANDSCAPE_FOOTER_MORE; + } + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY | CONTEXT_MENU_ITEM_STYLE_EDIT, anchorPoint); + } + break; + + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + bool isChecked = true; + if (__checkedItemCount == __pContentListTableView->GetItemCount()) + { + isChecked = false; + } + SetItemCheckedAll(isChecked); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FLICK_MENU_ITEM_SHARE: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_EMAIL | CONTEXT_MENU_ITEM_STYLE_MESSAGE); + } + break; + + case IDA_FLICK_MENU_ITEM_SET_AS: + { + CreateContextMenuN(source); + SetContextMenuItem(CONTEXT_MENU_ITEM_STYLE_CALL | CONTEXT_MENU_ITEM_STYLE_CALLER); + } + break; + + case IDA_FLICK_MENU_ITEM_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL)); + + if (__pContentListTableView->IsContextItemOpened(__activatedStateContextItem)) + { + __pContentListTableView->CloseContextItem(__activatedStateContextItem); + } + } + break; + + case IDA_COMMON_POPUP_CANCEL: + { + // empty statement + } + break; + + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentListTableView->IsContextItemOpened(__activatedStateContextItem)) + { + __pContentListTableView->CloseContextItem(__activatedStateContextItem); + } + } + break; + + case IDA_COMMON_POPUP_DELETE: + { + if(GetScreenState() == SCREEN_STATE_NORMAL) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo != null) + { + RemoveContentAt(pContentInfo->contentId); + __pPresentationModel->RefreshContentList(__currentFolderIndex); + __pContentListTableView->RefreshItem(__activatedStateContextItem, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + delete pContentInfo; + } + } + else + { + RemoveCheckedTableviewItem(true); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_EMAIL: + // fall through + case IDA_CONTEXT_MENU_ITEM_MESSAGE: + { + result r = E_FAILURE; + String providerID = ((actionId == IDA_CONTEXT_MENU_ITEM_EMAIL) ? PROVIDER_ID_EMAIL : PROVIDER_ID_MESSAGE); + AppControl* pAppControl = AppManager::FindAppControlN(providerID, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + AppLogDebug("AppManager::FindAppControlN is null"); + return; + } + + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + AppLogDebug("PresentationModel->GetContentInfoN is null"); + delete pAppControl; + pAppControl = null; + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + + Tizen::Base::Collection::ArrayList* pValueList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pValueList->Construct(); + pValueList->Add((new (std::nothrow) String(pContentInfo->ContentFilePath))); + + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), pValueList); + delete pContentInfo; + + r = pAppControl->Start(null, null, pDataList, this); + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + + delete pAppControl; + + if (__pContentListTableView->IsContextItemOpened(__activatedStateContextItem)) + { + __pContentListTableView->CloseContextItem(__activatedStateContextItem); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALL: + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + AppLogDebug("PresentationModel->GetContentInfoN is null"); + return; + } + + if (!IsFailed(SettingInfo::SetValue(CALL_RINGTONE_KEY, pContentInfo->ContentFilePath))) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + delete pContentInfo; + + if (__pContentListTableView->IsContextItemOpened(__activatedStateContextItem)) + { + __pContentListTableView->CloseContextItem(__activatedStateContextItem); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CALLER: + { + AppControl* pAppControl = AppManager::FindAppControlN(PROVIDER_ID_CONTACT, OPERATION_ID_SOCIAL_PICK); + if (pAppControl == null) + { + AppLogDebug("AppManager::FindAppControlN is null"); + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTION_MODE), new (std::nothrow) String(APPCONTROL_OPTION_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_ITEM_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_PERSON)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_RESULT_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_ITEM_ID)); + + pAppControl->Start(null, null, pDataList, this); + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + delete pAppControl; + + if (__pContentListTableView->IsContextItemOpened(__activatedStateContextItem)) + { + __pContentListTableView->CloseContextItem(__activatedStateContextItem); + } + } + break; + +// case IDA_FOOTER_BUTTON_DELETE: +// { +// RemoveCheckedTableviewItem(true); +// } +// break; + case IDA_FOOTER_BUTTON_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL),this); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + ToggleScreenState(SCREEN_STATE_SHARE_VIA); + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER, PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + TryRemoveCommonPopup(actionId); + AppLogDebug("EXIT"); +} + +int +FolderContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__currentFolderIndex); +} + +Tizen::Ui::Controls::TableViewItem* +FolderContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewAnnexStyle tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_NORMAL; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_MARK; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), tableViewAnnexStyle); + TryCatch(r == E_SUCCESS, , "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, , "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, , "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + + if (pItem != null) + { + delete pItem; + pItem = null; + } + + delete pContentInfo; + return null; +} + +void +FolderContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + if (GetScreenState() == SCREEN_STATE_NORMAL && IsEmptyContentList() == false) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } +} + +void +FolderContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetItemCheckedStateChanged(status); + AppLogDebug("EXIT"); + return; + } + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pSceneArg = MakePlayerSceneParam(itemIndex); + if (pSceneArg != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pSceneArg); + } + } + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (itemIndex >= 0) + { + AppLogDebug("INDEX %d", itemIndex); + __activatedStateContextItem = itemIndex; + } + AppLogDebug("EXIT"); +} + +int +FolderContentListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +FolderContentListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +FolderContentListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +FolderContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pSelectedMusicContent = __pPresentationModel->GetContentPathListN(__currentFolderIndex); + if (pSelectedMusicContent == null) + { + AppLogDebug("EXIT"); + return null; + } + + ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pSelectedMusicContent)); + + AppLogDebug("EXIT"); + return pTempList; +} + +result +FolderContentListForm::CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + else + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + + String filePath = contentInfo.ContentFilePath; + Bitmap* StorageIconBitmap = null; + int indexOf = -1; + + String tempPath = contentInfo.ContentFilePath; + String fileName; + tempPath.LastIndexOf(L"/", tempPath.GetLength() - 1, indexOf); + tempPath.SubString(indexOf + 1, fileName); + + String phonePath = IDS_STORAGE_PHONE_PATH; + phonePath.Remove(IDS_STORAGE_PHONE_PATH.GetLength() - 1, 1); + + String sdCardPath = IDS_STORAGE_SDCARD_PATH; + sdCardPath.Remove(IDS_STORAGE_SDCARD_PATH.GetLength() - 1, 1); + + if (filePath.Contains(phonePath)) + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + else if (filePath.Contains(sdCardPath)) + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_SDCARD); + } + else + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + + Label* pFolderStorageIcon = static_cast(pTableViewItem->GetControl(IDC_CONTENT_FOLDER_STORAGE_ICON)); + pFolderStorageIcon->SetBackgroundBitmap(*StorageIconBitmap); + delete StorageIconBitmap; + + static_cast(pTableViewItem->GetControl(IDC_CONTENT_TITLE_NAME))->SetText(fileName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENT_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + parent.SetIndividualSelectionEnabled(pTableViewItem, true); + + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +bool +FolderContentListForm::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetContentCount(__currentFolderIndex) != INIT_VALUE) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +FolderContentListForm::SetHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), __headerTitle); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +FolderContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(PROVIDER_ID_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + int contactId = -1; + String* pKey = null; + ArrayList* pArrayListValue = null; + String* pResultString = null; + if (pExtraData != null) + { + IMapEnumerator* pEnum = pExtraData->GetMapEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast(pEnum->GetKey()); + if (pKey->Equals(APPCONTROL_KEY_SOCIAL_ITEM_ID, true)) + { + pArrayListValue = static_cast(pEnum->GetValue()); + pResultString = static_cast(pArrayListValue->GetAt(0)); + AppLogDebug("extraData : %ls:%ls", pKey->GetPointer(), pResultString->GetPointer()); + Integer::Parse(*pResultString, contactId); + break; + } + } + delete pEnum; + + if (contactId < 0) + { + AppLogDebug("pKey is invaild"); + return; + } + } + else + { + AppLogDebug("pExtraData is null"); + return; + } + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + ShowDelayedMessageBox(ResourceManager::GetString(L"IDS_COM_POP_SUCCESS")); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentListTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentListForm::OnUserEventReceivedN(requestId, pArgs); + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENT_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +int +FolderContentListForm::GetCheckedItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __checkedItemCount; +} + +void +FolderContentListForm::UpdateTableView(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView->UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + __currentFolderIndex = __pPresentationModel->GetFolderIndex(*__pCurrentFolderPath); + + if (__currentFolderIndex < 0) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + SetScreenState(SCREEN_STATE_NORMAL); + + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_FOLDER_CONTENT_LIST,true)) + { + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE,SCENE_DESTROY_OPTION_KEEP)); + } + + } + else + { + __pPresentationModel->InitializeContentList(__currentFolderIndex); + } + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + if (isChecked == true) + { + __checkedItemCount = __pContentListTableView->GetItemCount(); + } + else + { + __checkedItemCount = INIT_VALUE; + } + CommonUtil::SetItemCheckedAll(isChecked, *__pContentListTableView); + if(GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::RemoveCheckedTableviewItem(bool itemRemove) +{ + AppLogDebug("ENTER"); + if (itemRemove) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + __pContentListTableView->SetItemChecked(iCount, false); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + RemoveContentAt(pContentInfo->contentId); + delete pContentInfo; + } + } + } + else + { + SetItemCheckedAll(false); + } + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_UNCHECKED) + { + __checkedItemCount--; + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + } + else if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), true); + } + } + + __checkedItemCount++; + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +void +FolderContentListForm::GoToLibrary(void) +{ + IEnumeratorT* pIEnum = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + IListT* pSceneIdList = pSceneManager->GetSceneHistoryN(); + if (pSceneIdList == null) + { + AppLogDebug("EXIT(ScenList is null)"); + pSceneManager->GoBackward(BackwardSceneTransition()); + return; + } + + pSceneManager->ClearSceneHistory(); + + pIEnum = pSceneIdList->GetEnumeratorN(); + + if (pIEnum != null) + { + while (pIEnum->MoveNext() == E_SUCCESS) + { + SceneId sceneID; + pIEnum->GetCurrent(sceneID); + + if (!__prevSceneId.Equals(sceneID, false)) + { + pSceneManager->AddToSceneHistory(sceneID); + } + else + { + pSceneManager->DestroyScene(sceneID); + } + } + delete pIEnum; + } + + pSceneManager->GoBackward(BackwardSceneTransition()); +} + +Tizen::Base::Collection::IList* +FolderContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pContentFilePathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pContentFilePathList->Construct())) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pContentFilePathList; + return null; + } + + if (argumentType == PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + delete pContentFilePathList; + AppLogDebug("GetContentInfoN(%d) is null", __activatedStateContextItem); + return null; + } + + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + else if (argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + AppLogDebug("GetContentInfoN(%d) is null", iCount); + delete pContentFilePathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + delete pContentInfo; + } + } + } + AppLogDebug("EXIT"); + return pContentFilePathList; +} + +void +FolderContentListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentListTableView->UpdateTableView(); +} diff --git a/src/MpFolderContentPickerPanel.cpp b/src/MpFolderContentPickerPanel.cpp new file mode 100644 index 0000000..d76217b --- /dev/null +++ b/src/MpFolderContentPickerPanel.cpp @@ -0,0 +1,340 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderContentPickerPanel.cpp + * @brief This is the implementation file for FolderContentPickerPanel class. + */ + +#include "MpFolderContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FolderContentPickerPanel::FolderContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderContentPickerPanel::~FolderContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +FolderContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +FolderContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = FolderListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +FolderContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +FolderContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentFolderIndex()); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentFolderIndex()); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +FolderContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + __pPresentationModel->UpdateFolderPathList(); + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +FolderContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + AppLogDebug("EXIT"); +} + +int +FolderContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentFolderIndex()); +} + +Tizen::Ui::Controls::TableViewItem* +FolderContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation *pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +FolderContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +FolderContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +FolderContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +FolderContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentFolderIndex())) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +FolderContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} +void +FolderContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpFolderListEditorPanel.cpp b/src/MpFolderListEditorPanel.cpp new file mode 100644 index 0000000..099681f --- /dev/null +++ b/src/MpFolderListEditorPanel.cpp @@ -0,0 +1,542 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListEditorPanel.cpp + * @brief This is the implementation file for FolderListEditorPanel class. + */ + +#include "MpFolderListEditorPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FolderListEditorPanel::FolderListEditorPanel(void) + : ContentEditPanel::ContentEditPanel() + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderListEditorPanel::~FolderListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +FolderListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = FolderListPresentationModel::GetInstance(); + UpdateContentList(); + SetLayoutFitToForm(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +FolderListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ContentEditPanel::OnTerminating(); +} + +void +FolderListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER %d", actionId); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllFolderCount(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + SetItemCheckedAll(false); + } + else + { + SetItemCheckedAll(true); + } + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ShowCommonDeletePopup(this); + } + break; + + case IDA_DELETE_POPUP_DELETE: + { + int totalCount = __pPresentationModel->GetAllFolderCount(); + for (int iCount = totalCount - 1; iCount >= 0; iCount--) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->RemoveFolderList(iCount); + } + } + + HideCommonDeletePopup(false); + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + HideCommonDeletePopup(false); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + SetEditHeaderStyle(); + + SetFooterStyle(STYLE_ADDTO_DELETE_ADD); + SetFormStyle(); + Footer* pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_ADDTO_DELETE_ADD); + + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + UpdateContentEditScreenState(); + + if (previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, true)) + { + if (pArgs != null) + { + int totalCount = 0; + __pContentTableView->UpdateTableView(); + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetAllFolderCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + else + { + if (pFooter != null && __checkedItemCount != 0) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + if (!(nextSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false))) + { + Footer* pFooter = GetFooter(); + + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + int totalCount = __pPresentationModel->GetAllFolderCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + } + AppLogDebug("EXIT"); +} + +int +FolderListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllFolderCount(); +} + +Tizen::Ui::Controls::TableViewItem* +FolderListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + String* pContentPath = null; + int contentCount = 0; + + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem; pItem = null, "pItem->Construct(%s)", GetErrorMessage(r)); + + pContentPath = __pPresentationModel->GetFolderPath(itemIndex); + contentCount = __pPresentationModel->GetContentCount(itemIndex); + if (pContentPath != null) + { + r = CreateTableViewItem(*pItem, *pContentPath, contentCount); + TryCatch(r == E_SUCCESS, delete pItem; pItem = null, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + } + else + { + delete pItem; + pItem = null; + } + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +bool +FolderListEditorPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +FolderListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +FolderListEditorPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +FolderListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + if (__checkedItemCount > INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateFolderPathList(); + } + AppLogDebug("EXIT"); +} + +void +FolderListEditorPanel::SetEditHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + String titleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} + +result +FolderListEditorPanel::CreateTableViewItem(Tizen::Ui::Container& parent, const Tizen::Base::String& contentPath, int contentCount) +{ + AppLogDebug("ENTER"); + Bitmap* pStorageIconBitmap = null; + String strFolderName; + + int folderNamePosition = 0; + contentPath.LastIndexOf(IDS_SEPARATOR_SLASH, contentPath.GetLength() - 1, folderNamePosition); + contentPath.SubString(folderNamePosition + 1, strFolderName); + + String phonePath = IDS_STORAGE_PHONE_PATH; + phonePath.Remove(IDS_STORAGE_PHONE_PATH.GetLength() - 1, 1); + + String sdCardPath = IDS_STORAGE_SDCARD_PATH; + sdCardPath.Remove(IDS_STORAGE_SDCARD_PATH.GetLength() - 1, 1); + + if (contentPath.Contains(phonePath)) + { + pStorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + else if (contentPath.Contains(sdCardPath)) + { + pStorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_SDCARD); + } + else + { + pStorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + if (pStorageIconBitmap != null) + { + static_cast(pTableViewItem->GetControl(IDC_STORAGE_TYPE_ICON))->SetBackgroundBitmap(*pStorageIconBitmap); + delete pStorageIconBitmap; + pStorageIconBitmap = null; + } + + String fullContentPath; + contentPath.SubString(INIT_VALUE, folderNamePosition, fullContentPath); + static_cast(pTableViewItem->GetControl(IDC_FOLDER_PATH))->SetText(CommonUtil::SetHighDepthToEllipsisPath(fullContentPath)); + + static_cast(pTableViewItem->GetControl(IDC_FOLDER_NAME))->SetText(strFolderName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ITEM_COUNT))->SetText(CommonUtil::SetSongsString(contentCount)); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +bool +FolderListEditorPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetAllFolderCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Base::Collection::IList* +FolderListEditorPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + ArrayList* pContentPathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + result r = pContentPathList->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(r)); + delete pContentPathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER && argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pPresentationModel->GetAllFolderCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pContentPathList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + } + else + { + AppLogDebug("EXIT"); + delete pContentPathList; + return null; + } + + AppLogDebug("EXIT"); + return pContentPathList; +} + +void +FolderListEditorPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} diff --git a/src/MpFolderListPanel.cpp b/src/MpFolderListPanel.cpp new file mode 100644 index 0000000..ce1cbef --- /dev/null +++ b/src/MpFolderListPanel.cpp @@ -0,0 +1,472 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListPanel.cpp + * @brief This is the implementation file for FolderListPanel class. + */ + +#include "MpFolderListPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FolderListPanel::FolderListPanel(void) + : ContentLibaryPanel::ContentLibaryPanel() + , __itemIndex(-1) + , __scrolledDistance(0) + , __pPresentationModel(null) + , __pLaunchPlayerTimer(null) + , __pContextItem(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderListPanel::~FolderListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +FolderListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pContentTableView->SetItemDividerColor(Color(COLOR_ID_WHITE)); + __pPresentationModel = FolderListPresentationModel::GetInstance(); + __pContextItem = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_02); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + SetLayoutFitToForm(); + SetFormStyle(); + UpdateContentList(); + __pLaunchPlayerTimer = new (std::nothrow) Timer(); + __pLaunchPlayerTimer->Construct(*this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +FolderListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + delete __pContextItem; + __pContextItem = null; + + if (__pLaunchPlayerTimer != null) + { + __pLaunchPlayerTimer->Cancel(); + delete __pLaunchPlayerTimer; + __pLaunchPlayerTimer = null; + } + AppLogDebug("EXIT"); + return ContentLibaryPanel::OnTerminating(); +} + +void +FolderListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_MENU_ITEM_PLAYALL: + { + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + // Need to launch the Player after a delay because launching Player in this case needs some DB operations + // these DB operations needs some time to be completed, so in such cases Player's Drawing might be delayed + // resulting behaviours as "Not Showing error message" etc + __pLaunchPlayerTimer->Cancel(); + __pLaunchPlayerTimer->Start(MESSAGE_BOX_DELAY); + } + break; + + case IDA_FLICK_MENU_ITEM_ADDTO: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER, PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM); + + if (__pContentTableView->IsContextItemOpened(__itemIndex)) + { + __pContentTableView->CloseContextItem(__itemIndex); + } + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY); + + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + if (__pPresentationModel->GetAllFolderCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_LIST_EDITOR)); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_GO_TO_LIBARY: + { + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + } + break; + + case IDA_FOOTER_BUTTON_BACK: + { + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + RemoveOptionMenu(); + SceneManager::GetInstance()->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_RIGHT)); + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_GO_TO_LIBARY); + + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), ResourceManager::GetString(L"IDS_MSGF_SK3_FOLDER_VIEW")); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + AppLogDebug("EXIT"); +} + +int +FolderListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllFolderCount(); +} + +Tizen::Ui::Controls::TableViewItem* +FolderListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + r = CreateTableViewItem(*pItem, *__pPresentationModel->GetFolderPath(itemIndex), __pPresentationModel->GetContentCount(itemIndex)); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + pItem->SetContextItem(__pContextItem); + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +void +FolderListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status != TABLE_VIEW_ITEM_STATUS_SELECTED) + { + return; + } + + ArrayList* pArgs = new (std::nothrow) ArrayList(); + if (IsFailed(pArgs->Construct())) + { + AppLogDebug("pArgs->Construct() failed(%s)", GetErrorMessage(GetLastResult())); + delete pArgs; + return; + } + + pArgs->Add(*(new (std::nothrow) String(pSceneManager->GetCurrentSceneId()))); + pArgs->Add(*(new (std::nothrow) String(*__pPresentationModel->GetFolderPath(itemIndex)))); + pArgs->Add(*(new (std::nothrow) Integer(itemIndex))); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_CONTENT_LIST), pArgs); + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnScrollEndReached (Tizen::Ui::Control& source, Tizen::Ui::Controls::ScrollEndEvent type) +{ + AppLogDebug("ENTER"); + if (type == SCROLL_END_EVENT_END_TOP) + { + __scrolledDistance = 0; + } + AppLogDebug("EXIT"); +} + +void +FolderListPanel::OnScrollPositionChanged (Tizen::Ui::Control& source, int scrollPos) +{ + AppLogDebug("ENTER"); + __scrolledDistance = scrollPos; + AppLogDebug("EXIT"); +} + +void +FolderListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->UpdateFolderPathList(); + } + AppLogDebug("EXIT"); +} + +bool +FolderListPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null || __pPresentationModel->GetAllFolderCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +Tizen::Base::Collection::IList* +FolderListPanel::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + if (pickerType != PICKER_TYPE_PLAY_LIST_PICKER || argumentType != PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + AppLogDebug("EXIT"); + return null; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentPathListN(__itemIndex); +} + +result +FolderListPanel::CreateTableViewItem(Tizen::Ui::Container& parent, const Tizen::Base::String& contentPath, int contentCount) +{ + AppLogDebug("ENTER"); + Bitmap* StorageIconBitmap = null; + String strFolderName; + + int folderNamePosition = 0; + contentPath.LastIndexOf(IDS_SEPARATOR_SLASH, contentPath.GetLength() - 1, folderNamePosition); + contentPath.SubString(folderNamePosition + 1, strFolderName); + + String phonePath = IDS_STORAGE_PHONE_PATH; + phonePath.Remove(IDS_STORAGE_PHONE_PATH.GetLength() - 1, 1); + + String sdCardPath = IDS_STORAGE_SDCARD_PATH; + sdCardPath.Remove(IDS_STORAGE_SDCARD_PATH.GetLength() - 1, 1); + + if (contentPath.Contains(phonePath)) + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + else if (contentPath.Contains(sdCardPath)) + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_SDCARD); + } + else + { + StorageIconBitmap = ResourceManager::GetBitmapN(IDB_STORAGE_PHONE); + } + + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_STORAGE_TYPE_ICON))->SetBackgroundBitmap(*StorageIconBitmap); + delete StorageIconBitmap; + + String fullContentPath; + contentPath.SubString(INIT_VALUE, folderNamePosition, fullContentPath); + static_cast(pTableViewItem->GetControl(IDC_FOLDER_PATH))->SetText(CommonUtil::SetHighDepthToEllipsisPath(fullContentPath)); + + static_cast(pTableViewItem->GetControl(IDC_FOLDER_NAME))->SetText(strFolderName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ITEM_COUNT))->SetText(CommonUtil::SetSongsString(contentCount)); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +FolderListPanel::OnTimerExpired(Timer& timer) +{ + if (timer.Equals(*__pLaunchPlayerTimer)) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(MUSIC))); + pData->Add(*(new (std::nothrow) Integer(0))); + pData->Add(*(__pPresentationModel->GetContentPathListN(__itemIndex))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pData); + } + } +} + +void +FolderListPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} diff --git a/src/MpFolderListPresentationModel.cpp b/src/MpFolderListPresentationModel.cpp new file mode 100644 index 0000000..ab11d1e --- /dev/null +++ b/src/MpFolderListPresentationModel.cpp @@ -0,0 +1,484 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderListPresentationModel.cpp + * @brief This is the implementation file for FolderListPresentationModel class. + */ + +#include "MpFolderListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +FolderListPresentationModel* FolderListPresentationModel::pFolderListPresentationModelInstance = null; + +FolderListPresentationModel::FolderListPresentationModel(void) + : __pFolderPathList(null) + , __pContentList(null) + , __currentFolderIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderListPresentationModel::~FolderListPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderListPresentationModel* +FolderListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pFolderListPresentationModelInstance == null) + { + pFolderListPresentationModelInstance = new (std::nothrow) FolderListPresentationModel(); + TryReturn(pFolderListPresentationModelInstance != null, null, "FolderListPresentationModel instance is not created."); + + result r = pFolderListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "FolderListPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pFolderListPresentationModelInstance; + +CATCH: + delete pFolderListPresentationModelInstance; + return null; +} + +Tizen::Base::Collection::IList* +FolderListPresentationModel::ContentDirectoryPathList(void) +{ + AppLogDebug("ENTER"); + ContentDirectory directory; + result r = directory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r)) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return directory.GetContentDirectoryPathListN(SORT_ORDER_ASCENDING); +} + +result +FolderListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppLogDebug("EXIT"); + return r; +} + +int +FolderListPresentationModel::GetAllFolderCount(void) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pFolderPathList->GetCount(); +} + +int +FolderListPresentationModel::GetContentCount(int folderIndex) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + int totalCount = INIT_VALUE; + + if ((__pContentList != null) && (__currentFolderIndex == folderIndex)) + { + totalCount = __pContentList->GetCount(); + } + else + { + if (__pFolderPathList == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + String* pStrPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + ContentDirectory directory; + r = directory.Construct(CONTENT_TYPE_AUDIO); + + if (IsFailed(r) || pStrPath == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + + totalCount = directory.GetContentDirectoryItemCount(*pStrPath); + if (IsFailed(GetLastResult())) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + } + AppLogDebug("EXIT"); + return totalCount; +} + +ContentInformation* +FolderListPresentationModel::GetFolderInfoN(int folderIndex) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList == null) + { + return null; + } + + String* pFolderPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + + ContentDirectory contentDirectory; + result r = contentDirectory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r) || pFolderPath == null) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + IList* pSearchList = contentDirectory.GetContentDirectoryItemListN(*pFolderPath, SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, STRING_SORT_TITLE, SORT_ORDER_ASCENDING); + if (pSearchList == null || IsFailed(GetLastResult())) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + if (pSearchList != null) + { + pSearchList->RemoveAll(); + delete pSearchList; + } + return null; + } + + ContentInformation* pContentInfoStruct = null; + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(INIT_VALUE)); + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + + if (pAudioContentInfo != null && pAudioContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +Tizen::Base::Collection::ArrayList* +FolderListPresentationModel::GetContentPathListN(int folderIndex) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList == null) + { + AppLogDebug("EXIT"); + return null; + } + + ContentDirectory contentDirectory; + result r = contentDirectory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return null; + } + + IList* pSearchList = null; + String* pFolderPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + if (pFolderPath != null) + { + pSearchList = contentDirectory.GetContentDirectoryItemListN(*pFolderPath, SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, STRING_SORT_TITLE, SORT_ORDER_ASCENDING); + } + + if (pSearchList == null || IsFailed(GetLastResult())) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + if (pSearchList != null) + { + pSearchList->RemoveAll(); + } + delete pSearchList; + return null; + } + + ArrayList* pContentPathList = new (std::nothrow) ArrayList(); + pContentPathList->Construct(); + + for (int iCount = 0; iCount < pSearchList->GetCount(); iCount++) + { + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(iCount)); + if (pContentInfo != null) + { + pContentPathList->Add(*(new (std::nothrow) String(pContentInfo->GetContentPath()))); + } + } + + pSearchList->RemoveAll(true); + delete pSearchList; + + AppLogDebug("EXIT"); + return pContentPathList; +} + +Tizen::Base::String* +FolderListPresentationModel::GetFolderPath(int folderIndex) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList == null) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return static_cast(__pFolderPathList->GetAt(folderIndex)); +} + +void +FolderListPresentationModel::InitializeContentList(int folderIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + ContentDirectory contentDirectory; + result r = contentDirectory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r) || __pFolderPathList == null) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return; + } + + String* pFolderPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + if (pFolderPath != null) + { + __pContentList = contentDirectory.GetContentDirectoryItemListN(*pFolderPath, SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, STRING_SORT_TITLE, SORT_ORDER_ASCENDING); + } + __currentFolderIndex = folderIndex; + AppLogDebug("EXIT"); +} + +ContentInformation* +FolderListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList == null || contentIndex < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pContentList is null)", contentIndex); + return null; + } + + ContentInformation* pContentInfoStruct = null; + ContentInfo* pContentInfo = static_cast(__pContentList->GetAt(contentIndex)); + if (pContentInfo != null && pContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + if (pAudioContentInfo != null) + { + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + } + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +Tizen::Base::String* +FolderListPresentationModel::GetFolderName(int folderIndex) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList == null) + { + return null; + } + + AppLogDebug("EXIT"); + return static_cast(__pFolderPathList->GetAt(folderIndex)); +} + +void +FolderListPresentationModel::RemoveFolderList(int folderIndex) +{ + AppLogDebug("ENTER"); + IList* pRemoveFolderList = null; + int totalCount = 0; + + ContentManager contentManager; + result r = contentManager.Construct(); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return ; + } + + ContentDirectory contentDirectory; + r = contentDirectory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return; + } + + if (__pFolderPathList != null) + { + String* pFolderPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + if (pFolderPath != null) + { + pRemoveFolderList = contentDirectory.GetContentDirectoryItemListN(*pFolderPath, SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, STRING_SORT_TITLE, SORT_ORDER_ASCENDING); + } + } + + if (pRemoveFolderList == null) + { + AppLogDebug("EXIT(pRemoveFolderList is null)"); + return; + } + + totalCount = pRemoveFolderList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentInfo* pContentInfo = static_cast(pRemoveFolderList->GetAt(iCount)); + if (pContentInfo != null && pContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + ContentInformation* pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + if (pContentInfoStruct != null) + { + contentManager.DeleteContent(pContentInfoStruct->contentId); + delete pContentInfoStruct; + } + } + } + + pRemoveFolderList->RemoveAll(true); + delete pRemoveFolderList; + AppLogDebug("EXIT"); +} + +void +FolderListPresentationModel::RefreshContentList(int folderIndex) +{ + AppLogDebug("ENTER"); + ContentDirectory contentDirectory; + result r = contentDirectory.Construct(CONTENT_TYPE_AUDIO); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return; + } + + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + String* pFolderPath = static_cast(__pFolderPathList->GetAt(folderIndex)); + if (pFolderPath != null) + { + __pContentList = contentDirectory.GetContentDirectoryItemListN(*pFolderPath, SEARCH_PAGE_NO, SEARCH_COUNT_PER_PAGE, STRING_SORT_TITLE, SORT_ORDER_ASCENDING); + } + + __currentFolderIndex = folderIndex; + AppLogDebug("EXIT"); +} + +int +FolderListPresentationModel::GetCurrentFolderIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentFolderIndex; +} + +int +FolderListPresentationModel::GetFolderIndex(const Tizen::Base::String& path) +{ + int index = 0; + + TryReturn(__pFolderPathList, -1, "__pFolderPathList is null.") + IEnumerator* pEnum = __pFolderPathList->GetEnumeratorN(); + + if (pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pFolderPath = static_cast(pEnum->GetCurrent()); + AppLogDebug("%ls", pFolderPath->GetPointer()); + if (path.Equals(*pFolderPath)) + { + return index; + } + index++; + } + + delete pEnum; + } + return -1; +} + +void +FolderListPresentationModel::AddContent(String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + if (pContentInfoStruct != null) + { + pPlayList->AddItem(pContentInfoStruct->contentId); + delete pContentInfoStruct; + } + + delete pPlayList; + AppLogDebug("EXIT"); +} + +result +FolderListPresentationModel::UpdateFolderPathList(void) +{ + AppLogDebug("ENTER"); + if (__pFolderPathList != null) + { + __pFolderPathList->RemoveAll(true); + delete __pFolderPathList; + } + + __pFolderPathList = ContentDirectoryPathList(); + result r = GetLastResult(); + if (__pFolderPathList == null) + { + r = E_FAILURE; + } + __currentFolderIndex = -1; + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return r; +} \ No newline at end of file diff --git a/src/MpFolderPickerPanel.cpp b/src/MpFolderPickerPanel.cpp new file mode 100644 index 0000000..8cf94b0 --- /dev/null +++ b/src/MpFolderPickerPanel.cpp @@ -0,0 +1,104 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFolderPickerPanel.cpp + * @brief This is the implementation file for FolderPickerPanel class. + */ + +#include "MpFolderPickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FolderPickerPanel::FolderPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FolderPickerPanel::~FolderPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +FolderPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + __pPresentationModel->UpdateFolderPathList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +FolderPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + } + + AppLogDebug("EXIT"); +} + +void +FolderPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + __pPresentationModel->InitializeContentList(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_CONTENT_PICKER)); + } + AppLogDebug("EXIT"); +} diff --git a/src/MpFormFactory.cpp b/src/MpFormFactory.cpp new file mode 100644 index 0000000..2028b80 --- /dev/null +++ b/src/MpFormFactory.cpp @@ -0,0 +1,308 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpFormFactory.cpp + * @brief This is the implementation file for FormFactory class. + */ + +#include "MpFormFactory.h" + +using namespace Tizen::Ui::Scenes; + +const wchar_t* IDC_PLAYER_FORM = L"PlayForm"; +const wchar_t* IDC_MUSIC_SETTING_FORM = L"SettingForm"; +const wchar_t* IDC_SEARCH_FORM = L"Search"; +const wchar_t* IDC_CONTENT_FORM = L"ContentForm"; +const wchar_t* IDC_CONTENT_PICKER_FORM = L"ContentPickerForm"; +const wchar_t* IDC_CONTENT_EDIT_FORM = L"ContentEditForm"; +const wchar_t* IDC_ALBUM_CONTENT_LIST_FORM = L"AlbumContentListForm"; +const wchar_t* IDC_ARTIST_CONTENT_LIST_FORM = L"ArtistContentListForm"; +const wchar_t* IDC_GENRE_CONTENT_LIST_FORM = L"GenreContentListForm"; +const wchar_t* IDC_COMPOSER_CONTENT_LIST_FORM = L"ComposerContentListForm"; +const wchar_t* IDC_YEAR_CONTENT_LIST_FORM = L"YearContentListForm"; +const wchar_t* IDC_FOLDER_CONTENT_LIST_FORM = L"FolderContentListForm"; +const wchar_t* IDC_PLAYLIST_CONTENT_LIST_FORM = L"PlayListContentListForm"; +const wchar_t* IDC_PLAYLIST_CREATOR_FORM = L"PlaylistCreatorForm"; +const wchar_t* IDC_PLAYLIST_RENAME_FORM = L"PlaylistReNameForm"; +const wchar_t* IDC_USER_PLAYLIST_CONTENT_LIST_FORM = L"UserPlaylistContentListForm"; +const wchar_t* IDC_CONTENT_DETAIL_FORM = L"ContentDetailForm"; +const wchar_t* IDC_ARTIST_ALBUM_LIST_FORM = L"ArtistAlbumListForm"; +const wchar_t* IDC_ARTIST_ALBUM_LIST_SEARCH_FORM = L"ArtistAlbumListSearchForm"; +const wchar_t* IDC_ARTIST_ALBUM_LIST_EDIT_FORM = L"ArtistAlbumListEditorForm"; +const wchar_t* IDC_ARTIST_ALL_SONG_LIST_FORM = L"ArtistAllSongListForm"; + +FormFactory::FormFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +FormFactory::~FormFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::Form* +FormFactory::CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + AppLogDebug("ENTER"); + Tizen::Ui::Controls::Form* pNewForm = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (formId == IDC_PLAYER_FORM) + { + PlayerForm* pForm = new (std::nothrow) PlayerForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_MUSIC_SETTING_FORM) + { + SettingForm* pForm = new (std::nothrow) SettingForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_CONTENT_FORM) + { + ContentForm* pForm = new (std::nothrow) ContentForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDC_CONTENT_PICKER_FORM) + { + ContentForm* pForm = new (std::nothrow) ContentForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == IDC_SEARCH_FORM) + { + SearchForm* pForm = new (std::nothrow) SearchForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_ALBUM_CONTENT_LIST_FORM) + { + AlbumContentListForm* pForm = new (std::nothrow) AlbumContentListForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_ARTIST_CONTENT_LIST_FORM) + { + ArtistContentListForm* pForm = new (std::nothrow) ArtistContentListForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } +// else if (formId == IDC_GENRE_CONTENT_LIST_FORM) +// { +// GenreContentListForm* pForm = new (std::nothrow) GenreContentListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } +// else if (formId == IDC_COMPOSER_CONTENT_LIST_FORM) +// { +// ComposerContentListForm* pForm = new (std::nothrow) ComposerContentListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } +// else if (formId == IDC_YEAR_CONTENT_LIST_FORM) +// { +// YearContentListForm* pForm = new (std::nothrow) YearContentListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } + else if (formId == IDC_FOLDER_CONTENT_LIST_FORM) + { + FolderContentListForm* pForm = new (std::nothrow) FolderContentListForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_PLAYLIST_CONTENT_LIST_FORM) + { + PlaylistContentListForm* pForm = new (std::nothrow) PlaylistContentListForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_PLAYLIST_CREATOR_FORM) + { + PlaylistCreatorForm* pForm = new (std::nothrow) PlaylistCreatorForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_PLAYLIST_RENAME_FORM) + { + PlaylistReNameForm* pForm = new (std::nothrow) PlaylistReNameForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + else if (formId == IDC_CONTENT_DETAIL_FORM) + { + ContentDetailForm* pForm = new (std::nothrow) ContentDetailForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } +// else if (formId == IDC_ARTIST_ALBUM_LIST_FORM) +// { +// ArtistAlbumListForm* pForm = new (std::nothrow) ArtistAlbumListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } +// else if (formId == IDC_ARTIST_ALBUM_LIST_SEARCH_FORM) +// { +// ArtistAlbumListForm* pForm = new (std::nothrow) ArtistAlbumListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } +// else if (formId == IDC_ARTIST_ALBUM_LIST_EDIT_FORM) +// { +// ArtistAlbumListEditorForm* pForm = new (std::nothrow) ArtistAlbumListEditorForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } +// else if (formId == IDC_ARTIST_ALL_SONG_LIST_FORM) +// { +// ArtistAllSongListForm* pForm = new (std::nothrow) ArtistAllSongListForm(); +// if (pForm == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pForm->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pForm); +// pNewForm = pForm; +// } + else if (formId == IDC_USER_PLAYLIST_CONTENT_LIST_FORM) + { + UserPlaylistContentListForm* pForm = new (std::nothrow) UserPlaylistContentListForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + AppLogDebug("EXIT"); + return pNewForm; +} diff --git a/src/MpGenreContentListForm.cpp b/src/MpGenreContentListForm.cpp new file mode 100644 index 0000000..2bfefea --- /dev/null +++ b/src/MpGenreContentListForm.cpp @@ -0,0 +1,916 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreContentListForm.cpp + * @brief This is the implementation file for GenreContentListForm class. + */ +#if 0 +#include +#include "MpGenreContentListForm.h" +#include "MpGenreListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int X_OFFSET_EDIT_STYLE_TABLE_VIEW = 96; + +static const Tizen::Graphics::Rectangle RECT_GENRE_ITEM_THUMBNAIL (16, 8, 112, 112); +static const Tizen::Graphics::Rectangle RECT_GENRE_ITEM_TITLE_NAME (144, 8, 300, 66); +static const Tizen::Graphics::Rectangle RECT_GENRE_ITEM_TIME (444, 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_GENRE_ITEM_ARTIST_NAME (144, 66, 560, 46); + +static const Tizen::Graphics::Rectangle RECT_GENRE_EDIT_ITEM_TITLE_NAME (144, 8, (300 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 66); +static const Tizen::Graphics::Rectangle RECT_GENRE_EDIT_ITEM_TIME ((444 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_GENRE_EDIT_ITEM_ARTIST_NAME (144, 66, (560 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 46); + + +GenreContentListForm::GenreContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pThumbnail(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenreContentListForm::~GenreContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +GenreContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + CreateTableview(); + CreateSelectAllCheckedButton(); + CreateCheckedCountLabel(); + CreateNoContentImage(L"IDS_MUSIC_HEADER_NO_SONGS"); + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(GetClientAreaBounds().width, ITEM_HEIGHT)); + CreateTableViewContextItem(*__pContextItem); + CreateDeletePopup(); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +GenreContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __checkedItemCount = 0; + RemovePlayListPicker(); + + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +GenreContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + __pStrSceneId = static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME)); + __pStrContentName = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME)); + __currentContentIndex = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + __pPresentationModel = GenreListPresentationModel::GetInstance(); + __pPresentationModel->UpdateGnereList(); + __pPresentationModel->InitializeContentList(__currentContentIndex); + } + else + { + // Empty statement + } + + ContentInformation* pContentInfo = null; + pContentInfo = __pPresentationModel->GetContentInfoN(0); + if (pContentInfo == null) + { + return; + } + + InitializeHeader(*pContentInfo); + if (__checkEdit == true) + { + Footer* pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + } + else + { + Footer* pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + } + __pContentTableView->UpdateTableView(); + + delete pContentInfo; + pContentInfo = null; + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + AppAssert(pSceneManager); + switch (actionId) + { + case IDA_FLICK_BUTTON_SHARE: + // fall through + case IDA_FLICK_BUTTON_SET: + { + CreateContextMenu(source); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + ContentInformation* pContentInfo; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + + delete pContentInfo; + pContentInfo = null; + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + } + break; + + case IDA_FLICK_BUTTON_DELETE: + { + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + } + } + break; + + case IDA_DELETE_POPUP_DELETE: + // fall through + case IDA_DELETE_POPUP_CANCEL: + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + if (actionId == IDA_DELETE_POPUP_DELETE && __pPresentationModel != null) + { + ContentManager contentManager; + contentManager.Construct(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + contentManager.DeleteContent(pContentInfo->contentId); + Footer* pFooter = GetFooter(); + + delete pContentInfo; + pContentInfo = null; + + __pPresentationModel->RefreshContentList(__currentContentIndex); + + if (__pPresentationModel->GetContentCount(__currentContentIndex) <= INIT_VALUE) + { + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_EDIT_FOOTER_EDIT, false); + pFooter->Invalidate(true); + } + + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } + } + break; + + case IDA_SHARE_CONTEXT_MENU_EMAIL: + // fall through + case IDA_SHARE_CONTEXT_MENU_MESSAGE: + { + String providerID = ((actionId == IDA_SHARE_CONTEXT_MENU_EMAIL) ? PROVIDER_ID_EMAIL : PROVIDER_ID_MESSAGE); + AppControl* pAppControl = AppManager::FindAppControlN(providerID, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + return; + } + + ContentInformation* pContentInfo = null; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_ATTACHMENTS), new (std::nothrow) String(pContentInfo->ContentFilePath)); + + pAppControl->Start(null, null, pDataList, this); + + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + + delete pContentInfo; + pContentInfo = null; + } + break; + + case IDA_SET_CONTEXT_MENU_CALL: + { + result r = E_SUCCESS; + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + r = SettingInfo::SetValue(CALL_RINGTONE_KEY, pContentInfo->ContentFilePath); + + delete pContentInfo; + pContentInfo = null; + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + } + break; + + case IDA_SET_CONTEXT_MENU_CALLER: + { + AppControl* pAppControl = AppManager::FindAppControlN(TIZEN_APPCONTROL_PROVIDER_CONTACT, TIZEN_APPCONTROL_OPERATION_PICK); + if (pAppControl == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SINGLE_MODE), new (std::nothrow) String(APPCONTROL_VALUE_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_RETURNTYPE), new (std::nothrow) String(APPCONTROL_VALUE_CONTACTID)); + + pAppControl->Start(null, null, pDataList, this); + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + } + break; + + case IDA_FOOTER_BUTTON_EDIT: + { + ToggleViewMode(false); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + __checkedItemCount = INIT_VALUE; + __pSelectAllCheckedButton->SetSelected(false); + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + ToggleViewMode(true); + } + break; + + case IDA_CHECK_BUTTON: + { + __checkedItemCount = __pPresentationModel->GetContentCount(__currentContentIndex); + if (__checkedItemCount > INIT_VALUE) + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + } + CommonUtil::SetAllCheckState(true, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_UNCHECK_BUTTON: + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + int iCount = 0; + + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + pFooter->Invalidate(true); + + contentManager.Construct(); + for (iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pContentTableView->SetItemChecked(iCount,false); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + contentManager.DeleteContent(pContentInfo->contentId); + + delete pContentInfo; + pContentInfo = null; + } + } + __pPresentationModel->RefreshContentList(__currentContentIndex); + __pContentTableView->UpdateTableView(); + __pContentTableView->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + + if (__pPresentationModel->GetContentCount(__currentContentIndex) > 0) + { + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + } + else + { + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pDataList->Construct(); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(L"attachment:" + pContentInfo->ContentFilePath))); + + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfo; + pContentInfo = null; + } + } + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + Invalidate(true); + + if (__pSharePopup == null) + { + __pSharePopup = new (std::nothrow) SharePopup(); + __pSharePopup->Initialize(); + } + __pSharePopup->SetShowState(true); + __pSharePopup->Show(); + __pSharePopup->SetArguments(pDataList); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + int totalCount = 0; + + if (__checkedItemCount <= 0) + { + return; + } + + pDataList->Construct(); + contentManager.Construct(); + totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + + pDataList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfo; + pContentInfo = null; + } + } + + if (IsFailed(CreatePlayListPickerPopup(pDataList))) + { + AppLogDebug("CreatePlayListPickerPopup failed(%s)", GetLastResult()); + return; + } + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + Invalidate(true); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +int +GenreContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__currentContentIndex); +} + +Tizen::Ui::Controls::TableViewItem* +GenreContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfo = null; + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + if (__checkEdit) + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); + } + else + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); + pItem->SetContextItem(__pContextItem); + } +// pItem->SetBackgroundColor(COLOR_WHITE); + + pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfo == null) + { + delete pItem; + pItem = null; + return null; + } + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) int(itemIndex))); + CreateTableViewItem(*pItem, *pContentInfo); + + delete pContentInfo; + pContentInfo = null; + + AppLogDebug("EXIT"); + return pItem; +} + +void +GenreContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + Footer* pFooter = GetFooter(); + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + if (__checkedItemCount == __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(true); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + Footer* pFooter = GetFooter(); + + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + + if (__checkedItemCount == INIT_VALUE) + { + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + } + + if (__checkedItemCount != __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(false); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_SELECTED: + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + ArrayList* tempArg; + AppAssert(pSceneManager); + tempArg = MakePlayerSceneParam(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), tempArg); + + if (tempArg != null) + { + tempArg->RemoveAll(); + delete tempArg; + tempArg = null; + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +GenreContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + ArrayList* pSelectedMusicContent = null; + + pSelectedMusicContent = __pPresentationModel->GetContentPathListN(__currentContentIndex); + if (pTempList == null || pSelectedMusicContent == null) + { + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pSelectedMusicContent)); + + AppLogDebug("EXIT"); + return pTempList; +} + +result +GenreContentListForm::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + Rectangle rectTitleName; + Rectangle rectPlayTime; + Rectangle rectArtistName; + + if (__checkEdit) + { + rectTitleName = RECT_GENRE_EDIT_ITEM_TITLE_NAME; + rectArtistName = RECT_GENRE_EDIT_ITEM_ARTIST_NAME; + rectPlayTime = RECT_GENRE_EDIT_ITEM_TIME; + } + else + { + rectTitleName = RECT_GENRE_ITEM_TITLE_NAME; + rectArtistName = RECT_GENRE_ITEM_ARTIST_NAME; + rectPlayTime = RECT_GENRE_ITEM_TIME; + } + + Label* pThumbnailLabel = new (std::nothrow) Label(); + pThumbnailLabel->Construct(RECT_GENRE_ITEM_THUMBNAIL, L""); + pThumbnailLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pThumbnailLabel->SetBackgroundBitmap(*GetDefaultThumbnail()); + pThumbnailLabel->SetName(L"ThumbnailLabel"); + + Label* pTitleLabel = new (std::nothrow) Label(); + pTitleLabel->Construct(rectTitleName, L""); + pTitleLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTitleLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pTitleLabel->SetText(contentInfo.TitleName); + + Label* pArtistNameLabel = new (std::nothrow) Label(); + pArtistNameLabel->Construct(rectArtistName, L""); + pArtistNameLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pArtistNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pArtistNameLabel->SetText(contentInfo.ArtistName); + + Label* pTimeLabel = new (std::nothrow) Label(); + pTimeLabel->Construct(rectPlayTime, L""); + pTimeLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pTimeLabel->SetText(CommonUtil::GetFormatDate(contentInfo.Duration)); + + parent.AddControl(pThumbnailLabel); + parent.AddControl(pTitleLabel); + parent.AddControl(pArtistNameLabel); + parent.AddControl(pTimeLabel); + AppLogDebug("EXIT"); + return r; +} + +void +GenreContentListForm::ToggleViewMode(bool editMode) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + + if (editMode) + { + int currentAlbumContentCount = 0; + currentAlbumContentCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + + if ( currentAlbumContentCount > INIT_VALUE) + { + SetTitleText(__strHeaderName); + } + else + { + SetTitleText("No songs"); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_FOOTER_EDIT, false); + } + + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + + __checkEdit = false; + __pContentTableView->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height)); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + else + { + SetTitleText(ResourceManager::GetString("IDS_COM_BODY_EDIT")); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + + pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + + __pSelectAllCheckedButton->SetEnabled(true); + __pSelectAllCheckedButton->SetShowState(true); + + __checkEdit = true; + __pContentTableView->SetBounds(Rectangle(0, __pSelectAllCheckedButton->GetHeight(), GetClientAreaBounds().width, (GetClientAreaBounds().height - __pSelectAllCheckedButton->GetHeight()))); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + + AppLogDebug("appId(%ls), operationId(%ls)", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(TIZEN_APPCONTROL_PROVIDER_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + const String* pContactId = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_RETURNTYPE))); + if (pContactId->Equals(APPCONTROL_VALUE_CONTACTID, true)) + { + const String* pResultString = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_VALUE))); + + AppLogDebug("%ls", pResultString->GetPointer()); + int contactId; + Integer::Parse(*pResultString, contactId); + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + } + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +GenreContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"ThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} +#endif diff --git a/src/MpGenreContentPickerPanel.cpp b/src/MpGenreContentPickerPanel.cpp new file mode 100644 index 0000000..e65116a --- /dev/null +++ b/src/MpGenreContentPickerPanel.cpp @@ -0,0 +1,345 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreContentPickerPanel.cpp + * @brief This is the implementation file for GenreContentPickerPanel class. + */ + +#include "MpGenreContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +GenreContentPickerPanel::GenreContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenreContentPickerPanel::~GenreContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +GenreContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +GenreContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = GenreListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +GenreContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +GenreContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentGenreIndex()); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentGenreIndex()); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +GenreContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + __pPresentationModel->UpdateGnereList(); + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +GenreContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + AppLogDebug("EXIT"); +} + +int +GenreContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentGenreIndex()); +} + +Tizen::Ui::Controls::TableViewItem* +GenreContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +GenreContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +GenreContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +GenreContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +GenreContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentGenreIndex())) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +GenreContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +GenreContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpGenreListEditorPanel.cpp b/src/MpGenreListEditorPanel.cpp new file mode 100644 index 0000000..2b44dd4 --- /dev/null +++ b/src/MpGenreListEditorPanel.cpp @@ -0,0 +1,419 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListEditorPanel.cpp + * @brief This is the implementation file for GenreListEditorPanel class. + */ + +#include "MpGenreListEditorPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +GenresListEditorPanel::GenresListEditorPanel(void) + : ThumbnailBase::ThumbnailBase() + , __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) + , __pThumbnail(null) + , __pPlayListPickerPopup(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenresListEditorPanel::~GenresListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +GenresListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = BasePanel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +GenresListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = GenreListPresentationModel::GetInstance(); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +GenresListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +GenresListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllGenreCount(); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + + int totalCount = __pPresentationModel->GetAllGenreCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pDataList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + UpdateContentList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + int totalCount = __pPresentationModel->GetAllGenreCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +GenresListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllGenreCount(); +} + +Tizen::Ui::Controls::TableViewItem* +GenresListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetGenreInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateEditListTableViewItem(*pItem, *GetDefaultThumbnail(), pContentInfoStruct->GenreName, __pPresentationModel->GetContentCount(itemIndex)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +GenresListEditorPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +GenresListEditorPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +GenresListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch(status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetAllGenreCount()) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateGnereList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +GenresListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpGenreListPanel.cpp b/src/MpGenreListPanel.cpp new file mode 100644 index 0000000..a4f8179 --- /dev/null +++ b/src/MpGenreListPanel.cpp @@ -0,0 +1,495 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListPanel.cpp + * @brief This is the implementation file for GenreListPanel class. + */ + +#include "MpGenreListPanel.h" +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +GenreListPanel::GenreListPanel(void) + : ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __pNowPlayContentPanel(null) + , __pPlayListPickerPopup(null) + , __pContextItem(null) + , __pContentTableView(null) + , __pNoContentImageLabel(null) + , __pNoContentTextLabel(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenreListPanel::~GenreListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +GenreListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = BasePanel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +GenreListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateTableView(width, height); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + + __pNoContentImageLabel = new (std::nothrow) Label(); + __pNoContentImageLabel->Construct(Rectangle((pForm->GetWidth() - W_NO_CONTENT) / 2, Y_GAP_NO_CONTENT, W_NO_CONTENT, H_NO_CONTENT), L""); + __pNoContentImageLabel->SetBackgroundBitmap(*(ResourceManager::GetBitmapN(IDB_NO_CONTENTS))); + + __pNoContentTextLabel = new (std::nothrow) Label(); + __pNoContentTextLabel->Construct(Rectangle(0, + __pNoContentImageLabel->GetHeight() + __pNoContentImageLabel->GetY(), + pForm->GetWidth(), + H_TEXT_NO_CONTENT), + ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pNoContentTextLabel->SetTextConfig(FONT_SIZE_NO_CONTENT, LABEL_TEXT_STYLE_BOLD); + + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(width, ITEM_HEIGHT)); + CommonUtil::CreateTableViewContextItem(*__pContextItem, *this); + + AddControl(__pNoContentImageLabel); + AddControl(__pNoContentTextLabel); + AddControl(__pContentTableView); + + __pPresentationModel = GenreListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +GenreListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +GenreListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__pPresentationModel->GetAllGenreCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS"), MSGBOX_STYLE_NONE, 500); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_GENRE_LIST_EDITOR)); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, __pPresentationModel->GetContentPathListN(__itemIndex)); + //__pPlayListPickerPopup->SetCollectedContent(__pPresentationModel->GetContentPathListN(__itemIndex)); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (CommonUtil::GetAddtoPlaylistState() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + CommonUtil::SetAddtoPlaylistState(false); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + + Footer* pFooter = CommonUtil::CreateContentListFooter(*pForm); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + + UpdateContentList(); + if (__pPresentationModel != null) + { + int totalGenreCount = __pPresentationModel->GetAllGenreCount(); + CommonUtil::SetButtonEnabled(*pForm, totalGenreCount, IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + +// CommonUtil::ShowNoContentImage(totalGenreCount, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +GenreListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllGenreCount(); +} + +Tizen::Ui::Controls::TableViewItem* +GenreListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetGenreInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); +// pItem->SetBackgroundColor(COLOR_ITEM); + +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateTableViewItem(*pItem, *GetDefaultThumbnail(), pContentInfoStruct->GenreName, __pPresentationModel->GetContentCount(itemIndex)); + pItem->SetContextItem(__pContextItem); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +GenreListPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +GenreListPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +GenreListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (itemIndex >= INIT_VALUE) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_GENRE_CONTENT_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE), + GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +GenreListPanel::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetGenreInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + String genreName = pContentInfoStruct->GenreName; + genreName = CommonUtil::SpecialReplaceChange(genreName); + genreName = CommonUtil::MakeQuery(STRING_SORT_GENRE, genreName); + + ArrayList* pRetList = new (std::nothrow) ArrayList(); + pRetList->Construct(); + + pRetList->Add(*(new (std::nothrow) String(IDSCN_GENRE_LIST))); + pRetList->Add(*(new (std::nothrow) String(genreName))); + pRetList->Add(*(new (std::nothrow) Integer(itemIndex))); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pRetList; +} + +void +GenreListPanel::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + AppLogDebug("ENTER"); + int totalCount = __pPresentationModel->GetAllGenreCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + String* pName = __pPresentationModel->GetGenreName(iCount); + String firstCharacter; + + pName->SubString(0, 1, firstCharacter); + firstCharacter.ToUpper(); + + mchar language; + firstCharacter.GetCharAt(0, language); + + if (Character::GetUnicodeCategory(language) == UNICODE_HANGUL) + { + Tizen::Base::String HangulIndex[] = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ" , "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + + wchar_t songName; + pName->GetCharAt(0, songName); + + wchar_t UnicodeValue = (songName - 0xAC00); + wchar_t InitialConsonant = ((UnicodeValue - (UnicodeValue % 28)) / 28) / 21; + int tempIndex = static_cast(InitialConsonant); + + if (HangulIndex[tempIndex].CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + else if (index.CompareTo("0") == 0 && Character::IsDigit(language) == true) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + else if (firstCharacter.CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +GenreListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateGnereList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +GenreListPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +GenreListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpGenreListPresentationModel.cpp b/src/MpGenreListPresentationModel.cpp new file mode 100644 index 0000000..d876d67 --- /dev/null +++ b/src/MpGenreListPresentationModel.cpp @@ -0,0 +1,304 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenreListPresentationModel.cpp + * @brief This is the implementation file for GenreListPresentationModel class. + */ + +#include "MpGenreListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +GenreListPresentationModel* GenreListPresentationModel::pGenreListPresentationModelInstance = null; + +GenreListPresentationModel* +GenreListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pGenreListPresentationModelInstance == null) + { + pGenreListPresentationModelInstance = new (std::nothrow) GenreListPresentationModel(); + TryReturn(pGenreListPresentationModelInstance != null, null, "GenreListPresentationModel instance is not created."); + + result r = pGenreListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "GenreListPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pGenreListPresentationModelInstance; + +CATCH: + delete pGenreListPresentationModelInstance; + return null; +} + +GenreListPresentationModel::GenreListPresentationModel(void) + : __pGnereList(null) + , __pContentList(null) + , __currentGenreIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenreListPresentationModel::~GenreListPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +GenreListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + if (__pGnereList != null) + { + __pGnereList->RemoveAll(true); + delete __pGnereList; + } + + __pGnereList = CommonUtil::SearchContentList(STRING_SORT_GENRE); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +int +GenreListPresentationModel::GetContentCount(int genreIndex) +{ + AppLogDebug("ENTER"); + int totalCount = INIT_VALUE; + if (__pGnereList == null) + { + return INIT_VALUE; + } + + if ((__pContentList != null) && (__currentGenreIndex == genreIndex)) + { + totalCount = __pContentList->GetCount(); + } + else + { + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pGnereList->GetAt(genreIndex))), STRING_SORT_GENRE, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + totalCount = pContentSearchResultList->GetCount(); + + pContentSearchResultList->RemoveAt(true); + delete pContentSearchResultList; + } + AppLogDebug("EXIT"); + return totalCount; +} + +int +GenreListPresentationModel::GetAllGenreCount(void) +{ + AppLogDebug("ENTER"); + if (__pGnereList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pGnereList->GetCount(); +} + +ContentInformation* +GenreListPresentationModel::GetGenreInfoN(int genreIndex) +{ + AppLogDebug("ENTER"); + if (__pGnereList == null) + { + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pGnereList->GetAt(genreIndex))), STRING_SORT_GENRE, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +Tizen::Base::String* +GenreListPresentationModel::GetGenreName(int genreIndex) +{ + AppLogDebug("ENTER"); + if (__pGnereList == null) + { + return null; + } + + AppLogDebug("EXIT"); + return static_cast(__pGnereList->GetAt(genreIndex)); +} + +void +GenreListPresentationModel::InitializeContentList(int genreIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __currentGenreIndex = genreIndex; + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pGnereList->GetAt(genreIndex))), STRING_SORT_GENRE, STRING_SORT_TITLE); + AppLogDebug("EXIT"); +} + +ContentInformation* +GenreListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = null; + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(contentIndex)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInfoStruct = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +Tizen::Base::Collection::ArrayList* +GenreListPresentationModel::GetContentPathListN(int genreIndex) +{ + AppLogDebug("ENTER"); + if (__pGnereList == null) + { + AppLogDebug("EXIT"); + return null; + } + + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pGnereList->GetAt(genreIndex))), STRING_SORT_GENRE, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + int totalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + + pContentSearchResultList->RemoveAt(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentPath; +} + +void +GenreListPresentationModel::RefreshContentList(int genreIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pGnereList->GetAt(genreIndex))), STRING_SORT_GENRE, STRING_SORT_TITLE); + if (__pContentList != null && __pContentList->GetCount() == INIT_VALUE) + { + delete __pContentList; + __pContentList = null; + } + __currentGenreIndex = genreIndex; + AppLogDebug("EXIT"); +} + +int +GenreListPresentationModel::GetCurrentGenreIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentGenreIndex; +} + +void +GenreListPresentationModel::AddContent(Tizen::Base::String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + pPlayList->AddItem(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +result +GenreListPresentationModel::UpdateGnereList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pGnereList != null) + { + __pGnereList->RemoveAll(true); + delete __pGnereList; + } + + __pGnereList = CommonUtil::SearchContentList(STRING_SORT_GENRE); + TryCatch(__pGnereList != null, r = E_FAILURE, "__pGnereList is null"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} \ No newline at end of file diff --git a/src/MpGenrePickerPanel.cpp b/src/MpGenrePickerPanel.cpp new file mode 100644 index 0000000..f40c15e --- /dev/null +++ b/src/MpGenrePickerPanel.cpp @@ -0,0 +1,115 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpGenrePickerPanel.cpp + * @brief This is the implementation file for GenrePickerPanel class. + */ + +#include "MpGenrePickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +GenrePickerPanel::GenrePickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +GenrePickerPanel::~GenrePickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +GenrePickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + __pPresentationModel->UpdateGnereList(); +// CommonUtil::ShowNoContentImage(__pPresentationModel->GetAllGenreCount(), *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +GenrePickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + if (pFooter != null) + { + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + } + + AppLogDebug("EXIT"); +} + +void +GenrePickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED && itemIndex >= 0) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + __pPresentationModel->InitializeContentList(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_GENRE_CONTENT_PICKER)); + } + AppLogDebug("EXIT"); +} diff --git a/src/MpMainFrame.cpp b/src/MpMainFrame.cpp new file mode 100644 index 0000000..63306cc --- /dev/null +++ b/src/MpMainFrame.cpp @@ -0,0 +1,144 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMainFrame.cpp + * @brief This is the implementation file for MainFrame class. + */ + +#include "MpMainFrame.h" +#include "MpSceneRegister.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +//#define GO_TO_SCENE_AFTER_FRAME_MODE_FULL_SCREEN_ACTIVATED + +MainFrame::MainFrame(void) + : __pDataList(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +MainFrame::~MainFrame(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +MainFrame::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = SceneRegister::RegisterAllScenes(); + TryReturn(r == E_SUCCESS, r, "[%s] Scene registering Failed.", GetErrorMessage(r)); + + AddFrameEventListener(*this); + AppLogDebug("EXIT"); + return r; +} + +result +MainFrame::OnTerminating(void) +{ + AppLogDebug("ENTER"); + RemoveFrameEventListener(*this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +MainFrame::OnFrameActivated(const Tizen::Ui::Controls::Frame& source) +{ + AppLogDebug("ENTER"); +#ifdef GO_TO_SCENE_AFTER_FRAME_MODE_FULL_SCREEN_ACTIVATED + if (__sceneId != null) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->GoForward(ForwardSceneTransition(__sceneId), __pDataList); + } + + __sceneId.Clear(); + __pDataList = null; +#endif + AppLogDebug("EXIT"); +} + +void +MainFrame::OnFrameRestored(const Tizen::Ui::Controls::Frame& source) +{ + AppLogDebug("ENTER"); +#if 1 //def GO_TO_SCENE_AFTER_FRAME_MODE_FULL_SCREEN_ACTIVATED + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + pSceneManager->BringCurrentSceneToTop(); + Invalidate(true); +#endif + AppLogDebug("EXIT"); +} + +void +MainFrame::OnFrameTerminating(const Tizen::Ui::Controls::Frame& source) +{ + AppLogDebug("ENTER"); +#ifdef GO_TO_SCENE_AFTER_FRAME_MODE_FULL_SCREEN_ACTIVATED + if (__pDataList != null) + { + __pDataList->RemoveAll(); + delete __pDataList; + __pDataList = null; + } + __sceneId.Clear(); +#endif + AppLogDebug("EXIT"); +} + +result +MainFrame::GoToInitialScene(const Tizen::Ui::Scenes::SceneId& sceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs == null) + { + AppLogDebug("GoToInitialScene pArgs is null(%ls)", sceneId.GetPointer()); + } + else + { + AppLogDebug("GoToInitialScene pArgs is not null(%ls)", sceneId.GetPointer()); + } +#ifdef GO_TO_SCENE_AFTER_FRAME_MODE_FULL_SCREEN_ACTIVATED + if (GetShowMode() != FRAME_SHOW_MODE_FULL_SCREEN) + { + __sceneId = sceneId; + __pDataList = pArgs; + return E_SUCCESS; + } +#endif + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + result r = pSceneManager->GoForward(ForwardSceneTransition(sceneId), pArgs); + TryReturn(r == E_SUCCESS, r, "[%s] Scene transition Failed.", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return r; +} diff --git a/src/MpMiniPlayer.cpp b/src/MpMiniPlayer.cpp new file mode 100644 index 0000000..ff4461e --- /dev/null +++ b/src/MpMiniPlayer.cpp @@ -0,0 +1,871 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMiniPlayer.cpp + * @brief This is the implementation file for MiniPlayer class. + */ + +#include "MpContentPanel.h" +#include "MpMiniPlayer.h" +#include "MpMusicPlayerApp.h" +#include "MpResourceManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int IDA_PLAY_CONTROL_TOGGLE_BUTTON = 1000; +static const int PROGRESS_MAX_VALUE = 100; + +static const wchar_t* IDB_PLAY_BUTTON_ICON_NORMAL = L"T02_mini_control_circle_icon_play.png"; +static const wchar_t* IDB_PLAY_BUTTON_ICON_PRESSED = L"T02_mini_control_circle_icon_play_press.png"; +static const wchar_t* IDB_PLAY_BUTTON_ICON_DISABLED = L"T02_mini_control_circle_icon_play_dim.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_NORMAL = L"T02_mini_control_circle_icon_pause.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_PRESSED = L"T02_mini_control_circle_icon_pause_press.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_DISABLED = L"T02_mini_control_circle_icon_pause_dim.png"; +static const wchar_t* IDB_MINIPLAYER_BACKGROUND = L"T02_mini_player_bg.png"; + +MiniPlayer::MiniPlayer(void) + : __pMsgTimer(null) + , __pMinPlayerPlayToggleButton(null) + , __pMinPlayerNextButton(null) + , __pMinPlayerPrevButton(null) + , __pThumbnailLabel(null) + , __pTitleLabel(null) + , __pArtistLabel(null) + , __pProgressBar(null) + , __pPresentationModel(null) + , __isLongPressed(false) + , __keyLongPressed(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +MiniPlayer::~MiniPlayer(void) +{ + AppLogDebug("ENTER"); + if (__pMsgTimer) + { + __pMsgTimer->Cancel(); + delete __pMsgTimer; + } + AppLogDebug("EXIT"); +} + +result +MiniPlayer::Construct(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Panel::Construct(IDL_MINI_PLYAER_PANEL))) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + __pPresentationModel = PlayerPresentationModel::GetInstance(); + if (__pPresentationModel == null) + { + AppLogDebug("PlayerPresentationModel::GetInstance() failed"); + return E_FAILURE; + } + + static_cast(GetControl(IDC_NOW_PLAYING_STATE))->SetShowState(false); + + __pThumbnailLabel = static_cast(GetControl(IDC_CONTENTS_THUMBNAIL)); + __pThumbnailLabel->AddTouchEventListener(*this); + + __pTitleLabel = static_cast(GetControl(IDC_CONTENTS_TITLE_NAME)); + __pArtistLabel = static_cast(GetControl(IDC_CONTENTS_ARTIST_NAME)); + + __pMinPlayerPlayToggleButton = static_cast(GetControl(IDC_PALY_TOGGLE_CONTROL_BUTTON)); + __pMinPlayerPlayToggleButton->SetActionId(IDA_PLAY_CONTROL_TOGGLE_BUTTON); + __pMinPlayerPlayToggleButton->AddActionEventListener(*this); + + __pMinPlayerPrevButton = static_cast(GetControl(IDC_PREVIOUS_CONTROL_BUTTON)); + __pMinPlayerPrevButton->AddTouchEventListener(*this); + __pMinPlayerPrevButton->AddKeyEventListener(*this); + __pMinPlayerPrevButton->AddFocusEventListener(*this); + + __pMinPlayerNextButton = static_cast(GetControl(IDC_NEXT_CONTROL_BUTTON)); + __pMinPlayerNextButton->AddTouchEventListener(*this); + __pMinPlayerNextButton->AddKeyEventListener(*this); + __pMinPlayerNextButton->AddFocusEventListener(*this); + + __pProgressBar = static_cast(GetControl(IDC_PROGRESS_BAR)); + __pProgressBar->SetRange(INIT_VALUE, PROGRESS_MAX_VALUE); + + Invalidate(true); + __pMsgTimer = new (std::nothrow) Timer(); + __pMsgTimer->Construct(*this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +bool +MiniPlayer::GetPlayStatus(void) +{ + AppLogDebug("ENTER"); + bool StatusDisplay = false; + if (__pPresentationModel->GetPlayerState() == PLAYER_STATE_PAUSED + || __pPresentationModel->GetPlayerState() == PLAYER_STATE_PLAYING + || __pPresentationModel->GetPlayerState() == PLAYER_STATE_OPENING) + { + StatusDisplay = true; + } + AppLogDebug("EXIT"); + return StatusDisplay; +} + +void +MiniPlayer::SetPlayButtonImage(void) +{ + AppLogDebug("ENTER"); + Point point(INIT_VALUE, INIT_VALUE); + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_NORMAL); + __pMinPlayerPlayToggleButton->SetNormalBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_PRESSED); + __pMinPlayerPlayToggleButton->SetPressedBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_DISABLED); + __pMinPlayerPlayToggleButton->SetDisabledBitmap(point, *pBitmap); + delete pBitmap; + + __pMinPlayerPlayToggleButton->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +MiniPlayer::SetPauseButtonImage(void) +{ + AppLogDebug("ENTER"); + Point point(INIT_VALUE, INIT_VALUE); + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_NORMAL); + __pMinPlayerPlayToggleButton->SetNormalBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_PRESSED); + __pMinPlayerPlayToggleButton->SetPressedBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_DISABLED); + __pMinPlayerPlayToggleButton->SetDisabledBitmap(point, *pBitmap); + delete pBitmap; + + __pMinPlayerPlayToggleButton->Invalidate(true); + AppLogDebug("EXIT"); +} + +//void +//MiniPlayer::DrawContentsTitleName(Tizen::Graphics::Canvas& canvas) +//{ +// AppLogDebug("ENTER"); +// EnrichedText* pEnrichedText = new (std::nothrow) EnrichedText(); +// result r = pEnrichedText->Construct(Dimension(498, 38)); +// if (IsFailed(r)) +// { +// AppLogDebug("Construct(Dimension(498, 38) failed(%s)", GetErrorMessage(r)); +// return; +// } +// +// pEnrichedText->SetHorizontalAlignment(TEXT_ALIGNMENT_LEFT); +// pEnrichedText->SetVerticalAlignment(TEXT_ALIGNMENT_MIDDLE); +// pEnrichedText->SetTextWrapStyle(TEXT_WRAP_CHARACTER_WRAP); +// pEnrichedText->SetTextAbbreviationEnabled(true); +// +// TextElement* pTextElement1 = new (std::nothrow) TextElement(); +// r = pTextElement1->Construct(__titleName); +// if (IsFailed(r)) +// { +// AppLogDebug("Construct(__titleName) failed(%s)", GetErrorMessage(r)); +// return; +// } +// +// pTextElement1->SetTextColor(Color::GetColor(COLOR_ID_BLACK)); +// Font font; +// font.Construct(FONT_STYLE_BOLD, 30); +// pTextElement1->SetFont(font); +// +// TextElement* pTextElement2 = new (std::nothrow) TextElement(); +// r = pTextElement2->Construct(__artistName); +// if (IsFailed(r)) +// { +// AppLogDebug("Construct(__titleName) failed(%s)", GetErrorMessage(r)); +// return; +// } +// +// pTextElement2->SetTextColor(Color32<128, 128, 128>::Value); +// Font fontArtist; +// font.Construct(FONT_STYLE_BOLD, 26); +// pTextElement2->SetFont(fontArtist); +// +// pEnrichedText->Add(*pTextElement1); +// pEnrichedText->Add(*pTextElement2); +// +// canvas.DrawText(Point(110, 55), *pEnrichedText); +// pEnrichedText->RemoveAll(true); +// delete pEnrichedText; +// AppLogDebug("EXIT"); +//} + +void +MiniPlayer::DrawBackground(Tizen::Graphics::Canvas& canvas) +{ + AppLogDebug("ENTER"); + Bitmap* backgroupBitmap = ResourceManager::GetBitmapN(IDB_MINIPLAYER_BACKGROUND); + canvas.Clear(); + canvas.DrawBitmap(GetBounds(), *backgroupBitmap); + delete backgroupBitmap; + AppLogDebug("EXIT"); +} + +result +MiniPlayer::OnDraw(void) +{ + AppLogDebug("ENTER"); + Canvas* pCanvas = GetCanvasN(); + if (pCanvas != null) + { + DrawBackground(*pCanvas); +// DrawContentsTitleName(*pCanvas); + delete pCanvas; + } + + AppLogDebug("EXIT"); + return Panel::OnDraw(); +} + +void +MiniPlayer::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + + if (__pPresentationModel == null) + { + AppLogDebug("__pPresentationModel is null"); + return; + } + + switch (actionId) + { + case IDA_PLAY_CONTROL_TOGGLE_BUTTON: + { + switch (__pPresentationModel->GetPlayerState()) + { + case PLAYER_STATE_PLAYING: + { + __pPresentationModel->Pause(); + } + break; + + default: + { + if(__pPresentationModel->GetPlayerState() == PLAYER_STATE_PAUSED) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), __pProgressBar->GetValue(), true); + } + else + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), __pProgressBar->GetValue(), false); + } + } + break; + } + } + break; + + default: + { + AppLogDebug("Unknown actionId(%d)", actionId); + } + break; + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnFocusGained(const Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnFocusLost(const Control& source) +{ + AppLogDebug("ENTER"); + if (source.Equals(*__pMinPlayerNextButton) || source.Equals(*__pMinPlayerPrevButton)) + { + if (__isLongPressed == true) + { + __pPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnTimerExpired(Timer& timer) +{ + if (timer.Equals(*__pMsgTimer)) + { + MessageBox messageBox; + int modalResult = 0; + if (__pPresentationModel->IsDuringCall()) + { + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_TO_PLAY_DURING_CALL"), MSGBOX_STYLE_NONE, 3000); + } + else + { + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_TO_PLAY_ERROR_OCCURRED"), MSGBOX_STYLE_NONE, 3000); + } + messageBox.ShowAndWait(modalResult); + } +} + +void +MiniPlayer::OnPlayStateChanged(Tizen::Media::PlayerState playerState) +{ + AppLogDebug("ENTER"); + if (playerState == PLAYER_STATE_PLAYING) + { + SetPauseButtonImage(); + AppLogDebug("EXIT"); + __pMinPlayerPlayToggleButton->SetEnabled(true); + __pProgressBar->SetEnabled(true); + return; + } + + SetPlayButtonImage(); + if (playerState == PLAYER_STATE_PAUSED || playerState == PLAYER_STATE_ERROR) + { + if (__pPresentationModel->IsDuringCall() == true) + { + __pMinPlayerPlayToggleButton->SetEnabled(false); + __pProgressBar->SetEnabled(false); + } + + if (playerState == PLAYER_STATE_ERROR) + { + __pMsgTimer->Cancel(); + SetContentInfo(__pPresentationModel->GetCurrentContentIndex()); + __pMinPlayerPlayToggleButton->SetEnabled(false); + __pProgressBar->SetEnabled(false); + __pMsgTimer->Start(MESSAGE_BOX_DELAY); + } + } + + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnPlayContentChanged(int currentContentIndex) +{ + AppLogDebug("ENTER %d", __pPresentationModel->GetPlayerState()); + SetContentInfo(currentContentIndex); + if ((__pMinPlayerPlayToggleButton->IsEnabled() == false) + && (__pPresentationModel->IsDuringCall() == false) + && (__pPresentationModel->GetPlayerState() != PLAYER_STATE_INITIALIZED)) + { + __pMinPlayerPlayToggleButton->SetEnabled(true); + __pProgressBar->SetEnabled(true); + } + else if (__pPresentationModel->IsDuringCall() == true) + { + __pMinPlayerPlayToggleButton->SetEnabled(false); + __pProgressBar->SetEnabled(false); + } + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition) +{ +// AppLogDebug("ENTER"); + __pProgressBar->SetValue(currentPosition); + __pProgressBar->Invalidate(true); +// AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnPlayVolumeBarStateChanged(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnPlayPresentationModelDestroying(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = null; + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnKeyPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnKeyReleased(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + + switch(keyCode) + { + case KEY_ENTER: + if (__isLongPressed == true) + { + __pPresentationModel->StopForwardRewind(); + __isLongPressed = false; + __keyLongPressed = false; + } + else if (!__keyLongPressed) + { + if (__pMinPlayerPrevButton->GetHashCode() == source.GetHashCode()) + { + if (__pPresentationModel->GetContentListCount() > 1) + { + while (__pPresentationModel->IsFileExist(__pPresentationModel->GetPreviousContentIndex()) == false + && __pPresentationModel->GetContentListCount() > 0) + { + __pPresentationModel->RemoveContent(*__pPresentationModel->GetContentPath(__pPresentationModel->GetPreviousContentIndex())); + } + } + + if (__pPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pPresentationModel->MovePreviousContent(true); + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT); + } + } + } + else if (__pMinPlayerNextButton->GetHashCode() == source.GetHashCode()) + { + if (__pPresentationModel->GetContentListCount() > 1) + { + while (__pPresentationModel->IsFileExist(__pPresentationModel->GetNextContentIndex()) == false + && __pPresentationModel->GetContentListCount() > 0) + { + __pPresentationModel->RemoveContent(*__pPresentationModel->GetContentPath(__pPresentationModel->GetNextContentIndex())); + } + } + + if (__pPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pPresentationModel->MoveNextContent(); + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT); + } + } + } + else + { + // Empty statement + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnKeyLongPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + switch(keyCode) + { + case KEY_ENTER: + if (__pMinPlayerPrevButton->GetHashCode() == source.GetHashCode() ) + { + __isLongPressed = true; + + if (__pMinPlayerPlayToggleButton->IsEnabled()) + { + __pPresentationModel->SeekToRewind(); + } + __keyLongPressed = true; + } + else if (__pMinPlayerNextButton->GetHashCode() == source.GetHashCode() ) + { + __isLongPressed = true; + + if(__pMinPlayerPlayToggleButton->IsEnabled()) + { + __pPresentationModel->SeekToForward(); + } + + __keyLongPressed = true; + AppLogDebug("__pMinPlayerNextButton"); + } + else + { + // Empty statement + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + AppLogDebug("__pPresentationModel is null"); + return; + } + + if (__pThumbnailLabel->GetHashCode() == source.GetHashCode() ) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); +#if 0 + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_MUSIC_SETTING, true)) + { + IListT* sceneList = pSceneManager->GetSceneHistoryN(); + + IEnumeratorT* pEnum = sceneList->GetEnumeratorN(); + SceneId sceneID; + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(sceneID); + + if (sceneID.Equals(SceneId(IDSCN_PLAYER)) == false) + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + delete pEnum; + delete sceneList; + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + else +#endif + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER)); + } + } +// else if (__pMinPlayerPrevButton->GetHashCode() == source.GetHashCode() +// || __pMinPlayerNextButton->GetHashCode() == source.GetHashCode()) +// { +// __isLongPressed = false; +// } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnTouchLongPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (__pMinPlayerPrevButton->GetHashCode() == source.GetHashCode() ) + { + __isLongPressed = true; + + if (__pMinPlayerPlayToggleButton->IsEnabled()) + { + __pPresentationModel->SeekToRewind(); + } + } + else if (__pMinPlayerNextButton->GetHashCode() == source.GetHashCode() ) + { + __isLongPressed = true; + + if(__pMinPlayerPlayToggleButton->IsEnabled()) + { + __pPresentationModel->SeekToForward(); + } + AppLogDebug("__pMinPlayerNextButton"); + } + else + { + // Empty statement + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (__isLongPressed == true) + { + __pPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + else + { + if (__pMinPlayerPrevButton->GetHashCode() == source.GetHashCode()) + { + if (__pPresentationModel->GetContentListCount() > 1) + { + while (__pPresentationModel->IsFileExist(__pPresentationModel->GetPreviousContentIndex()) == false + && __pPresentationModel->GetContentListCount() > 0) + { + __pPresentationModel->RemoveContent(*__pPresentationModel->GetContentPath(__pPresentationModel->GetPreviousContentIndex())); + } + } + + if (__pPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pPresentationModel->MovePreviousContent(true); + String* currentPlayConent = __pPresentationModel->GetPlayContentPath(); + String* ContentPath = __pPresentationModel->GetContentPath(__pPresentationModel->GetCurrentContentIndex()); + + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED + && (__pPresentationModel->IsDuringCall() == false) + && (__pPresentationModel->GetPlayerState() != PLAYER_STATE_OPENED)) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT); + } + else if (!currentPlayConent->Equals(*ContentPath,true)) + { + __pProgressBar->SetValue(0); + __pPresentationModel->SetPlayPosition(0); + + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED && + __pPresentationModel->GetPlayerState() != PLAYER_STATE_PLAYING ) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT,false,true); + __pPresentationModel->Pause(); + __pPresentationModel->Mute(false); + } + } + } + } + else if (__pMinPlayerNextButton->GetHashCode() == source.GetHashCode()) + { + if (__pPresentationModel->GetContentListCount() > 1) + { + while (__pPresentationModel->IsFileExist(__pPresentationModel->GetNextContentIndex()) == false + && __pPresentationModel->GetContentListCount() > 0) + { + __pPresentationModel->RemoveContent(*__pPresentationModel->GetContentPath(__pPresentationModel->GetNextContentIndex())); + } + } + + if (__pPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pPresentationModel->MoveNextContent(); + String* currentPlayConent = __pPresentationModel->GetPlayContentPath(); + String* ContentPath = __pPresentationModel->GetContentPath(__pPresentationModel->GetCurrentContentIndex()); + + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED + && (__pPresentationModel->IsDuringCall() == false) + && (__pPresentationModel->GetPlayerState() != PLAYER_STATE_OPENED)) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT); + } + else if (!currentPlayConent->Equals(*ContentPath,true)) + { + __pProgressBar->SetValue(0); + __pPresentationModel->SetPlayPosition(0); + + if (__pPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED && + __pPresentationModel->GetPlayerState() != PLAYER_STATE_PLAYING ) + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT,false,true); + __pPresentationModel->Pause(); + __pPresentationModel->Mute(false); + } + } + } + } + else + { + // Empty statement + } + } + AppLogDebug("EXIT"); +} + +void +MiniPlayer::OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (__isLongPressed == true) + { + __pPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + AppLogDebug("EXIT"); +} + + +result +MiniPlayer::MiniPlayerActivate(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + __pPresentationModel = PlayerPresentationModel::GetInstance(); + r = SetContentInfo(__pPresentationModel->GetCurrentContentIndex()); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return r; + } + + if (__pPresentationModel->IsDuringCall() == true || __pPresentationModel->GetPlayerState() == PLAYER_STATE_INITIALIZED + || __pPresentationModel->GetPlayerState() == PLAYER_STATE_ERROR) + { + __pMinPlayerPlayToggleButton->SetEnabled(false); + __pProgressBar->SetEnabled(false); + } + else if (__pMinPlayerPlayToggleButton->IsEnabled() == false) + { + __pMinPlayerPlayToggleButton->SetEnabled(true); + __pProgressBar->SetEnabled(true); + } + + switch (__pPresentationModel->GetPlayerState()) + { + case PLAYER_STATE_PLAYING: + { + SetPauseButtonImage(); + } + break; + + case PLAYER_STATE_PAUSED: + { + SetPlayButtonImage(); + } + break; + + default: + { + SetPlayButtonImage(); + } + break; + } + + __pProgressBar->SetValue(__pPresentationModel->GetPlayPosition()); + __pPresentationModel->AddMusicPlayerEventListener(*this); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +MiniPlayer::MiniPlayerDeactivate(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->RemoveMusicPlayerEventListener(*this); + } + AppLogDebug("EXIT"); +} + +result +MiniPlayer::SetContentInfo(int currentContentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(currentContentIndex); + if (pContentInfo == null) + { + String* pTitle = __pPresentationModel->GetPlayContentTitle(); + String* pArtist = __pPresentationModel->GetPlayContentArtist(); + Bitmap* pAlbumArt = __pPresentationModel->GetPlayContentThumbnail(); + + if (pTitle != null) + { + __pTitleLabel->SetText(*pTitle); + } + if (pArtist != null) + { + __pArtistLabel->SetText(*pArtist); + } + + if (pAlbumArt != null) + { + __pThumbnailLabel->SetBackgroundBitmap(*pAlbumArt); + } + + AppLogDebug("__pPlayerPresentationModel->GetContentInfoN is null"); + return E_SUCCESS; + } + + String miniPlayerAtritsName; + miniPlayerAtritsName.Append(L" - "); + miniPlayerAtritsName.Append(pContentInfo->ArtistName); + + __pTitleLabel->SetText(pContentInfo->TitleName); + __pArtistLabel->SetText(miniPlayerAtritsName); + + Bitmap* pAlbumArt = __pPresentationModel->GetContentAlbumArtN(currentContentIndex); + __pThumbnailLabel->SetBackgroundBitmap(*pAlbumArt); + delete pAlbumArt; + delete pContentInfo; + AppLogDebug("EXIT"); + return E_SUCCESS; +} diff --git a/src/MpMusicPlayerApp.cpp b/src/MpMusicPlayerApp.cpp new file mode 100644 index 0000000..b2cae26 --- /dev/null +++ b/src/MpMusicPlayerApp.cpp @@ -0,0 +1,692 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerApp.cpp + * @brief This is the implementation file for MusicPlayerApp class. + */ + +#include +#include "MpBaseForm.h" +#include "MpBasePanel.h" +#include "MpCommonUtil.h" +#include "MpIMusicContentUpdateEventListner.h" +#include "MpIFontChangeEventListener.h" +#include "MpMusicPlayerApp.h" +#include "MpMusicPlayerForm.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpThumbnailProvider.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const wchar_t* TIZEN_APPCONTORL_PROVIDER_AUDIO = L"http://tizen.org/appcontrol/provider/musicplayer"; +const wchar_t* TIZEN_APPCONTROL_OPERATION_PLAY = L"http://tizen.org/appcontrol/operation/play"; +const wchar_t* TIZEN_APPCONTROL_OPERATION_VIEW = L"http://tizen.org/appcontrol/operation/view"; +const wchar_t* TIZEN_APPCONTROL_OPERATION_CONFIGURE = L"http://tizen.org/appcontrol/operation/configure"; +static const wchar_t* TIZEN_APPCONTROL_DATA_PATH = L"http://tizen.org/appcontrol/data/path"; +static const wchar_t* TIZEN_FILE_PREFIX_DATA_PATH = L"file://"; +//const static Tizen::Base::String APPCONTROL_KEYFIELD_PATH = L"path"; +static const wchar_t* PARAM_LANGUAGE = L"http://tizen.org/setting/locale.language"; +static const wchar_t* PARAM_COUNTRY = L"http://tizen.org/setting/locale.country"; + +static const int TIMER_CONTENT_UPDATE_DELAY = 500; + +MusicPlayerApp::MusicPlayerApp(void) + : __sceneId(IDSCN_ALL_LIST) + , __pDataList(null) + , __pMainFrame(null) + , __pContentManager(null) + , __pContentUpdateCompleteTimer(null) + , __pContentUpdateInProgressPopup(null) + , __fontSize(FONT_MAIN_TEXT_SIZE_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +MusicPlayerApp::~MusicPlayerApp(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +UiApp* +MusicPlayerApp::CreateInstance(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return new (std::nothrow) MusicPlayerApp(); +} + +bool +MusicPlayerApp::OnAppInitializing(AppRegistry& appRegistry) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppControlProviderManager* pAppControlProviderManager = null; + + CommonUtil::SetValue(AUTO_OFF_LEVEL, 0); + + pAppControlProviderManager = AppControlProviderManager::GetInstance(); + TryCatch(pAppControlProviderManager != null, r = E_OBJ_NOT_FOUND, "Failed to get AppControlProviderManager"); + + r = pAppControlProviderManager->SetAppControlProviderEventListener(this); + TryCatch(r == E_SUCCESS, , "Failed SetAppControlProviderEventListener"); + + AppLogDebug("EXIT"); + return true; + +CATCH: + //AppLogException("[%s]",GetErrorMessage(r)); + return false; +} + +bool +MusicPlayerApp::OnAppInitialized(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + long long storage = 0; + __pMainFrame = new (std::nothrow) MainFrame(); + if (__pMainFrame == null) + { + AppLogDebug("EXIT"); + return false; + } + + __pContentManager = new (std::nothrow) ContentManager(); + r = __pContentManager->Construct(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "AddFrame failed.\n"); + + __pContentManager->AddContentUpdateEventListener(*this); + + __pContentUpdateCompleteTimer = new (std::nothrow) Timer(); + r = __pContentUpdateCompleteTimer->Construct(*this); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "AddFrame failed.\n"); + + __pMainFrame->Construct(); + r = AddFrame(*__pMainFrame); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "AddFrame failed.\n"); + + SettingInfo::AddSettingEventListener(*this); + SettingInfo::GetValue(PARAM_FONT_SIZE, __fontSize); + + if (__sceneId.IsEmpty()) + { + __sceneId = IDSCN_ALL_LIST; + } + r = __pMainFrame->GoToInitialScene(__sceneId, __pDataList); + if (r == E_SUCCESS) + { + __pDataList = null; + } + + r = RuntimeInfo::GetValue(PARAM_STORAGE_MEMORY_INTERNAL,storage); + + if (r == E_SUCCESS && storage < STORAGE_THRESHOLD_VALUE) + { + int messageResult = 0; + MessageBox messageBox; + messageBox.Construct(L"",IDS_STORAGE_FULL,MSGBOX_STYLE_NONE,COUNT_MESSAGE_BOX_TIMEOUT); + messageBox.ShowAndWait(messageResult); + Terminate(); + } + + AppLogDebug("EXIT"); + return true; + +CATCH: + delete __pContentUpdateCompleteTimer; + __pContentUpdateCompleteTimer = null; + delete __pContentManager; + __pContentManager = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return false; +} + +bool +MusicPlayerApp::OnAppWillTerminate(void) +{ + AppLogDebug("ENTER"); + if (__pContentManager != null) + { + __pContentManager->RemoveContentUpdateEventListener(*this); + } + + if (__pContentUpdateCompleteTimer != null) + { + __pContentUpdateCompleteTimer->Cancel(); + } + AppLogDebug("EXIT"); + return true; +} + +bool +MusicPlayerApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + AppLogDebug("ENTER"); + CommonUtil::SetValue(AUTO_OFF_LEVEL, 0); + /*if (__operationId.Equals(TIZEN_APPCONTROL_OPERATION_PLAY, true) + || __operationId.Equals(TIZEN_APPCONTROL_OPERATION_VIEW, true) + || __operationId.Equals(TIZEN_APPCONTROL_OPERATION_CONFIGURE, true)) + { + AppControlProviderManager::GetInstance()->SendAppControlResult(__requestId, APP_CTRL_RESULT_TERMINATED, null); + }*/ + ThumbnailProvider* pThumbnailProvider = dynamic_cast(ThumbnailProvider::GetInstance()); + if (pThumbnailProvider != null) + { + pThumbnailProvider->Quit(); + pThumbnailProvider->Join(); + pThumbnailProvider->DestroyInstance(); + } + + SettingInfo::RemoveSettingEventListener(*this); + + delete __pContentUpdateCompleteTimer; + __pContentUpdateCompleteTimer = null; + delete __pContentManager; + __pContentManager = null; + + AppLogDebug("EXIT"); + return true; +} + +void +MusicPlayerApp::OnForeground(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnBackground(void) +{ + AppLogDebug("ENTER"); + Frame* pFrame = GetFrameAt(0); + AppAssert(pFrame); + + if (pFrame->IsEnabled() == false) + { + pFrame->SetEnabled(true); + pFrame->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnLowMemory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnBatteryLevelChanged(BatteryLevel batteryLevel) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnScreenOn(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnScreenOff(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnSettingChanged(Tizen::Base::String& key) +{ + AppLogDebug("ENTER"); + if (key.Equals(PARAM_LANGUAGE, true) || key.Equals(PARAM_FONT_SIZE, true)) + { + UiApp* pApp = UiApp::GetInstance(); + pApp->Terminate(); + } +// else if (key.Equals(PARAM_FONT_SIZE, true)) +// { +// String fontSizeValue; +// SettingInfo::GetValue(PARAM_FONT_SIZE, fontSizeValue); +// +// if (!(fontSizeValue.Equals(__fontSize, false))) +// { +// int frameChildControlCount = __pMainFrame->GetControlCount(); +// for (int iCount = 0; iCount < frameChildControlCount; iCount++) +// { +// Form* pForm = dynamic_cast(__pMainFrame->GetControl(iCount)); +// if (pForm == null) +// { +// continue; +// } +// +// IFontChangeEventListner* pEventListner = dynamic_cast(pForm); +// if (pEventListner != null) +// { +// pEventListner->OnFontSizeChanged(); +// continue; +// } +// +// int formChildControlCount = pForm->GetControlCount(); +// for (int iCount = 0; iCount < formChildControlCount; iCount++) +// { +// IFontChangeEventListner* pEventListner = dynamic_cast(pForm->GetControl(iCount)); +// if (pEventListner != null) +// { +// pEventListner->OnFontSizeChanged(); +// } +// } +// } +// } +// } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, const Tizen::Base::String* pUriData, + const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData) +{ + AppLogDebug("ENTER"); +// result r = E_SUCCESS; +// TryCatch(__pDataList == null, r = E_OBJ_ALREADY_EXIST, "The application has already launched"); + + __requestId = reqId; + __operationId = operationId; + + if (operationId.Equals(TIZEN_APPCONTROL_OPERATION_PLAY, true) || operationId.Equals(TIZEN_APPCONTROL_OPERATION_VIEW, true)) + { + ParsingArgument(pUriData, pExtraData); + __sceneId = IDSCN_PLAYER; + } + else if (operationId.Equals(TIZEN_APPCONTROL_OPERATION_CONFIGURE, true)) + { + __sceneId = IDSCN_MUSIC_SETTING; + } + else + { + __sceneId = IDSCN_ALL_LIST; + } + + if (__pMainFrame != null) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + result r = E_FAILURE; + SceneId currentSceneId = pSceneManager->GetCurrentSceneId(); + if (__sceneId.Equals(IDSCN_PLAYER, false)) + { + + Scene* pScene = pSceneManager->GetCurrentScene(); + PlayerForm* pPlayerForm = static_cast(pScene->GetForm()); + if (currentSceneId.Equals(IDSCN_PLAYER, false)) + { + pPlayerForm->OnChangedContentListByAppControlN(__pDataList); + r = E_SUCCESS; + } + else if(pSceneManager->IsSceneAlive(IDSCN_PLAYER) && currentSceneId.Equals(IDSCN_CONTENT_DETAIL, false)) + { + r = pSceneManager->GoBackward(BackwardSceneTransition(IDSCN_PLAYER), __pDataList); + } + else + { + r = __pMainFrame->GoToInitialScene(__sceneId, __pDataList); + } + } + else + { + r = __pMainFrame->GoToInitialScene(__sceneId, __pDataList); + } + + if (r == E_SUCCESS) + { + __pDataList = null; + } + } + AppLogDebug("EXIT"); + return; +} + +void +MusicPlayerApp::ParsingArgument(const Tizen::Base::String* pUriData, const Tizen::Base::Collection::IMap* pArgs) +{ + AppLogDebug("ENTER"); + String sourceStr; + bool checkUriData = true; + + if (pArgs != null && pArgs->GetCount() > 0) + { + String keyMusicPath(TIZEN_APPCONTROL_DATA_PATH); + String original(TIZEN_FILE_PREFIX_DATA_PATH); + String replace(L""); + const ArrayList* pPathList = static_cast(pArgs->GetValue(keyMusicPath)); + + if (pPathList != null && pPathList->GetCount() > 0) + { + ArrayList* pContentPathArrayList = null; + checkUriData = false; + if (__pDataList != null) + { + __pDataList->RemoveAll(); + delete __pDataList; + } + + __pDataList = new (std::nothrow) ArrayList(); + __pDataList->Construct(); + pContentPathArrayList = new (std::nothrow) ArrayList(); + pContentPathArrayList->Construct(); + + for (int trackCount = 0; trackCount < pPathList->GetCount(); trackCount++) + { + const String* pTempPath = static_cast(pPathList->GetAt(trackCount)); + + if (pTempPath != null) + { + sourceStr.Clear(); + sourceStr.Append(*pTempPath); + sourceStr.Replace(original,replace); + AppLogDebug("pTempPath : %ls", pTempPath->GetPointer()); + pContentPathArrayList->Add((new (std::nothrow) String(sourceStr))); + } + } + + __pDataList->Add(pContentPathArrayList); + __pDataList->Add(new (std::nothrow) Integer(0)); + } + } + + if (checkUriData && pUriData != null) + { + String original(TIZEN_FILE_PREFIX_DATA_PATH); + String replace(L""); + + sourceStr.Append(*pUriData); + sourceStr.Replace(original, replace); + + if (__pDataList != null) + { + __pDataList->RemoveAll(); + delete __pDataList; + } + + __pDataList = new (std::nothrow) ArrayList(); + __pDataList->Construct(); + + ArrayList* pContentPathArrayList = new (std::nothrow) ArrayList(); + pContentPathArrayList->Construct(); + + AppLogDebug("sourceStr : %ls", sourceStr.GetPointer()); + pContentPathArrayList->Add((new (std::nothrow) String(sourceStr))); + + __pDataList->Add(pContentPathArrayList); + __pDataList->Add(new (std::nothrow) Integer(0)); + } + +/*For multiple file path*/ + +/* else if (pArgs != null && pArgs->GetCoun__pDataListt() > 0) + { + pContentPath = static_cast(pArgs->GetValue(APPCONTROL_KEYFIELD_PATH)); + } + else + { + return; + } + + ArrayList* pContentPathArrayList = new (std::nothrow) ArrayList(); + pContentPathArrayList->Construct(); + + if (pContentPath != null) + { + String token; + String delim(L";"); + + AppLogDebug("pContentPath : %ls", pContentPath->GetPointer()); + + if (__pDataList == null) + { + __pDataList = new (std::nothrow) ArrayList(); + __pDataList->Construct(); + } + else + { + __pDataList->RemoveAll(true); + } + + Tizen::Base::Utility::StringTokenizer PathStringTokenizer(*pContentPath, delim); + + while (PathStringTokenizer.HasMoreTokens()) + { + PathStringTokenizer.GetNextToken(token); +// if (File::IsFileExist(token)) + { + AppLogDebug("token : %ls", token.GetPointer()); + pContentPathArrayList->Add((new (std::nothrow) String(token))); + } + } + __pDataList->Add(pContentPathArrayList); + __pDataList->Add(*(new (std::nothrow) Integer(0))); + } +*/ + AppLogDebug("EXIT"); +} + +Tizen::Base::String +MusicPlayerApp::GetOperationId(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __operationId; +} + +RequestId +MusicPlayerApp::GetRequestId(void) +{ + return __requestId; +} + +void +MusicPlayerApp::ResetRequestId(void) +{ + __requestId = 0; +} + +void +MusicPlayerApp::OnContentFileCreated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_AUDIO && !IsFailed(r)) + { + ReStartContentUpdateTimer(); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnContentFileUpdated(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_AUDIO && !IsFailed(r)) + { + ReStartContentUpdateTimer(); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnContentFileDeleted(Tizen::Content::ContentId contentId, Tizen::Content::ContentType contentType, result r) +{ + AppLogDebug("ENTER"); + if (contentType == CONTENT_TYPE_AUDIO && !IsFailed(r)) + { + ReStartContentUpdateTimer(); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnContentDirectoryScanCompleted(const Tizen::Base::String& directoryPath, result r) +{ + AppLogDebug("ENTER"); + if (!IsFailed(r)) + { + ReStartContentUpdateTimer(); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::ReStartContentUpdateTimer(void) +{ + AppLogDebug("ENTER"); + if (__pContentUpdateCompleteTimer != null) + { + __pContentUpdateCompleteTimer->Cancel(); + __pContentUpdateCompleteTimer->Start(TIMER_CONTENT_UPDATE_DELAY); + ShowContentUpdateInProgressPopup(); + } + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::ShowContentUpdateInProgressPopup(void) +{ + AppLogDebug("ENTER"); + if (__pContentUpdateInProgressPopup != null) + { + AppLogDebug("EXIT"); + return; + } + + __pContentUpdateInProgressPopup = new (std::nothrow) Popup(); + result r = __pContentUpdateInProgressPopup->Construct(IDL_CONTENTS_UPDATE_POPUP); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + delete __pContentUpdateInProgressPopup; + return; + } + + __pContentUpdateInProgressPopup->SetShowState(true); + __pContentUpdateInProgressPopup->Show(); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::HideContentUpdateInProgressPopup(void) +{ + AppLogDebug("ENTER"); + if (__pContentUpdateInProgressPopup == null) + { + AppLogDebug("EXIT"); + return; + } + + __pContentUpdateInProgressPopup->SetShowState(false); + delete __pContentUpdateInProgressPopup; + __pContentUpdateInProgressPopup = null; + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::OnTimerExpired(Tizen::Base::Runtime::Timer& timer) +{ + AppLogDebug("ENTER"); + if (__pContentUpdateCompleteTimer != &timer) + { + AppLogDebug("EXIT(UnKnown Timer)"); + return; + } + + CallOnMusicContentUpdateCompleted(); + HideContentUpdateInProgressPopup(); + AppLogDebug("EXIT"); +} + +void +MusicPlayerApp::CallOnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UiApp* pApp = UiApp::GetInstance(); + AppAssert(pApp); +#if 0 + if (pApp->GetAppUiState() == APP_UI_STATE_FOREGROUND || pApp->GetAppUiState() == APP_UI_STATE_PARTIAL_BACKGROUND) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + IMusicContentUpdateEventListner* pEventListner = dynamic_cast(pSceneManager->GetCurrentScene()->GetForm()); + if (pEventListner == null) + { + pEventListner = dynamic_cast(pSceneManager->GetCurrentScene()->GetPanel()); + } + + if (pEventListner != null) + { + pEventListner->OnMusicContentUpdateCompleted(); + + } + AppLogDebug("EXIT"); + return; + } +#endif + int frameChildControlCount = __pMainFrame->GetControlCount(); + for (int iCount = 0; iCount < frameChildControlCount; iCount++) + { + Form* pForm = dynamic_cast(__pMainFrame->GetControl(iCount)); + if (pForm == null) + { + continue; + } + + IMusicContentUpdateEventListner* pEventListner = dynamic_cast(pForm); + if (pEventListner != null) + { + pEventListner->OnMusicContentUpdateCompleted(); + continue; + } + + int formChildControlCount = pForm->GetControlCount(); + for (int iCount = 0; iCount < formChildControlCount; iCount++) + { + IMusicContentUpdateEventListner* pEventListner = dynamic_cast(pForm->GetControl(iCount)); + if (pEventListner != null) + { + pEventListner->OnMusicContentUpdateCompleted(); + } + } + } + AppLogDebug("EXIT"); +} + diff --git a/src/MpMusicPlayerEntry.cpp b/src/MpMusicPlayerEntry.cpp new file mode 100644 index 0000000..b2c05d5 --- /dev/null +++ b/src/MpMusicPlayerEntry.cpp @@ -0,0 +1,80 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerEntry.cpp + * @brief This is the implementation file for MusicPlayerEntry class. + */ + +#include +#include "MpMusicPlayerApp.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +_EXPORT_ int OspMain(int argc, char *pArgv[]); +#ifdef _PROFILE +extern void start_profile(void); +extern void end_profile(void); +#else +#define start_profile() +#define end_profile() +#endif + +/** + * The entry function of Tizen application called by the operating system. + */ +int +OspMain(int argc, char *pArgv[]) +{ + result r = E_SUCCESS; + + ArrayList* pArgs = new (std::nothrow) ArrayList(); + + if (pArgs == null) + { + //AppLogDebug("[E_OUT_OF_MEMORY] Unable to create arraylist."); + return null; + } + + pArgs->Construct(); + for (int i = 0; i < argc; i++) + { + pArgs->Add(*(new (std::nothrow) String(pArgv[i]))); + } + + start_profile(); + r = Tizen::App::UiApp::Execute(MusicPlayerApp::CreateInstance, pArgs); + if (IsFailed(r)) + { + //AppLogException("Application execution failed-[%s].", GetErrorMessage(r)); + r &= 0x0000FFFF; + } + end_profile(); + + pArgs->RemoveAll(true); + delete pArgs; + + return static_cast(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus \ No newline at end of file diff --git a/src/MpMusicPlayerForm.cpp b/src/MpMusicPlayerForm.cpp new file mode 100644 index 0000000..99182f6 --- /dev/null +++ b/src/MpMusicPlayerForm.cpp @@ -0,0 +1,3156 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerForm.h + * @brief This is the implementation file for MusicPlayerForm class. + */ + +#include +#include +#include +#include +#include +#include +#include "MpAllListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpFolderListPresentationModel.h" +#include "MpMusicPlayerApp.h" +#include "MpMusicPlayerForm.h" +#include "MpMusicPlayerPresentationModel.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpSetAsPopup.h" +#include "MpSettingPresentationModel.h" +#include "MpSharePopup.h" +#include "MpSoundPathPopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Animations; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_CONTROLLER_PANEL = 288; +static const int W_HORIZONTAL_PLAYER = 720; +static const int H_HORIZONTAL_CONTROLLER_PANEL = 300; +static const int H_VOLUME_PANEL = 112; + +static const int TRANSPARENT_COLOR = 0x00000000; + +static const int MIN_VOLUME_SLIDER_COUNT = 0; +static const int MAX_VOLUME_SLIDER_COUNT = 15; + +static const int IDA_BUTTON_CONTENTS_LIST_VIEW = 200; +static const int IDA_BUTTON_CONTENTS_ALBUM_VIEW = 201; + +static const Tizen::Base::String INVALID_VALUE_OF_CONTENT_ID = L"00000000-0000-0000-0000-000000000000"; + +static const wchar_t* IDB_PLAY_BUTTON_ICON_NORMAL = L"T02_control_circle_icon_play.png"; +static const wchar_t* IDB_PLAY_BUTTON_ICON_PRESSED = L"T02_control_circle_icon_play_press.png"; +static const wchar_t* IDB_PLAY_BUTTON_ICON_DISABLED = L"T02_control_circle_icon_play_dim.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_NORMAL = L"T02_control_circle_icon_pause.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_PRESSED = L"T02_control_circle_icon_pause_press.png"; +static const wchar_t* IDB_PAUSE_BUTTON_ICON_DISABLED = L"T02_control_circle_icon_pause_dim.png"; + +FloatRectangle rectanglePreviousElement; +FloatRectangle rectangleCurrentElement; +FloatRectangle rectangleNextElement; + +enum RepeatType +{ + IDA_TYPE_REPEAT_A = 0, /**< The repeat type is OFF */ + IDA_TYPE_REPEAT_ONE, /**< The repeat type is ONE */ + IDA_TYPE_REPEAT_ALL /**< The repeat type is ALL */ +}; + +enum PlayerScreenState +{ + PLAYER_SCREEN_STATE_BASE = 0, + PLAYER_SCREEN_STATE_NORMAL = PLAYER_SCREEN_STATE_BASE, + PLAYER_SCREEN_STATE_NO_CONTENT_LIST, + PLAYER_SCREEN_STATE_APP_CONTROL, + PLAYER_SCREEN_STATE_INVALID_CONTENT_ID, + PLAYER_SCREEN_STATE_ERROR_CONTENT, + PLAYER_SCREEN_STATE_DURING_CALL, + PLAYER_SCREEN_STATE_MAX +}; + +enum IDAPlayerController +{ + IDA_PLAYER_CONTROLLER_BASE = 100, + IDA_PLAYER_CONTROLLER_REWIND = IDA_PLAYER_CONTROLLER_BASE, + IDA_PLAYER_CONTROLLER_PLAY, + IDA_PLAYER_CONTROLLER_PAUSE, + IDA_PLAYER_CONTROLLER_FORWARD, + IDA_PLAYER_CONTROLLER_VOLUME, + IDA_PLAYER_CONTROLLER_REPEAT, + IDA_PLAYER_CONTROLLER_SHUFFLE, + IDA_PLAYER_CONTROLLER_BACK, + IDA_PLAYER_CONTROLLER_MORE, + IDA_PLAYER_CONTROLLER_MAX +}; + +PlayerForm::PlayerForm(void) + : __pPlayerPresentationModel(null) + , __pAlbumArtElements(null) + , __pVolumePanel(null) + , __pControllerPanel(null) + , __pPanelRegisterBar(null) + , __pContentsAlbumViewPanel(null) + , __pContentsListViewPanel(null) + , __pCurrentTimeLabel(null) + , __pTotalTimeLabel(null) + , __pTitleName(null) + , __pArtistName(null) + , __pRewindButton(null) + , __pForwardButton(null) + , __pVolumeButton(null) + , __pPlayPauseButton(null) + , __pRepeatButton(null) + , __pShuffleButton(null) + , __pContentsViewToggleButton(null) + , __pPlayStateSlider(null) + , __pVolumeSlider(null) + , __pThumbnail(null) + , __pPlayListPicker(null) + , __pSharePicker(null) + , __pSetAsPicker(null) + , __pSoundPathPopup(null) + , __isLongPressed(false) + , __keyLongPressed(false) + , __flickDirection(FLICK_DIRECTION_NONE) + , __transactionID(ANIMATION_TRANSACTION_STATUS_STOPPED) + , __playerScreenState(PLAYER_SCREEN_STATE_NORMAL) + , __playerScreenStateBeforeCall(PLAYER_SCREEN_STATE_NORMAL) + , __isAnimationPerformed(false) + , __isRunByAppControl(false) + , __isContentMoveCompleted(false) + , __isMusicUpdated(false) + , __prevRepeatStateRunByAppControl(0) + , __playPosition(-1) + , __itemIndexToPlay(-1) + , __pAnimationFinishedTimer(null) + , __pContentPlayTimer(null) + , __pMsgShowTimer(null) + , __pSeekTimer(null) + , __pPreviousSceneId(null) + , __pPath(null) + , __pOptionMenu(null) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlayerForm::~PlayerForm(void) +{ + AppLogDebug("ENTER"); + + if (__pPath != null) + { + delete __pPath; + __pPath = null; + } + + AppLogDebug("EXIT"); +} + +result +PlayerForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_MUSIC_PLAYER_FORM))) + { + AppLogDebug("Form::Construct(IDL_MUSIC_PLAYER_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +PlayerForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + __pControllerPanel = static_cast(GetControl(IDC_PLAYER_CONTROL_BAR)); + __pTitleName = static_cast(GetControl(IDC_CONTENTS_TITLE_NAME)); + __pArtistName = static_cast(GetControl(IDC_CONTENTS_ARTIST_NAME)); + + __pContentsViewToggleButton = static_cast(GetControl(IDC_CONTENTS_VIEW_TOGGLE_BUTTON)); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_LIST_VIEW); + Bitmap* pButtonBackgroundBitmap = ResourceManager::GetBitmapN(L"blank_normal_background.png"); + + if (pButtonBackgroundBitmap != null) + { + //blank_normal_background.png + Canvas* pCanvas = new (std::nothrow) Canvas(); + pCanvas->Construct(__pContentsViewToggleButton->GetBoundsF()); + pCanvas->DrawNinePatchedBitmap(pCanvas->GetBoundsF(),*pButtonBackgroundBitmap); + + Bitmap* pFinalBackBitmap = new Bitmap(); + pFinalBackBitmap->Construct(*pCanvas,pCanvas->GetBoundsF()); + __pContentsViewToggleButton->SetNormalBackgroundBitmap(*pFinalBackBitmap); + __pContentsViewToggleButton->SetPressedBackgroundBitmap(*pFinalBackBitmap); + __pContentsViewToggleButton->SetDisabledBackgroundBitmap(*pFinalBackBitmap); + + delete pFinalBackBitmap; + delete pCanvas; + delete pButtonBackgroundBitmap; + } + + __pContentsViewToggleButton->AddActionEventListener(*this); + + __pVolumeButton = static_cast(__pControllerPanel->GetControl(L"IDC_OPTION_VOLUMN")); + __pVolumeButton->SetActionId(IDA_PLAYER_CONTROLLER_VOLUME); + __pVolumeButton->AddActionEventListener(*this); + __pShuffleButton = static_cast(__pControllerPanel->GetControl(IDC_OPTION_SHUFFLE)); + __pShuffleButton->SetActionId(IDA_PLAYER_CONTROLLER_SHUFFLE); + __pShuffleButton->AddActionEventListener(*this); + __pRepeatButton = static_cast(__pControllerPanel->GetControl(IDC_OPTION_REPEAT)); + __pRepeatButton->SetActionId(IDA_PLAYER_CONTROLLER_REPEAT); + __pRepeatButton->AddActionEventListener(*this); + + Button* pButton = static_cast(__pControllerPanel->GetControl(IDC_OPTION_PLAY_LIST_ADD)); + pButton->SetShowState(false); + + __pRewindButton = static_cast(__pControllerPanel->GetControl(IDC_PREVIOUS_CONTROL_BUTTON)); + __pRewindButton->SetActionId(IDA_PLAYER_CONTROLLER_REWIND); + __pRewindButton->AddTouchEventListener(*this); + __pRewindButton->AddKeyEventListener(*this); + __pRewindButton->AddFocusEventListener(*this); + + __pPlayPauseButton = static_cast(__pControllerPanel->GetControl(IDC_PALY_TOGGLE_CONTROL_BUTTON)); + __pPlayPauseButton->SetActionId(IDA_PLAYER_CONTROLLER_PLAY); + __pPlayPauseButton->AddActionEventListener(*this); + + __pForwardButton = static_cast(__pControllerPanel->GetControl(IDC_NEXT_CONTROL_BUTTON)); + __pForwardButton->SetActionId(IDA_PLAYER_CONTROLLER_FORWARD); + __pForwardButton->AddTouchEventListener(*this); + __pForwardButton->AddKeyEventListener(*this); + __pForwardButton->AddFocusEventListener(*this); + + __pCurrentTimeLabel = static_cast(__pControllerPanel->GetControl(IDC_CURRENT_PLAYING_TIME)); + __pTotalTimeLabel = static_cast(__pControllerPanel->GetControl(IDC_CONTENT_TOTAL_TIME)); + __pPlayStateSlider = static_cast(__pControllerPanel->GetControl(IDC_SLIDER_BAR)); + __pPlayStateSlider->AddSliderEventListener(*this); + __pPlayStateSlider->AddAdjustmentEventListener(*this); + + __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_NORMAL, TRANSPARENT_COLOR); +// __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_PRESSED, TRANSPARENT_COLOR); + __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_DISABLED, TRANSPARENT_COLOR); + __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_HIGHLIGHTED, TRANSPARENT_COLOR); + SetFormMenuEventListener(this); + SetFormBackEventListener(this); + + __pAnimationFinishedTimer = new (std::nothrow) Tizen::Base::Runtime::Timer(); + __pAnimationFinishedTimer->Construct(*this); + __pContentPlayTimer = new (std::nothrow) Tizen::Base::Runtime::Timer(); + __pContentPlayTimer->Construct(*this); + __pMsgShowTimer= new (std::nothrow) Tizen::Base::Runtime::Timer(); + __pMsgShowTimer->Construct(*this); + __pSeekTimer = new (std::nothrow) Tizen::Base::Runtime::Timer(); + __pSeekTimer->Construct(*this); + __pPlayerPresentationModel = PlayerPresentationModel::GetInstance(); + + __pContentsListViewPanel = new (std::nothrow) Panel(); + if (IsFailed(__pContentsListViewPanel->Construct(IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL))) + { + AppLogDebug("Construct(IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + delete __pContentsListViewPanel; + return E_FAILURE; + } + + __pPanelRegisterBar = static_cast(GetControl(IDC_PANEL_REGISTER_BAR)); + __pPanelRegisterBar->AddControl(__pContentsListViewPanel); + __pContentsListViewPanel->SetShowState(false); + __pContentsListViewPanel->SetEnabled(false); + + CommonUtil::SetLayoutFitToContainer(*__pPanelRegisterBar, *__pContentsListViewPanel); + TableView* pContentsTableView = static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW)); + pContentsTableView->AddTableViewItemEventListener(*this); + pContentsTableView->SetItemProvider(this); + + __pContentsAlbumViewPanel = new (std::nothrow) Panel(); + if (IsFailed(__pContentsAlbumViewPanel->Construct(IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL))) + { + AppLogDebug("Construct(IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + delete __pContentsAlbumViewPanel; + return E_FAILURE; + } + __pPanelRegisterBar->AddControl(__pContentsAlbumViewPanel); + CommonUtil::SetLayoutFitToContainer(*__pPanelRegisterBar, *__pContentsAlbumViewPanel); + + Label* pAlbumThumbnailLabel = static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL)); + __pContentsAlbumViewPanel->SetControlAlwaysOnTop(*pAlbumThumbnailLabel, true); + pAlbumThumbnailLabel->AddTouchEventListener(*this); + + FloatDimension floatDimension = pAlbumThumbnailLabel->GetSizeF(); + __pAlbumArtElements = new (std::nothrow) VisualElement(); + __pAlbumArtElements->Construct(); + __pAlbumArtElements->SetName(L"VisualElement"); + __pAlbumArtElements->SetBounds(FloatRectangle(0.0f, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElements->SetClipChildrenEnabled(false); + __pAlbumArtElements->SetShowState(true); + pAlbumThumbnailLabel->GetVisualElement()->AttachChild(*__pAlbumArtElements); + + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT] = new (std::nothrow) VisualElement(); + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->Construct(); + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->SetBounds(FloatRectangle(0.0f, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->SetShowState(true); + __pAlbumArtElements->AttachChild(*__pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]); + + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS] = new (std::nothrow) VisualElement(); + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->Construct(); + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetBounds(FloatRectangle(-604.0, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetShowState(true); + __pAlbumArtElements->AttachChild(*__pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]); + + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT] = new (std::nothrow) VisualElement(); + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->Construct(); + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetName(L"Rect3"); + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetBounds(FloatRectangle(836.0, 0.0f, floatDimension.width, floatDimension.height)); + + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetShowState(true); + __pAlbumArtElements->AttachChild(*__pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]); + + rectanglePreviousElement = __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->GetBounds(); + rectangleCurrentElement = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->GetBounds(); + rectangleNextElement = __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->GetBounds(); + + AddOrientationEventListener(*this); + //AddKeyEventListener(*this); + + UpdateSplitBarState(); + TogglePlayPauseImage(PLAYER_STATE_CLOSED); + SetRepeatButtonImage(__pPlayerPresentationModel->GetRepeatState()); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +void +PlayerForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("ENTER"); + FloatDimension floatDimension = static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->GetSizeF(); + + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->SetImplicitAnimationEnabled(false); + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->SetBounds(FloatRectangle(0.0f, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetBounds(FloatRectangle(-604.0, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetBounds(FloatRectangle(836.0, 0.0f, floatDimension.width, floatDimension.height)); + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->SetImplicitAnimationEnabled(true); + + rectanglePreviousElement = __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->GetBounds(); + rectangleCurrentElement = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->GetBounds(); + rectangleNextElement = __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->GetBounds(); + + UpdateSplitBarState(); + + Rectangle clientBounds = GetClientAreaBounds(); + if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE + || orientationStatus == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + if (__pVolumePanel != null) + { + if (clientBounds.width > 1200) + { + __pVolumePanel->SetPosition(clientBounds.width - W_HORIZONTAL_PLAYER , GetClientAreaBounds().height - H_HORIZONTAL_CONTROLLER_PANEL - H_VOLUME_PANEL - 50); + } + else + { + __pVolumePanel->SetBounds(Rectangle(clientBounds.width - 670 + , GetClientAreaBounds().height - H_HORIZONTAL_CONTROLLER_PANEL - H_VOLUME_PANEL - 50 + , 680 + , H_VOLUME_PANEL)); + } + __pVolumePanel->Invalidate(true); + } + } + else if (orientationStatus == ORIENTATION_STATUS_PORTRAIT + || orientationStatus == ORIENTATION_STATUS_PORTRAIT_REVERSE) + { + if (__pVolumePanel != null) + { + if (clientBounds.width > 1200) + { + __pVolumePanel->SetPosition(0, clientBounds.height - H_CONTROLLER_PANEL - H_VOLUME_PANEL - 50); + } + else + { + __pVolumePanel->SetBounds( Rectangle(0 + , clientBounds.height - H_CONTROLLER_PANEL - H_VOLUME_PANEL - 50 + , clientBounds.width + , H_VOLUME_PANEL)); + } + __pVolumePanel->Invalidate(true); + } + } + TogglePlayPauseImage(__pPlayerPresentationModel->GetPlayerState()); + AppLogDebug("EXIT"); +} + +result +PlayerForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + if (__pAlbumArtElements) + { + __pAlbumArtElements->Destroy(); + __pAlbumArtElements = null; + } + + if (__isRunByAppControl == true) + { + __pPlayerPresentationModel->SetRepeatMode(__prevRepeatStateRunByAppControl); + __isRunByAppControl = false; + } + + RemoveOptionMenu(); + RemoveSharePicker(); + RemovePlayListPicker(); + RemoveSetAsPicker(); + + RemoveOrientationEventListener(*this); + RemoveKeyEventListener(*this); + + delete __pSoundPathPopup; + __pSoundPathPopup = null; + + if (__pAnimationFinishedTimer != null) + { + __pAnimationFinishedTimer->Cancel(); + delete __pAnimationFinishedTimer; + } + + if (__pContentPlayTimer != null) + { + __pContentPlayTimer->Cancel(); + delete __pContentPlayTimer; + } + + if (__pMsgShowTimer != null) + { + __pMsgShowTimer->Cancel(); + delete __pMsgShowTimer; + } + + if (__pSeekTimer != null) + { + __pSeekTimer->Cancel(); + delete __pSeekTimer; + } + + if (__pPlayerPresentationModel != null) + { + __pPlayerPresentationModel->RemoveMusicPlayerEventListener(*this); + __pPlayerPresentationModel->DestroyPlayerPresentationModel(); + } + SettingPresentationModel::GetInstance()->DestroySettingPresentationModel(); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_BUTTON_CONTENTS_ALBUM_VIEW: + { + CancelAllThumbnailRequest(); + __pContentsListViewPanel->SetShowState(false); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_LIST_VIEW); + __pContentsAlbumViewPanel->SetShowState(true); + __pPanelRegisterBar->Invalidate(true); + } + break; + + case IDA_BUTTON_CONTENTS_LIST_VIEW: + { + if (__pVolumePanel != null) + { + if (__pVolumePanel->GetShowState()) + { + UpdatePlayingListBounds(__pVolumePanel->GetHeightF()); + } + else + { + UpdatePlayingListBounds(0.0f); + } + } + + TableView* pContentsTableView = static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW)); + + if (pContentsTableView != null) + { + pContentsTableView->UpdateTableView(); + } + + __pContentsAlbumViewPanel->SetShowState(false); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_ALBUM_VIEW); + __pContentsListViewPanel->SetShowState(true); + __pContentsListViewPanel->SetEnabled(true); + __pPanelRegisterBar->Invalidate(true); + } + break; + + case IDA_PLAYER_CONTROLLER_VOLUME: + { + if (__pVolumePanel == null) + { + InitializeVolumeBar(); + if (__pContentsListViewPanel != null && __pContentsListViewPanel->GetShowState()) + { + UpdatePlayingListBounds(__pVolumePanel->GetHeightF()); + } + } + else + { + if (__pVolumePanel->GetShowState() == true) + { + __pVolumePanel->SetShowState(false); + + if (__pContentsListViewPanel != null && __pContentsListViewPanel->GetShowState()) + { + UpdatePlayingListBounds(0.0f); + } + } + else + { + int MediaSoundVolume = 0; + SettingInfo::GetValue(MEDIA_VOLUME, MediaSoundVolume); + __pPlayerPresentationModel->SetVolume(MediaSoundVolume); + __pVolumeSlider->SetValue(__pPlayerPresentationModel->GetVolume()); + __pVolumeSlider->Invalidate(true); + + if (__pContentsListViewPanel != null && __pContentsListViewPanel->GetShowState()) + { + UpdatePlayingListBounds(__pVolumePanel->GetHeightF()); + } + __pVolumePanel->SetShowState(true); + } + } + } + break; + + case IDA_PLAYER_CONTROLLER_PLAY: + { + String* pCurrentPlayConent = __pPlayerPresentationModel->GetPlayContentPath(); + String* pContentPath = __pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetCurrentContentIndex()); + + if (pContentPath == null && pCurrentPlayConent != null) + { + __pPlayerPresentationModel->Play(__pPlayerPresentationModel->GetCurrentContentIndex(), __pPlayStateSlider->GetValue(), true); + } + + else if (pContentPath != null && pCurrentPlayConent->Equals(*pContentPath)) + { + __pPlayerPresentationModel->Play(__pPlayerPresentationModel->GetCurrentContentIndex(), __pPlayStateSlider->GetValue(), true); + } + else + { + __pPlayerPresentationModel->Play(__pPlayerPresentationModel->GetCurrentContentIndex(), __pPlayStateSlider->GetValue()); + } + + if (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex()) != true) + { + SetFileNotExistState(false); + } + } + break; + + case IDA_PLAYER_CONTROLLER_PAUSE: + { + __pPlayerPresentationModel->Pause(); + } + break; + + case IDA_PLAYER_CONTROLLER_BACK: + { + result r = pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_DESTROY_OPTION_KEEP)); + if (IsFailed(r)) + { + UiApp* pApp = UiApp::GetInstance(); + pApp->Terminate(); + } + __isRunByAppControl = false; +// else if (__isRunByAppControl) +// { +// Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); +// } + } + break; + + case IDA_PLAYER_CONTROLLER_REPEAT: + { + switch (__pPlayerPresentationModel->GetRepeatState()) + { + case IDA_TYPE_REPEAT_A: + { + SetRepeatButtonImage(IDA_TYPE_REPEAT_ONE); + } + break; + + case IDA_TYPE_REPEAT_ONE: + { + SetRepeatButtonImage(IDA_TYPE_REPEAT_ALL); + } + break; + + case IDA_TYPE_REPEAT_ALL: + { + SetRepeatButtonImage(IDA_TYPE_REPEAT_A); + } + break; + + default: + break; + } + } + break; + + case IDA_PLAYER_CONTROLLER_SHUFFLE: + { + if (__pPlayerPresentationModel->IsShuffleEnable() == false) + { + SetShuffleButtonImage(true); + } + else + { + SetShuffleButtonImage(false); + } + } + break; + + case IDA_PLAYER_CONTROLLER_MORE: + { + if (GetPlayerScreenState() == PLAYER_SCREEN_STATE_NORMAL) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SET_AS | CONTEXT_MENU_ITEM_STYLE_DETAILS | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA + | CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST | CONTEXT_MENU_ITEM_STYLE_SETTINGS); + } + else if (GetPlayerScreenState() == PLAYER_SCREEN_STATE_APP_CONTROL || GetPlayerScreenState() == PLAYER_SCREEN_STATE_INVALID_CONTENT_ID) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SET_AS | CONTEXT_MENU_ITEM_STYLE_DETAILS | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + case IDA_CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_CONTEXT_MENU_ITEM_STYLE_SET_AS: + { + LanucherPicker(PICKER_TYPE_SET_AS_PICKER); + } + break; + + case IDA_CONTEXT_MENU_ITEM_STYLE_SOUND_PATH: + { + if (__pSoundPathPopup == null) + { + __pSoundPathPopup = new (std::nothrow) SoundPathPopup(); + __pSoundPathPopup->Initialize(); + } + __pSoundPathPopup->ShowPopup(true); + } + break; + + case IDA_CONTEXT_MENU_ITEM_STYLE_DETAILS: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_CONTENT_DETAIL)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SETTINGS: + { +// SettingPresentationModel::GetInstance()->InitializeSettingValue(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_MUSIC_SETTING)); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnKeyPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + switch (keyCode) + { + case KEY_SIDE_UP: + { + if (__pVolumePanel == null) + { + InitializeVolumeBar(); + } + + __pVolumePanel->SetShowState(true); + __pPlayerPresentationModel->SetVolume(__pPlayerPresentationModel->GetVolume() + 1); + __pVolumeSlider->SetValue(__pPlayerPresentationModel->GetVolume()); + __pVolumeSlider->Invalidate(true); + } + break; + + case KEY_SIDE_DOWN: + { + if (__pVolumePanel == null) + { + InitializeVolumeBar(); + } + + __pVolumePanel->SetShowState(true); + __pPlayerPresentationModel->SetVolume(__pPlayerPresentationModel->GetVolume() - 1); + __pVolumeSlider->SetValue(__pPlayerPresentationModel->GetVolume()); + __pVolumeSlider->Invalidate(true); + } + break; + +// case KEY_ENTER: +// if (__isLongPressed && (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton))) +// { +// __isLongPressed = false; +// } +// break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnKeyReleased(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + switch (keyCode) + { + case KEY_ENTER: + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + if (__isLongPressed == true) + { + __pPlayerPresentationModel->StopForwardRewind(); + __isLongPressed = false; + __keyLongPressed = false; + } + else if (!__keyLongPressed) + { + if (source.Equals(*__pRewindButton)) + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetPreviousContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetPreviousContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_RIGHT; + + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + else + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetNextContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetNextContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_LEFT; + + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnKeyLongPressed(const Tizen::Ui::Control& source, Tizen::Ui::KeyCode keyCode) +{ + AppLogDebug("ENTER"); + AppLogDebug("keycode(%d)", keyCode); + switch (keyCode) + { + case KEY_ENTER: + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + __isLongPressed = true; + if (source.Equals(*__pRewindButton) && (__pPlayStateSlider->IsEnabled())) + { + __pPlayerPresentationModel->SeekToRewind(); + } + else if (__pPlayStateSlider->IsEnabled()) + { + __pPlayerPresentationModel->SeekToForward(); + } + __keyLongPressed = true; + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTouchLongPressed(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + __isLongPressed = true; + if (source.Equals(*__pRewindButton) && (__pPlayStateSlider->IsEnabled())) + { + __pPlayerPresentationModel->SeekToRewind(); + } + else if (__pPlayStateSlider->IsEnabled()) + { + __pPlayerPresentationModel->SeekToForward(); + } + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + Label *pAlbumLable = static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL)); + if (source.Equals(*pAlbumLable) == false) + { + return; + } + + if (__isAnimationPerformed == true || __isContentMoveCompleted == true) + { + return; + } + + if (currentPosition.y < 0 || currentPosition.y > GetBounds().height - __pControllerPanel->GetBounds().height) + { + return; + } + + if (Tizen::Base::Utility::Math::Abs(touchInfo.GetStartPosition().y - currentPosition.y) > 100) + { + return; + } + + if (currentPosition.x > touchInfo.GetStartPosition().x + 100) + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetPreviousContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetPreviousContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_RIGHT; + __isContentMoveCompleted = true; + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + else if (currentPosition.x < touchInfo.GetStartPosition().x - 100) + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetNextContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetNextContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_LEFT; + __isContentMoveCompleted = true; + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTouchPressed(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); +// if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) +// { +// __isLongPressed = false; +// } +// else + { + if (__pVolumePanel != null && __pVolumePanel->GetShowState()) + { + __pVolumePanel->SetShowState(false); + } + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTouchReleased(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + __isContentMoveCompleted = false; + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + if (__isLongPressed == true) + { + __pPlayerPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + else + { + if(0 > currentPosition.x || source.GetWidth() < currentPosition.x || + 0 > currentPosition.y || source.GetHeight() < currentPosition.y) + { + return; + } + + if (source.Equals(*__pRewindButton)) + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetPreviousContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetPreviousContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_RIGHT; + + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pMsgShowTimer->Cancel(); + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + else + { + if (__pPlayerPresentationModel->GetContentListCount() > 1) + { + while (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetNextContentIndex()) == false + && __pPlayerPresentationModel->GetContentListCount() > 0) + { + __pPlayerPresentationModel->RemoveContent(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetNextContentIndex())); + } + } + __flickDirection = FLICK_DIRECTION_LEFT; + + if (__pPlayerPresentationModel->GetContentListCount() <= 1) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 1000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + __pMsgShowTimer->Cancel(); + __pSeekTimer->Cancel(); + __playPosition = -1; + PlayAnimation(); + } + } + } + } + else + { + // Empty statement + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + __isContentMoveCompleted = false; + + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + if (__isLongPressed == true) + { + __pPlayerPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + } + + AppLogDebug("EXIT"); + +} + +void +PlayerForm::PlayAnimation(void) +{ + AppLogDebug("ENTER"); + __isAnimationPerformed = true; +// if (AnimationTransaction::GetStatus(__transactionID) == ANIMATION_TRANSACTION_STATUS_STOPPED) +// { + if (__flickDirection == FLICK_DIRECTION_RIGHT) + { + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetShowState(true); + + AnimationTransaction::Begin(__transactionID); + AnimationTransaction::SetVisualElementAnimationDuration(200); + AnimationTransaction::SetCurrentTransactionEventListener(this); + + VisualElementPropertyAnimation* pAnimation = new (std::nothrow) VisualElementPropertyAnimation(); + pAnimation->SetPropertyName(L"bounds"); + pAnimation->SetStartValue(Variant(rectanglePreviousElement)); + pAnimation->SetEndValue(Variant(rectangleCurrentElement)); + + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->AddAnimation(*pAnimation); + delete pAnimation; + + pAnimation = new (std::nothrow) VisualElementPropertyAnimation(); + pAnimation->SetPropertyName(L"bounds"); + pAnimation->SetStartValue(Variant(rectangleCurrentElement)); + pAnimation->SetEndValue(Variant(rectangleNextElement)); + + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->AddAnimation(*pAnimation); + + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetShowState(false); + delete pAnimation; + + AnimationTransaction::Commit(); + } + else if (__flickDirection == FLICK_DIRECTION_LEFT) + { + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetShowState(true); + + AnimationTransaction::Begin(__transactionID); + AnimationTransaction::SetVisualElementAnimationDuration(200); + AnimationTransaction::SetCurrentTransactionEventListener(this); + + VisualElementPropertyAnimation* pAnimation = new (std::nothrow) VisualElementPropertyAnimation(); + pAnimation->SetPropertyName(L"bounds"); + pAnimation->SetStartValue(Variant(rectangleCurrentElement)); + pAnimation->SetEndValue(Variant(rectanglePreviousElement)); + + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->AddAnimation(*pAnimation); + delete pAnimation; + + pAnimation = new (std::nothrow) VisualElementPropertyAnimation(); + pAnimation->SetPropertyName(L"bounds"); + pAnimation->SetStartValue(Variant(rectangleNextElement)); + pAnimation->SetEndValue(Variant(rectangleCurrentElement)); + + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->AddAnimation(*pAnimation); + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetShowState(false); + delete pAnimation; + + AnimationTransaction::Commit(); + } + else + { + // Empty statement + } +// } + AppLogDebug("EXIT"); +} + +void +PlayerForm::StopAnimation(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnAnimationTransactionStarted(int transactionId) +{ + AppLogDebug("ENTER"); + __pContentPlayTimer->Cancel(); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnAnimationTransactionStopped(int transactionId) +{ + AppLogDebug("ENTER"); + __isAnimationPerformed = false; + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnAnimationTransactionFinished(int transactionId) +{ + AppLogDebug("ENTER"); + __isAnimationPerformed = false; + __pAnimationFinishedTimer->Start(1); + __pContentPlayTimer->Start(700); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnSliderBarMoved(Tizen::Ui::Controls::Slider& source, int value) +{ + AppLogDebug("ENTER value = %d",value); + if (source.Equals(*__pPlayStateSlider)) + { + if (value >= 100) + { + __pPlayStateSlider->SetShowState(false);//To cancel touch event. + __pPlayStateSlider->SetShowState(true); + __pSeekTimer->Cancel(); + __playPosition = -1; + __pPlayerPresentationModel->SetPlayPosition(100); + } + else + { + __playPosition = value; + __pSeekTimer->Cancel(); + __pSeekTimer->Start(100); + } + } + else + { + if (__pVolumePanel->GetShowState() == false) + { + __pVolumePanel->SetShowState(true); + } + __pPlayerPresentationModel->SetVolume(value); + } + AppLogDebug("EXIT"); +} + + +void +PlayerForm::OnAdjustmentValueChanged(const Control& source, int adjustment) +{ + AppLogDebug("ENTER value = %d",adjustment); + if (source.Equals(*__pPlayStateSlider)) + { + __pPlayStateSlider->SetShowState(false);//To cancel touch event. + __pPlayStateSlider->SetShowState(true); + __pSeekTimer->Cancel(); + __playPosition = -1; + __pPlayerPresentationModel->SetPlayPosition(adjustment); + } + else + { + if (__pVolumePanel->GetShowState() == false) + { + __pVolumePanel->SetShowState(true); + } + __pPlayerPresentationModel->SetVolume(adjustment); + } + AppLogDebug("EXIT"); +} + + +void +PlayerForm::OnTimerExpired(Tizen::Base::Runtime::Timer& timer) +{ + AppLogDebug("ENTER"); + if (&timer == __pAnimationFinishedTimer) + { + if (__flickDirection == FLICK_DIRECTION_RIGHT) + { + Tizen::Ui::Animations::VisualElement* pTempVisualElement = __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]; + pTempVisualElement->SetBounds(rectanglePreviousElement); + + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT] = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]; + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT] = __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]; + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS] = pTempVisualElement; + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->SetShowState(false); + + __pPlayerPresentationModel->MovePreviousContent(true); + } + else if (__flickDirection == FLICK_DIRECTION_LEFT) + { + Tizen::Ui::Animations::VisualElement* pTempVisualElement = __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]; + pTempVisualElement->SetBounds(rectangleNextElement); + + __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS] = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]; + __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT] = __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]; + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT] = pTempVisualElement; + __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->SetShowState(false); + + __pPlayerPresentationModel->MoveNextContent(); + } + __flickDirection = FLICK_DIRECTION_NONE; + __transactionID = ANIMATION_TRANSACTION_STATUS_STOPPED; + } + else if (&timer == __pMsgShowTimer) + { + if(__pPlayerPresentationModel->IsDuringCall()) + { + ShowMessageBox(ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_TO_PLAY_DURING_CALL")); + } + else + { + ShowMessageBox(ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_TO_PLAY_ERROR_OCCURRED")); + } + } + else if (&timer == __pSeekTimer) + { + int playPosition = __playPosition; + __playPosition = -1; + __pPlayerPresentationModel->SetPlayPosition(playPosition); + } + else + { + if (__itemIndexToPlay != -1) + { + __pPlayerPresentationModel->Play(__itemIndexToPlay, MIN_PLAY_STATE_SLIDER_COUNT); + + if (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex()) != true) + { + SetFileNotExistState(false); + } + __itemIndexToPlay = -1; + } + else + { + String* currentPlayConent = __pPlayerPresentationModel->GetPlayContentPath(); + String* ContentPath = __pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetCurrentContentIndex()); + __itemIndexToPlay = -1; + if ((__pPlayerPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED) && (__pPlayerPresentationModel->IsDuringCall() == false) + && (__pPlayerPresentationModel->GetPlayerState() != PLAYER_STATE_OPENED)) + { + __pPlayStateSlider->SetShowState(false);//To cancel touch event. + __pPlayStateSlider->SetShowState(true); + __pPlayerPresentationModel->Play(__pPlayerPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT); + } + else if (!currentPlayConent->Equals(*ContentPath,true)) + { + __pPlayStateSlider->SetValue(0); + __pPlayerPresentationModel->SetPlayPosition(0); + + if (__pPlayerPresentationModel->GetPlayerState() != PLAYER_STATE_PAUSED && + __pPlayerPresentationModel->GetPlayerState() != PLAYER_STATE_PLAYING ) + { + __pPlayerPresentationModel->Play(__pPlayerPresentationModel->GetCurrentContentIndex(), MIN_PLAY_STATE_SLIDER_COUNT,false,true); + __pPlayerPresentationModel->Pause(); + __pPlayerPresentationModel->Mute(false); + } + } + + if (!__pPlayerPresentationModel->IsDuringCall()) + { + SetFileNotExistState(__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())); + } + } + } + AppLogDebug("EXIT"); +} + +int +PlayerForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPlayerPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPlayerPresentationModel->GetContentListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +PlayerForm::CreateItem(int index, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPlayerPresentationModel->GetContentInfoN(index); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(index))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +bool +PlayerForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +PlayerForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +PlayerForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + __itemIndexToPlay = itemIndex; + __pContentPlayTimer->Cancel(); + __pContentPlayTimer->Start(MESSAGE_BOX_DELAY); + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, int itemIndexFrom, int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (__isMusicUpdated) + { + IListT* pList = pSceneManager->GetSceneHistoryN(); + __isMusicUpdated = false; + + if (pList != null) + { + if (pList->GetCount() > 1) + { + pSceneManager->ClearSceneHistory(); + + for(int i = 0; i < pList->GetCount(); i++) + { + SceneId sceneID; + pList->GetAt(i,sceneID); + + if (i == pList->GetCount()-1) + { + if (sceneID.Equals(IDSCN_ALBUM_CONTENT_LIST,true)) + { + if (!__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())) + { + pSceneManager->DestroyScene(sceneID); + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else if (sceneID.Equals(IDSCN_ARTIST_CONTENT_LIST,true)) + { + if (!__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())) + { + pSceneManager->DestroyScene(sceneID); + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else if (sceneID.Equals(IDSCN_FOLDER_CONTENT_LIST,true)) + { + if (!__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())) + { + pSceneManager->DestroyScene(sceneID); + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else if (sceneID.Equals(IDSCN_FOLDER_LIST,true)) + { + FolderListPresentationModel* pFolderListPresentationModel = FolderListPresentationModel::GetInstance(); + if (pFolderListPresentationModel->GetAllFolderCount() == 0) + { + pSceneManager->DestroyScene(sceneID); + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else if (sceneID.Equals(IDSCN_PLAYLIST_CONTENT_LIST,true)) + { + PlaylistListPresentationModel* pPlayListPresentationModel = PlaylistListPresentationModel::GetInstance(); + + if (pPlayListPresentationModel->GetContentCount() == 0) + { + pSceneManager->DestroyScene(sceneID); + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + else + { + pSceneManager->AddToSceneHistory(sceneID); + } + + } + } + pList->RemoveAll(); + delete pList; + pList = null; + } + } + + r = pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_DESTROY_OPTION_KEEP)); + + if (IsFailed(r)) + { + UiApp* pApp = UiApp::GetInstance(); + pApp->Terminate(); + } + __isRunByAppControl = false; +// else if (__isRunByAppControl) +// { +// Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); +// } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + bool isFileExist = __pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex()); + + if (!isFileExist) + { + AppLogDebug("file doesn't exist"); + return; + } + + if (GetPlayerScreenState() == PLAYER_SCREEN_STATE_NORMAL) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SET_AS | CONTEXT_MENU_ITEM_STYLE_DETAILS | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA + | CONTEXT_MENU_ITEM_STYLE_ADD_TO_PLAYLIST | CONTEXT_MENU_ITEM_STYLE_SETTINGS); + } + else if ((GetPlayerScreenState() == PLAYER_SCREEN_STATE_APP_CONTROL || GetPlayerScreenState() == PLAYER_SCREEN_STATE_INVALID_CONTENT_ID)) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SET_AS | CONTEXT_MENU_ITEM_STYLE_DETAILS | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA); + } + + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + MusicPlayerApp* pMusicPlayerApp = static_cast(MusicPlayerApp::GetInstance()); + TryReturnVoid(pMusicPlayerApp != null, "Unable to cast UiApp to MusicPlayerApp"); + /* Comment out this code temporarily in 2.0. This will be supported in 2.1. + SetKeyCapture(KEY_SIDE_UP); + SetKeyCapture(KEY_SIDE_DOWN); + */ + + + SetFocus(); + __pPlayerPresentationModel->AddMusicPlayerEventListener(*this); + + if (pArgs != null && pArgs->GetCount() > 0 && dynamic_cast(pArgs->GetAt(0)) == null) + { + if (IsFailed(__pPlayerPresentationModel->SetContentList(pArgs))) + { + AppLogDebug("__pPlayerPresentationModel->SetContentList failed(%s)", GetErrorMessage(GetLastResult())); + SetPlayerScreenState(PLAYER_SCREEN_STATE_NO_CONTENT_LIST); + + pArgs->RemoveAll(); + delete pArgs; + return; + } + + if (!static_cast(pArgs->GetAt(0))->Equals(MUSIC, false)) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_APP_CONTROL); + } + else + { + if (GetPlayerScreenState() == PLAYER_SCREEN_STATE_APP_CONTROL || __playerScreenStateBeforeCall == PLAYER_SCREEN_STATE_APP_CONTROL) + { + if (__pPlayerPresentationModel->IsDuringCall()) + { + __playerScreenStateBeforeCall = PLAYER_SCREEN_STATE_NORMAL; + __pRepeatButton->SetShowState(true); + __pShuffleButton->SetShowState(true); + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } + else + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_NORMAL); + } + } + } + + __pPlayerPresentationModel->Play(static_cast(pArgs->GetAt(1))->ToInt(), MIN_PLAY_STATE_SLIDER_COUNT); + SetFileNotExistState(__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())); + SetRepeatButtonImage(__pPlayerPresentationModel->GetRepeatState());// 0 - 2 (OFF, ONE, ALL) + SetShuffleButtonImage(__pPlayerPresentationModel->IsShuffleEnable());// 0 - 1 (OFF, ON) + TogglePlayPauseImage(__pPlayerPresentationModel->GetPlayerState()); + + if (__pContentsListViewPanel != null && __pContentsListViewPanel->GetShowState()) + { + TableView* pContentsTableView = static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW)); + + if (pContentsTableView != null) + { + pContentsTableView->UpdateTableView(); + } + } + + __isRunByAppControl = false; + + pArgs->RemoveAll(true); + delete pArgs; + } + else + { + PlayerState playerState = __pPlayerPresentationModel->GetPlayerState(); + if (__pPlayerPresentationModel->IsDuringCall() == true || playerState == PLAYER_STATE_INITIALIZED + || playerState == PLAYER_STATE_ERROR) + { + playerState = PLAYER_STATE_ERROR; + } + + SetContentInfo( __pPlayerPresentationModel->GetCurrentContentIndex()); + OnPlayTimeChanged(__pPlayerPresentationModel->GetCurrentDuration(), __pPlayerPresentationModel->GetPlayPosition()); + OnPlayStateChanged(playerState); + + if (GetPlayerScreenState() == PLAYER_SCREEN_STATE_DURING_CALL + && playerState != PLAYER_STATE_ERROR + && __pPlayerPresentationModel->IsDuringCall() == false) + { +// if (playerState == PLAYER_STATE_INITIALIZED) +// { +// __playerScreenStateBeforeCall = PLAYER_SCREEN_STATE_ERROR_CONTENT; +// } + + SetPlayerScreenState(__playerScreenStateBeforeCall); + } + else if (__pPlayerPresentationModel->IsDuringCall()) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } +// else if (playerState == PLAYER_STATE_INITIALIZED) +// { +// SetPlayerScreenState(PLAYER_SCREEN_STATE_ERROR_CONTENT); +// } + + //at this point the error message would have been shown already so aoid showing it once again + if (playerState == PLAYER_STATE_ERROR) + { + __pMsgShowTimer->Cancel(); + } + SetFileNotExistState(__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex())); + + } + + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnFocusGained(const Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnFocusLost(const Control& source) +{ + AppLogDebug("ENTER"); + if (source.Equals(*__pForwardButton) || source.Equals(*__pRewindButton)) + { + if (__isLongPressed == true) + { + __pPlayerPresentationModel->StopForwardRewind(); + __isLongPressed = false; + } + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + __pPlayerPresentationModel->RemoveMusicPlayerEventListener(*this); + + if (__pVolumePanel != null && __pVolumePanel->GetShowState()) + { + __pVolumePanel->SetShowState(false); + UpdatePlayingListBounds(0.0f); + } + __isMusicUpdated = false; + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnChangedContentListByAppControlN(Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + MusicPlayerApp* pMusicPlayerApp = static_cast(MusicPlayerApp::GetInstance()); + TryReturnVoid(pMusicPlayerApp != null, "Unable to cast UiApp to MusicPlayerApp"); + + RemoveOptionMenu(); + RemoveSetAsPicker(false); + RemoveSharePicker(false); + RemovePlayListPicker(false); + + if (pArgs == null || static_cast(pArgs->GetAt(0))->Equals(MUSIC, false)) + { + AppLogDebug("EXIT(E_FAILURE)"); + if (pArgs != null) + { + pArgs->RemoveAll(); + delete pArgs; + } + return; + } + + result r = __pPlayerPresentationModel->SetContentList(pArgs); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + SetPlayerScreenState(PLAYER_SCREEN_STATE_NO_CONTENT_LIST); + pArgs->RemoveAll(); + delete pArgs; + + return; + } + + SetPlayerScreenState(PLAYER_SCREEN_STATE_APP_CONTROL); + int playIndex = (static_cast(pArgs->GetAt(1)))->ToInt(); + __pPlayerPresentationModel->Play(playIndex, MIN_PLAY_STATE_SLIDER_COUNT); + + + TableView* pContentsTableView = static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW)); + if (pContentsTableView != null) + { + pContentsTableView->UpdateTableView(); + } + + pArgs->RemoveAll(); + delete pArgs; + + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP || requestId == ID_DESTORY_SHARE_POPUP) + { + RemovePlayListPicker(); + RemoveSharePicker(); + } + + if (requestId == ID_SHOW_SUCCESS_MESSAGE) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayStateChanged(PlayerState playerState) +{ + AppLogDebug("ENTER"); + AppLogDebug("%d", playerState); + + if (playerState == PLAYER_STATE_ERROR) + { + MusicPlayerApp* pApp = static_cast(App::GetInstance()); + RemoveOptionMenu(); + SetContentInfo( __pPlayerPresentationModel->GetCurrentContentIndex()); + + if (__pPlayerPresentationModel->IsDuringCall()) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } + else + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_ERROR_CONTENT); + } + + __pMsgShowTimer->Cancel(); + __pMsgShowTimer->Start(MESSAGE_BOX_DELAY); + + if (pApp != null && pApp->GetRequestId() != 0) + { + AppControlProviderManager::GetInstance()->SendAppControlResult(pApp->GetRequestId(),APP_CTRL_RESULT_FAILED,null); + pApp->ResetRequestId(); + } + } + + else if (playerState == PLAYER_STATE_PAUSED) + { + if (__pPlayerPresentationModel->IsDuringCall() == true) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } + } + else if(playerState == PLAYER_STATE_PLAYING && GetPlayerScreenState() != PLAYER_SCREEN_STATE_APP_CONTROL) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_NORMAL); + } + + TogglePlayPauseImage(playerState); + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayContentChanged(int currentContentIndex) +{ + AppLogDebug("ENTER"); + String* pCurrentPlayConent = __pPlayerPresentationModel->GetPlayContentPath(); + String* pContentPath = __pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetCurrentContentIndex()); + if (pContentPath != null && pCurrentPlayConent != null) + { + if (!pContentPath->Equals(*pCurrentPlayConent,true) || __pPlayerPresentationModel->IsDuringCall()) + { + File musicFile; + result r = E_SUCCESS; + RemoveOptionMenu(); + RemoveSetAsPicker(false); + RemoveSharePicker(false); + RemovePlayListPicker(false); + + if (__pPath != null) + r = musicFile.Construct(*__pPath,"r"); + if (r == E_FILE_NOT_FOUND && GetPlayerScreenState() != PLAYER_SCREEN_STATE_DURING_CALL && !__pPlayerPresentationModel->IsDuringCall()) + { + // Remove the now playing content if it gets deleted/renamed + // As in OnMusicContentUpdated the current playing track has not yet removed from __pPlayerPresentationModel + __pPlayerPresentationModel->RemoveContent(*__pPath); + delete __pPath; + __pPath = null; + } + } + } + else + { + RemoveOptionMenu(); + RemoveSetAsPicker(false); + RemoveSharePicker(false); + RemovePlayListPicker(false); + } + + SetContentInfo(currentContentIndex); + + if ( __pPlayerPresentationModel->IsDuringCall()) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } + else if (__playerScreenState == PLAYER_SCREEN_STATE_DURING_CALL) + { + if (__pPlayerPresentationModel->GetPlayerState() == PLAYER_STATE_INITIALIZED) + { + __playerScreenStateBeforeCall = PLAYER_SCREEN_STATE_ERROR_CONTENT; + } + SetPlayerScreenState(__playerScreenStateBeforeCall); + } + + SetFileNotExistState(__pPlayerPresentationModel->IsFileExist(currentContentIndex)); + + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayContentRemoved(int removedContentIndex) +{ + AppLogDebug("ENTER"); + int currentIndex = __pPlayerPresentationModel->GetCurrentContentIndex(); + int currentContentCount = __pPlayerPresentationModel->GetContentListCount(); + + if ((removedContentIndex == currentIndex - 1) + || (currentIndex == 0 && removedContentIndex == 0) + || (currentIndex == removedContentIndex) + || (currentIndex == __pPlayerPresentationModel->GetPreviousContentIndex())) + { + UpdateAnimationAlbumArt(ALBUM_ART_IMAGE_PREVIOUS); + } + else if ((removedContentIndex == currentIndex + 1) + || (currentIndex == currentContentCount - 1 && removedContentIndex == 0)) + { + UpdateAnimationAlbumArt(ALBUM_ART_IMAGE_NEXT); + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayVolumeBarStateChanged(void) +{ + AppLogDebug("ENTER"); + if (__pVolumePanel->GetShowState() == true) + { + __pVolumePanel->SetShowState(false); + FocusManager* pFocusManager = FocusManager::GetInstance(); + + if (pFocusManager != null) + { + Control* pFocusedControl = pFocusManager->GetCurrentFocusOwner(); + + if (pFocusedControl != null && pFocusedControl->GetHashCode() == __pVolumeSlider->GetHashCode()) + { + __pVolumeButton->SetFocus(); + } + } + } + + if (__pContentsListViewPanel->GetShowState()) + { + UpdatePlayingListBounds(0.0f); + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition) +{ +// AppLogDebug("ENTER"); + if (__playPosition == -1) + { + __pCurrentTimeLabel->SetText(currentDuration); + __pPlayStateSlider->SetValue(currentPosition); + __pCurrentTimeLabel->Invalidate(true); + __pPlayStateSlider->Invalidate(true); +// __pCurrentTimeLabel->Draw(); +// __pCurrentTimeLabel->Show(); +// __pPlayStateSlider->Draw(); +// __pPlayStateSlider->Show(); + } +// AppLogDebug("EXIT"); +} + +void +PlayerForm::OnAutoOffTimeChanged(int autoOffTime) +{ +// AppLogDebug("ENTER"); + __pPlayerPresentationModel->StartAutoOffTimer(autoOffTime); +// AppLogDebug("EXIT"); +} + +void +PlayerForm::OnPlayPresentationModelDestroying(void) +{ + AppLogDebug("ENTER"); + if (__pPlayerPresentationModel != null) + { + __pPlayerPresentationModel = null; + } + AppLogDebug("EXIT"); +} + +result +PlayerForm::ShowMessageBox(const Tizen::Base::String& showText) +{ + AppLogDebug("ENTER"); + MessageBox messageBox; + int modalResult = 0; + messageBox.Construct(L"", showText, MSGBOX_STYLE_NONE, 3000); + messageBox.ShowAndWait(modalResult); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::SetContentInfo(int currentContentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPlayerPresentationModel->GetContentInfoN(currentContentIndex); + __pPlayStateSlider->SetRange(MIN_PLAY_STATE_SLIDER_COUNT, MAX_PLAY_STATE_SLIDER_COUNT); + + if (pContentInfoStruct == null) + { + String* pTitle = __pPlayerPresentationModel->GetPlayContentTitle(); + String* pArtist = __pPlayerPresentationModel->GetPlayContentArtist(); + Bitmap* pAlbumArt = __pPlayerPresentationModel->GetPlayContentThumbnail(); + + if (pTitle != null) + { + __pTitleName->SetText(*pTitle); + } + if (pArtist != null) + { + __pArtistName->SetText(*pArtist); + } + + String totalTime = CommonUtil::GetFormatDate(__pPlayerPresentationModel->GetPlayContentDuration()); + if (totalTime.Equals(INITIAL_TIME, true) != true) + { + __pTotalTimeLabel->SetText(totalTime); + } + else + { + __pTotalTimeLabel->SetText(INITIAL_TIME); + } + + if (pAlbumArt != null) + { + Bitmap* pTempBitmap = new (std::nothrow) Bitmap(); + result r = pTempBitmap->Construct(*pAlbumArt,Rectangle(0,0,pAlbumArt->GetWidth(),pAlbumArt->GetHeight())); + + if (!IsFailed(r)) + { + Canvas* pCanvas = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->GetCanvasN(); + if (pCanvas != null) + { + FloatDimension floatDimension = static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->GetSizeF(); + pTempBitmap->Scale(floatDimension); + pCanvas->Clear(); + Point point(INIT_VALUE, INIT_VALUE); + pCanvas->DrawBitmap(point, *pTempBitmap); + delete pCanvas; + } + } + + delete pTempBitmap; + } + Invalidate(true); + return; + } + TryReturnVoid(pContentInfoStruct != null, "The currentContentIndex is invalid"); + + __pTitleName->SetText(pContentInfoStruct->TitleName); + __pArtistName->SetText(pContentInfoStruct->ArtistName); + + Invalidate(true); + + String totalTime = CommonUtil::GetFormatDate(pContentInfoStruct->Duration); + if (totalTime.Equals(INITIAL_TIME, true) != true) + { + __pTotalTimeLabel->SetText(totalTime); + } + else + { + __pTotalTimeLabel->SetText(INITIAL_TIME); + } + + if (pContentInfoStruct->contentId.ToString().Equals(INVALID_VALUE_OF_CONTENT_ID, true)) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_INVALID_CONTENT_ID); + } +/* else + { + if (__pPlayerPresentationModel->GetPlayerState() != PLAYER_STATE_ERROR) + { + if (__pPlayStateSlider->IsEnabled() != true) + { + __pPlayStateSlider->SetEnabled(true); + } + SetFileNotExistState(true); + } + }*/ + delete pContentInfoStruct; + + UpdateAnimationAlbumArt(ALBUM_ART_IMAGE_CURRENT); + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlayerForm::UpdateAnimationAlbumArt(AlbumArtImage position) +{ + AppLogDebug("ENTER"); + Bitmap* pAlbumArtBitmap[ALBUM_ART_IMAGE_COUNT] = {null, }; + FloatDimension floatDimension = static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->GetSizeF(); + + switch (position) + { + case ALBUM_ART_IMAGE_CURRENT: + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT] = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetCurrentContentIndex()); + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT] != null) + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT]->Scale(floatDimension); + } + pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetPreviousContentIndex()); + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] != null) + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS]->Scale(floatDimension); + } + pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetNextContentIndex()); + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] != null) + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT]->Scale(floatDimension); + } + } + break; + + case ALBUM_ART_IMAGE_PREVIOUS: + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT] = null; + pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetPreviousContentIndex()); + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] != null) + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS]->Scale(floatDimension); + } + pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] = null; + } + break; + + case ALBUM_ART_IMAGE_NEXT: + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT] = null; + pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] = null; + pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetNextContentIndex()); + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] != null) + { + pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT]->Scale(floatDimension); + } + } + break; + + default: + break; + } + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT] != null) + { + Canvas* pCanvas = __pAlbumArtElement[ALBUM_ART_IMAGE_CURRENT]->GetCanvasN(); + if (pCanvas) + { + pCanvas->Clear(); + Point point(INIT_VALUE, INIT_VALUE); + pCanvas->DrawBitmap(point, *pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT]); + delete pCanvas; + } + delete pAlbumArtBitmap[ALBUM_ART_IMAGE_CURRENT]; + } + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS] != null) + { + Canvas* pCanvas = __pAlbumArtElement[ALBUM_ART_IMAGE_PREVIOUS]->GetCanvasN(); + if (pCanvas) + { + pCanvas->Clear(); + Point point(INIT_VALUE, INIT_VALUE); + pCanvas->DrawBitmap(point, *pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS]); + delete pCanvas; + } + delete pAlbumArtBitmap[ALBUM_ART_IMAGE_PREVIOUS]; + } + + if (pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT] != null) + { + Canvas* pCanvas = __pAlbumArtElement[ALBUM_ART_IMAGE_NEXT]->GetCanvasN(); + if (pCanvas) + { + pCanvas->Clear(); + Point point(INIT_VALUE, INIT_VALUE); + pCanvas->DrawBitmap(point, *pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT]); + delete pCanvas; + } + delete pAlbumArtBitmap[ALBUM_ART_IMAGE_NEXT]; + } + AppLogDebug("EXIT"); + return; +} + +void +PlayerForm::SetRepeatButtonImage(int repeatValue)// 0 - 2 (OFF, ONE, ALL) +{ + AppLogDebug("ENTER"); + Bitmap* pOptionRepeatBitmap = null; + Bitmap* pOptionRepeatPressBitmap = null; + + switch (repeatValue) + { + case 0: + { + pOptionRepeatBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_A.png"); + pOptionRepeatPressBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_A_press.png"); + } + break; + + case 1: + { + pOptionRepeatBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_1.png"); + pOptionRepeatPressBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_1_press.png"); + } + break; + + case 2: + { + pOptionRepeatBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_all.png"); + pOptionRepeatPressBitmap = ResourceManager::GetBitmapN(L"T02_option_rep_all_press.png"); + } + break; + + default: + break; + } + if (pOptionRepeatBitmap != null) + { + __pRepeatButton->SetNormalBitmap(Point(INIT_VALUE, INIT_VALUE), *pOptionRepeatBitmap); + delete pOptionRepeatBitmap; + pOptionRepeatBitmap = null; + } + if (pOptionRepeatPressBitmap != null) + { + __pRepeatButton->SetPressedBitmap(Point(INIT_VALUE, INIT_VALUE), *pOptionRepeatPressBitmap); + delete pOptionRepeatPressBitmap; + pOptionRepeatPressBitmap = null; + } + + __pRepeatButton->Invalidate(true); + + __pPlayerPresentationModel->SetRepeatMode(repeatValue); + AppLogDebug("EXIT"); +} + +void +PlayerForm::SetShuffleButtonImage(bool shuffleEnable) +{ + AppLogDebug("ENTER"); + Bitmap* pOptionShuffleBitmap; + + if (shuffleEnable == false) + { + pOptionShuffleBitmap = ResourceManager::GetBitmapN(L"T02_option_shuffle_on_dim.png"); + } + else + { + pOptionShuffleBitmap = ResourceManager::GetBitmapN(L"T02_option_shuffle_on.png"); + } + + __pShuffleButton->SetNormalBitmap(Point(INIT_VALUE, INIT_VALUE), *pOptionShuffleBitmap); + __pShuffleButton->Invalidate(true); + __pPlayerPresentationModel->SetShuffleEnable(shuffleEnable); + UpdateAnimationAlbumArt(ALBUM_ART_IMAGE_CURRENT); + + delete pOptionShuffleBitmap; + pOptionShuffleBitmap = null; + AppLogDebug("EXIT"); +} + +void +PlayerForm::SetFileNotExistState(bool isFileExist) +{ + AppLogDebug("ENTER"); + if (!isFileExist) + { + RemoveOptionMenu(); + __pContentsViewToggleButton->SetEnabled(isFileExist); + __pContentsViewToggleButton->Invalidate(true); + } + + if((GetPlayerScreenState() != PLAYER_SCREEN_STATE_DURING_CALL && + GetPlayerScreenState() != PLAYER_SCREEN_STATE_ERROR_CONTENT)) + { + __pContentsViewToggleButton->SetEnabled(isFileExist); + __pContentsViewToggleButton->Invalidate(true); + __pShuffleButton->SetEnabled(isFileExist); + __pShuffleButton->Invalidate(true); + } + + AppLogDebug("EXIT"); +} + +void +PlayerForm::TogglePlayPauseImage(PlayerState playerState) +{ + AppLogDebug("ENTER"); + if (playerState == PLAYER_STATE_PLAYING) + { + RelativeLayout* layout = dynamic_cast(__pContentsAlbumViewPanel->GetLayoutN()); + if (layout != null) + { + layout->ResetCenterAligned(*static_cast(__pContentsAlbumViewPanel->GetControl(IDC_ALBUM_THUMBANIL_BACKGROUND)), CENTER_ALIGN_HORIZONTAL); + delete layout; + } + + static_cast(__pContentsAlbumViewPanel->GetControl(IDC_ALBUM_TURN_TABLE))->SetShowState(true); + SetPauseButtonImage(); + } + else + { + RelativeLayout* layout = dynamic_cast(__pContentsAlbumViewPanel->GetLayoutN()); + if (layout != null) + { + layout->SetCenterAligned(*static_cast(__pContentsAlbumViewPanel->GetControl(IDC_ALBUM_THUMBANIL_BACKGROUND)), CENTER_ALIGN_HORIZONTAL); + delete layout; + } + + static_cast(__pContentsAlbumViewPanel->GetControl(IDC_ALBUM_TURN_TABLE))->SetShowState(false); + SetPlayButtonImage(); + } + + if (__pContentsAlbumViewPanel->GetShowState() == true) + { + __pContentsAlbumViewPanel->Invalidate(true); + } + AppLogDebug("EXIT"); +} +void +PlayerForm::SetPlayButtonImage(void) +{ + AppLogDebug("ENTER"); + Point point(INIT_VALUE, INIT_VALUE); + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_NORMAL); + __pPlayPauseButton->SetNormalBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_PRESSED); + __pPlayPauseButton->SetPressedBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PLAY_BUTTON_ICON_DISABLED); + __pPlayPauseButton->SetDisabledBitmap(point, *pBitmap); + delete pBitmap; + + __pPlayPauseButton->SetActionId(IDA_PLAYER_CONTROLLER_PLAY); + __pPlayPauseButton->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlayerForm::SetPauseButtonImage(void) +{ + AppLogDebug("ENTER"); + Point point(INIT_VALUE, INIT_VALUE); + Bitmap* pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_NORMAL); + __pPlayPauseButton->SetNormalBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_PRESSED); + __pPlayPauseButton->SetPressedBitmap(point, *pBitmap); + delete pBitmap; + + pBitmap = ResourceManager::GetBitmapN(IDB_PAUSE_BUTTON_ICON_DISABLED); + __pPlayPauseButton->SetDisabledBitmap(point, *pBitmap); + delete pBitmap; + + __pPlayPauseButton->SetActionId(IDA_PLAYER_CONTROLLER_PAUSE); + __pPlayPauseButton->Invalidate(true); + AppLogDebug("EXIT"); +} + +result +PlayerForm::InitializeVolumeBar(void) +{ + AppLogDebug("ENTER"); + int MediaSoundVolume = 0; + SettingInfo::GetValue(MEDIA_VOLUME, MediaSoundVolume); + __pPlayerPresentationModel->SetVolume(MediaSoundVolume); + + __pVolumePanel = new (std::nothrow) Panel(); + __pVolumeSlider = new (std::nothrow) Slider(); + OrientationStatus orientationStatue = GetOrientationStatus(); + Rectangle clientBounds = GetClientAreaBounds(); + Rectangle bounds = GetBounds(); + RelativeLayout layout; + layout.Construct(); + + if (orientationStatue == ORIENTATION_STATUS_LANDSCAPE + || orientationStatue == ORIENTATION_STATUS_LANDSCAPE_REVERSE) + { + AppLogDebug("CHECK %d", clientBounds.width); + if (clientBounds.width > 1200) + { + __pVolumePanel->Construct(layout, Rectangle(clientBounds.width - W_HORIZONTAL_PLAYER + , GetClientAreaBounds().height - H_HORIZONTAL_CONTROLLER_PANEL - H_VOLUME_PANEL - 50 + , W_HORIZONTAL_PLAYER + , H_VOLUME_PANEL)); + } + else + { + __pVolumePanel->Construct(layout, Rectangle(clientBounds.width - 670 + , GetClientAreaBounds().height - H_HORIZONTAL_CONTROLLER_PANEL - H_VOLUME_PANEL - 50 + , 680 + , H_VOLUME_PANEL)); + } + } + else if (orientationStatue == ORIENTATION_STATUS_PORTRAIT + || orientationStatue == ORIENTATION_STATUS_PORTRAIT_REVERSE) + { + __pVolumePanel->Construct(layout, Rectangle(0 + , clientBounds.height - H_CONTROLLER_PANEL - H_VOLUME_PANEL - 50 + , clientBounds.width + , H_VOLUME_PANEL)); + } + + if (clientBounds.width > 1200) + { + __pVolumeSlider->Construct(Rectangle(0 + , 0, W_HORIZONTAL_PLAYER, H_VOLUME_PANEL) + , BACKGROUND_STYLE_NONE + , false + , MIN_VOLUME_SLIDER_COUNT + , MAX_VOLUME_SLIDER_COUNT + , GROUP_STYLE_NONE); + } + else + { + __pVolumeSlider->Construct(Rectangle(0 + , 0, 680, H_VOLUME_PANEL) + , BACKGROUND_STYLE_NONE + , false + , MIN_VOLUME_SLIDER_COUNT + , MAX_VOLUME_SLIDER_COUNT + , GROUP_STYLE_NONE); + } + + __pVolumeSlider->SetColor(TRANSPARENT_COLOR); + AddControl(__pVolumePanel); + __pVolumePanel->AddControl(__pVolumeSlider); + CommonUtil::SetLayoutFitToContainer(*__pVolumePanel, *__pVolumeSlider); + + Bitmap* pVolumeLeftIconBitmap = ResourceManager::GetBitmapN(L"T02_volume_icon_01.png"); + Bitmap* pVolumeRightIconBitmap = ResourceManager::GetBitmapN(L"T02_volume_icon_02.png"); + Bitmap* pThumbHandle = ResourceManager::GetBitmapN(L"T02_volume_popup_progress_handle.png"); +// __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_NORMAL, *ResourceManager::GetBitmapN(L"T02_player_progress_handle.png")); +// __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_PRESSED, *ResourceManager::GetBitmapN(L"T02_player_progress_handle_press.png")); +// __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_HIGHLIGHTED, *ResourceManager::GetBitmapN(L"T02_player_progress_handle_press.png")); + __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_NORMAL, *pThumbHandle); +// __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_PRESSED, *pThumbHandle); +// __pVolumeSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_HIGHLIGHTED, *pThumbHandle); + __pVolumeSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_NORMAL, TRANSPARENT_COLOR); +// __pVolumeSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_PRESSED, TRANSPARENT_COLOR); + __pVolumeSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_HIGHLIGHTED, TRANSPARENT_COLOR); + + __pVolumeSlider->SetIcon(ICON_POSITION_LEFT, *pVolumeLeftIconBitmap); + __pVolumeSlider->SetIcon(ICON_POSITION_RIGHT, *pVolumeRightIconBitmap); + __pVolumeSlider->SetValue(__pPlayerPresentationModel->GetVolume()); + __pVolumeSlider->AddSliderEventListener(*this); + __pVolumeSlider->AddAdjustmentEventListener(*this); + delete pThumbHandle; + pThumbHandle = null; + delete pVolumeLeftIconBitmap; + pVolumeLeftIconBitmap = null; + delete pVolumeRightIconBitmap; + pVolumeRightIconBitmap = null; + + return E_SUCCESS; +} + +result +PlayerForm::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfoStruct.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfoStruct.ArtistName); + + if(contentInfoStruct.contentId.ToString().Equals(INVALID_VALUE_OF_CONTENT_ID,true) && __playerScreenState == PLAYER_SCREEN_STATE_APP_CONTROL) + { + Bitmap* pBmp = __pPlayerPresentationModel->GetContentAlbumArtN(__pPlayerPresentationModel->GetCurrentContentIndex()); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*pBmp); + delete pBmp; + pBmp = null; + } + else + { + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + } + +// pTableViewItem->SetSize(parent.GetWidthF()-10,pTableViewItem->GetHeightF()); + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::UpdatePlayingListBounds(const float margin) +{ + RelativeLayout* pLayout = dynamic_cast(__pPanelRegisterBar->GetPortraitLayoutN()); + + if (pLayout != null) + { + pLayout->SetRelation(*__pContentsListViewPanel,__pPanelRegisterBar,RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM); + pLayout->SetRelation(*__pContentsListViewPanel,__pPanelRegisterBar,RECT_EDGE_RELATION_TOP_TO_TOP); + pLayout->SetMargin(*__pContentsListViewPanel,0.0f,0.0f,0.0f,margin); + pLayout->SetVerticalFitPolicy(*__pContentsListViewPanel,FIT_POLICY_FIXED); + pLayout->Update(); + delete pLayout; + } + + __pPanelRegisterBar->Invalidate(true); +} + +void +PlayerForm::UpdateSplitBarState(void) +{ + AppLogDebug("ENTER"); + Label* pSplitBar = static_cast(GetControl(IDC_SPLIT_BAR)); + if ((GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT) || (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT_REVERSE)) + { + pSplitBar->SetSize(GetClientAreaBounds().width, 0); + } + else + { + pSplitBar->SetSize(13, GetClientAreaBounds().height); + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW))->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +PlayerForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + RemoveOptionMenu(); + RemoveSharePicker(false); + RemovePlayListPicker(false); + __isMusicUpdated = true; + UiApp* pApp = UiApp::GetInstance(); + AppAssert(pApp); + + if (pApp->GetAppUiState() == APP_UI_STATE_FOREGROUND) + { + RemoveSetAsPicker(false); + } + + bool isCurrentContentModified = false; + + if (__pPlayerPresentationModel->IsFileExist(__pPlayerPresentationModel->GetCurrentContentIndex()) != true) + { + isCurrentContentModified = true; + SetFileNotExistState(false); + } + + AllListPresentationModel* pPresentationModel = AllListPresentationModel::GetInstance(); + if (pPresentationModel == null) + { + AppLogDebug("EXIT"); + return; + } + + pPresentationModel->UpdateContentList(); + + String* pPlayContentPath = __pPlayerPresentationModel->GetPlayContentPath(); + int iContentListCount = __pPlayerPresentationModel->GetContentListCount(); + + for (int iCount = iContentListCount - 1; iCount >= 0; iCount--) + { + String* pContentPath = __pPlayerPresentationModel->GetContentPath(iCount); + if (pContentPath == null) + { + continue; + } + { + if (pPlayContentPath == null || !pContentPath->Equals(*pPlayContentPath, false)) + { + if (!__pPlayerPresentationModel->IsFileExist(iCount)) + { + __pPlayerPresentationModel->RemoveContent(*pContentPath); + } + } + else if(pContentPath != null) + { + __pPath = new (std::nothrow) String(); + __pPath->Append(*pPlayContentPath); + } + } + } + + if (__pContentsListViewPanel->GetShowState() == true) + { + if (__pPlayerPresentationModel->GetContentListCount() != INIT_VALUE && isCurrentContentModified == false) + { + static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW))->UpdateTableView(); + } + else + { + static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW))->UpdateTableView(); + __pContentsListViewPanel->SetShowState(false); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_LIST_VIEW); + __pContentsAlbumViewPanel->SetShowState(true); + __pPanelRegisterBar->Invalidate(true); + } + } + AppLogDebug("EXIT"); +} + +void +PlayerForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlayerForm::SetPlayerScreenState(unsigned int playerScreenState) +{ + AppLogDebug("ENTER %d && old = %d",playerScreenState,__playerScreenState); + + if (__playerScreenState == playerScreenState) + { + AppLogDebug("EXIT"); + return; + } + + __playerScreenStateBeforeCall = playerScreenState; + + switch (playerScreenState) + { + case PLAYER_SCREEN_STATE_NORMAL: + { + __pVolumeButton->SetEnabled(true); + __pContentsViewToggleButton->SetEnabled(true); + __pShuffleButton->SetShowState(true); + __pRepeatButton->SetShowState(true); + __pShuffleButton->SetEnabled(true); + __pRepeatButton->SetEnabled(true); + __pRewindButton->SetEnabled(true); + __pPlayPauseButton->SetEnabled(true); + __pForwardButton->SetEnabled(true); + __pPlayStateSlider->SetEnabled(true); + + if (__playerScreenState == PLAYER_SCREEN_STATE_INVALID_CONTENT_ID) + { + // __pContentsViewToggleButton->SetEnabled(false); + __pShuffleButton->SetEnabled(false); + } + + if (__isRunByAppControl == false) + { + break; + } + } + // fall through + case PLAYER_SCREEN_STATE_APP_CONTROL: + { + AppLogDebug("111111111111111111111"); + __pPlayPauseButton->SetEnabled(true); + __pPlayStateSlider->SetEnabled(true); + + RemoveOptionMenu(); + __pShuffleButton->SetShowState(false); + __pRepeatButton->SetShowState(false); + __prevRepeatStateRunByAppControl = __pPlayerPresentationModel->GetRepeatState(); + + if (__pContentsListViewPanel->GetShowState() == true) + { + __pContentsListViewPanel->SetShowState(false); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_LIST_VIEW); + __pContentsAlbumViewPanel->SetShowState(true); + } + playerScreenState = PLAYER_SCREEN_STATE_APP_CONTROL; + __isRunByAppControl = true; + } + break; + + case PLAYER_SCREEN_STATE_INVALID_CONTENT_ID: + { + // __pContentsViewToggleButton->SetEnabled(false); + // __pContentsViewToggleButton->Invalidate(true); + if (__playerScreenState != PLAYER_SCREEN_STATE_APP_CONTROL) + { + __pRepeatButton->SetShowState(true); + __pRepeatButton->SetEnabled(false); + } + else + { + return; + } +// __pMoreContextButton->SetEnabled(false); + } + break; + + case PLAYER_SCREEN_STATE_NO_CONTENT_LIST: + { + __pVolumeButton->SetEnabled(false); + __pContentsViewToggleButton->SetEnabled(false); + __pShuffleButton->SetShowState(true); + __pRepeatButton->SetShowState(true); + __pShuffleButton->SetEnabled(false); + __pRepeatButton->SetEnabled(false); + __pRewindButton->SetEnabled(false); + __pPlayPauseButton->SetEnabled(false); + __pForwardButton->SetEnabled(false); + __pPlayStateSlider->SetEnabled(false); + RemoveOptionMenu(); + + Bitmap* pThumb = ResourceManager::GetBitmapN(L"music_play_grid_thumb_loading.png"); + static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*pThumb); + delete pThumb; + } + break; + + case PLAYER_SCREEN_STATE_ERROR_CONTENT: + { + AppLogDebug("222222222222222222222"); + if (__pPlayerPresentationModel->IsDuringCall()) + { + if (__isRunByAppControl) + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_APP_CONTROL); + } + else + { + SetPlayerScreenState(PLAYER_SCREEN_STATE_DURING_CALL); + } + return; + } + else + { + __pPlayStateSlider->SetShowState(true); + __pPlayStateSlider->SetValue(0); + __pPlayPauseButton->SetEnabled(false); + __pPlayStateSlider->SetEnabled(false); + __pShuffleButton->SetEnabled(false); + RemoveOptionMenu(); + __pPlayStateSlider->Invalidate(true); + + Bitmap* pThumb = ResourceManager::GetBitmapN(L"music_play_grid_thumb_loading.png"); + static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*pThumb); + delete pThumb; + } + } + break; + + case PLAYER_SCREEN_STATE_DURING_CALL: + { + __playerScreenStateBeforeCall = __playerScreenState; + __pPlayPauseButton->SetEnabled(false); + RemoveOptionMenu(); + __pContentsViewToggleButton->SetEnabled(false); + __pPlayStateSlider->SetEnabled(false); + + if (__pContentsListViewPanel->GetShowState() == true) + { + __pContentsListViewPanel->SetShowState(false); + __pContentsViewToggleButton->SetActionId(IDA_BUTTON_CONTENTS_LIST_VIEW); + __pContentsAlbumViewPanel->SetShowState(true); + } + + Bitmap* pThumb = ResourceManager::GetBitmapN(L"music_play_grid_thumb_loading.png"); + static_cast(__pContentsAlbumViewPanel->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*pThumb); + delete pThumb; + } + break; + + default: + break; + } + + __playerScreenState = playerScreenState; + Invalidate(true); + AppLogDebug("EXIT"); +} + +unsigned int +PlayerForm::GetPlayerScreenState(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __playerScreenState; +} + +result +PlayerForm::SetOptionMenuItem(unsigned int contextMenuItemStyle, Tizen::Graphics::Point anchorPosition) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + CommonUtil::AddOptionMenuItem(*__pOptionMenu, contextMenuItemStyle); + CommonUtil::ShowOptionMenu(*__pOptionMenu, true); + +// if (anchorPosition.x != -1 && anchorPosition.y != -1) +// { +// __pOptionMenu->SetAnchorPosition(anchorPosition); +// } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +PlayerForm::CreateOptionMenuN(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + RemoveOptionMenu(true); + __pOptionMenu = CommonUtil::CreateOptionMenuN(source, *this); + if (__pOptionMenu != null) + { + return E_SUCCESS; + } + AppLogDebug("EXIT"); + return E_FAILURE; +} + +void +PlayerForm::RemoveOptionMenu(const bool deallocate) +{ + AppLogDebug("ENTER"); + if (__pOptionMenu != null) + { + CommonUtil::SetShowStateControl(*__pOptionMenu, false); + if (deallocate) + { + delete __pOptionMenu; + __pOptionMenu = null; + } + } + AppLogDebug("EXIT"); +} + +result +PlayerForm::TryRemoveContextMenu(int actionId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (CommonUtil::IsVaildContextMenuItemActionId(actionId) == true) + { + RemoveOptionMenu(); + r = E_SUCCESS; + } + AppLogDebug("EXIT"); + return r; +} + +result +PlayerForm::ShowSharePicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemoveSharePicker(); + + __pSharePicker = new (std::nothrow) SharePopup(); + if (IsFailed(__pSharePicker->Initialize(this))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemoveSharePicker(); + return E_FAILURE; + } + + __pSharePicker->SetArguments(pIList); + __pSharePicker->SetShowState(true); + __pSharePicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::RemoveSharePicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pSharePicker != null) + { + CommonUtil::SetShowStateControl(*__pSharePicker, false); + if(deletePopup) + { + delete __pSharePicker; + __pSharePicker = null; + } + } + AppLogDebug("EXIT"); +} + +result +PlayerForm::ShowPlayListPicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemovePlayListPicker(); + + __pPlayListPicker = new (std::nothrow) PlayListPickerPopup(); + if (IsFailed(__pPlayListPicker->Initialize(this, pIList))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemovePlayListPicker(); + return E_FAILURE; + } + + __pPlayListPicker->SetShowState(true); + __pPlayListPicker->Show(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::RemovePlayListPicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pPlayListPicker != null) + { + CommonUtil::SetShowStateControl(*__pPlayListPicker, false); + if (deletePopup) + { + delete __pPlayListPicker; + __pPlayListPicker = null; + } + } + AppLogDebug("EXIT"); +} + +result +PlayerForm::ShowSetAsPicker(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + RemoveSetAsPicker(); + + __pSetAsPicker = new (std::nothrow) SetAsPopup(); + if (IsFailed(__pSetAsPicker->Initialize(this))) + { + AppLogDebug("__pSharePicker->Initialize failed(%s)", GetErrorMessage(E_FAILURE)); + RemoveSetAsPicker(); + return E_FAILURE; + } + + __pSetAsPicker->SetCurrentContentPath(new (std::nothrow) String(*static_cast(pIList->GetAt(0)))); + __pSetAsPicker->SetShowState(true); + __pSetAsPicker->Show(); + + pIList->RemoveAll(true); + delete pIList; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlayerForm::RemoveSetAsPicker(const bool deletePopup) +{ + AppLogDebug("ENTER"); + if (__pSetAsPicker != null) + { + CommonUtil::SetShowStateControl(*__pSetAsPicker, false); + if (deletePopup) + { + delete __pSetAsPicker; + __pSetAsPicker = null; + } + } + AppLogDebug("EXIT"); +} + +result +PlayerForm::LanucherPicker(PickerType pickerType) +{ + AppLogDebug("ENTER"); + IList* pArgumentList = GetPickerArgumentListN(pickerType); + if (pArgumentList == null) + { + AppLogDebug("GetPickerArgumentListN is null"); + return E_FAILURE; + } + + result r = E_FAILURE; + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + r = ShowPlayListPicker(pArgumentList); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + r = ShowSharePicker(pArgumentList); + } + else if (pickerType == PICKER_TYPE_SET_AS_PICKER) + { + r = ShowSetAsPicker(pArgumentList); + } + + if (IsFailed(r)) + { + AppLogDebug("ShowPlayListPicker failed(%s)", GetErrorMessage(r)); + delete pArgumentList; + } + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::IList* +PlayerForm::GetPickerArgumentListN(PickerType pickerType) +{ + AppLogDebug("ENTER"); + String contentPath; + switch (pickerType) + { + case PICKER_TYPE_SET_AS_PICKER: + // fall through + case PICKER_TYPE_PLAY_LIST_PICKER: + // fall through + case PICKER_TYPE_SHARE_PICKER: + { + contentPath.Append(*__pPlayerPresentationModel->GetContentPath(__pPlayerPresentationModel->GetCurrentContentIndex())); + } + break; + + default: + { + AppLogDebug("EXIT"); + return null; + } + break; + } + + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pDataList->Construct())) + { + AppLogDebug("Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pDataList; + return null; + } + + pDataList->Add(*(new (std::nothrow) String(contentPath))); + AppLogDebug("EXIT"); + return pDataList; +} + +void +PlayerForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + TableView* pContentsTableView = static_cast(__pContentsListViewPanel->GetControl(IDC_CONTENTS_TABLEVIEW)); + pContentsTableView->UpdateTableView(); +} diff --git a/src/MpMusicPlayerPresentationModel.cpp b/src/MpMusicPlayerPresentationModel.cpp new file mode 100644 index 0000000..b101de7 --- /dev/null +++ b/src/MpMusicPlayerPresentationModel.cpp @@ -0,0 +1,2288 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpMusicPlayerPresentationModel.cpp + * @brief This is the implementation file for MusicPlayerPresentationModel class. + */ + +#include +#include +#include +#include +#include +#include +#include "MpCommonUtil.h" +#include "MpIMusicPlayerEventListener.h" +#include "MpMusicPlayerPresentationModel.h" +#include "MpPlaylistDB.h" +#include "MpResourceManager.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Telephony; +using namespace Tizen::Ui::Controls; + +#define BUFFER_INFO_OF_PLAYER 0 + +static const int PROGRESS_TIMER_DURATION = 150; +static const int PROGRESS_BAR_DURATION_TIMER = 1000; +static const int MIN_SLIDER_COUNT = 0; +static const int MAX_SLIDER_COUNT = 100; +static const int INIT_X_VALUE = 0; +static const int INIT_CONTENT_INDEX = -1; +static const int VOLUMEBAR_INTERVAL = 3000; +static const int PAUSE_AUTO_OFF_TIME = 1000 * 60 * 2; + +PlayerPresentationModel* PlayerPresentationModel::pPlayerPresentationModel = null; + +PlayerPresentationModel* +PlayerPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pPlayerPresentationModel == null) + { + pPlayerPresentationModel = new (std::nothrow) PlayerPresentationModel(); + TryReturn(pPlayerPresentationModel != null, null, "PlayerPresentationModel instance is not created."); + + result r = pPlayerPresentationModel->Construct(); + TryCatch(r == E_SUCCESS, , null, "PlayerPresentationModel instance is not constructed."); + } + AppLogDebug("EXIT"); + return pPlayerPresentationModel; + +CATCH: + if (pPlayerPresentationModel != null) + { + delete pPlayerPresentationModel; + } + + return null; +} + +PlayerPresentationModel::PlayerPresentationModel(void) + : __pPlayer(null) + , __pPlayStateTimer(null) + , __pFastForwardTimer(null) + , __pFastRewindTimer(null) + , __pAutoOffTimer(null) + , __pPauseAutoOffTimer(null) + , __pVolumeBarStateTimer(null) + , __pPlayContentList(null) + , __previousContentIndex(INIT_CONTENT_INDEX) + , __currentContentIndex(INIT_CONTENT_INDEX) + , __nextContentIndex(INIT_CONTENT_INDEX) + , __removedContentIndex(INIT_CONTENT_INDEX) + , __pCurrentPlayContentPath(null) + , __pCurrentPlayContentTitle(null) + , __pCurrentPlayContentThumbnail(null) + , __pCurrentPlayContentArtist(null) + , __pUuIdForFileOnly(null) + , __pCurrentAudioContentInfo(null) + , __currentPlayContentDuration(null) + , __repeatMode(null) + , __shuffleEnable(false) + , __seekCompleted(true) + , __isForceChanged(false) + , __playposition(MIN_SLIDER_COUNT) + , __previousPlayerState(PLAYER_STATE_ERROR) + , __xTimesValue(INIT_X_VALUE) + , __currentContentTotalDuration(0) + , __pCallManager(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlayerPresentationModel::~PlayerPresentationModel(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__repeatMode != CommonUtil::GetValue(REPEAT_MODE)) + { + CommonUtil::SetValue(REPEAT_MODE, __repeatMode); + } + if (__shuffleEnable != static_cast(CommonUtil::GetValue(SHUFFLE_MODE))) + { + CommonUtil::SetValue(SHUFFLE_MODE, static_cast(__shuffleEnable)); + } + if (__pPlayContentList != null) + { + __pPlayContentList->RemoveAll(true); + delete __pPlayContentList; + __pPlayContentList = null; + } + if (__pPlayStateTimer != null) + { + __pPlayStateTimer->Cancel(); + delete __pPlayStateTimer; + __pPlayStateTimer = null; + } + if (__pFastForwardTimer != null) + { + __pFastForwardTimer->Cancel(); + delete __pFastForwardTimer; + __pFastForwardTimer = null; + } + if (__pFastRewindTimer != null) + { + __pFastRewindTimer->Cancel(); + delete __pFastRewindTimer; + __pFastRewindTimer = null; + } + if (__pAutoOffTimer != null) + { + __pAutoOffTimer->Cancel(); + delete __pAutoOffTimer; + __pAutoOffTimer = null; + } + if (__pPauseAutoOffTimer != null) + { + __pPauseAutoOffTimer->Cancel(); + delete __pPauseAutoOffTimer; + __pPauseAutoOffTimer = null; + } + if (__pVolumeBarStateTimer != null) + { + __pVolumeBarStateTimer->Cancel(); + delete __pVolumeBarStateTimer; + } + + delete __pCurrentPlayContentPath; + delete __pCurrentPlayContentTitle; + delete __pCurrentPlayContentThumbnail; + delete __pCurrentPlayContentArtist; + delete __pUuIdForFileOnly; + delete __pCurrentAudioContentInfo; + + if (__pCallManager != null) + { + delete __pCallManager; + } + + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + if (__pPlayer != null) + { + PlayerState state = __pPlayer->GetState(); + switch (state) + { + case PLAYER_STATE_PLAYING: + // fall through + case PLAYER_STATE_PAUSED: + { + r = __pPlayer->Stop(); + TryLog(r == E_SUCCESS, "[%s] Failed Stop",GetErrorMessage(r)); + r = __pPlayer->Close(); + TryLog(r == E_SUCCESS, "[%s] Failed Close",GetErrorMessage(r)); + } + break; + + case PLAYER_STATE_ENDOFCLIP: + // fall through + case PLAYER_STATE_OPENED: + // fall through + case PLAYER_STATE_STOPPED: + { + r = __pPlayer->Close(); + TryLog(r == E_SUCCESS, "[%s] Failed Close",GetErrorMessage(r)); + } + break; + + case PLAYER_STATE_CLOSED: + { + } + break; + + default: + break; + } + delete __pPlayer; + __pPlayer = null; + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::DestroyPlayerPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (pPlayerPresentationModel != null) + { + CallOnPlayPresentationModelDestroying(); + + delete pPlayerPresentationModel; + pPlayerPresentationModel = null; + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnTelephonyCallStatusChangedN(Tizen::Telephony::CallStatus callStatus, Tizen::Telephony::CallInfo* pCallInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("callStatus : %d", callStatus); + if (callStatus == CALL_STATUS_IDLE || callStatus == CALL_STATUS_COMMUNICATING || callStatus == CALL_STATUS_DIALING) + { + CallOnPlayContentChanged(__currentContentIndex); + } + AppLogDebug("EXIT"); +} + +result +PlayerPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + /*AudioSessionManager::GetInstance()->SetAudioSessionEventListener(this); + AudioSessionManager::GetInstance()->SetMode(AUDIO_SESSION_MODE_EXCLUSIVE);*/ + + __pPlayStateTimer = new (std::nothrow) Timer(); + r = __pPlayStateTimer->Construct(*this); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct Timer.\n"); + + __pFastForwardTimer = new (std::nothrow) Timer(); + r = __pFastForwardTimer->Construct(*this) ; + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct FastForwardTimer.\n"); + + __pFastRewindTimer = new (std::nothrow) Timer(); + r = __pFastRewindTimer->Construct(*this) ; + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct FastRewindTimer.\n"); + + __pAutoOffTimer = new (std::nothrow) Timer(); + r = __pAutoOffTimer->Construct(*this); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct __pAutoOffTimer.\n"); + + __pPauseAutoOffTimer = new (std::nothrow) Timer(); + r = __pPauseAutoOffTimer->Construct(*this); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct __pPauseAutoOffTimer.\n"); + + __pVolumeBarStateTimer = new (std::nothrow) Timer(); + r = __pVolumeBarStateTimer->Construct(*this); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct Timer.\n"); + + __pCurrentPlayContentPath = new (std::nothrow) String(L""); + + __repeatMode = CommonUtil::GetValue(REPEAT_MODE); + __shuffleEnable = static_cast(CommonUtil::GetValue(SHUFFLE_MODE)); + + __pCallManager = new (std::nothrow) CallManager(); + __pCallManager->Construct(*this); + + __pUuIdForFileOnly = Tizen::Base::UuId::GenerateN(); + + InitializePlayer(); + + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException( "[%s]", GetErrorMessage(r)); + if (__pPlayStateTimer != null) + { + __pPlayStateTimer->Cancel(); + delete __pPlayStateTimer; + __pPlayStateTimer = null; + } + if (__pFastForwardTimer != null) + { + __pFastForwardTimer->Cancel(); + delete __pFastForwardTimer; + __pFastForwardTimer = null; + } + if (__pFastRewindTimer != null) + { + __pFastRewindTimer->Cancel(); + delete __pFastRewindTimer; + __pFastRewindTimer = null; + } + if (__pAutoOffTimer != null) + { + __pAutoOffTimer->Cancel(); + delete __pAutoOffTimer; + __pAutoOffTimer = null; + } + if (__pPauseAutoOffTimer != null) + { + __pPauseAutoOffTimer->Cancel(); + delete __pPauseAutoOffTimer; + __pPauseAutoOffTimer = null; + } + if (__pVolumeBarStateTimer != null) + { + __pVolumeBarStateTimer->Cancel(); + delete __pVolumeBarStateTimer; + } + return r; +} + +result +PlayerPresentationModel::InitializePlayer(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pPlayer != null) + { + delete __pPlayer; + __pPlayer = null; + } + + __pPlayer = new (std::nothrow) Player(); + r = __pPlayer->Construct(*this, BUFFER_INFO_OF_PLAYER); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct Player.\n"); + + AppLogDebug("EXIT"); + return r; + +CATCH: + delete __pPlayer; + __pPlayer = null; + + return r; +} + +result +PlayerPresentationModel::StartAutoOffTimer(int autoOffValue) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (__pAutoOffTimer != null) + { + if (autoOffValue == 0) + { + r = __pAutoOffTimer->Cancel(); + AppLogDebug("%s", GetErrorMessage(r)); + } + else + { + __pAutoOffTimer->Cancel(); + r = __pAutoOffTimer->Start(autoOffValue); + AppLogDebug("%s", GetErrorMessage(r)); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to Start __pAutoOffTimer.\n"); + } + AppLogDebug("EXIT"); + return r; + } + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException( "[%s]", GetErrorMessage(r)); + return r; +} + +void +PlayerPresentationModel::RemoveContent(const Tizen::Base::String& filePath) +{ + AppLogDebug("ENTER"); + TryReturnVoid(__pPlayContentList != null, "There is not a playlist"); + IEnumerator* pEnum = __pPlayContentList->GetEnumeratorN(); + String* pFilePath = null; + int index = 0; + + while (pEnum->MoveNext() == E_SUCCESS) + { + pFilePath = static_cast(pEnum->GetCurrent()); + + if (pFilePath->Equals(filePath)) + { + __pPlayContentList->Remove(filePath); + + if (index < __currentContentIndex) + { + __currentContentIndex--; + } + else if (index == __currentContentIndex) + { + if (index == __pPlayContentList->GetCount()) + { + __currentContentIndex--; + } + __removedContentIndex = index; + } + + GenerateNextIndex(); + if (__pPlayContentList->GetCount() > 0) + { + CallOnPlayContentRemoved(index); + } + break; + } + index++; + } + delete pEnum; + AppLogDebug("EXIT"); + return; +} + +PlayerState +PlayerPresentationModel::GetPlayerState(void) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return PLAYER_STATE_ERROR; + } + AppLogDebug("EXIT"); + return __pPlayer->GetState(); +} + +bool +PlayerPresentationModel::IsDuringCall(void) +{ + AppLogDebug("ENTER"); + CallStatus callStatus = CALL_STATUS_UNDEFINED; + callStatus = __pCallManager->GetCurrentCallStatus(); + AppLogDebug("callStatus = %d", callStatus); + + if (callStatus == CALL_STATUS_IDLE) + { + AppLogDebug("EXIT"); + return false; + } + else + { + AppLogDebug("EXIT"); + return true; + } +} + +void +PlayerPresentationModel::ClosePlayer(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + + __previousPlayerState = __pPlayer->GetState(); + + switch (__previousPlayerState) + { + case PLAYER_STATE_PLAYING: + // fall through + case PLAYER_STATE_PAUSED: + { + r = __pPlayer->Stop(); + TryLog(r == E_SUCCESS, "[%s] Failed Stop", GetErrorMessage(r)); + r = __pPlayer->Close(); + TryLog(r == E_SUCCESS, "[%s] Failed Close", GetErrorMessage(r)); + } + break; + + case PLAYER_STATE_OPENED: + // fall through + case PLAYER_STATE_STOPPED: + { + r = __pPlayer->Close(); + TryLog(r == E_SUCCESS, "[%s] Failed Close", GetErrorMessage(r)); + } + break; + + case PLAYER_STATE_CLOSED: + { + } + break; + + case PLAYER_STATE_ENDOFCLIP: + { + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +Tizen::Base::String* +PlayerPresentationModel::GetPlayContentPath(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pCurrentPlayContentPath; +} + +Tizen::Base::String* +PlayerPresentationModel::GetPlayContentTitle(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pCurrentPlayContentTitle; +} + +Tizen::Base::String* +PlayerPresentationModel::GetPlayContentArtist(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pCurrentPlayContentArtist; +} + +Tizen::Graphics::Bitmap* +PlayerPresentationModel::GetPlayContentThumbnail(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pCurrentPlayContentThumbnail; +} + +long +PlayerPresentationModel::GetPlayContentDuration(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentPlayContentDuration; +} + +Tizen::Base::String* +PlayerPresentationModel::GetContentPath(int contentIndex)const +{ + AppLogDebug("ENTER"); + String* pFilePath = null; + + TryReturn(contentIndex >= 0 && contentIndex < __pPlayContentList->GetCount(), null, "contentIndex is invalid."); + pFilePath = static_cast(__pPlayContentList->GetAt(contentIndex)); + + AppLogDebug("EXIT"); + return pFilePath; +} + +int +PlayerPresentationModel::GetPreviousContentIndex(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __previousContentIndex; +} + +int +PlayerPresentationModel::GetCurrentContentIndex(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentContentIndex; +} + +int +PlayerPresentationModel::GetNextContentIndex(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __nextContentIndex; +} + +ContentInformation* +PlayerPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + AudioContentInfo* pAudioContentInfo = null; + + if (__pPlayContentList == null || contentIndex < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pPlayContentList is null)", contentIndex); + return null; + } + + Tizen::Base::String* contentPath = static_cast(__pPlayContentList->GetAt(contentIndex)); + if (contentPath == null || File::IsFileExist(*contentPath) == false) + { + AppLogDebug("EXIT"); + return null; + } + + ContentInformation* pContentInfo = new (std::nothrow) ContentInformation(); + TryReturn(pContentInfo != null, null, "pContentInfo is null."); + + pAudioContentInfo = CommonUtil::GetAudioContentInfoN(*contentPath); + + if (pAudioContentInfo != null) + { + if (pAudioContentInfo->GetArtist() == null) + { + pContentInfo->ArtistName = ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN"); + } + else + { + pContentInfo->ArtistName = pAudioContentInfo->GetArtist(); + } + + if (pAudioContentInfo->GetTitle() == null) + { + pContentInfo->TitleName = ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN"); + } + else + { + pContentInfo->TitleName = pAudioContentInfo->GetTitle(); + } + + if (__pPlayer != null) + { + pContentInfo->Duration = __pPlayer->GetDuration(); + } + else + { + pContentInfo->Duration = pAudioContentInfo->GetDuration(); + } + pContentInfo->contentId = pAudioContentInfo->GetContentId(); + + if (pAudioContentInfo != __pCurrentAudioContentInfo) + { + delete pAudioContentInfo; + } + } + else + { + Tizen::Content::AudioMetadata* pAudioMeta = Tizen::Content::ContentManagerUtil::GetAudioMetaN(*static_cast(__pPlayContentList->GetAt(contentIndex))); + if (pAudioMeta == null) + { + delete pContentInfo; + return null; + } + + if (pAudioMeta->GetArtist() == null) + { + pContentInfo->ArtistName = ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN"); + } + else + { + pContentInfo->ArtistName = pAudioMeta->GetArtist(); + } + + if (pAudioMeta->GetTitle() == null) + { + pContentInfo->TitleName = ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN"); + } + else + { + pContentInfo->TitleName = pAudioMeta->GetTitle(); + } + + if (__pPlayer != null) + { + pContentInfo->Duration = __pPlayer->GetDuration(); + } + pContentInfo->contentId = *__pUuIdForFileOnly; + delete pAudioMeta; + } + + AppLogDebug("EXIT"); + return pContentInfo; +} + +Tizen::Graphics::Bitmap* +PlayerPresentationModel::GetContentAlbumArtN(int contentIndex) +{ + AppLogDebug("ENTER"); + Bitmap* pAlbumArtBitmap = null; + if (contentIndex <= -1) + { + pAlbumArtBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + AppLogDebug("EXIT"); + return pAlbumArtBitmap; + } + + String* path = static_cast(__pPlayContentList->GetAt(contentIndex)); + if (path == null) + { + pAlbumArtBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + AppLogDebug("EXIT"); + return pAlbumArtBitmap; + } + + pAlbumArtBitmap = CommonUtil::GetContentAlbumArtN(*path); + if (pAlbumArtBitmap == null) + { + pAlbumArtBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + } + AppLogDebug("EXIT"); + return pAlbumArtBitmap; +} + +result +PlayerPresentationModel::Play(int contentIndex, int sliderPosition, bool bPausePlay, bool bPlayPause) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + __seekCompleted = true; +/* if (__seekCompleted == false) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } +*/ + PlayerState playerState; + String currentDuration; + String* pPath = null; + + if (bPausePlay == false) + { + if (GetContentListCount() == 0) + { + ClosePlayer(); + InitializeProgress(); + } + TryCatch(contentIndex >= 0 && contentIndex < __pPlayContentList->GetCount(), , "contentIndex is invalid"); + pPath = GetContentPath(contentIndex); + AppLogDebug("__pCurrentPlayContentPath = %ls", __pCurrentPlayContentPath->GetPointer()); + if (__pPlayer->GetState() == PLAYER_STATE_ENDOFCLIP + || pPath->Equals(*__pCurrentPlayContentPath) == false || __currentContentIndex != contentIndex || __isForceChanged) + { + __isForceChanged = false; + ClosePlayer(); + InitializeProgress(); + InitializePlayer(); + __previousPlayerState = PLAYER_STATE_INITIALIZED; + __currentContentIndex = contentIndex; + GenerateNextIndex(); + __pCurrentPlayContentPath->Clear(); + __pCurrentPlayContentPath->Append(pPath->GetPointer()); + + if (__pCurrentAudioContentInfo != null) + { + delete __pCurrentAudioContentInfo; + __pCurrentAudioContentInfo = null; + } + + __pCurrentAudioContentInfo = CommonUtil::GetAudioContentInfoN(*(__pCurrentPlayContentPath)); + + if (__pCurrentAudioContentInfo != null) + { + if (__pCurrentPlayContentTitle != null) + { + delete __pCurrentPlayContentTitle; + } + if(__pCurrentPlayContentThumbnail != null) + { + delete __pCurrentPlayContentThumbnail; + } + + __pCurrentPlayContentTitle = new (std::nothrow) String(__pCurrentAudioContentInfo->GetTitle()); + __pCurrentPlayContentThumbnail = __pCurrentAudioContentInfo->GetThumbnailN(); + if (__pCurrentPlayContentThumbnail == null) + { + __pCurrentPlayContentThumbnail = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + } + + if (__pCurrentPlayContentArtist != null) + { + delete __pCurrentPlayContentArtist; + } + __pCurrentPlayContentArtist = new (std::nothrow) String(__pCurrentAudioContentInfo->GetArtist()); + __currentPlayContentDuration = __pCurrentAudioContentInfo->GetDuration(); + if (__currentPlayContentDuration == null) + { + __currentPlayContentDuration = __pPlayer->GetDuration(); + } + } + else + { + Tizen::Content::AudioMetadata* pAudioMeta = Tizen::Content::ContentManagerUtil::GetAudioMetaN(*static_cast(__pPlayContentList->GetAt(contentIndex))); + if (__pCurrentPlayContentTitle != null) + { + delete __pCurrentPlayContentTitle; + } + if (__pCurrentPlayContentArtist != null) + { + delete __pCurrentPlayContentArtist; + } + + if (pAudioMeta == null) + { + __pCurrentPlayContentTitle = new (std::nothrow) String(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + __pCurrentPlayContentArtist = new (std::nothrow) String(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + __pCurrentPlayContentThumbnail = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + __currentPlayContentDuration = __pPlayer->GetDuration(); + } + else + { + __pCurrentPlayContentTitle = new (std::nothrow) String(pAudioMeta->GetTitle()); + if (__pCurrentPlayContentTitle == null) + { + __pCurrentPlayContentTitle = new (std::nothrow) String(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + __pCurrentPlayContentArtist = new (std::nothrow) String(pAudioMeta->GetArtist()); + if (__pCurrentPlayContentArtist == null) + { + __pCurrentPlayContentArtist = new (std::nothrow) String(ResourceManager::GetString(L"IDS_MUSIC_BODY_UNKNOWN")); + } + + __pCurrentPlayContentThumbnail = pAudioMeta->GetThumbnailN(); + if (__pCurrentPlayContentThumbnail == null) + { + __pCurrentPlayContentThumbnail = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + } + + __currentPlayContentDuration = pAudioMeta->GetDuration(); + if (__currentPlayContentDuration == null) + { + __currentPlayContentDuration = __pPlayer->GetDuration(); + } + + delete pAudioMeta; + } + } + } + else + { + /* IEnumerator* pEnum = __pPlayContentList->GetEnumeratorN(); + String* pFilePath = null; + int index = 0; + + if(pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + pFilePath = static_cast(pEnum->GetCurrent()); + + if (pFilePath->Equals(*__pCurrentPlayContentPath)) + { + __currentContentIndex = index; + GenerateNextIndex(); + break; + } + index++; + } + + delete pEnum; + }*/ + if (__pPlayer->GetState() == PLAYER_STATE_PLAYING) + { + CallOnPlayContentChanged(__currentContentIndex); + return E_SUCCESS; + } + } + } + + playerState = __pPlayer->GetState(); + + switch (playerState) + { + case PLAYER_STATE_PLAYING: + { + CallOnPlayContentChanged(__currentContentIndex); + } + break; + + case PLAYER_STATE_STOPPED: + // fall through + case PLAYER_STATE_OPENED: + // fall through + case PLAYER_STATE_PAUSED: + // fall through + case PLAYER_STATE_ENDOFCLIP: + { + if (__pPauseAutoOffTimer != null) + { + r = __pPauseAutoOffTimer->Cancel(); + TryLog(r == E_SUCCESS, "__pPauseAutoOffTimer cancel failed\n(%s)", GetErrorMessage(r)); + } + + AppLogDebug("%d", __pPlayer->GetState()); + r = __pPlayer->Play(); + TryCatch(r == E_SUCCESS, , "Play failed(%s)", GetErrorMessage(r)); + if (sliderPosition != 0 && playerState != PLAYER_STATE_PAUSED) + { + r = __pPlayer->SeekTo(sliderPosition * (__pPlayer->GetDuration() / TIMER_INTERVAL)); + TryCatch(r == E_SUCCESS, , "Unable to seek to.\n"); + __playposition = sliderPosition; + } + if (bPausePlay == false) + { + CallOnPlayContentChanged(__currentContentIndex); + } + if (__pPlayStateTimer != null) + { + __pPlayStateTimer->Cancel(); + r = __pPlayStateTimer->Start(MESSAGE_BOX_DELAY/2); + TryCatch(r == E_SUCCESS, , "__pPlayStateTimer start failed..error %s\n",GetErrorMessage(r)); + } + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + // CallOnPlayTimeChanged(currentDuration, __playposition); + } + break; + + case PLAYER_STATE_ERROR: + { + AppLogDebug("PlayerState : %d", playerState); + r = E_FAILURE; + TryCatch(r == E_SUCCESS, , "PLAYER_STATE_ERROR occured.\n"); + } + break; + + case PLAYER_STATE_CLOSED: + // fall through + case PLAYER_STATE_INITIALIZED: + { + TryCatch(__pPlayer != null && pPath != null, r = E_FAILURE, "Player is not initialized or pPath is null."); + r = __pPlayer->OpenFile(*pPath); + TryCatch(r == E_SUCCESS, , "[%ls] OpenFile failed\n(%s).", pPath->GetPointer(), GetErrorMessage(r)); + + if ((__previousPlayerState == PLAYER_STATE_PLAYING) || (__previousPlayerState == PLAYER_STATE_ENDOFCLIP) + || (__previousPlayerState == PLAYER_STATE_INITIALIZED)) + { + if (__pPauseAutoOffTimer != null) + { + r = __pPauseAutoOffTimer->Cancel(); + TryLog(r == E_SUCCESS, "__pPauseAutoOffTimer cancel failed\n(%s)", GetErrorMessage(r)); + } + if (bPlayPause) + { + r = __pPlayer->SetMute(true); + TryLog(r == E_SUCCESS,"__pPlayer->SetMute(true) failed with %s",GetErrorMessage(r)); + } + r = __pPlayer->Play(); + TryCatch(r == E_SUCCESS, , "Play failed\n(%s)", GetErrorMessage(r)); + if (sliderPosition != 0 && playerState != PLAYER_STATE_PAUSED) + { + r = __pPlayer->SeekTo(sliderPosition * (__pPlayer->GetDuration() / TIMER_INTERVAL)); + TryCatch(r == E_SUCCESS, , "Unable to seek to.\n"); + __playposition = sliderPosition; + } + __currentContentTotalDuration = __pPlayer->GetDuration(); + if (__pPlayStateTimer != null) + { + __pPlayStateTimer->Cancel(); + r = __pPlayStateTimer->Start(MESSAGE_BOX_DELAY/2); + TryCatch(r == E_SUCCESS, , "__pPlayStateTimer start failed\n(%s)", GetErrorMessage(r)); + } + } + + r = UpdateContentDB(); + if (r == E_STORAGE_FULL) + { + int messageResult = 0; + MessageBox messageBox; + messageBox.Construct(L"",IDS_STORAGE_FULL,MSGBOX_STYLE_NONE,COUNT_MESSAGE_BOX_TIMEOUT); + messageBox.ShowAndWait(messageResult); + App::GetInstance()->Terminate(); + return r; + } + if (bPausePlay == false) + { + CallOnPlayContentChanged(__currentContentIndex); + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + CallOnPlayTimeChanged(currentDuration, sliderPosition); + } + } + break; + + case PLAYER_STATE_OPENING: + { + } + break; + + default: + break; + } + + CallOnPlayStateChanged(__pPlayer->GetState()); + AppLogDebug("EXIT"); + return E_SUCCESS; + +CATCH: + currentDuration = CommonUtil::GetFormatDate(MIN_SLIDER_COUNT); + CallOnPlayTimeChanged(currentDuration,MIN_SLIDER_COUNT); + CallOnPlayStateChanged(PLAYER_STATE_ERROR); + StopForwardRewind(); + return E_FAILURE; +} + +void +PlayerPresentationModel::Pause(void) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + + result r = E_SUCCESS; + PlayerState playerState = __pPlayer->GetState() ; + AppLogDebug("%d", playerState); + if (playerState == PLAYER_STATE_PLAYING) + { + r = __pPlayer->Pause(); + TryCatch(r == E_SUCCESS, , "__pPlayer pause failed..%s\n",GetErrorMessage(r)); + } + if (__pPlayer->GetState() == PLAYER_STATE_PAUSED) + { + if (__pPlayStateTimer != null) + { + r = __pPlayStateTimer->Cancel(); + TryCatch(r == E_SUCCESS, , "__pPlayStateTimer cancel failed..\n"); + } + if (__pPauseAutoOffTimer != null) + { + /*__pPauseAutoOffTimer->Start(3000);*/ + r = __pPauseAutoOffTimer->Start(PAUSE_AUTO_OFF_TIME); + TryCatch(r == E_SUCCESS, , "__pPauseAutoOffTimer start failed..\n"); + } + } + CallOnPlayStateChanged(__pPlayer->GetState()); + AppLogDebug("EXIT"); + return; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + return; +} + +void PlayerPresentationModel::Mute(const bool isMute) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + __pPlayer->SetMute(isMute); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::MovePreviousContent(bool forceMove) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + + result r = E_SUCCESS; + String currentDuration; + +// if ((__pPlayer->GetState() == PLAYER_STATE_PLAYING || __pPlayer->GetState() == PLAYER_STATE_PAUSED) && (__playposition > MIN_REWIND_POSITION)) + if (__playposition > MIN_REWIND_POSITION && forceMove != true) + { + r = __pPlayer->SeekTo(MIN_SLIDER_COUNT); + TryCatch(r == E_SUCCESS, , "SeekTo failed. [%ls]", GetErrorMessage(r)); + __playposition = MIN_SLIDER_COUNT; + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + CallOnPlayTimeChanged(currentDuration, __playposition); + AppLogDebug("EXIT"); + return; + } + else + { + __isForceChanged = true; + } + +// ClosePlayer(); +// InitializeProgress(); +// InitializePlayer(); +/* if(IsShuffleEnable()) + { + srand(int(time(NULL))); + __currentContentIndex = rand() % __pPlayContentList->GetCount(); + } + else + { + if (__currentContentIndex == 0 || __removedContentIndex == __pPlayContentList->GetCount()) + { + __currentContentIndex = __pPlayContentList->GetCount() - 1; + } + else + { + __currentContentIndex--; + } + + __removedContentIndex = INIT_CONTENT_INDEX; + }*/ + + __currentContentIndex = __previousContentIndex; + GenerateNextIndex(); + __removedContentIndex = INIT_CONTENT_INDEX; + + if (__pPlayContentList->GetCount() > 0) + { + CallOnPlayContentChanged(__currentContentIndex); + if (GetPlayerState() == PLAYER_STATE_PAUSED) + { + __seekCompleted = false; + Play(__currentContentIndex, MIN_SLIDER_COUNT,false,true); + Pause(); + __pPlayer->SeekTo(MIN_SLIDER_COUNT); + //need to unmute the player as it is mute in case of moved next in pause state + __pPlayer->SetMute(false); + InitializeProgress(); + } + } +// Play(__currentContentIndex, MIN_SLIDER_COUNT); + + AppLogDebug("EXIT"); + return; + +CATCH: + //AppLogException("[%s]", GetErrorMessage(r)); + return; +} + +void +PlayerPresentationModel::MoveNextContent(void) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + __currentContentIndex = __nextContentIndex; + GenerateNextIndex(); + __removedContentIndex = INIT_CONTENT_INDEX; + __isForceChanged = true; + if (__pPlayContentList->GetCount() > 0) + { + CallOnPlayContentChanged(__currentContentIndex); + + if (GetPlayerState() == PLAYER_STATE_PAUSED) + { + __seekCompleted = false; + Play(__currentContentIndex, MIN_SLIDER_COUNT,false,true); + Pause(); +// __pPlayer->SeekTo(MIN_SLIDER_COUNT); + //need to unmute the player as it is mute in case of moved next in pause state + __pPlayer->SetMute(false); + InitializeProgress(); + } + } +// Play(__currentContentIndex, MIN_SLIDER_COUNT); + + AppLogDebug("EXIT"); + return; +} + +void +PlayerPresentationModel::SeekToRewind(void) +{ + AppLogDebug("ENTER"); + int playDuration = __pPlayer->GetDuration(); + if(playDuration != 0) + { + //__playposition = static_cast(__pPlayer->GetPosition() / (playDuration / TIMER_INTERVAL)); + __playposition = static_cast(__pPlayer->GetPosition() * TIMER_INTERVAL / playDuration); + Rewind(); + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::Rewind(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + __pPlayStateTimer->Cancel(); + int newPosition = __playposition - __xTimesValue; + + if (__playposition != newPosition) + { + __playposition = newPosition; + r = SetPlayPosition(__playposition); + if (IsFailed(r)) + { + StopForwardRewind(); + // if there is some error in reading from the content file + // it needs to show the message and Update the Ui accordingly. + if (r == E_INVALID_DATA) + { + __pPlayer->Stop(); + InitializeProgress(); + InitializePlayer(); + CallOnPlayStateChanged(PLAYER_STATE_ERROR); + } + return; + } + } + + if (__playposition < MIN_SLIDER_COUNT && GetPlayerState() == PLAYER_STATE_PAUSED) + { + StopForwardRewind(); + return; + } + + if (__pFastRewindTimer != null) + { + r = __pFastRewindTimer->Start(PROGRESS_TIMER_DURATION); + TryCatch(r == E_SUCCESS, , "__pFastRewindTimer start failed. [%ls]", GetErrorMessage(r)); + } + + AppLogDebug("EXIT"); + return; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + return; +} + +void +PlayerPresentationModel::SeekToForward(void) +{ + AppLogDebug("ENTER"); + int playDuration = __pPlayer->GetDuration(); + if (playDuration > 0) + { + __playposition = static_cast(__pPlayer->GetPosition() * TIMER_INTERVAL / playDuration); + Forward(); + } + + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::Forward(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + __pPlayStateTimer->Cancel(); + int newPosition = __playposition - __xTimesValue; + + if (__playposition != newPosition) + { + __playposition = newPosition; + __playposition = __playposition - __xTimesValue; + r = SetPlayPosition(__playposition); + if (IsFailed(r)) + { + AppLogDebug("SetPlayPosition Failed %s",GetErrorMessage(r)); + StopForwardRewind(); + // if there is some error in reading from the content file + // it needs to show the message and Update the Ui accordingly. + if (r == E_INVALID_DATA) + { + __pPlayer->Stop(); + InitializeProgress(); + InitializePlayer(); + CallOnPlayStateChanged(PLAYER_STATE_ERROR); + } + + return; + } + } + + if (__pFastForwardTimer != null) + { + r = __pFastForwardTimer->Start(PROGRESS_TIMER_DURATION); + TryCatch(r == E_SUCCESS, , "__pFastForwardTimer start failed. [%ls]", GetErrorMessage(r)); + } + + AppLogDebug("EXIT"); + return; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + return; +} + +void +PlayerPresentationModel::StopForwardRewind(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pFastForwardTimer != null) + { + r = __pFastForwardTimer->Cancel(); + TryLog(r == E_SUCCESS, "[%s] __pFastForwardTimer cancel failed", GetErrorMessage(r)); + } + + if (__pFastRewindTimer != null) + { + r = __pFastRewindTimer->Cancel(); + TryLog(r == E_SUCCESS, "[%s] __pFastRewindTimer cancel failed", GetErrorMessage(r)); + } + __xTimesValue = INIT_X_VALUE; + __seekCompleted = true; + __pPlayStateTimer->Cancel(); + r = __pPlayStateTimer->Start(MESSAGE_BOX_DELAY/2); + + AppLogDebug("EXIT"); + return; +} + +result +PlayerPresentationModel::SetPlayPosition(int playPosition) +{ + AppLogDebug("ENTER %d",playPosition); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + result r = E_SUCCESS; + String currentDuration; + if (/*(playPosition >= MIN_SLIDER_COUNT) && (playPosition <= TIMER_INTERVAL) &&*/ __seekCompleted == true) + { + if (GetPlayerState() == PLAYER_STATE_PLAYING || GetPlayerState() == PLAYER_STATE_PAUSED || GetPlayerState() == PLAYER_STATE_OPENED) + { + if (playPosition >= MAX_SLIDER_COUNT) + { + r = __pPlayer->SeekTo(__pPlayer->GetDuration()); + TryCatch(r == E_SUCCESS, , "__pPlayer seekto failed..\n"); + __playposition = MAX_SLIDER_COUNT; +// StopForwardRewind(); +// __seekCompleted = false; +// return; + } + else if (playPosition <= MIN_SLIDER_COUNT) + { + r = __pPlayer->SeekTo(MIN_SLIDER_COUNT); + TryCatch(r == E_SUCCESS, , "__pPlayer seekto failed..\n"); + __playposition = MIN_SLIDER_COUNT; + } + else + { + int position = playPosition * (__pPlayer->GetDuration() / TIMER_INTERVAL); + AppLogDebug("position(%d)", position); + r = __pPlayer->SeekTo(position); + TryCatch(r == E_SUCCESS, , "__pPlayer seekto failed..\n"); + __playposition = playPosition; + } + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Unable to seek to.\n"); + //currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + //CallOnPlayTimeChanged(currentDuration, __playposition); + __seekCompleted = false; + } + else + { +// __playposition = playPosition; +// currentDuration = CommonUtil::GetFormatDate(playPosition * (__currentPlayContentDuration / TIMER_INTERVAL)); +// CallOnPlayTimeChanged(currentDuration, __playposition); + __seekCompleted = true; + } + } + + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException( "[%s]", GetErrorMessage(r)); + if (__pPlayer->GetDuration() > MIN_SLIDER_COUNT) + { + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + CallOnPlayTimeChanged(currentDuration, __playposition); + } + __seekCompleted = false; + AppLogDebug("EXIT"); + return r; +} + +int +PlayerPresentationModel::GetPlayPosition(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __playposition; +} + +String +PlayerPresentationModel::GetCurrentDuration(void) +{ + AppLogDebug("ENTER"); + String currentDuration; + if (__pPlayer != null) + { + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + } + else + { + currentDuration = CommonUtil::GetFormatDate(INIT_VALUE); + } + AppLogDebug("EXIT"); + return currentDuration; +} + +result +PlayerPresentationModel::SetContentList(IList* pArgs) +{ + AppLogDebug("ENTER"); + TryReturn( pArgs != null && pArgs->GetCount() > 0, E_INVALID_ARG, "Invalid arguments"); + result r = E_SUCCESS; + String* pTemp = null; + + if (__pPlayContentList == null) + { + __pPlayContentList = new (std::nothrow) ArrayList(); + TryCatch(__pPlayContentList != null, r = E_OUT_OF_MEMORY, "Unable to create ArrayList.\n"); + + r = __pPlayContentList->Construct(); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to Construct ArrayList.\n"); + } + else + { + __pPlayContentList->RemoveAll(true); + } + + pTemp = static_cast(pArgs->GetAt(0)); + if (pTemp->Equals(MUSIC, true)) + { + ArrayList* pContentList = static_cast(pArgs->GetAt(2)); + TryReturn(pContentList != null, E_FAILURE, "pArgs->GetAt(2) is null.") + + IEnumerator* pEnum = pContentList->GetEnumeratorN(); + + if (pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pContentPath = static_cast(pEnum->GetCurrent()); + AppLogDebug("%ls", pContentPath->GetPointer()); + __pPlayContentList->Add(new (std::nothrow) String(*pContentPath)); + } + delete pEnum; + } + } + else + { + ArrayList* pContentList = static_cast(pArgs->GetAt(0)); + TryReturn(pContentList != null, E_FAILURE, "pArgs->GetAt(0) is null.") + + IEnumerator* pEnum = pContentList->GetEnumeratorN(); + if (pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pContentPath = static_cast(pEnum->GetCurrent()); + AppLogDebug("%ls", pContentPath->GetPointer()); + __pPlayContentList->Add(new (std::nothrow) String(*pContentPath)); + } + + delete pEnum; + } + __isForceChanged = true; + } + + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException("[%s].\n",GetErrorMessage(r)); + if (__pPlayContentList != null) + { + delete __pPlayContentList; + __pPlayContentList = null; + } + return r; +} + +int +PlayerPresentationModel::GetContentListCount(void)const +{ + AppLogDebug("ENTER"); + if (__pPlayContentList != null) + { + AppLogDebug("EXIT"); + return __pPlayContentList->GetCount(); + } + else + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } +} + +result +PlayerPresentationModel::SetVolume(int volume) +{ + AppLogDebug("ENTER"); + String key(MEDIA_VOLUME); + result r = E_SUCCESS; + + if (__pVolumeBarStateTimer != null) + { + r = __pVolumeBarStateTimer->Cancel(); + TryLog(r == E_SUCCESS, "[%s] __pVolumeBarStateTimer cancel failed.", GetErrorMessage(r)); + r = __pVolumeBarStateTimer->Start(VOLUMEBAR_INTERVAL); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to Start __pVolumeBarStateTimer.\n"); + } + + if (volume >= 0 && volume <= 15) + { + SettingInfo::SetValue(key, volume); + } + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + return r; +} + +int +PlayerPresentationModel::GetVolume(void) +{ + AppLogDebug("ENTER"); + int volume = 0; + String key(MEDIA_VOLUME); + SettingInfo::GetValue(key, volume); + AppLogDebug("EXIT"); + return volume; +} + +void +PlayerPresentationModel::SetShuffleEnable(bool shuffleEnable) +{ + AppLogDebug("ENTER"); +/* int __totalCount = 0; + + if (__pPlayContentList != null) + { + __totalCount = __pPlayContentList->GetCount(); + } + + if (shuffleEnable == true) + {// 0 - 1 (OFF, ON) + int nDust; + int nSour; + int nTemp; + srand(int(time(NULL))); + for (int i = 0; i < __totalCount; i++) + { + nDust = rand() % __totalCount; + nSour = rand() % __totalCount; + + nTemp = __pPlayContentIndexOrder[nDust]; + __pPlayContentIndexOrder[nDust] = __pPlayContentIndexOrder[nSour]; + __pPlayContentIndexOrder[nSour] = nTemp; + } + + for (int i = 0; i < __totalCount; i++) + { + if (__pPlayContentIndexOrder[i] - 1 == __currentContentIndex) + { + nTemp = __pPlayContentIndexOrder[i]; + __pPlayContentIndexOrder[i] = __pPlayContentIndexOrder[__currentContentIndex]; + __pPlayContentIndexOrder[__currentContentIndex] = nTemp; + } + } + } + else + { + int currentIndex = __currentContentIndex; + __currentContentIndex = __pPlayContentIndexOrder[currentIndex] - 1; + for (int i=0; i<__totalCount; i++) + { + __pPlayContentIndexOrder[i]=i + 1; + } + }*/ + __shuffleEnable = shuffleEnable; + GenerateNextIndex(); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::SetRepeatMode(int repeatMode) +{ + AppLogDebug("ENTER"); + __repeatMode = repeatMode; + AppLogDebug("EXIT"); +} + +bool +PlayerPresentationModel::IsShuffleEnable(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __shuffleEnable; +} + +bool +PlayerPresentationModel::IsFileExist(int contentIndex) const +{ + AppLogDebug("ENTER"); + TryReturn(contentIndex >= 0 && contentIndex < __pPlayContentList->GetCount(), false, "contentIndex is invalid.") + String* pFilePath = GetContentPath(contentIndex); + + File file; + + result r = file.Construct(*pFilePath, "r"); + TryReturn(r == E_SUCCESS, false, "File construct was failed.") + + AppLogDebug("EXIT"); + return file.IsFileExist(*pFilePath); +} + +int +PlayerPresentationModel::GetRepeatState(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __repeatMode; +} + +String +PlayerPresentationModel::GetFileName(String* pFilePath) +{ + AppLogDebug("ENTER"); + String path = Tizen::Io::File::GetFileName(*pFilePath); + String strRemoveTemp = IDS_BLANK; + int removeIndex = -1 ; + path.LastIndexOf(IDS_PERIOD, path.GetLength() - 1, removeIndex); + path.SubString(removeIndex + 1, strRemoveTemp); + String strTemp = IDS_BLANK; + + path.Remove(removeIndex, strRemoveTemp.GetLength() + 1); + path.SubString(0, strTemp); + AppLogDebug("EXIT"); + return strTemp; +} + +void +PlayerPresentationModel::InitializeProgress(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + String currentDuration; + if (__pPlayer != null) + { + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + } + else + { + currentDuration = INITIAL_TIME; + } + + if (__pPlayStateTimer != null /*&& __previousPlayerState != PLAYER_STATE_INITIALIZED*/ + && __previousPlayerState != PLAYER_STATE_PAUSED + && __previousPlayerState != PLAYER_STATE_CLOSED) + { + r = __pPlayStateTimer->Cancel(); + TryLog(r == E_SUCCESS, "[%s] __pPlayStateTimer cancel failed.", GetErrorMessage(r)); + } + __playposition = MIN_SLIDER_COUNT; +// __seekCompleted = true; + __xTimesValue = INIT_VALUE; + //CallOnPlayTimeChanged(currentDuration, __playposition); + AppLogDebug("EXIT"); + return; +} + +result +PlayerPresentationModel::UpdateContentDB(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + int playCount = 0; + String contentIdString; + ArrayList* pTempList = null; + + Tizen::Base::String contentPath = *static_cast(__pPlayContentList->GetAt(__currentContentIndex)); + if (File::IsFileExist(contentPath) == false) + { + AppLogDebug("File not exist(%ls)", contentPath.GetPointer()); + return GetLastResult(); + } + + ContentId contentId = CommonUtil::GetContentId(contentPath); + if (IsFailed(GetLastResult())) + { + AppLogDebug("CommonUtil::GetContentId(%ls) failed", contentPath.GetPointer()); + return GetLastResult(); + } + + DateTime playTime; + Tizen::System::SystemTime::GetCurrentTime(Tizen::System::TIME_MODE_STANDARD, playTime); + Tizen::Base::String playTimeString = playTime.ToString(); + + PlaylistDB* pPlaylistDB = new (std::nothrow) PlaylistDB(); + r = pPlaylistDB->CreatePlaylistDatabase(); + TryCatch(r == E_SUCCESS,,"CreatePlaylistDatabase() failed with error %s",GetErrorMessage(r)); + +// pTempList = new (std::nothrow) ArrayList(); +// pTempList->Construct(); + + contentIdString = contentId.ToString(); + if (pPlaylistDB->Read(contentIdString) != E_KEY_ALREADY_EXIST) + { + r = pPlaylistDB->Insert(contentIdString, playCount + 1, playTimeString); + } + else + { + pTempList = pPlaylistDB->ReadValueN(contentIdString); + if (pTempList != null) + { + playCount = static_cast(pTempList->GetAt(0))->ToInt(); + } + r = pPlaylistDB->Update(contentIdString, playCount + 1, playTimeString); + } + +CATCH: + + if (pPlaylistDB != null) + { + delete pPlaylistDB; + pPlaylistDB = null; + } + + if (pTempList != null) + { + pTempList->RemoveAll(true); + delete pTempList; + pTempList = null; + } + AppLogDebug("EXIT %s",GetErrorMessage(r)); + return r; +} + +void +PlayerPresentationModel::GenerateNextIndex(void) +{ + AppLogDebug("ENTER"); + if (IsShuffleEnable()) + { + int totalCount = __pPlayContentList->GetCount(); + + if (totalCount < 2) + { + __previousContentIndex = 0; + __nextContentIndex = 0; + } + else + { + srand(int(time(NULL))); + __previousContentIndex = rand() % totalCount; + while (__previousContentIndex == __currentContentIndex) + { + __previousContentIndex = rand() % totalCount; + } + + __nextContentIndex = rand() % totalCount; + while (__nextContentIndex == __currentContentIndex) + { + __nextContentIndex = rand() % totalCount; + } + } + } + else + { + if (__pPlayContentList->GetCount() == 0) + { + __previousContentIndex = 0; + __nextContentIndex = 0; + return; + } + + if (__currentContentIndex == 0 || __removedContentIndex == __pPlayContentList->GetCount()) + { + __previousContentIndex = __pPlayContentList->GetCount() - 1; + } + else + { + __previousContentIndex = __currentContentIndex - 1; + } + + if (__currentContentIndex == __pPlayContentList->GetCount() - 1 + || __removedContentIndex == __pPlayContentList->GetCount()) + { + __nextContentIndex = 0; + } + else + { + if (__removedContentIndex != INIT_CONTENT_INDEX) + { + __nextContentIndex = __previousContentIndex + 1; + if (__nextContentIndex > __pPlayContentList->GetCount() - 1) + { + __nextContentIndex = 0; + } + } + else + { + __nextContentIndex = __currentContentIndex + 1; + } + } + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerOpened(result r) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerReleased(void) +{ + AppLogDebug("ENTER"); + if (__pPlayer != null && (__pPlayer->GetState() == PLAYER_STATE_PAUSED)) + { + Play(__currentContentIndex, MIN_SLIDER_COUNT); + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerEndOfClip(void) +{ + AppLogDebug("ENTER"); +// StopForwardRewind(); + + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + if (__seekCompleted) + { + String totalDuration = CommonUtil::GetFormatDate(__currentContentTotalDuration); + AppLogDebug("totalDuration(%ls), __currentContentTotalDuration(%d)", totalDuration.GetPointer(), __currentContentTotalDuration); + CallOnPlayTimeChanged(totalDuration, MAX_SLIDER_COUNT); + __playposition = MIN_PLAY_STATE_SLIDER_COUNT; + } + + __seekCompleted = true; + AppLogDebug("GetRepeatState() : %d", GetRepeatState()); + switch (GetRepeatState())// 0 - 2 (OFF, ONE, ALL) + { + case 1: + { + AppLogDebug("Repeat State(%d)", 1); + while (__pPlayContentList->GetCount() > 0 && __currentContentIndex < __pPlayContentList->GetCount() && IsFileExist(__currentContentIndex) == false) + { + String* pContentPath = GetContentPath(__currentContentIndex); + + if (pContentPath != null) + { + RemoveContent(*pContentPath); + } + } + + //Need to play the currently loaded song in case there is no other content available in "Now Playing List" + if (__pPlayContentList->GetCount() == 0) + { + InitializeProgress(); + Play(__currentContentIndex, MIN_SLIDER_COUNT, true); + break; + } + + ClosePlayer(); + InitializeProgress(); + InitializePlayer(); + Play(__currentContentIndex, MIN_SLIDER_COUNT); + } + break; + + case 0: + { + AppLogDebug("Repeat State(%d)", 0); + if (__pPlayContentList->GetCount() - 1 == __currentContentIndex) + { + StopForwardRewind(); + InitializeProgress(); + Play(__currentContentIndex, MIN_SLIDER_COUNT, true); + Pause(); + } + else + { + while (__pPlayContentList->GetCount() > 0 && GetNextContentIndex() < __pPlayContentList->GetCount() && IsFileExist(GetNextContentIndex()) == false) + { + String* pContentPath = GetContentPath(GetNextContentIndex()); + + if (pContentPath != null) + { + RemoveContent(*pContentPath); + } + } + MoveNextContent(); + InitializeProgress(); + Play(__currentContentIndex, MIN_SLIDER_COUNT); + } + } + break; + + case 2: + { + AppLogDebug("Repeat State(%d)", 2); + + while (__pPlayContentList->GetCount() > 0 && GetNextContentIndex() < __pPlayContentList->GetCount() && IsFileExist(GetNextContentIndex()) == false) + { + String* pContentPath = GetContentPath(GetNextContentIndex()); + + if (pContentPath != null) + { + RemoveContent(*pContentPath); + } + } + + //Need to play the currently loaded song in case there is no other content available in "Now Playing List" + if (__pPlayContentList->GetCount() == 0) + { + InitializeProgress(); + Play(__currentContentIndex, MIN_SLIDER_COUNT, true); + break; + } + + MoveNextContent(); + InitializeProgress(); + Play(__currentContentIndex, MIN_SLIDER_COUNT); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerBuffering(int percent) +{ + AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + CallOnPlayStateChanged(__pPlayer->GetState()); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerErrorOccurred(PlayerErrorReason r) +{ + AppLogDebug("ENTER Error Reason = %d", r); + if (__pPlayer == null) + { + AppLogDebug("EXIT"); + return; + } + // in case of Device failed stop the player and reinitialize for next content + PlayerState playerState = __pPlayer->GetState(); + if (r == PLAYER_ERROR_DEVICE_FAILED) + { + __pPlayer->Stop(); + InitializeProgress(); + InitializePlayer(); + } + + CallOnPlayStateChanged(playerState); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerInterrupted(void) +{ + AppLogDebug("ENTER"); + Pause(); + AppLogDebug("EXIT"); + return; +} + +void +PlayerPresentationModel::OnPlayerSeekCompleted(result r) +{ + AppLogDebug("ENTER %s",GetErrorMessage(r)); + + if (!__seekCompleted) + { + String currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + CallOnPlayTimeChanged(currentDuration, __playposition); + AppLogDebug("current duration %ls",currentDuration.GetPointer()); + } + + if (r == E_SUCCESS) + { + __seekCompleted = true; + } + else + { + __seekCompleted = false; + } + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnPlayerAudioFocusChanged(void) +{ + AppLogDebug("ENTER"); + /*__audioFocusChanged = true;*/ + Pause(); + AppLogDebug("EXIT"); +} + +/*void +PlayerPresentationModel::OnAudioSessionInterrupted(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnAudioSessionInterruptReleased(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::OnAudioSessionAudioFocusChanged(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +}*/ + +void +PlayerPresentationModel::OnTimerExpired(Timer& timer) +{ +// AppLogDebug("ENTER"); + if (__pPlayer == null) + { + AppLogDebug("EXIT player is null"); + return; + } + + result r = E_SUCCESS; + if (__pPlayStateTimer == &timer) + { + String currentDuration; + PlayerState playerState = __pPlayer->GetState() ; + long playDuration = __pPlayer->GetDuration(); + TryReturnVoid(playDuration != 0, "playDuration is zero."); + + switch (playerState) + { + case PLAYER_STATE_PLAYING: + { + if ( playDuration < 2000) + { + currentDuration = CommonUtil::GetFormatDate(playDuration); + CallOnPlayTimeChanged(currentDuration, TIMER_INTERVAL); + return; + } + + r = __pPlayStateTimer->Start(PROGRESS_BAR_DURATION_TIMER); + + TryCatch(r == E_SUCCESS, , "__pPlayStateTimer start failed..\n"); + TryReturnVoid(__seekCompleted == true, "SeekTo is not complete."); + //AppLogDebug("GetPosition(%d), playDuration(%d)", __pPlayer->GetPosition(), playDuration); + + if (__pPlayer->GetPosition() <= playDuration) + { + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + __playposition = static_cast(__pPlayer->GetPosition() * TIMER_INTERVAL / playDuration); +// AppLogDebug("currentDuration(%s), __playposition(%d)", currentDuration.GetPointer(), __playposition); + CallOnPlayTimeChanged(currentDuration, __playposition); + } + } + break; + + case PLAYER_STATE_PAUSED: + { + TryReturnVoid(__seekCompleted == true, "SeekTo is not complete."); + TryReturnVoid(playDuration != 0, "playDuration is zero."); + currentDuration = CommonUtil::GetFormatDate(__pPlayer->GetPosition()); + __playposition = static_cast(__pPlayer->GetPosition() * TIMER_INTERVAL / playDuration); + CallOnPlayTimeChanged(currentDuration, __playposition); + } + break; + + default: + break; + } + } + else if (__pFastForwardTimer == &timer) + { + __xTimesValue--; + Forward(); + } + else if (__pFastRewindTimer == &timer) + { + __xTimesValue++; + Rewind(); + } + else if (__pAutoOffTimer == &timer) + { + Application::GetInstance()->Terminate(); + } + else if (__pPauseAutoOffTimer == &timer) + { + Application::GetInstance()->Terminate(); + } + else if (__pVolumeBarStateTimer == &timer) + { + r = __pVolumeBarStateTimer->Cancel(); + TryLog(r == E_SUCCESS, "[%s] __pVolumeBarStateTimer cancel Failed.", GetErrorMessage(r)); + CallOnPlayVolumeBarStateChanged(); + } + else + { + //AppLogDebug("Timer is invalid value."); + } +// AppLogDebug("EXIT"); + + return; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + return; +} + +void +PlayerPresentationModel::AddMusicPlayerEventListener(const IMusicPlayerEventListener& listener) +{ + AppLogDebug("ENTER"); + __musicPlayerEventListener.Add(const_cast(&listener)); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::RemoveMusicPlayerEventListener(const IMusicPlayerEventListener& listener) +{ + AppLogDebug("ENTER"); + __musicPlayerEventListener.Remove(const_cast(&listener)); + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayStateChanged(PlayerState playerState) +{ + AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayStateChanged(playerState); + } + } + delete pEnum; + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayContentChanged(int currentContentIndex) +{ + AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayContentChanged(currentContentIndex); + } + } + delete pEnum; + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayContentRemoved(int removedContentIndex) +{ + AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayContentRemoved(removedContentIndex); + } + } + delete pEnum; + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayTimeChanged(Tizen::Base::String& currentDuration, int currentPosition) +{ +// AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayTimeChanged(currentDuration, currentPosition); + } + } + delete pEnum; +// AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayVolumeBarStateChanged(void) +{ + AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayVolumeBarStateChanged(); + } + } + delete pEnum; + AppLogDebug("EXIT"); +} + +void +PlayerPresentationModel::CallOnPlayPresentationModelDestroying(void) +{ + AppLogDebug("ENTER"); + IMusicPlayerEventListener* pListener = null; + IEnumeratorT* pEnum = __musicPlayerEventListener.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pListener); + if (pListener != null) + { + pListener->OnPlayPresentationModelDestroying(); + } + } + delete pEnum; + AppLogDebug("EXIT"); +} diff --git a/src/MpNotificationTicker.cpp b/src/MpNotificationTicker.cpp new file mode 100644 index 0000000..8c02b7a --- /dev/null +++ b/src/MpNotificationTicker.cpp @@ -0,0 +1,282 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpNotificationTicker.cpp + * @brief This is the implementation file for NotificationTicker class. + */ + +#include +#include "MpCommonUtil.h" +#include "MpNotificationTicker.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Animations; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +NotificationTicker::NotificationTicker(void) + : __pNotificationTickerPanel(null) + , __pTickerTextLabel(null) + , __pBgBitmap(null) + , __hideStateRectangle() + , __showStateRectangle() + , __showTransactionId(-1) + , __HideTransactionId(-1) + , __timeOut(0) + , __isDestory(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +NotificationTicker::~NotificationTicker(void) +{ + AppLogDebug("ENTER"); + if (__isDestory == false) + { + AnimationTransaction::SetTransactionEventListener(null); + + if (__pNotificationTickerPanel != null) + { + RemoveControl(__pNotificationTickerPanel); + __pNotificationTickerPanel = null; + } + + if (__pBgBitmap != null) + { + delete __pBgBitmap; + } + } + AppLogDebug("EXIT"); +} + +result +NotificationTicker::Construct(void) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + __pNotificationTickerPanel = new (std::nothrow) Panel(); + result r = __pNotificationTickerPanel->Construct(L"IDL_NOTIFICATION_TICKER_PANEL"); + TryCatch(r == E_SUCCESS, , "Construct failed(%s)", GetErrorMessage(r)); + + r = Window::Construct(layout, __pNotificationTickerPanel->GetBounds()); + TryCatch(r == E_SUCCESS, , "Construct failed(%s)", GetErrorMessage(r)); + + __pTickerTextLabel = static_cast(__pNotificationTickerPanel->GetControl(L"IDC_LABEL_NOTIFICATION_TEXT")); + + AddControl(__pNotificationTickerPanel); + SetShowState(false); + + AnimationTransaction::SetTransactionEventListener(this); + AppLogDebug("EXIT"); + return r; + +CATCH: + delete __pNotificationTickerPanel; + __pNotificationTickerPanel = null; + + AppLogDebug("EXIT(%s)", GetErrorMessage(r)); + return r; +} + +void +NotificationTicker::SetBoundTicker(Tizen::Graphics::Rectangle rect) +{ + AppLogDebug("ENTER"); + Point point = rect.GetTopLeft(); + Dimension dimension(rect.width, rect.height); + + __showStateRectangle.SetBounds(point, dimension); + SetBounds(__showStateRectangle); + + point.y = - dimension.height; + __hideStateRectangle.SetBounds(point, dimension); + AppLogDebug("EXIT"); +} + +void +NotificationTicker::ShowTicker(const Tizen::Base::String& text, int timeOut) +{ + AppLogDebug("ENTER"); + ForceStopAnimation(); + + __pTickerTextLabel->SetText(text); + __timeOut = timeOut; + + SetShowState(true); + Show(); + AppLogDebug("EXIT"); +} + +void +NotificationTicker::ForceStopAnimation(void) +{ + AppLogDebug("ENTER"); + AnimationTransaction::Discard(); + if (GetShowState() == true) + { + SetShowState(false); + } + AppLogDebug("EXIT"); +} + +result +NotificationTicker::DestoryTicker(void) +{ + AppLogDebug("ENTER"); + __isDestory= true; + AppLogDebug("EXIT"); + return Destroy(); +} + +void +NotificationTicker::PlayControlAnimator(bool isShow) +{ + AppLogDebug("ENTER"); + if (isShow == true) + { + AnimationTransaction::Begin(__showTransactionId); + RectangleAnimation tickerAnimation(__hideStateRectangle, __showStateRectangle, 1000, ANIMATION_INTERPOLATOR_LINEAR); + __pNotificationTickerPanel->GetControlAnimator()->StartUserAnimation(ANIMATION_TARGET_POSITION, tickerAnimation); + } + else + { + AnimationTransaction::Begin(__HideTransactionId); + RectangleAnimation tickerAnimation(__showStateRectangle, __hideStateRectangle, 1000, ANIMATION_INTERPOLATOR_LINEAR); + tickerAnimation.SetDelay(__timeOut); + __pNotificationTickerPanel->GetControlAnimator()->StartUserAnimation(ANIMATION_TARGET_POSITION, tickerAnimation); + } + AnimationTransaction::Commit(); + AppLogDebug("EXIT"); +} + +result +NotificationTicker::OnInitializing(void) +{ + AppLogDebug("ENTER"); + PlayControlAnimator(true); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +NotificationTicker::OnTerminating(void) +{ + AppLogDebug("ENTER"); + if (__isDestory == true) + { + AnimationTransaction::SetTransactionEventListener(null); + + if (__pNotificationTickerPanel != null) + { + RemoveControl(__pNotificationTickerPanel); + __pNotificationTickerPanel = null; + } + + if (__pBgBitmap != null) + { + delete __pBgBitmap; + __pBgBitmap = null; + } + } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +NotificationTicker::OnAnimationTransactionStopped(int transactionId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NotificationTicker::OnAnimationTransactionFinished(int transactionId) +{ + AppLogDebug("ENTER"); + if (transactionId == __showTransactionId) + { + PlayControlAnimator(false); + __showTransactionId = -1; + } + else if (transactionId == __HideTransactionId) + { + SetShowState(false); + __HideTransactionId = -1; + } + AppLogDebug("EXIT"); +} + +result +NotificationTicker::OnDraw(void) +{ + AppLogDebug("ENTER"); + Canvas* pCanvas = GetCanvasN(); + if (pCanvas != null) + { + DrawBackground(*pCanvas); + delete pCanvas; + } + + AppLogDebug("EXIT"); + return Window::OnDraw(); +} + +void +NotificationTicker::DrawBackground(Tizen::Graphics::Canvas& canvas) +{ + AppLogDebug("ENTER"); + if (__pBgBitmap != null) + { + delete __pBgBitmap; + } + + __pBgBitmap = GetCapturedBitmapN(); + if (__pBgBitmap != null) + { + canvas.Clear(); + canvas.DrawBitmap(GetBounds(), *__pBgBitmap, GetBounds()); + delete __pBgBitmap; + __pBgBitmap = null; + } + AppLogDebug("EXIT"); +} + +Tizen::Graphics::Bitmap* +NotificationTicker::GetCapturedBitmapN(void) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + Scene* pScene = pSceneManager->GetCurrentScene(); + AppAssert(pScene); + + Form* pForm = pScene->GetForm(); + if (pForm == null) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return pForm->GetCapturedBitmapN(); +} \ No newline at end of file diff --git a/src/MpNowPlayContentPanel.cpp b/src/MpNowPlayContentPanel.cpp new file mode 100644 index 0000000..249b95a --- /dev/null +++ b/src/MpNowPlayContentPanel.cpp @@ -0,0 +1,375 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpNowPlayContentPanel.cpp + * @brief This is the implementation file for NowPlayContentPanel class. + */ + +#include "MpNowPlayContentPanel.h" +#include "MpResourceManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const Tizen::Graphics::Rectangle RECT_MUSIC_THUMBNAIL (32, 22, 76, 76); +static const Tizen::Graphics::Rectangle RECT_MUSIC_TOUCH (140, 0, 590, 120); +static const Tizen::Graphics::Rectangle RECT_MUSIC_TITLE (140, 5, 550, 38); +static const Tizen::Graphics::Rectangle RECT_SLIDER (120, 0, 600,120); + +static const Tizen::Graphics::Color COLOR_NOW_PLAY_TITLE (90, 99, 104); + +static const Tizen::Base::String PLAYING_ICON_PLAY = L"T02_now_playing_icon_play.png"; +static const Tizen::Base::String PLAYING_ICON_PAUSE = L"T02_now_playing_icon_pause.png"; + +static const Tizen::Base::String PLAYING_TEXT = L"PlayIcon"; +static const Tizen::Base::String PLAY_FORM_TEXT = L"PlayForm"; + +static const int SLIDER_MAX_VALUE = 100; + +NowPlayContentPanel::NowPlayContentPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +NowPlayContentPanel::~NowPlayContentPanel(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel->RemoveMusicPlayerEventListener(*this); + } + AppLogDebug("EXIT"); +} + +result +NowPlayContentPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + __pPresentationModel = PlayerPresentationModel::GetInstance(); + + r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, W_NOW_PLAY_BAR, H_NOW_PLAY_BAR)); + if (IsFailed(r)) + { + AppLogDebug("EXIT"); + return E_INVALID_STATE; + } + +// SetBackgroundColor(COLOR_NOW_PLAY_PANEL); + + __pThumbnailLabel = new (std::nothrow) Label(); + __pThumbnailLabel->Construct(RECT_MUSIC_THUMBNAIL, L""); + + __pPlayStatusLabel = new (std::nothrow) Label(); + __pPlayStatusLabel->Construct(RECT_MUSIC_THUMBNAIL, L""); + __pPlayStatusLabel->SetName(PLAYING_TEXT); + __pPlayStatusLabel->AddTouchEventListener(*this); + + __pTitleLabel = new (std::nothrow) Label(); + __pTitleLabel->Construct(RECT_MUSIC_TITLE, L""); + __pTitleLabel->SetTextColor(COLOR_NOW_PLAY_TITLE); + __pTitleLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + __pTitleLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + + __pPlayStateSlider = new (std::nothrow) Slider(); + __pPlayStateSlider->Construct(RECT_SLIDER, BACKGROUND_STYLE_NONE, false, INIT_VALUE, SLIDER_MAX_VALUE); + __pPlayStateSlider->SetBarColor(Color::GetColor(COLOR_ID_WHITE)); + __pPlayStateSlider->SetColor(Color::GetColor(COLOR_ID_BLUE)); + + __pTouchLabel = new (std::nothrow) Label(); + __pTouchLabel->Construct(RECT_MUSIC_TOUCH, L""); + __pTouchLabel->SetName(PLAY_FORM_TEXT); + __pTouchLabel->AddTouchEventListener(*this); + + AddControl(__pPlayStateSlider); + AddControl(__pThumbnailLabel); + AddControl(__pPlayStatusLabel); + AddControl(__pTitleLabel); + AddControl(__pTouchLabel); + + __pPresentationModel->AddMusicPlayerEventListener(*this); + + Bitmap* SongThumbnail = null; + String songTitle; + String songArtist; + int SongDuration = 0; + + SongThumbnail = __pPresentationModel->GetPlayContentThumbnail(); + songTitle = *__pPresentationModel->GetPlayContentTitle(); + songArtist = *__pPresentationModel->GetPlayContentArtist(); + SongDuration = __pPresentationModel->GetPlayContentDuration(); + + String titleBar; + titleBar.Format(STRING_LENGTH, L"%ls / %ls", songTitle.GetPointer(), songArtist.GetPointer()); + + __pThumbnailLabel->SetBackgroundBitmap(*SongThumbnail); + + switch (__pPresentationModel->GetPlayerState()) + { + case PLAYER_STATE_PLAYING: + { + __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PAUSE)); + } + break; + + case PLAYER_STATE_PAUSED: + { + __pPresentationModel->Pause(); + __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PLAY)); + } + break; + + default: + break; + } + + __pTitleLabel->SetText(titleBar); + + __pPlayStateSlider->SetRange(INIT_VALUE, SLIDER_MAX_VALUE); + __pPlayStateSlider->SetValue(__pPresentationModel->GetPlayPosition()); + __pPlayStateSlider->SetEnabled(false); + __pPlayStateSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_NORMAL, *ResourceManager::GetBitmapN(L"T02_player_progress_handle.png")); + __pPlayStateSlider->SetThumbBitmap(SLIDER_THUMB_STATUS_DISABLED, *ResourceManager::GetBitmapN(L"T02_player_progress_handle.png")); + __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_NORMAL, Color(255, 255, 255, 0)); + __pPlayStateSlider->SetThumbTextColor(SLIDER_THUMB_STATUS_DISABLED, Color(255, 255, 255, 0)); + + Invalidate(true); + AppLogDebug("EXIT"); + return r; +} + +bool +NowPlayContentPanel::GetPlayStatus(void) +{ + AppLogDebug("ENTER"); + + bool StatusDisplay = true; + + switch (__pPresentationModel->GetPlayerState()) + { + case PLAYER_STATE_PAUSED: + // fall through + case PLAYER_STATE_PLAYING: + // fall through + case PLAYER_STATE_OPENING: + { + SetShowState(true); + } + break; + + default: + { + SetShowState(false); + StatusDisplay = false; + } + break; + } + + Invalidate(true); + AppLogDebug("EXIT"); + return StatusDisplay; +} + +void +NowPlayContentPanel::OnPlayStateChanged(Tizen::Media::PlayerState playerState) +{ + AppLogDebug("ENTER"); + if (playerState == PLAYER_STATE_PLAYING) + { + __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PAUSE)); + } + else + { + __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PLAY)); + } + __pPlayStatusLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnPlayContentChanged(int currentContentIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(currentContentIndex); + if (pContentInfoStruct == null) + { + return; + } + + Bitmap* pAlbumArt = __pPresentationModel->GetContentAlbumArtN(currentContentIndex); + + String titleBar; + titleBar.Format(STRING_LENGTH, L"%ls / %ls", pContentInfoStruct->TitleName.GetPointer(), pContentInfoStruct->ArtistName.GetPointer()); + + __pThumbnailLabel->SetBackgroundBitmap(*pAlbumArt); + __pThumbnailLabel->Invalidate(true); + + __pTitleLabel->SetText(titleBar); + __pTitleLabel->Invalidate(true); + + __pPlayStateSlider->SetRange(INIT_VALUE, SLIDER_MAX_VALUE); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pAlbumArt; + pAlbumArt = null; + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnPlayTimeChanged(const Tizen::Base::String& currentDuration, int currentPosition) +{ + AppLogDebug("ENTER"); + __pPlayStateSlider->SetValue(currentPosition); + __pPlayStateSlider->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnPlayVolumeBarStateChanged(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnPlayPresentationModelDestroying(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null) + { + __pPresentationModel = null; + } + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchPressed(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return; + } + + if (source.GetName().Equals(PLAYING_TEXT, true)) + { + switch (__pPresentationModel->GetPlayerState()) + { + case PLAYER_STATE_PLAYING: + { + __pPresentationModel->Pause(); +// __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PLAY)); + } + break; + +/* case PLAYER_STATE_PAUSED: + // fall through + case PLAYER_STATE_ENDOFCLIP: + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), __pPlayStateSlider->GetValue(), true); + __pPlayStatusLabel->SetBackgroundBitmap(*ResourceManager::GetBitmapN(PLAYING_ICON_PAUSE)); + } + break; +*/ + + default: + { + __pPresentationModel->Play(__pPresentationModel->GetCurrentContentIndex(), __pPlayStateSlider->GetValue(), true); + } + break; + } + Invalidate(true); + } + else if (source.GetName().Equals(PLAY_FORM_TEXT, true)) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_MUSIC_SETTING, true)) + { + IListT* sceneList = pSceneManager->GetSceneHistoryN(); + + IEnumeratorT* pEnum = sceneList->GetEnumeratorN(); + SceneId sceneID; + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(sceneID); + + if (sceneID.Equals(SceneId(IDSCN_PLAYER)) == false) + { + pSceneManager->AddToSceneHistory(sceneID); + } + } + delete pEnum; + delete sceneList; + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER)); + } + } + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchReleased(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchMoved(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchFocusIn(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchFocusOut(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +NowPlayContentPanel::OnTouchCanceled(const Tizen::Ui::Control& source, const Tizen::Graphics::Point& currentPosition, const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpPanelFactory.cpp b/src/MpPanelFactory.cpp new file mode 100644 index 0000000..02d8a63 --- /dev/null +++ b/src/MpPanelFactory.cpp @@ -0,0 +1,379 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPanelFactory.cpp + * @brief This is the implementation file for PanelFactory class. + */ + +#include +#include "MpAlbumContentPickerPanel.h" +#include "MpAlbumListEditorPanel.h" +#include "MpAlbumListPanel.h" +#include "MpAlbumPickerPanel.h" +#include "MpAllContentPickerPanel.h" +#include "MpAllListEditorPanel.h" +#include "MpAllListPanel.h" +#include "MpArtistContentPickerPanel.h" +#include "MpArtistListEditorPanel.h" +#include "MpArtistListPanel.h" +#include "MpArtistPickerPanel.h" +#include "MpComposerContentPickerPanel.h" +#include "MpComposerListEditorPanel.h" +#include "MpComposerListPanel.h" +#include "MpComposerPickerPanel.h" +#include "MpFolderContentPickerPanel.h" +#include "MpFolderListEditorPanel.h" +#include "MpFolderListPanel.h" +#include "MpFolderPickerPanel.h" +#include "MpGenreContentPickerPanel.h" +#include "MpGenreListEditorPanel.h" +#include "MpGenreListPanel.h" +#include "MpGenrePickerPanel.h" +#include "MpPanelFactory.h" +#include "MpPlaylistListEditorPanel.h" +#include "MpPlaylistListPanel.h" +#include "MpYearContentPickerPanel.h" +#include "MpYearListEditorPanel.h" +#include "MpYearListPanel.h" +#include "MpYearPickerPanel.h" + +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +const wchar_t* IDC_ALL_LIST_PANEL = L"AllListPanel"; +const wchar_t* IDC_PLAYLIST_LIST_PANEL = L"PlaylistListPanel"; +const wchar_t* IDC_ALBUM_LIST_PANEL = L"AlbumlistListPanel"; +const wchar_t* IDC_ARTIST_LIST_PANEL = L"ArtistListPanel"; +const wchar_t* IDC_GENRES_LIST_PANEL = L"GenreListPanel"; +const wchar_t* IDC_COMPOSER_LIST_PANEL = L"ComposerListPanel"; +const wchar_t* IDC_YEAR_LIST_PANEL = L"YearListPanel"; +const wchar_t* IDC_FOLDER_LIST_PANEL = L"FolderListPanel"; + +const wchar_t* IDC_ALL_LIST_EDITOR_PANEL = L"AllListEditorPanel"; +const wchar_t* IDC_PLAYLIST_LIST_EDITOR_PANEL = L"PlaylistListEditorPanel"; +const wchar_t* IDC_ALBUM_LIST_EDITOR_PANEL = L"AlbumlistListEditorPanel"; +const wchar_t* IDC_ARTIST_LIST_EDITOR_PANEL = L"ArtistListEditorPanel"; +const wchar_t* IDC_GENRES_LIST_EDITOR_PANEL = L"GenresListEditorPanel"; +const wchar_t* IDC_COMPOSER_LIST_EDITOR_PANEL = L"ComposerListEditorPanel"; +const wchar_t* IDC_YEAR_LIST_EDITOR_PANEL = L"YearListEditorPanel"; +const wchar_t* IDC_FOLDER_LIST_EDITOR_PANEL = L"FolderListEditorPanel"; + +const wchar_t* IDC_ALBUM_PICKER_PANEL = L"AlbumPickerPanel"; +const wchar_t* IDC_ARTIST_PICKER_PANEL = L"ArtistPickerPanel"; +const wchar_t* IDC_GENRE_PICKER_PANEL = L"GenrePickerPanel"; +const wchar_t* IDC_COMPOSER_PICKER_PANEL = L"ComposerPickerPanel"; +const wchar_t* IDC_YEAR_PICKER_PANEL = L"YearPickerPanel"; +const wchar_t* IDC_FOLDER_PICKER_PANEL = L"FolderPickerPanel"; + +const wchar_t* IDC_ALL_CONTENT_PICKER_PANEL = L"AllContentPickerPanel"; +const wchar_t* IDC_ALBUM_CONTENT_PICKER_PANEL = L"AlbumContentEditorPickerPanel"; +const wchar_t* IDC_ARTIST_CONTENT_PICKER_PANEL = L"ArtistContentEditorPickerPanel"; +const wchar_t* IDC_GENRE_CONTENT_PICKER_PANEL = L"GenreContentEditorPickerPanel"; +const wchar_t* IDC_COMPOSER_CONTENT_PICKER_PANEL = L"ComposerContentEditorPickerPanel"; +const wchar_t* IDC_YEAR_CONTENT_PICKER_PANEL = L"YearContentEditorPickerPanel"; +const wchar_t* IDC_FOLDER_CONTENT_PICKER_PANEL = L"FolderContentEditorPickerPanel"; + +PanelFactory::PanelFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PanelFactory::~PanelFactory(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Ui::Controls::Panel* +PanelFactory::CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + Panel* pNewPanel = null; + if (panelId == IDC_ALL_LIST_PANEL) + { + AllListPanel* pPanel = new (std::nothrow) AllListPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY]Unable to create AllPanel"); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PLAYLIST_LIST_PANEL) + { + PlaylistListPanel* pPanel = new (std::nothrow) PlaylistListPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create playlistpanel"); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_ALBUM_LIST_PANEL) + { + AlbumListPanel* pPanel = new (std::nothrow) AlbumListPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_ARTIST_LIST_PANEL) + { + ArtistListPanel* pPanel = new (std::nothrow) ArtistListPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } +// else if (panelId == IDC_GENRES_LIST_PANEL) +// { +// GenreListPanel* pPanel = new (std::nothrow) GenreListPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_COMPOSER_LIST_PANEL) +// { +// ComposerListPanel* pPanel = new (std::nothrow) ComposerListPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_YEAR_LIST_PANEL) +// { +// YearsListPanel* pPanel = new (std::nothrow) YearsListPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } + else if (panelId == IDC_FOLDER_LIST_PANEL) + { + FolderListPanel* pPanel = new (std::nothrow) FolderListPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_ALL_LIST_EDITOR_PANEL) + { + AllListEditorPanel* pPanel = new (std::nothrow) AllListEditorPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_PLAYLIST_LIST_EDITOR_PANEL) + { + PlaylistListEditorPanel* pPanel = new (std::nothrow) PlaylistListEditorPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_ALBUM_LIST_EDITOR_PANEL) + { + AlbumListEditorPanel* pPanel = new (std::nothrow) AlbumListEditorPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + else if (panelId == IDC_ARTIST_LIST_EDITOR_PANEL) + { + ArtistListEditorPanel* pPanel = new (std::nothrow) ArtistListEditorPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } +// else if (panelId == IDC_GENRES_LIST_EDITOR_PANEL) +// { +// GenresListEditorPanel* pPanel = new (std::nothrow) GenresListEditorPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_COMPOSER_LIST_EDITOR_PANEL) +// { +// ComposerListEditorPanel* pPanel = new (std::nothrow) ComposerListEditorPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_YEAR_LIST_EDITOR_PANEL) +// { +// YearsListEditorPanel* pPanel = new (std::nothrow) YearsListEditorPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } + else if (panelId == IDC_FOLDER_LIST_EDITOR_PANEL) + { + FolderListEditorPanel* pPanel = new (std::nothrow) FolderListEditorPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } +// else if (panelId == IDC_ALBUM_PICKER_PANEL) +// { +// AlbumPickerPanel* pPanel = new (std::nothrow) AlbumPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_ARTIST_PICKER_PANEL) +// { +// ArtistPickerPanel* pPanel = new (std::nothrow) ArtistPickerPanel(); +// if (pPanel == null) +// { +// AppLogDebug("EXIT"); +// return null; +// } +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_GENRE_PICKER_PANEL) +// { +// GenrePickerPanel* pPanel = new (std::nothrow) GenrePickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_COMPOSER_PICKER_PANEL) +// { +// ComposerPickerPanel* pPanel = new (std::nothrow) ComposerPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_YEAR_PICKER_PANEL) +// { +// YearPickerPanel* pPanel = new (std::nothrow) YearPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_FOLDER_PICKER_PANEL) +// { +// FolderPickerPanel* pPanel = new (std::nothrow) FolderPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } + else if (panelId == IDC_ALL_CONTENT_PICKER_PANEL) + { + AllContentPickerPanel* pPanel = new (std::nothrow) AllContentPickerPanel(); + TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); + + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } +// else if (panelId == IDC_ALBUM_CONTENT_PICKER_PANEL) +// { +// AlbumContentPickerPanel* pPanel = new (std::nothrow) AlbumContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_ARTIST_CONTENT_PICKER_PANEL) +// { +// ArtistContentPickerPanel* pPanel = new (std::nothrow) ArtistContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_GENRE_CONTENT_PICKER_PANEL) +// { +// GenreContentPickerPanel* pPanel = new (std::nothrow) GenreContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_COMPOSER_CONTENT_PICKER_PANEL) +// { +// ComposerContentPickerPanel* pPanel = new (std::nothrow) ComposerContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_YEAR_CONTENT_PICKER_PANEL) +// { +// YearContentPickerPanel* pPanel = new (std::nothrow) YearContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } +// else if (panelId == IDC_FOLDER_CONTENT_PICKER_PANEL) +// { +// FolderContentPickerPanel* pPanel = new (std::nothrow) FolderContentPickerPanel(); +// TryCatch(pPanel != null, , "[E_OUT_OF_MEMORY] Unable to create albumlistpanel."); +// +// pPanel->Initialize(); +// pSceneManager->AddSceneEventListener(sceneId, *pPanel); +// pNewPanel = pPanel; +// } + AppLogDebug("EXIT"); + return pNewPanel; + +CATCH: + return null; +} \ No newline at end of file diff --git a/src/MpPlaylistContentListForm.cpp b/src/MpPlaylistContentListForm.cpp new file mode 100644 index 0000000..f5ddf60 --- /dev/null +++ b/src/MpPlaylistContentListForm.cpp @@ -0,0 +1,921 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistContentListForm.cpp + * @brief This is the implementation file for PlaylistContentListForm class. + */ + +#include +#include "MpMusicPlayerApp.h" +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistContentListForm.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +PlaylistContentListForm::PlaylistContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pContentListTableView(null) + , __pThumbnail(null) + , __pPresentationModel(null) + , __checkedItemCount(0) + , __currentContentType(-1) + , __activatedStateContextItem(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistContentListForm::~PlaylistContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlaylistContentListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_CONTENT_LIST_FORM))) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return false; + } + + AppLogDebug("EXIT"); + return Construct(); +} + +result +PlaylistContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView = static_cast(GetControl(IDC_TABLEVIEW_CONTENT_LIST)); + __pContentListTableView->AddTableViewItemEventListener(*this); + __pContentListTableView->SetItemProvider(this); + + SetContentList(__pContentListTableView); + AppLogDebug("EXIT"); + return ContentListForm::Construct(); +} + +result +PlaylistContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +PlaylistContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return ContentListForm::OnTerminating(); +} + +void +PlaylistContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + bool isChecked = true; + if (__checkedItemCount == __pContentListTableView->GetItemCount()) + { + isChecked = false; + } + SetItemCheckedAll(isChecked); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + if (__pPresentationModel->GetContentCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + ToggleScreenState(SCREEN_STATE_EDITOR); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + if (__pPresentationModel->GetContentCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + ToggleScreenState(SCREEN_STATE_SHARE_VIA); +// LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL),this); + } + break; + + case IDA_COMMON_POPUP_DELETE: + { + if (__currentContentType == RECENTLY_ADDED_CONTENT) + { + RemoveCheckedTableviewItem(true); + } + else + { + int totalCount = __pPresentationModel->GetContentCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + __pContentListTableView->SetItemChecked(iCount, false); + __checkedItemCount--; + + if (pContentInfoStruct == null) + { + return; + } + // __pContentListTableView->SetItemChecked(iCount, false); + __pPresentationModel->DeleteContent(__currentContentType, *pContentInfoStruct); + + delete pContentInfoStruct; + } + } + RemoveCheckedTableviewItem(false); + __pPresentationModel->UpdatePlaylistContentList(__currentContentType, __headerTitle); + UpdateScreenState(); + UpdateTableView(); + + if(__pPresentationModel->GetContentCount() == 0) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + } + } + } + break; + + case IDA_COMMON_POPUP_CANCEL: + { + //empty statement + } + break; + /*case IDA_FOOTER_BUTTON_DELETE: + { + if (__currentContentType == RECENTLY_ADDED_CONTENT) + { + RemoveCheckedTableviewItem(true); + } + else + { + int totalCount = __pPresentationModel->GetContentCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfoStruct == null) + { + return; + } +// __pContentListTableView->SetItemChecked(iCount, false); + __pPresentationModel->DeleteContent(__currentContentType, *pContentInfoStruct); + + delete pContentInfoStruct; + } + } + RemoveCheckedTableviewItem(false); + __pPresentationModel->UpdatePlaylistContentList(__currentContentType, __headerTitle); + UpdateScreenState(); + UpdateTableView(); + + if(__pPresentationModel->GetContentCount() == 0) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + } + } + } + break;*/ + + default: + break; + } + + TryRemoveCommonPopup(actionId); + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null && previousSceneId.Equals(IDSCN_PLAYLIST_LIST, true) == true) + { + __headerTitle.Clear(); + __prevSceneId.Clear(); + __prevSceneId.Append(*static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME))); + __headerTitle.Append(*static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME))); + __currentContentType = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + SetHeader(); + pArgs->RemoveAll(true); + delete pArgs; + } + else if (pArgs != null && previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, true) == true) + { + SetItemCheckedAll(false); + pArgs->RemoveAll(true); + delete pArgs; + } + + __pPresentationModel = PlaylistListPresentationModel::GetInstance(); + __pPresentationModel->UpdatePlaylistContentList(__currentContentType, __headerTitle); + UpdateScreenState(); + if (__currentContentType < RECENTLY_ADDED_CONTENT || !previousSceneId.Equals(IDSCN_PLAYER,true)) + { + UpdateTableView(); + } + + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +PlaylistContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(); +} + +Tizen::Ui::Controls::TableViewItem* +PlaylistContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewAnnexStyle tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_NORMAL; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_MARK; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), tableViewAnnexStyle); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +PlaylistContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetItemCheckedStateChanged(status); + AppLogDebug("EXIT"); + return; + } + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pSceneArg = MakePlayerSceneParam(itemIndex); + if (pSceneArg != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pSceneArg); + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (itemIndex >= 0) + { + __activatedStateContextItem = itemIndex; + } + AppLogDebug("EXIT"); +} + +int +PlaylistContentListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +PlaylistContentListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +PlaylistContentListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +PlaylistContentListForm::GetSearchResultContentList(int itemIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + if (pTempList == null) + { + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(itemIndex))); + pTempList->Add(*(__pPresentationModel->GetContentPathListN(__currentContentType))); + AppLogDebug("EXIT"); + return pTempList; +} + +Tizen::Base::Collection::ArrayList* +PlaylistContentListForm::GetAudioContentInfoContentList(int itemIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + if (pTempList == null) + { + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(itemIndex))); + pTempList->Add(*(__pPresentationModel->GetContentPathListN(__currentContentType))); + AppLogDebug("EXIT"); + return pTempList; +} + +bool +PlaylistContentListForm::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetContentCount() != INIT_VALUE) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +int +PlaylistContentListForm::GetCheckedItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __checkedItemCount; +} + +Tizen::Base::Collection::ArrayList* +PlaylistContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + if (__currentContentType != RECENTLY_ADDED_CONTENT) + { + AppLogDebug("EXIT"); + return GetAudioContentInfoContentList(startIndex); + } + else if (__currentContentType == RECENTLY_ADDED_CONTENT) + { + AppLogDebug("EXIT"); + return GetSearchResultContentList(startIndex); + } + AppLogDebug("EXIT"); + return null; +} + +result +PlaylistContentListForm::SetHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), __headerTitle); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +PlaylistContentListForm::CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + else + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfo.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfo.ArtistName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlaylistContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(PROVIDER_ID_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + const String* pResultString = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_SOCIAL_ITEM_ID))); + + AppLogDebug("%ls", pResultString->GetPointer()); + int contactId; + Integer::Parse(*pResultString, contactId); + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + ShowDelayedMessageBox(ResourceManager::GetString(L"IDS_COM_POP_SUCCESS")); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + if (GetScreenState() == SCREEN_STATE_NORMAL && IsEmptyContentList() == false) + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } +} + +void +PlaylistContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + Object* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentListTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::UpdateTableView(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView->UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->UpdatePlaylistContentList(__currentContentType, __headerTitle); + + if (__pPresentationModel->GetContentCount() == 0) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager->GetCurrentSceneId().Equals(IDSCN_PLAYLIST_CONTENT_LIST,true)) + { + AppAssert(pSceneManager); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_NONE,SCENE_DESTROY_OPTION_KEEP)); + } + } + else + { + UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + if (isChecked == true) + { + __checkedItemCount = __pContentListTableView->GetItemCount(); + } + else + { + __checkedItemCount = INIT_VALUE; + } + CommonUtil::SetItemCheckedAll(isChecked, *__pContentListTableView); + + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::RemoveCheckedTableviewItem(bool itemRemove) +{ + AppLogDebug("ENTER"); + if (itemRemove) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + __pContentListTableView->SetItemChecked(iCount, false); + __checkedItemCount--; + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo != null) + { + RemoveContentAt(pContentInfo->contentId); + delete pContentInfo; + } + } + } + } + else + { + SetItemCheckedAll(false); + } + AppLogDebug("EXIT"); +} + +void +PlaylistContentListForm::SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_UNCHECKED) + { + __checkedItemCount--; + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + } + else if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), true); + } + } + + __checkedItemCount++; + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::IList* +PlaylistContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pContentFilePathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pContentFilePathList->Construct())) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pContentFilePathList; + return null; + } + + if (argumentType == PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + delete pContentFilePathList; + AppLogDebug("GetContentInfoN(%d) is null", __activatedStateContextItem); + return null; + } + + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + else if (argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + AppLogDebug("GetContentInfoN(%d) is null", iCount); + delete pContentFilePathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + delete pContentInfo; + } + } + } + AppLogDebug("EXIT"); + return pContentFilePathList; +} + +void +PlaylistContentListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentListTableView->UpdateTableView(); +} diff --git a/src/MpPlaylistCreatorForm.cpp b/src/MpPlaylistCreatorForm.cpp new file mode 100644 index 0000000..1c454dd --- /dev/null +++ b/src/MpPlaylistCreatorForm.cpp @@ -0,0 +1,528 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistCreatorForm.cpp + * @brief This is the implementation file for PlaylistCreatorForm class. + */ + +#include "MpAllListPresentationModel.h" +#include "MpAlbumListPresentationModel.h" +#include "MpArtistListPresentationModel.h" +#include "MpFolderListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpPlaylistCreatorForm.h" +#include "MpPlaylistEditorPresentationModel.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +PlaylistCreatorForm::PlaylistCreatorForm(void) + : __pPlaylistEditorPresentationModel(null) + , __pPlaylistEditField(null) + , __pDataList(null) + , __previousSceneId(L"") +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistCreatorForm::~PlaylistCreatorForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::Initialize(void) +{ + AppLogDebug("ENTER"); + Form::Construct(IDL_PLAYLIST_CREATOR_FORM); + AppLogDebug("EXIT"); +} + +result +PlaylistCreatorForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPlaylistEditField = static_cast(GetControl(IDC_EDITFIELD)); + __pPlaylistEditField->AddTextEventListener(*this); + __pPlaylistEditField->AddKeypadEventListener(*this); + __pPlaylistEditField->SetOverlayKeypadCommandButtonVisible(false); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditorPresentationModel = PlaylistEditorPresentationModel::GetInstance(); + + SetFormBackEventListener(this); + if (GetFooter() != null) + { + GetFooter()->AddActionEventListener(*this); + } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +PlaylistCreatorForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + if (__pDataList != null) + { + __pDataList->RemoveAll(true); + delete __pDataList; + } + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlaylistCreatorForm::OnKeypadActionPerformed(Tizen::Ui::Control& source, + Tizen::Ui::KeypadAction keypadAction) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnKeypadClosed(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnKeypadOpened(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnKeypadWillOpen(Tizen::Ui::Control &source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + String PlayListName = ResourceManager::GetString(L"IDS_MP_HEADER_MENU_PLAYLIST"); + PlayListName.Append(L"_"); + ArrayList* pNumberList = new (std::nothrow) ArrayList(); + pNumberList->Construct(); + + int numericPlaylist = 1; + int totalPlaylistCount = __pPlaylistEditorPresentationModel->GetAllPlayListCount(); + __previousSceneId = previousSceneId; + AppLogDebug("%d", totalPlaylistCount); + + if (totalPlaylistCount != 0) + { + int lastNum = 0; + for (int i = 0; i < totalPlaylistCount; i++) + { + String currentPlayListName = __pPlaylistEditorPresentationModel->GetPlayListName(i); + if (currentPlayListName.GetLength() >= PlayListName.GetLength()) + { + String compareStr; + currentPlayListName.SubString(0, PlayListName.GetLength(), compareStr); + if (compareStr.Equals(PlayListName, true)) + { + String pLastStr; + wchar_t ch; + for (int index = currentPlayListName.GetLength()-1; index >= 0; index--) + { + currentPlayListName.GetCharAt(index, ch); + if (Character::IsDigit(ch)) + { + continue; + } + else + { + currentPlayListName.SubString(index + 1, currentPlayListName.GetLength() - (index + 1), pLastStr); + break; + } + } + + if (pLastStr != null) + { + Integer::Parse(pLastStr, lastNum); + pNumberList->Add((new (std::nothrow) Integer(lastNum))); + } + } + } + } + if (pNumberList != null) + { + int pNumberListCount = pNumberList->GetCount(); + IntegerComparer integerComparer; + pNumberList->Sort(integerComparer); + for (int index = 0; index < pNumberListCount; index++) + { + if (static_cast(pNumberList->GetAt(0))->ToInt() != 1) + { + break; + } + + int firstNumber = 0; + int secondNumber = 0; + + firstNumber = static_cast(pNumberList->GetAt(index))->ToInt(); + if (index + 1 < pNumberListCount) + { + secondNumber = static_cast(pNumberList->GetAt(index + 1))->ToInt(); + } + + if (firstNumber + 1 < secondNumber) + { + numericPlaylist = firstNumber + 1; + break; + } + else + { + numericPlaylist = firstNumber + 1; + } + } + } + PlayListName.Append(numericPlaylist); + if (__pPlaylistEditField->GetTextLength() == 0) + { + __pPlaylistEditField->SetText(PlayListName); + } + } + else + { + PlayListName.Append(numericPlaylist); + if (__pPlaylistEditField->GetTextLength() == 0) + { + __pPlaylistEditField->SetText(PlayListName); + } + } + + __pPlaylistEditField->ShowKeypad(); + + if (pNumberList != null) + { + pNumberList->RemoveAll(true); + delete pNumberList; + } + if (pArgs != null) + { + __pDataList = pArgs; + } + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + result r = E_FAILURE; + ArrayList* pList = null; + + switch (actionId) + { + case IDA_FOOTER_BUTTON_SAVE: + { + String inputString = __pPlaylistEditField->GetText(); + inputString.Trim(); + __pPlaylistEditField->HideKeypad(); + if (inputString.GetLength() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_CREATE_PLAYLIST"), MSGBOX_STYLE_NONE, 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditField->ShowKeypad(); + break; + } + + r = __pPlaylistEditorPresentationModel->SetPlayListName(L"", inputString); + if (r != E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_CREATE_PLAYLIST"), MSGBOX_STYLE_NONE, 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditField->ShowKeypad(); + break; + } + + if (__pDataList != null) + { + for (int index = 0; index < __pDataList->GetCount(); index++) + { + ContentId contentId = CommonUtil::GetContentId(*(static_cast(__pDataList->GetAt(index)))); + if (!IsFailed(GetLastResult())) + { + __pPlaylistEditorPresentationModel->AddItem(contentId, inputString); + r = GetLastResult(); + if (IsFailed(r)) + { + break; + } + } + else + { + r = E_FAILURE; + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_TO_ADD"), + MSGBOX_STYLE_OK, + 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + } + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + if (!__previousSceneId.Equals(IDSCN_PLAYER,true)) + { + pList = new (std::nothrow) ArrayList(); + pList->Construct(); + pList->Add(new (std::nothrow) Integer(1)); + } + } + else + { + __pPlaylistEditorPresentationModel->RemovePlayList(inputString); + } + + if (__previousSceneId.Equals(IDSCN_PLAYER, true)) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + else + { + pSceneManager->GoBackward(BackwardSceneTransition(), pList); + } + } + else + { + ArrayList* pList = new (std::nothrow) ArrayList(); + pList->Construct(); + AllListPresentationModel* pPresentationModel = AllListPresentationModel::GetInstance(); + if (pPresentationModel->GetTotalCount() == 0) + { + pSceneManager->GoBackward(BackwardSceneTransition(), pList); + } + else + { + CommonUtil::SetAddtoPlaylistState(true); + CommonUtil::SetAddtoPlaylistName(inputString); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_CONTENT_PICKER, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + } + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnTextValueChanged(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + EditArea* pEditArea = const_cast(static_cast(&source)); + String editareaString = pEditArea->GetText(); + editareaString.Trim(); + + if (editareaString.GetLength() == INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnTextValueChangeCanceled(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +PlaylistCreatorForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + int validContents = 0; + int totalContents = 0; + SceneManager* pSceneManager = SceneManager::GetInstance(); + + if (pSceneManager != null && pSceneManager->GetCurrentSceneId().Equals(IDSCN_PLAYLIST_CREATOR,true)) + { + if (__pDataList != null && __pDataList->GetCount()) + { + totalContents = __pDataList->GetCount(); + + for (int pathIndex = 0; pathIndex < __pDataList->GetCount(); pathIndex++) + { + ContentId contentId = CommonUtil::GetContentId(*(static_cast(__pDataList->GetAt(pathIndex)))); + + if (IsFailed(GetLastResult())) + { + continue; + } + else + { + validContents++; + } + } + } + else + { + validContents++; + } + + if ( validContents == 0) + { + IListT* pSceneList = pSceneManager->GetSceneHistoryN(); + if(pSceneList != null) + { + if (pSceneList->GetCount() > 1) + { + pSceneManager->ClearSceneHistory(); + for(int sceneIndex = 0; sceneIndex < pSceneList->GetCount(); sceneIndex++) + { + SceneId scenId; + pSceneList->GetAt(sceneIndex,scenId); + + if ((sceneIndex == pSceneList->GetCount()-1) && (__previousSceneId.Equals(IDSCN_ALBUM_CONTENT_LIST,true) + || __previousSceneId.Equals(IDSCN_FOLDER_CONTENT_LIST,true) + || __previousSceneId.Equals(IDSCN_ARTIST_CONTENT_LIST,true))) + { + pSceneManager->DestroyScene(scenId); + } + else if ((sceneIndex == pSceneList->GetCount()-1) + && (__previousSceneId.Equals(IDSCN_ALBUM_LIST_EDITOR,true))) + { + AlbumListPresentationModel* pListPresentationModel = AlbumListPresentationModel::GetInstance(); + if (pListPresentationModel->GetAllAlbumCount() == 0) + { + pSceneManager->DestroyScene(scenId); + } + } + else if ((sceneIndex == pSceneList->GetCount()-1) + && (__previousSceneId.Equals(IDSCN_ARTIST_LIST_EDITOR,true))) + { + ArtistListPresentationModel* pListPresentationModel = ArtistListPresentationModel::GetInstance(); + if (pListPresentationModel->GetArtistListCount() == 0) + { + pSceneManager->DestroyScene(scenId); + } + } + else if ((sceneIndex == pSceneList->GetCount()-1) + && (__previousSceneId.Equals(IDSCN_FOLDER_LIST_EDITOR,true))) + { + FolderListPresentationModel* pListPresentationModel = FolderListPresentationModel::GetInstance(); + if (pListPresentationModel->GetAllFolderCount() ==0) + { + pSceneManager->DestroyScene(scenId); + } + } + else if ((sceneIndex == pSceneList->GetCount()-1) + && (__previousSceneId.Equals(IDSCN_ALL_LIST_EDITOR,true))) + { + AllListPresentationModel* pListPresentationModel = AllListPresentationModel::GetInstance(); + if (pListPresentationModel->GetTotalCount() ==0) + { + pSceneManager->DestroyScene(scenId); + } + } + else if ((sceneIndex == pSceneList->GetCount()-1) + && (__previousSceneId.Equals(IDSCN_PLAYLIST_CONTENT_LIST,true))) + { + PlaylistListPresentationModel* pListPresentationModel = PlaylistListPresentationModel::GetInstance(); + if (pListPresentationModel->GetContentCount() ==0) + { + pSceneManager->DestroyScene(scenId); + } + } + else + { + pSceneManager->AddToSceneHistory(scenId); + } + } + } + } + } + + if (totalContents != 0 && totalContents > validContents) + { + if (!__previousSceneId.Equals(IDSCN_PLAYLIST_LIST,true)) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + } + } + AppLogDebug("EXIT"); +} diff --git a/src/MpPlaylistDB.cpp b/src/MpPlaylistDB.cpp new file mode 100644 index 0000000..a101247 --- /dev/null +++ b/src/MpPlaylistDB.cpp @@ -0,0 +1,420 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistDB.cpp + * @brief This is the implementation file for PlaylistDB class. + */ + +#include +#include "MpCommonUtil.h" +#include "MpPlaylistDB.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Io; + +PlaylistDB::PlaylistDB(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistDB::~PlaylistDB(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlaylistDB::CreatePlaylistDatabase(void) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + Tizen::Base::String sql; + + result r = E_SUCCESS; + + if (File::IsFileExist(dbName)) + { + return r; + } + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + TryCatch(pDatabase != null, r = E_FAILURE, "Database can not used new operator.[%s]", GetErrorMessage(r)); + r = pDatabase->Construct(dbName, true); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Database can not construct.[%s]", GetErrorMessage(r)); + sql.Append(L"CREATE TABLE IF NOT EXISTS playlisttable ( primaryKey INTEGER PRIMARY KEY AUTOINCREMENT, contentId TEXT, playCount INTEGER, playTime TEXT )"); + r = pDatabase->BeginTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "BeginTransaction failed.[%s]", GetErrorMessage(r)); + r = pDatabase->ExecuteSql(sql, true); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "ExecuteSql failed.[%s]", GetErrorMessage(r)); + r = pDatabase->CommitTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "CommitTransaction failed.[%s]", GetErrorMessage(r)); + delete pDatabase; + pDatabase = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; + +CATCH: + if (pDatabase) + { + delete pDatabase; + pDatabase = null; + } + if (Database::Exists(dbName)) + { + Database::Delete(dbName); + } + return r; +} + +result +PlaylistDB::Insert(Tizen::Base::String& contentId, int playCount, Tizen::Base::String& playTime) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + result r = E_SUCCESS; + + DbStatement* pStmt = null; + String statement; + DbEnumerator* pEnum = null; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + TryCatch(pDatabase != null, r = E_FAILURE, "Database can not used new operator.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->Construct(dbName, false); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Database can not construct.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->BeginTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "BeginTransaction failed.%n[%ls]", GetErrorMessage(r)); + + statement.Append(L"INSERT INTO playlisttable (contentId, playCount, playTime) VALUES (?, ?, ?)"); + pStmt = pDatabase->CreateStatementN(statement); + TryCatch(pStmt != null, r = E_FAILURE,"CreateStatementN failed with %s", GetErrorMessage(GetLastResult())); + r = pStmt->BindString(0, contentId); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "contentId BindString failed.%n[%ls]", GetErrorMessage(r)); + r = pStmt->BindInt(1, playCount); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "playCount BindInt failed.%n[%ls]", GetErrorMessage(r)); + r = pStmt->BindString(2, playTime); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "playTime BindString failed.%n[%ls]", GetErrorMessage(r)); + pEnum = pDatabase->ExecuteStatementN(*pStmt); + TryCatch(r == E_SUCCESS,, "ExecuteStatementN failed.%n[%ls]", GetErrorMessage(r)); +// AppAssert(!pEnum); + r = pDatabase->CommitTransaction(); + TryCatch(r == E_SUCCESS,, "CommitTransaction failed.%n[%ls]", GetErrorMessage(r)); + + delete pEnum; + pEnum = null; + + delete pStmt; + pStmt = null; + + delete pDatabase; + pDatabase = null; + AppLogDebug("EXIT"); + return r; + +CATCH: + if (pEnum != null) + { + delete pEnum; + pEnum = null; + } + if (pStmt != null) + { + delete pStmt; + pStmt = null; + } + if (pDatabase) + { + delete pDatabase; + pDatabase = null; + } + if (Database::Exists(dbName)) + { + Database::Delete(dbName); + } + return r; +} + +result +PlaylistDB::Update(Tizen::Base::String& contentId, int playCount, Tizen::Base::String& playTime) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + + result r = E_SUCCESS; + + DbStatement* pStmt = null; + String statement; + DbEnumerator* pEnum = null; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + TryCatch(pDatabase != null, r = E_FAILURE, "Database can not used new operator.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->Construct(dbName, false); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Database can not construct.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->BeginTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "BeginTransaction failed.%n[%ls]", GetErrorMessage(r)); + + statement.Append(L"UPDATE playlisttable SET playCount = ?, playTime = ? WHERE contentId = ?"); + pStmt = pDatabase->CreateStatementN(statement); + + r = pStmt->BindInt(0, playCount); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "playCount BindInt failed.%n[%ls]", GetErrorMessage(r)); + r = pStmt->BindString(1, playTime); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "playTime BindString failed.%n[%ls]", GetErrorMessage(r)); + r = pStmt->BindString(2, contentId); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "contentId BindString failed.%n[%ls]", GetErrorMessage(r)); + + pEnum = pDatabase->ExecuteStatementN(*pStmt); +// AppAssert(!pEnum); + + r = pDatabase->CommitTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "CommitTransaction failed.%n[%ls]", GetErrorMessage(r)); + + delete pEnum; + pEnum = null; + + delete pStmt; + pStmt = null; + + delete pDatabase; + pDatabase = null; + AppLogDebug("EXIT"); + return r; + +CATCH: + if (pEnum != null) + { + delete pEnum; + pEnum = null; + } + if (pStmt != null) + { + delete pStmt; + pStmt = null; + } + if (pDatabase) + { + delete pDatabase; + pDatabase = null; + } + if (Database::Exists(dbName)) + { + Database::Delete(dbName); + } + return r; +} + +result +PlaylistDB::Delete(Tizen::Base::String& contentId) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + result r = E_SUCCESS; + + DbStatement* pStmt = null; + String statement; + DbEnumerator* pEnum = null; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + TryCatch(pDatabase != null, r = E_FAILURE, "Database can not used new operator.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->Construct(dbName, false); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Database can not construct.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->BeginTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "BeginTransaction failed.%n[%ls]", GetErrorMessage(r)); + + statement.Append(L"DELETE FROM playlisttable where contentId = ?"); + pStmt = pDatabase->CreateStatementN(statement); + r = pStmt->BindString(0, contentId); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "contentId BindString failed.%n[%ls]", GetErrorMessage(r)); + pEnum = pDatabase->ExecuteStatementN(*pStmt); +// AppAssert(!pEnum); + r = pDatabase->CommitTransaction(); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "CommitTransaction failed.%n[%ls]", GetErrorMessage(r)); + + delete pEnum; + pEnum = null; + + delete pStmt; + pStmt = null; + + delete pDatabase; + pDatabase = null; + AppLogDebug("EXIT"); + return r; + +CATCH: + if (pEnum != null) + { + delete pEnum; + pEnum = null; + } + if (pStmt != null) + { + delete pStmt; + pStmt = null; + } + if (pDatabase) + { + delete pDatabase; + pDatabase = null; + } + if (Database::Exists(dbName)) + { + Database::Delete(dbName); + } + return r; +} + +Tizen::Io::DbEnumerator* +PlaylistDB::SearchN(int index) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + + result r = E_SUCCESS; + + Tizen::Base::String statement; + DbEnumerator* pEnum = null; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + r = pDatabase->Construct(dbName, false); + + TryReturn(r == E_SUCCESS,null,"pDatabase->Construct failed with error %s",GetErrorMessage(r)); + + if (index == MOST_PLAYED_CONTENT) + { + statement.Append(L"SELECT contentId FROM playlisttable WHERE playCount > 0 ORDER BY playCount DESC"); + } + else if (index == RECENTLY_PLAYED_CONTENT) + { + statement.Append(L"SELECT contentId FROM playlisttable WHERE playTime IS NOT '' ORDER BY playTime DESC"); + } + else + { + AppLogDebug("EXIT"); + return null; + } + + pEnum = pDatabase->QueryN(statement); + + AppLogDebug("EXIT"); + return pEnum; +} + +result +PlaylistDB::Read(Tizen::Base::String& contentId) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + + result r = E_KEY_NOT_FOUND; + + DbStatement* pStmt = null; + String statement; + DbEnumerator* pEnum = null; +// int playCount = 0; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + // TryCatch(pDatabase != null, r = E_FAILURE, "Database can not used new operator.%n[%ls]", GetErrorMessage(r)); + r = pDatabase->Construct(dbName, false); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "Database can not construct.[%s]", GetErrorMessage(r)); + statement.Append(L"SELECT contentId FROM playlisttable WHERE contentId = ?"); + pStmt = pDatabase->CreateStatementN(statement); + TryCatch(pStmt != null, r = E_FAILURE, "CreateStatementN failed with error.[%s]", GetErrorMessage(r)); + + r = pStmt->BindString(0, contentId); + TryCatch(r == E_SUCCESS, r = E_FAILURE, "contentId BindString failed.[%s]", GetErrorMessage(r)); + + pEnum = pDatabase->ExecuteStatementN(*pStmt); + +// AppAssert(!pEnum); + + if (pEnum != null) + { + while (pEnum->MoveNext()== E_SUCCESS) + { + pEnum->GetStringAt(0, contentId); + r = E_KEY_ALREADY_EXIST; + break; + } + delete pEnum; + pEnum = null; + } + + CATCH: + if(pStmt != null) + { + delete pStmt; + pStmt = null; + } + + delete pDatabase; + pDatabase = null; + //AppLogDebug("Read 8 : %d", playCount); + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::Collection::ArrayList* +PlaylistDB::ReadValueN(Tizen::Base::String& contentId) +{ + AppLogDebug("ENTER"); + Tizen::Base::String dbName(App::GetInstance()->GetAppRootPath() + DATABASE_PATH); + + result r = E_SUCCESS; + + String statement; + DbEnumerator* pEnum = null; + + Tizen::Io::Database* pDatabase = new (std::nothrow) Database(); + r = pDatabase->Construct(dbName, false); + statement.Append(L"SELECT playCount, playTime FROM playlisttable"); + + pEnum = pDatabase->QueryN(statement); + int playCount = 0; + Tizen::Base::String playTime; + + Tizen::Base::Collection::ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + if (pEnum != null) + { + while (pEnum->MoveNext()== E_SUCCESS) + { + pEnum->GetIntAt(0, playCount); + pEnum->GetStringAt(1, playTime); + pTempList->Add(*(new (std::nothrow) Integer(playCount))); + pTempList->Add(*(new (std::nothrow) String(playTime))); + } + AppLogDebug("EXIT"); + } + else + { + pTempList = null; + } + + delete pEnum; + pEnum = null; + + delete pDatabase; + pDatabase = null; + + AppLogDebug("EXIT"); + return pTempList; +} diff --git a/src/MpPlaylistEditorPresentationModel.cpp b/src/MpPlaylistEditorPresentationModel.cpp new file mode 100644 index 0000000..2e70b26 --- /dev/null +++ b/src/MpPlaylistEditorPresentationModel.cpp @@ -0,0 +1,271 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistEditorPresentationModel.cpp + * @brief This is the implementation file for PlaylistEditorPresentationModel class. + */ + +#include "MpCommonUtil.h" +#include "MpPlaylistEditorPresentationModel.h" +#include "MpResourceManager.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Io; + +PlaylistEditorPresentationModel* PlaylistEditorPresentationModel::pPlaylistEditorPresentationModel = null; + +PlaylistEditorPresentationModel* +PlaylistEditorPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pPlaylistEditorPresentationModel == null) + { + pPlaylistEditorPresentationModel = new (std::nothrow) PlaylistEditorPresentationModel(); + TryReturn(pPlaylistEditorPresentationModel != null, null, "PlaylistEditorPresentationModel instance is not created."); + + result r = pPlaylistEditorPresentationModel->Construct(); + TryCatch(r == E_SUCCESS, , null, "PlayerPresentationModel instance is not constructed."); + } + + AppLogDebug("EXIT"); + return pPlaylistEditorPresentationModel; + +CATCH: + //AppLogException("PlaylistEditorPresentationModel::GetInstance(void) Error"); + delete pPlaylistEditorPresentationModel; + + return null; +} + +PlaylistEditorPresentationModel::PlaylistEditorPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistEditorPresentationModel::~PlaylistEditorPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlaylistEditorPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppLogDebug("EXIT"); + return r; +} + +int +PlaylistEditorPresentationModel::GetPlayListItemCount(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(playlist); + TryReturn(pPlayList != null, 0, "no such playlist found"); + int itemCount = pPlayList->GetPlayListItemCount(); + delete pPlayList; + pPlayList = null; + + AppLogDebug("EXIT"); + return itemCount; +} + +int +PlaylistEditorPresentationModel::GetAllPlayListCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return PlayListManager::GetInstance()->GetAllPlayListCount(); +} + +Tizen::Base::Collection::IList* +PlaylistEditorPresentationModel::GetAllPlayListNameN(void) +{ + AppLogDebug("ENTER"); +// IList* pTempList = PlayListManager::GetInstance()->GetAllPlayListNameN(); +// StringComparer strComparer; +// pTempList->Sort(strComparer); + AppLogDebug("EXIT"); + return PlayListManager::GetInstance()->GetAllPlayListNameN(); +} + +Tizen::Base::String +PlaylistEditorPresentationModel::GetPlayListName(int playlistIndex) +{ + AppLogDebug("ENTER"); + IList* pList = PlayListManager::GetInstance()->GetAllPlayListNameN(); + if (pList == null) + { + AppLogDebug("EXIT"); + return String(L""); + } + + String* pPlayListName = static_cast(pList->GetAt(playlistIndex)); + if (pPlayListName == null) + { + AppLogDebug("EXIT(pPlayListName is null)"); + return String(L""); + } + + String playListName(*pPlayListName); + pList->RemoveAll(); + delete pList; + + AppLogDebug("EXIT"); + return playListName; +} + +result +PlaylistEditorPresentationModel::SetPlayListName(const Tizen::Base::String& oldPlayListName, const Tizen::Base::String& newPlayListName) +{ + AppLogDebug("ENTER"); + AppLogDebug("%ls, %ls", oldPlayListName.GetPointer(), newPlayListName.GetPointer()); + result r = E_SUCCESS; + if (!oldPlayListName.IsEmpty()) + { + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(oldPlayListName); + r = pPlaylist->SetPlayListName(newPlayListName); + delete pPlaylist; + } + else + { + PlayList* pPlaylist = new (std::nothrow) PlayList(); + r = pPlaylist->Construct(newPlayListName); + TryLog(r == E_SUCCESS, "pPlaylist->Construct returned (%s) for %ls",GetErrorMessage(r),newPlayListName.GetPointer()); + delete pPlaylist; + } + + AppLogDebug("EXIT"); + return r; +} + +Tizen::Graphics::Bitmap* +PlaylistEditorPresentationModel::GetPlayListItemBitmap(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(playlist); + IList* pSearchList = pPlaylist->GetContentInfoListN(); + if (pSearchList == null) + { + return null; + } + + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(0)); + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + Tizen::Graphics::Bitmap* pBitmap = null; + + if (pAudioContentInfo == null) + { + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + pBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + return pBitmap; + } + + pBitmap = pAudioContentInfo->GetThumbnailN(); + if (pBitmap == null) + { + pBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + } + + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + + delete pPlaylist; + pPlaylist = null; + + AppLogDebug("EXIT"); + return pBitmap; +} + +Tizen::Content::ContentId +PlaylistEditorPresentationModel::GetPlayListItemContentId(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(playlist); + TryReturn(pPlaylist != null, ContentId(),"No such playlist found"); + + IList* pSearchList = pPlaylist->GetContentInfoListN(); + if (pSearchList == null) + { + return ContentId(); + } + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(0)); + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + if (pAudioContentInfo == null) + { + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + SetLastResult(E_FAILURE); + return ContentId(); + } + ContentId contentId = pAudioContentInfo->GetContentId(); + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + delete pPlaylist; + pPlaylist = null; + + AppLogDebug("EXIT"); + return contentId; +} + +bool +PlaylistEditorPresentationModel::IsPlaylistExist(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + AppLogDebug("CATCH %ls", playlist.GetPointer()); + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(playlist); + if (pPlaylist != null) + { + delete pPlaylist; + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +void +PlaylistEditorPresentationModel::RemovePlayList(Tizen::Base::String& playlistName) +{ + AppLogDebug("ENTER"); + AppLogDebug("%ls", playlistName.GetPointer()); + PlayListManager::GetInstance()->RemovePlayList(playlistName); + AppLogDebug("EXIT"); +} + +void +PlaylistEditorPresentationModel::AddItem(const Tizen::Content::ContentId& contentId, Tizen::Base::String& name) +{ + AppLogDebug("ENTER name %ls",name.GetPointer()); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(name); + TryReturnVoid(pPlayList != null, "unable to Get playlist %s",GetErrorMessage(GetLastResult())); + pPlayList->AddItem(contentId); + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} diff --git a/src/MpPlaylistListEditorPanel.cpp b/src/MpPlaylistListEditorPanel.cpp new file mode 100644 index 0000000..44ef11f --- /dev/null +++ b/src/MpPlaylistListEditorPanel.cpp @@ -0,0 +1,566 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListEditorPanel.cpp + * @brief This is the implementation file for PlaylistListEditorPanel class. + */ + +#include "MpPlaylistEditorPresentationModel.h" +#include "MpPlaylistListEditorPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int IDA_RENAME_EDIT_BUTTON = 101; + +PlaylistListEditorPanel::PlaylistListEditorPanel(void) + : ContentEditPanel::ContentEditPanel() + , ThumbnailBase::ThumbnailBase() + , __pSelectAllCheckedButton(null) + , __pThumbnail(null) + , __pPlaylistName(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistListEditorPanel::~PlaylistListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlaylistListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel = PlaylistEditorPresentationModel::GetInstance(); + SetLayoutFitToForm(); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +PlaylistListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + AppLogDebug("EXIT"); + return ContentEditPanel::OnTerminating(); +} + +void +PlaylistListEditorPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} +void +PlaylistListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllPlayListCount(); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + if (totalCount == __checkedItemCount) + { + SetItemCheckedAll(false); + } + else + { + SetItemCheckedAll(true); + } + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ShowCommonDeletePopup(this); + } + break; + + case IDA_DELETE_POPUP_DELETE: + { + ContentManager contentManager; + contentManager.Construct(); + + int totalCount = __pPresentationModel->GetAllPlayListCount(); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + for (int index = totalCount - 1; index >= 0; index--) + { + if (__pContentTableView->IsItemChecked(index) == true) + { + pTempList->Add(*(new (std::nothrow) String(__pPresentationModel->GetPlayListName(index)))); + __pContentTableView->RefreshItem(index, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } + } + + if (pTempList != null) + { + for (int i = 0; i < pTempList->GetCount(); i++) + { + __pPresentationModel->RemovePlayList(*static_cast(pTempList->GetAt(i))); + } + } + + __checkedItemCount = INIT_VALUE; + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + HideCommonDeletePopup(false); + UpdateContentEditScreenState(); + __pContentTableView->UpdateTableView(); + + } + break; + + case IDA_DELETE_POPUP_CANCEL: + { + HideCommonDeletePopup(false); + } + break; + + case IDA_RENAME_EDIT_BUTTON: + { + Container *pItem = dynamic_cast(source.GetParent()); + AppAssert(pItem); + + Point screenPoint = pItem->ConvertToScreenPosition(source.GetPosition()); + Point point = __pContentTableView->ConvertToControlPosition(screenPoint); + int itemIndex = __pContentTableView->GetItemIndexFromPosition(point); + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) Integer(itemIndex))); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_RENAME),pData); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + SetEditHeaderStyle(); + pForm->SetFormBackEventListener(this); + + SetFooterStyle(STYLE_DELETE_ADD); + SetFormStyle(); + Footer* pFooter = CommonUtil::CreateBackButtonStyleFooter(*pForm, STYLE_DELETE_ADD); + if (pFooter != null) + { + pFooter->AddActionEventListener(*this); + pFooter->SetShowState(true); + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + + UpdateContentEditScreenState(); + + if (previousSceneId.Equals(IDSCN_PLAYLIST_RENAME, true)) + { + if (pArgs != null) + { + int totalCount = 0; + __pContentTableView->UpdateTableView(); + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetAllPlayListCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + else + { + if (pFooter != null) + { + if(__checkedItemCount != INIT_VALUE) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + } + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + ContentPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + + if (!(nextSceneId.Equals(IDSCN_PLAYLIST_RENAME, false))) + { + int totalCount = 0; + Footer* pFooter = GetFooter(); + if (pFooter != null) + { + pFooter->SetItemEnabled(0, true); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + } + + __checkedItemCount = INIT_VALUE; + SetCheckedCountBallonTooltip(__checkedItemCount); + + totalCount = __pPresentationModel->GetAllPlayListCount(); + for (int count = 0; count < totalCount; count++) + { + __pContentTableView->SetItemChecked(count, false); + } + } + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +PlaylistListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + AppLogDebug("EXIT"); + return 0; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllPlayListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +PlaylistListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + Tizen::Base::String playlistName = __pPresentationModel->GetPlayListName(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + r = CreateTableViewItem(*pItem, playlistName, itemIndex); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + if (__pPresentationModel->GetPlayListItemCount(playlistName) > 0 && !IsFailed(GetLastResult())) + { + static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true))->SetBackgroundBitmap(*GetDefaultThumbnail()); + RequestThumbnail(__pPresentationModel->GetPlayListItemContentId(playlistName), (new (std::nothrow) Integer(itemIndex))); + } + else + { + Bitmap* thumbnail = (ResourceManager::GetBitmapN(L"34_player_list_thum_noitems.png")); + thumbnail->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true))->SetBackgroundBitmap(*thumbnail); + delete thumbnail; + } + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +void +PlaylistListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + Footer* pFooter = pForm->GetFooter(); + + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + if (__checkedItemCount > INIT_VALUE) + { + __checkedItemCount--; + } + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + if (__checkedItemCount > INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + + SetCheckedCountBallonTooltip(__checkedItemCount); + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::UpdateContentList(void) +{ + AppLogDebug( "ENTER"); + AppLogDebug( "EXIT"); +} + +void +PlaylistListEditorPanel::SetEditHeaderStyle(void) +{ + AppLogDebug("ENTER"); + Header* pHeader = GetHeader(); + String titleText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT")); + CommonUtil::SetEditHeaderStyle(*pHeader, titleText); + pHeader->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + ArrayList* pList = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pList = new (std::nothrow) ArrayList(); + pList->Construct(); + pSceneManager->GoBackward(BackwardSceneTransition(),pList); + AppLogDebug("EXIT"); +} + +void +PlaylistListEditorPanel::OnMusicContentUpdateCompleted(void) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->GetCurrentSceneId() == IDSCN_PLAYLIST_RENAME) + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + ContentEditPanel::OnMusicContentUpdateCompleted(); + HideCommonDeletePopup(false); +} + +result +PlaylistListEditorPanel::CreateTableViewItem(Tizen::Ui::Controls::TableViewItem& parent, const Tizen::Base::String& title, int itemIndex) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(title); + Button* pEditButton = static_cast(pTableViewItem->GetControl(IDC_BUTTON_EDIT)); + Bitmap* pNormalBitmap = ResourceManager::GetBitmapN(L"00_button_rename_normal.png"); + Bitmap* pPressedBitmap = ResourceManager::GetBitmapN(L"00_button_rename_press.png"); + Bitmap* pBackgroundNormalBitmap = ResourceManager::GetBitmapN(L"00_btn_circle_bg_normal.png"); + Bitmap* pBackgroundPressBitmap = ResourceManager::GetBitmapN(L"00_btn_circle_bg_press.png"); + + pEditButton->SetNormalBitmap(Point(0, 0), *pNormalBitmap); + pEditButton->SetNormalBackgroundBitmap(*pBackgroundNormalBitmap); + pEditButton->SetPressedBitmap(Point(0, 0), *pPressedBitmap); + pEditButton->SetPressedBackgroundBitmap(*pBackgroundPressBitmap); + + pEditButton->SetActionId(IDA_RENAME_EDIT_BUTTON); + pEditButton->AddActionEventListener(*this); + + delete pNormalBitmap; + delete pPressedBitmap; + delete pBackgroundNormalBitmap; + delete pBackgroundPressBitmap; + + parent.AddControl(pTableViewItem); + parent.SetIndividualSelectionEnabled(pEditButton, true); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +String +PlaylistListEditorPanel::GetNoContentText(void) +{ + return ResourceManager::GetString(L"IDS_MUSIC_BODY_NO_PLAYLISTS"); +} + +bool +PlaylistListEditorPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetAllPlayListCount() == INIT_VALUE) + { + AppLogDebug("EXIT"); + return true; + } + AppLogDebug("EXIT"); + return false; +} diff --git a/src/MpPlaylistListPanel.cpp b/src/MpPlaylistListPanel.cpp new file mode 100644 index 0000000..62dbadb --- /dev/null +++ b/src/MpPlaylistListPanel.cpp @@ -0,0 +1,886 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListPanel.cpp + * @brief This is the implementation file for PlaylistListPanel class. + */ + +#include "MpAllListPresentationModel.h" +#include "MpCommonUtil.h" +#include "MpMusicPlayerApp.h" +#include "MpPlaylistListPanel.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpSettingPresentationModel.h" +#include "MpThumbnailInfo.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int NUM_NOT_DISPLAY_CONTENT_COUNT = -1; + +PlaylistListPanel::PlaylistListPanel(void) + : ContentLibaryPanel::ContentLibaryPanel() + , ThumbnailBase::ThumbnailBase() + , __pPlaylistListPresentationModel(null) + , __pThumbnail(null) + , __pContextItem_default(null) + , __pContextItem_user(null) + , __pDeletePopup(null) + , __selectedItemIndex(-1) + , __pPlaylistName(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistListPanel::~PlaylistListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlaylistListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __pContextItem_default = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_03); + __pContextItem_user = CommonUtil::CreateTableViewContextItemN(*this, GetWidth(), FLICK_MENU_STYLE_TYPE_04); + + if (__pContextItem_default == null || __pContextItem_user == null) + { + delete __pContextItem_default; + __pContextItem_default = null; + + delete __pContextItem_user; + __pContextItem_user = null; + + AppLogDebug("CommonUtil::CreateContentDeletePopup failed"); + return E_FAILURE; + } + + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + + __pPlaylistListPresentationModel = PlaylistListPresentationModel::GetInstance(); + SetFormStyle(); + SetLayoutFitToForm(); + UpdateContentList(); + __pLaunchPlayerTimer = new (std::nothrow) Timer(); + __pLaunchPlayerTimer->Construct(*this); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +PlaylistListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + if (__pDeletePopup != null) + { + __pDeletePopup->SetPropagatedKeyEventListener(null); + delete __pDeletePopup; + __pDeletePopup = null; + } + + delete __pContextItem_default; + __pContextItem_default = null; + + delete __pContextItem_user; + __pContextItem_user = null; + + if (__pLaunchPlayerTimer != null) + { + __pLaunchPlayerTimer->Cancel(); + delete __pLaunchPlayerTimer; + __pLaunchPlayerTimer = null; + } + + AppLogDebug("EXIT"); + return ContentLibaryPanel::OnTerminating(); +} + +void +PlaylistListPanel::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentTableView->UpdateTableView(); + +} + +void +PlaylistListPanel::OnTimerExpired(Timer& timer) +{ + if (timer.Equals(*__pLaunchPlayerTimer)) + { + if (__pContentTableView->IsContextItemOpened(__selectedItemIndex)) + { + __pContentTableView->CloseContextItem(__selectedItemIndex); + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (__selectedItemIndex >= USER_CONTENT) + { + String* pPlayName = __pPlaylistListPresentationModel->GetPlayListName(__selectedItemIndex - USER_CONTENT); + __pPlaylistListPresentationModel->UpdatePlaylistContentList(USER_CONTENT, *pPlayName); + } + + ArrayList* pContentPath = __pPlaylistListPresentationModel->GetContentPathListN(__selectedItemIndex); + + if (pContentPath == null || pContentPath->GetCount() == 0) + { + return; + } + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + + pData->Add(*(new (std::nothrow) String(MUSIC))); + pData->Add(*(new (std::nothrow) Integer(0))); + pData->Add(*pContentPath); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pData); + } +} + +bool +PlaylistListPanel::OnKeyPressed(Control& source, const Tizen::Ui::KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + return true; + } + AppLogDebug("EXIT"); + return false; + +} + +bool +PlaylistListPanel::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null && (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC)) + { + __pDeletePopup->SetShowState(false); + return true; + } + AppLogDebug("EXIT"); + return false; +} + + +void +PlaylistListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnActionPerformed : %d", actionId); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_DELETE_POPUP_DELETE: + // fall through + case IDA_DELETE_POPUP_CANCEL: + { + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->SetPropagatedKeyEventListener(null); +// delete __pDeletePopup; +// __pDeletePopup = null; + } + + if (actionId == IDA_DELETE_POPUP_DELETE) + { + String* pPlaylistName = __pPlaylistListPresentationModel->GetPlayListName(__selectedItemIndex - USER_CONTENT); + __pPlaylistListPresentationModel->RemovePlayList(*pPlaylistName); + __pPlaylistListPresentationModel->UpdatePlaylistList(); + __pContentTableView->UpdateTableView(); + Invalidate(true); + } + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_SETTINGS | + CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW | CONTEXT_MENU_ITEM_STYLE_CREATE_PLAYLIST); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + if (__pPlaylistListPresentationModel->GetAllPlayListCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_BODY_NO_PLAYLISTS"), MSGBOX_STYLE_NONE, 3000); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + + if (__pPlaylistListPresentationModel->GetAllPlayListCount() != 0) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST_EDITOR)); + } + } + break; + + case IDA_CONTEXT_MENU_ITEM_CREATE_PLAYLIST: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_CREATOR)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_FOLDER_VIEW: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_FOLDER_LIST)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SETTINGS: + { +// SettingPresentationModel::GetInstance()->InitializeSettingValue(); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_MUSIC_SETTING)); + } + break; + + case IDA_FLICK_MENU_ITEM_PLAYALL: + { + // Need to launch the Player after a delay because launching Player in this case needs some DB operations + // these DB operations needs some time to be completed, so in such cases Player's Drawing might be delayed + // resulting behaviours as "Not Showing error message" etc + __pLaunchPlayerTimer->Cancel(); + __pLaunchPlayerTimer->Start(MESSAGE_BOX_DELAY); + } + break; + + case IDA_FLICK_MENU_ITEM_DELETE: + { + if (__pDeletePopup == null) + { + __pDeletePopup = CommonUtil::CreateContentDeletePopup(*this, IDA_DELETE_POPUP_DELETE, IDA_DELETE_POPUP_CANCEL); + } + __pDeletePopup->SetPropagatedKeyEventListener(this); + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + + if(__pContentTableView->IsContextItemOpened(__selectedItemIndex)) + { + __pContentTableView->CloseContextItem(__selectedItemIndex); + } + } + break; + + case IDA_FOOTER_BUTTON_BACK: + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + break; + + default: + break; + } + + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (IsExistMiniPlayer()) + { + Tizen::App::UiApp::GetInstance()->GetFrameAt(0)->SetShowMode(FRAME_SHOW_MODE_MINIMIZED); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + CreateOptionMenuN(source); + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_SEARCH | CONTEXT_MENU_ITEM_STYLE_EDIT | CONTEXT_MENU_ITEM_STYLE_SETTINGS | + CONTEXT_MENU_ITEM_STYLE_FOLDER_VIEW | CONTEXT_MENU_ITEM_STYLE_CREATE_PLAYLIST); + + AppLogDebug("EXIT"); +} +void +PlaylistListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentLibaryPanel::OnSceneActivatedN(previousSceneId, currentSceneId, null); + + GetHeader()->SetItemSelected(1); + GetHeader()->Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + + if (__pContentTableView != null) + { + UpdateContentList(); + __pContentTableView->UpdateTableView(); + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + pArgs = null; + } + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + ContentLibaryPanel::OnSceneDeactivated(currentSceneId, nextSceneId); + AppLogDebug("EXIT"); +} + +int +PlaylistListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistListPresentationModel == null) + { + return USER_CONTENT; + } + AppLogDebug("EXIT"); + return USER_CONTENT + __pPlaylistListPresentationModel->GetAllPlayListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +PlaylistListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS,, "pItem->Construct(%s)", GetErrorMessage(r)); + + if (itemIndex < USER_CONTENT) + { + Tizen::Base::String defaultPlaylistTitle; + switch (itemIndex) + { + case MOST_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_MOST_PLAYED"); + } + break; + + case RECENTLY_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_PLAYED"); + } + break; + + case RECENTLY_ADDED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_ADDED"); + } + break; + } + + String bitmapResName[] = {"34_mostplayed.png", "34_recentlyplayed.png", "34_recentlyadded.png"}; + Bitmap* pBitmap = ResourceManager::GetBitmapN(bitmapResName[itemIndex]); + if (pBitmap != null) + { + r = CreateTableViewItem(*pItem, defaultPlaylistTitle, *pBitmap, NUM_NOT_DISPLAY_CONTENT_COUNT); + delete pBitmap; + TryCatch(r == E_SUCCESS, , "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + ArrayList* pPlaylistContentList = __pPlaylistListPresentationModel->GetContentPathListN(itemIndex); + if(__pContextItem_default) + { + __pContextItem_default->SetEnabled(true); + + if (pPlaylistContentList != null) + { + if (pPlaylistContentList->GetCount() == 0) + { + __pContextItem_default->SetEnabled(false); + } + + pPlaylistContentList->RemoveAll(true); + delete pPlaylistContentList; + } + + __pContextItem_default->Invalidate(true); + pItem->SetContextItem(__pContextItem_default); + } + } + + } + else + { + String* playlistName = __pPlaylistListPresentationModel->GetPlayListName(itemIndex - USER_CONTENT); + if (playlistName != null) + { + String name; + name.Clear(); + name.Append(*playlistName); + int playlistItemCount = __pPlaylistListPresentationModel->GetPlayListItemCount(*playlistName); + ContentId contentId = __pPlaylistListPresentationModel->GetPlayListItemContentId(*playlistName); + if (playlistItemCount > 0 && !IsFailed(GetLastResult())) + { + r = CreateTableViewItem(*pItem, *playlistName, *GetDefaultThumbnail(), playlistItemCount); + TryCatch(r == E_SUCCESS, , "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + RequestThumbnail(contentId, (new (std::nothrow) Integer(itemIndex))); + } + else + { + Bitmap* pThumbnail = (ResourceManager::GetBitmapN(L"34_player_list_thum_noitems.png")); + if (pThumbnail != null) + { + pThumbnail->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + r = CreateTableViewItem(*pItem, *playlistName, *pThumbnail, playlistItemCount); + delete pThumbnail; + TryCatch(r == E_SUCCESS, , "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + } + + } + } + + Button* pPlayAllButton = static_cast(__pContextItem_user->GetControl(IDC_PLAY_ALL_BUTTON,true)); + + if (pPlayAllButton != null) + { + String* pPlayName = __pPlaylistListPresentationModel->GetPlayListName(itemIndex - USER_CONTENT); + + if (__pPlaylistListPresentationModel->GetPlayListItemCount(*pPlayName) == 0) + { + + pPlayAllButton->SetEnabled(false); + } + else + { + pPlayAllButton->SetEnabled(true); + } + + pPlayAllButton->Invalidate(true); + } + + pItem->SetContextItem(__pContextItem_user); + } + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + + if (pItem != null) + { + delete pItem; + pItem = null; + } + + return null; +} + +bool +PlaylistListPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("%d", itemIndex); + + + AppLogDebug("EXIT"); + return false; +} + +void +PlaylistListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(IDSCN_PLAYLIST_LIST))); + + if (itemIndex <= RECENTLY_ADDED_CONTENT) + { + Tizen::Base::String defaultPlaylistTitle; + switch (itemIndex) + { + case MOST_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_MOST_PLAYED"); + } + break; + + case RECENTLY_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_PLAYED"); + } + break; + + case RECENTLY_ADDED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_ADDED"); + } + break; + + default: + break; + } + + pData->Add(*(new (std::nothrow) String(defaultPlaylistTitle))); + pData->Add(*(new (std::nothrow) Integer(itemIndex))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_CONTENT_LIST), pData); + } + else + { + String* pPlaylistName = __pPlaylistListPresentationModel->GetPlayListName(itemIndex - USER_CONTENT); + if (pPlaylistName != null) + { + pData->Add(*(new (std::nothrow) String(*pPlaylistName))); + } + else + { + pData->Add(*(new (std::nothrow) String(L""))); + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_USER_PLAYLIST_CONTENT_LIST), pData); + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == false) + { + AppLogDebug("EXIT"); + return; + } + __selectedItemIndex = itemIndex; + + if (itemIndex >= USER_CONTENT) + { + Button* pPlayAllButton = static_cast(__pContextItem_user->GetControl(IDC_PLAY_ALL_BUTTON,true)); + if (pPlayAllButton != null) + { + String* pPlayName = __pPlaylistListPresentationModel->GetPlayListName(__selectedItemIndex - USER_CONTENT); + if (__pPlaylistListPresentationModel->GetPlayListItemCount(*pPlayName) == 0) + { + + pPlayAllButton->SetEnabled(false); + } + else + { + pPlayAllButton->SetEnabled(true); + } + pPlayAllButton->Draw(true); + } + } + else if (itemIndex < USER_CONTENT) + { + String defaultPlaylistTitle; + switch (itemIndex) + { + case MOST_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_MOST_PLAYED"); + } + break; + + case RECENTLY_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_PLAYED"); + } + break; + + case RECENTLY_ADDED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_ADDED"); + } + break; + } + + ArrayList* pPlaylistContentList = __pPlaylistListPresentationModel->GetContentPathListN(__selectedItemIndex); + if (pPlaylistContentList != null) + { + if (pPlaylistContentList->GetCount() == 0) + { + __pContextItem_default->SetEnabled(false); + } + else + { + __pContextItem_default->SetEnabled(true); + } + pPlaylistContentList->RemoveAll(true); + delete pPlaylistContentList; + } + else + { + __pContextItem_default->SetEnabled(true); + } + __pContextItem_default->Invalidate(true); + } + + AppLogDebug("EXIT"); +} + +result +PlaylistListPanel::CreateTableViewItem(Tizen::Ui::Container& parent, + Tizen::Base::String& labelName, + const Tizen::Graphics::Bitmap& bitmap, + int totalCount) +{ + AppLogDebug("ENTER"); + Panel* pPanelTableViewItem = new (std::nothrow) Panel(); + + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pPanelTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pPanelTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pPanelTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pPanelTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pPanelTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + + static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(bitmap); + static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(labelName); + static_cast(pPanelTableViewItem->GetControl(IDC_CONTENT_TOTAL_COUNT))->SetText(CommonUtil::SetSongsString(totalCount)); + + if (totalCount <= NUM_NOT_DISPLAY_CONTENT_COUNT) + { + Label* pTitleLabel = static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME)); + RelativeLayout* pLayout = dynamic_cast(pPanelTableViewItem->GetLayoutN()); +// float height = static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->GetHeightF(); +// float xPos = static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->GetXF(); +// static_cast(pPanelTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetSize(pPanelTableViewItem->GetWidthF()-(26.0f+xPos), height); + static_cast(pPanelTableViewItem->GetControl(IDC_CONTENT_TOTAL_COUNT))->SetShowState(false); + static_cast(pPanelTableViewItem->GetControl(IDC_THUMBNAIL_INNER_STROKE))->SetShowState(false); + + if (pLayout != null) + { + pLayout->SetRelation(*pTitleLabel,pPanelTableViewItem,RECT_EDGE_RELATION_RIGHT_TO_RIGHT); + pLayout->SetHorizontalFitPolicy(*pTitleLabel,FIT_POLICY_FIXED); + + delete pLayout; + pLayout = null; + } + } + else if (totalCount == INIT_VALUE) + { + static_cast(pPanelTableViewItem->GetControl(IDC_THUMBNAIL_INNER_STROKE))->SetShowState(false); + } + + parent.AddControl(pPanelTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pPanelTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlaylistListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistListPresentationModel != null) + { + __pPlaylistListPresentationModel->UpdatePlaylistList(); + if (AllListPresentationModel::GetInstance()->GetTotalCount() <= 0) + { + CommonUtil::SetAddtoPlaylistState(false); + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +PlaylistListPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + if (__pDeletePopup != null && __pDeletePopup->GetShowState() == true) + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->SetPropagatedKeyEventListener(null); +// delete __pDeletePopup; +// __pDeletePopup = null; + } + + for(int playListCount = 0; playListCount < USER_CONTENT; playListCount++) + { + String defaultPlaylistTitle; + + switch (playListCount) + { + case MOST_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_MOST_PLAYED"); + } + break; + + case RECENTLY_PLAYED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_PLAYED"); + } + break; + + case RECENTLY_ADDED_CONTENT: + { + defaultPlaylistTitle = ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_ADDED"); + } + break; + //no need to have any default case here as it not possible that any un-handled value. + } + + if(defaultPlaylistTitle.GetLength() > 0) + { + __pPlaylistListPresentationModel->UpdatePlaylistContentList(playListCount,defaultPlaylistTitle); + } + } + + ContentLibaryPanel::OnMusicContentUpdateCompleted(); + AppLogDebug("EXIT"); +} + +bool +PlaylistListPanel::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} diff --git a/src/MpPlaylistListPresentationModel.cpp b/src/MpPlaylistListPresentationModel.cpp new file mode 100644 index 0000000..6deca83 --- /dev/null +++ b/src/MpPlaylistListPresentationModel.cpp @@ -0,0 +1,663 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistListPresentationModel.cpp + * @brief This is the implementation file for PlaylistListPresentationModel class. + */ + +#include "MpCommonUtil.h" +#include "MpPlaylistDB.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpResourceManager.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Io; + +PlaylistListPresentationModel* PlaylistListPresentationModel::pPlaylistListPresentationModel = null; + +PlaylistListPresentationModel* +PlaylistListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pPlaylistListPresentationModel == null) + { + AppLogDebug("ENTER"); + pPlaylistListPresentationModel = new (std::nothrow) PlaylistListPresentationModel(); + TryReturn(pPlaylistListPresentationModel != null, null, "PlaylistListPresentationModel instance is not created."); + + result r = pPlaylistListPresentationModel->Construct(); + TryCatch(r == E_SUCCESS, , null, "PlayerPresentationModel instance is not constructed."); + } + AppLogDebug("EXIT"); + return pPlaylistListPresentationModel; + +CATCH: + //AppLogException("PlaylistListPresentationModel::GetInstance(void) Error"); + delete pPlaylistListPresentationModel; + + return null; +} + +PlaylistListPresentationModel::PlaylistListPresentationModel(void) + : __pPlaylistList(null) + , __pContentList(null) + , __contentType(0) + , __pQueryName(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistListPresentationModel::~PlaylistListPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistList != null) + { + __pPlaylistList->RemoveAll(true); + delete __pPlaylistList; + } + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + AppLogDebug("EXIT"); +} + +void +PlaylistListPresentationModel::DestroyPlaylistListPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (pPlaylistListPresentationModel != null) + { + delete pPlaylistListPresentationModel; + pPlaylistListPresentationModel = null; + } + AppLogDebug("EXIT"); +} + +result +PlaylistListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +int +PlaylistListPresentationModel::GetPlayListItemCount(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(playlist); + int itemCount = 0; + TryReturn(pPlayList != null, itemCount,"No such playlist"); + if (pPlayList != null) + { + itemCount = pPlayList->GetPlayListItemCount(); + delete pPlayList; + pPlayList = null; + } + + AppLogDebug("EXIT"); + return itemCount; +} + +Tizen::Graphics::Bitmap* +PlaylistListPresentationModel::GetPlayListItemBitmap(Tizen::Base::String& playList) +{ + AppLogDebug("ENTER"); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(playList); + IList* pSearchList = pPlayList->GetContentInfoListN(); + if (pSearchList == null) + { + return null; + } + + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(0)); + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + Tizen::Graphics::Bitmap* pBitmap = null; + + if (pAudioContentInfo == null) + { + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + pBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + return pBitmap; + } + + pBitmap = pAudioContentInfo->GetThumbnailN(); + if (pBitmap == null) + { + pBitmap = ResourceManager::GetBitmapN(L"34_thumb_07.png"); + } + + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + + delete pPlayList; + pPlayList = null; + + AppLogDebug("EXIT"); + return pBitmap; +} + +Tizen::Content::ContentId +PlaylistListPresentationModel::GetPlayListItemContentId(Tizen::Base::String& playlist) +{ + AppLogDebug("ENTER"); + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(playlist); + TryReturn(pPlaylist != null, ContentId(),"No such playlist"); + IList* pSearchList = pPlaylist->GetContentInfoListN(); + if (pSearchList == null) + { + delete pPlaylist; + return ContentId(); + } + ContentInfo* pContentInfo = static_cast(pSearchList->GetAt(0)); + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + + if (pAudioContentInfo == null) + { + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + SetLastResult(E_FAILURE); + return ContentId(); + } + + ContentId contentId = pAudioContentInfo->GetContentId(); + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + delete pPlaylist; + pPlaylist = null; + + AppLogDebug("EXIT"); + return contentId; +} + +int +PlaylistListPresentationModel::GetAllPlayListCount(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPlaylistList->GetCount(); +// return PlayListManager::GetInstance()->GetAllPlayListCount(); +} + +Tizen::Base::Collection::ArrayList* +PlaylistListPresentationModel::GetContentPathListN(int contentType) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pPlaylistContentList = new (std::nothrow) ArrayList(); + pPlaylistContentList->Construct(); + + if (contentType == MOST_PLAYED_CONTENT || contentType == RECENTLY_PLAYED_CONTENT) + { + PlaylistDB* playlistDB = new (std::nothrow) PlaylistDB(); + playlistDB->CreatePlaylistDatabase(); + + Tizen::Io::DbEnumerator* pDbEnumerator = playlistDB->SearchN(contentType); + Tizen::Base::String contentId; + + Tizen::Base::Collection::ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + if (pDbEnumerator != null) + { + while (pDbEnumerator->MoveNext()== E_SUCCESS) + { + pDbEnumerator->GetStringAt(0, contentId); + + String contentPath = null; + ContentId outContentId; + + CommonUtil::StringToContentId(contentId, outContentId); + ContentInfo* pContentInfo = CommonUtil::GetContentInfoN(outContentId); + if (pContentInfo != null && pContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + contentPath = pContentInfo->GetContentPath(); + delete pContentInfo; + } + else + { + pTempList->Add(*new (std::nothrow) String(contentId)); + } + + if (contentPath == null) + { + pTempList->Add(*new (std::nothrow) String(contentId)); + } + else + { + pPlaylistContentList->Add(*(new (std::nothrow) String(contentPath))); + } + } + delete pDbEnumerator; + } + + if (pTempList != null) + { + for (int i = 0; i < pTempList->GetCount(); i++) + { + playlistDB->Delete(*static_cast(pTempList->GetAt(i))); + } + + pTempList->RemoveAll(); + delete pTempList; + } + delete playlistDB; + } + else if (contentType == RECENTLY_ADDED_CONTENT) + { + DateTime playTime; + Tizen::System::SystemTime::GetCurrentTime(Tizen::System::TIME_MODE_STANDARD, playTime); + + String whereQuery = L"DateTime<'"; + whereQuery.Append(playTime.ToString()); + whereQuery.Append(L"'"); + + IList* pSearchList = CommonUtil::SearchContentList(whereQuery, L"DateTime", SORT_ORDER_DESCENDING); + if (pSearchList == null) + { + return null; + } + + int totalCount = pSearchList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pSearchList->GetAt(iCount)); + AudioContentInfo* pAudioContentInfo = static_cast(pResult->GetContentInfo()); + pPlaylistContentList->Add(*(new (std::nothrow) String(pAudioContentInfo->GetContentPath()))); + } + + pSearchList->RemoveAll(true); + delete pSearchList; + pSearchList = null; + } + else if (contentType >= USER_CONTENT) + { + if (__pContentList == null) + { + AppLogDebug("EXIT"); + return null; + } + + String StrTemp = null; + ArrayList* pTempPath = new (std::nothrow) ArrayList(); + pTempPath->Construct(); + + AudioContentInfo* pAudioContentInfo; + for (int iCount = INIT_VALUE; iCount < __pContentList->GetCount(); iCount++) + { + pAudioContentInfo = static_cast(__pContentList->GetAt(iCount)); + if (pAudioContentInfo != null) + { + StrTemp = pAudioContentInfo->GetContentPath(); + pTempPath->Add(*(new (std::nothrow) String(StrTemp))); + } + } + AppLogDebug("EXIT"); + return pTempPath; + } + + AppLogDebug("EXIT"); + return pPlaylistContentList; +} + +result +PlaylistListPresentationModel::SetPlayListName(const Tizen::Base::String& oldPlayListName, const Tizen::Base::String& newPlayListName) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + if (oldPlayListName != null) + { + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(oldPlayListName); + r = pPlaylist->SetPlayListName(newPlayListName); + + delete pPlaylist; + pPlaylist = null; + } + else + { + PlayList* pPlaylist = new (std::nothrow) PlayList(); + r = pPlaylist->Construct(newPlayListName); + delete pPlaylist; + pPlaylist = null; + } + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::String* +PlaylistListPresentationModel::GetPlayListName(int playlistIndex) +{ + AppLogDebug("ENTER"); + /*Tizen::Base::Collection::IList* pAllPlaylistNameList = PlayListManager::GetInstance()->GetAllPlayListNameN(); + if (pAllPlaylistNameList != null) + { +// AppLogDebug("EXIT"); + IEnumerator* pEnum = pAllPlaylistNameList->GetEnumeratorN(); + if(pEnum != null) + { + while (pEnum->MoveNext() == E_SUCCESS) + { + String* pTempName = dynamic_cast< String* >(pEnum->GetCurrent()); + } + delete pEnum; + } + + return static_cast(pAllPlaylistNameList->GetAt(playlistIndex)); + }*/ + if (__pPlaylistList != null) + { + String* pPlayListName = static_cast(__pPlaylistList->GetAt(playlistIndex)); + return pPlayListName; + } + AppLogDebug("EXIT"); + return null; +} + +void +PlaylistListPresentationModel::RemovePlayList(Tizen::Base::String& playlistName) +{ + AppLogDebug("ENTER"); + AppLogDebug("%ls", playlistName.GetPointer()); + PlayListManager::GetInstance()->RemovePlayList(playlistName); + AppLogDebug("EXIT %s",GetErrorMessage(GetLastResult())); +} + +void +PlaylistListPresentationModel::AddContent(const Tizen::Content::ContentId& contentId, int playlistIndex) +{ + AppLogDebug("ENTER"); + Tizen::Base::String* pPlayListName; + pPlayListName = static_cast(__pPlaylistList->GetAt(playlistIndex)); + + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(*pPlayListName); + TryReturnVoid(pPlayList != null, "No playlist with the name %ls",pPlayListName->GetPointer()); + pPlayList->AddItem(contentId); + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +void +PlaylistListPresentationModel::UpdatePlaylistContentList(const int contentType, const Tizen::Base::String& playlistName) +{ + AppLogDebug("ENTER"); + if (__pQueryName != null) + { + delete __pQueryName; + __pQueryName = null; + } + + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + __contentType = contentType; + __pQueryName = new (std::nothrow) String(playlistName); + + if (contentType == MOST_PLAYED_CONTENT || contentType == RECENTLY_PLAYED_CONTENT) + { + PlaylistDB* pPlaylistDB = new (std::nothrow) PlaylistDB(); + pPlaylistDB->CreatePlaylistDatabase(); + Tizen::Base::Collection::ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + Tizen::Io::DbEnumerator* pDbEnumerator = pPlaylistDB->SearchN(__contentType); + if (pDbEnumerator != null) + { + Tizen::Base::Collection::ArrayList* pContentIdList = new (std::nothrow) ArrayList(SingleObjectDeleter); + pContentIdList->Construct(); + + while (pDbEnumerator->MoveNext()== E_SUCCESS) + { + Tizen::Base::String contentId; + pDbEnumerator->GetStringAt(0, contentId); + + ContentId outContentId; + CommonUtil::StringToContentId(contentId, outContentId); + ContentInfo* pContentInfo = CommonUtil::GetContentInfoN(outContentId); + if (pContentInfo != null && pContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + pTempList->Add(*pContentInfo); + } + else + { + pContentIdList->Add(*new (std::nothrow) String(contentId)); + delete pContentInfo; + } + } + + if (pTempList != null) + { + __pContentList = pTempList; + } + + if (pContentIdList != null) + { + for (int i = 0; i < pContentIdList->GetCount(); i++) + { + pPlaylistDB->Delete(*static_cast(pContentIdList->GetAt(i))); + } + + delete pContentIdList; + pContentIdList = null; + } + } + + delete pDbEnumerator; + pDbEnumerator = null; + + delete pPlaylistDB; + pPlaylistDB = null; + } + else if (contentType == RECENTLY_ADDED_CONTENT) + { + DateTime playTime; + Tizen::System::SystemTime::GetCurrentTime(Tizen::System::TIME_MODE_STANDARD, playTime); + + String whereQuery = L"DateTime<'"; + whereQuery.Append(playTime.ToString()); + whereQuery.Append(L"'"); + + __pContentList = CommonUtil::SearchContentList(whereQuery, L"DateTime", SORT_ORDER_DESCENDING); + } + else if (contentType == USER_CONTENT) + { + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(*__pQueryName); + if (pPlaylist != null) + { + __pContentList = pPlaylist->GetContentInfoListN(); + delete pPlaylist; + pPlaylist = null; + } + } + AppLogDebug("EXIT"); +} + +int +PlaylistListPresentationModel::GetContentCount(void) +{ + AppLogDebug("ENTER"); + if (__pContentList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pContentList->GetCount(); +} + +void +PlaylistListPresentationModel::UpdatePlaylistList(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistList != null) + { + __pPlaylistList->RemoveAll(true); + delete __pPlaylistList; + __pPlaylistList = null; + } + + __pPlaylistList = PlayListManager::GetInstance()->GetAllPlayListNameN(); + AppLogDebug("EXIT"); +} + +ContentInformation* +PlaylistListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList == null || contentIndex < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pContentList is null)", contentIndex); + return null; + } + + ContentInformation* pContentInfoStruct = null; + switch (__contentType) + { + case MOST_PLAYED_CONTENT: + // fall through + case RECENTLY_PLAYED_CONTENT: + { + AudioContentInfo* pAudioContentInfo; + pAudioContentInfo = static_cast(__pContentList->GetAt(contentIndex)); + if (pAudioContentInfo == null) + { + return pContentInfoStruct; + } + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + break; + + case RECENTLY_ADDED_CONTENT: + { + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(contentIndex)); + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + AudioContentInfo* pAudioContentInfo = static_cast(pResult->GetContentInfo()); + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + } + break; + + case USER_CONTENT: + { + ContentInfo* pContentInfo = static_cast(__pContentList->GetAt(contentIndex)); + if (pContentInfo != null && pContentInfo->GetContentType() == CONTENT_TYPE_AUDIO) + { + AudioContentInfo* pAudioContentInfo = static_cast(pContentInfo); + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +void +PlaylistListPresentationModel::DeleteContent(int contentType, const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + switch (contentType) + { + case NORMAL_CONTENT: + { + } + break; + + case MOST_PLAYED_CONTENT: + // fall through + case RECENTLY_PLAYED_CONTENT: + { + PlaylistDB* playlistDB = new (std::nothrow) PlaylistDB(); + String contentId = contentInfoStruct.contentId.ToString(); + + ArrayList* pTempList = new (std::nothrow) ArrayList(); + pTempList->Construct(); + + pTempList = playlistDB->ReadValueN(contentId); + int playCount = static_cast(pTempList->GetAt(0))->ToInt(); + String playTime; + playTime.Append(*static_cast(pTempList->GetAt(1))); + if (contentType == MOST_PLAYED_CONTENT) + { + playlistDB->Update(contentId, null, playTime); + } + else + { + String tempPlayTime; + tempPlayTime.Append(IDS_BLANK); + playlistDB->Update(contentId, playCount, tempPlayTime); + } + + delete pTempList; + + pTempList = playlistDB->ReadValueN(contentId); + playCount = static_cast(pTempList->GetAt(0))->ToInt(); + playTime = null; + playTime.Append(*static_cast(pTempList->GetAt(1))); + + if (playCount == 0 && playTime.Equals(IDS_BLANK, true)) + { + playlistDB->Delete(contentId); + } + + delete playlistDB; + delete pTempList; + } + break; + + case RECENTLY_ADDED_CONTENT: + { + } + break; + + case USER_CONTENT: + { + PlayList* pPlaylist = PlayListManager::GetInstance()->GetPlayListN(*__pQueryName); + pPlaylist->RemoveItem(contentInfoStruct.contentId); + + delete pPlaylist; + pPlaylist = null; + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} diff --git a/src/MpPlaylistPickerPopup.cpp b/src/MpPlaylistPickerPopup.cpp new file mode 100644 index 0000000..8200a0e --- /dev/null +++ b/src/MpPlaylistPickerPopup.cpp @@ -0,0 +1,381 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistPickerPopup.cpp + * @brief This is the implementation file for PlaylistPickerPopup class. + */ + +#include "MpCommonUtil.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Media; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const Tizen::Graphics::Rectangle RECT_LABEL (0, 25, 560, 60); +static const int HEIGHT_POPUP_ITEM = 110; + +PlayListPickerPopup::PlayListPickerPopup(void) + : __pPlaylistListPresentationModel(null) + , __pPlaylistTableView(null) + , __pCancelButton(null) + , __pCreateButton(null) + , __pPlaylistContentList(null) + , __pControl(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlayListPickerPopup::~PlayListPickerPopup(void) +{ + AppLogDebug("ENTER"); + if (__pPlaylistContentList != null) + { + __pPlaylistContentList->RemoveAll(true); + delete __pPlaylistContentList; + } + AppLogDebug("EXIT"); +} + +result +PlayListPickerPopup::Initialize(Tizen::Ui::Control* pControl, Tizen::Base::Collection::IList* pDataList) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + __pPlaylistListPresentationModel = PlaylistListPresentationModel::GetInstance(); + __pPlaylistListPresentationModel->UpdatePlaylistList(); + + Construct(IDL_CREATE_PLAYLIST_POPUP); + SetTitleText(ResourceManager::GetString(L"IDS_MUSIC_BODY_ADD_TO_PLAYLIST")); + + AddTouchEventListener(*this); + SetPropagatedKeyEventListener(this); + + __pPlaylistTableView = static_cast(GetControl(IDC_TABLEVIEW)); + __pPlaylistTableView->AddTableViewItemEventListener(*this); + __pPlaylistTableView->SetItemProvider(this); + + __pCreateButton = static_cast(GetControl(IDC_CREATE_BUTTON)); + __pCreateButton->SetActionId(IDA_BUTTON_CREATE); + __pCreateButton->AddActionEventListener(*this); + + __pCancelButton = static_cast(GetControl(IDC_CANCEL_BUTTON)); + __pCancelButton->SetActionId(IDA_BUTTON_CANCEL); + __pCancelButton->AddActionEventListener(*this); + + __pControl = pControl; + __pPlaylistContentList = pDataList; + AppLogDebug("EXIT"); + return r; +} + +void +PlayListPickerPopup::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + + if (actionId == IDA_BUTTON_CANCEL) + { + SetShowState(false); + Invalidate(true); + pDataList->Add(*(new (std::nothrow) Boolean(false))); + __pControl->SendUserEvent(ID_DESTORY_PLAY_LIST_PICKER_POPUP, pDataList); + } + else if (actionId == IDA_BUTTON_CREATE) + { + SetShowState(false); + Invalidate(true); + if (__pPlaylistContentList != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_CREATOR), __pPlaylistContentList); + __pPlaylistContentList = null; + } + else + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_CREATOR)); + } + pDataList->Add(*(new (std::nothrow) Boolean(false))); + __pControl->SendUserEvent(ID_DESTORY_PLAY_LIST_PICKER_POPUP, pDataList); + } + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (GetShowState() + && (currentPosition.x < 0 + || currentPosition.y < 0 + || this->GetBounds().width + || this->GetBounds().height)) + { +// SetShowState(false); +// Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +PlayListPickerPopup::OnKeyPressed(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (KEY_BACK == keyEventInfo.GetKeyCode() || KEY_ESC == keyEventInfo.GetKeyCode()) + { + return true; + } + + AppLogDebug("EXIT"); + return false; +} + +bool +PlayListPickerPopup::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if (KEY_BACK == keyEventInfo.GetKeyCode() || KEY_ESC == keyEventInfo.GetKeyCode()) + { + SetShowState(false); + Show(); + return true; + } + + AppLogDebug("EXIT"); + return false; +} + +int +PlayListPickerPopup::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pPlaylistListPresentationModel->GetAllPlayListCount(); +} + +Tizen::Ui::Controls::TableViewItem* +PlayListPickerPopup::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + result r = pItem->Construct(layout, Dimension(itemWidth, HEIGHT_POPUP_ITEM), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + r = CreateTableViewItem(*pItem, *(__pPlaylistListPresentationModel->GetPlayListName(itemIndex))); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +bool +PlayListPickerPopup::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +PlayListPickerPopup::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +PlayListPickerPopup::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return HEIGHT_POPUP_ITEM; +} + +void +PlayListPickerPopup::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SetShowState(false); + Invalidate(true); + + if (__pPlaylistContentList != null) + { + for (int index = 0; index < __pPlaylistContentList->GetCount(); index++) + { + ContentId contentId = CommonUtil::GetContentId(*(static_cast(__pPlaylistContentList->GetAt(index)))); + if (!IsFailed(GetLastResult())) + { + __pPlaylistListPresentationModel->AddContent(contentId, itemIndex); + } + } + } + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + pDataList->Add(*(new (std::nothrow) Boolean(true))); + + if (GetLastResult() == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + __pControl->SendUserEvent(ID_DESTORY_PLAY_LIST_PICKER_POPUP, pDataList); + } + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlayListPickerPopup::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +PlayListPickerPopup::CreateTableViewItem(Tizen::Ui::Container& parent, Tizen::Base::String& labelName) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + Label* pStrLabel = new (std::nothrow) Label(); + if (pStrLabel == null) + { + return E_INIT_FAILED; + } + + r = pStrLabel->Construct(RECT_LABEL, L""); + if (r != E_SUCCESS) + { + return E_INIT_FAILED; + } + + pStrLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pStrLabel->SetTextConfig(32, LABEL_TEXT_STYLE_NORMAL); + pStrLabel->SetText(labelName); + + parent.AddControl(pStrLabel); + + AppLogDebug("EXIT"); + return r; +} diff --git a/src/MpPlaylistReNameForm.cpp b/src/MpPlaylistReNameForm.cpp new file mode 100644 index 0000000..e26721a --- /dev/null +++ b/src/MpPlaylistReNameForm.cpp @@ -0,0 +1,284 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpPlaylistReNameForm.cpp + * @brief This is the implementation file for PlaylistReNameForm class. + */ + +#include "MpCommonUtil.h" +#include "MpPlaylistReNameForm.h" +#include "MpPlaylistEditorPresentationModel.h" +#include "MpResourceManager.h" +#include "MpSceneRegister.h" +#include "MpTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +PlaylistReNameForm::PlaylistReNameForm(void) + : __pPlaylistEditorPresentationModel(null) + , __pPlaylistEditField(null) + , __playlistName(null) + , __orignalPlaylistName(null) + , __selectedPlaylistIndex(0) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +PlaylistReNameForm::~PlaylistReNameForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::Initialize(void) +{ + AppLogDebug("ENTER"); + Form::Construct(IDL_PLAYLIST_RENAME_FORM); + AppLogDebug("EXIT"); +} + +result +PlaylistReNameForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + String headerText; + + headerText.Append(ResourceManager::GetString(L"IDS_MUSIC_OPT_RENAME")); + headerText.Append(L" "); + headerText.Append(ResourceManager::GetString(L"IDS_MP_HEADER_MENU_PLAYLIST")); + GetHeader()->SetTitleText(headerText); + + __pPlaylistEditField = static_cast(GetControl(IDC_EDITFIELD)); + __pPlaylistEditField->AddTextEventListener(*this); + __pPlaylistEditField->AddKeypadEventListener(*this); + __pPlaylistEditField->SetOverlayKeypadCommandButtonVisible(false); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditorPresentationModel = PlaylistEditorPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +PlaylistReNameForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +PlaylistReNameForm::OnKeypadActionPerformed(Tizen::Ui::Control& source, + Tizen::Ui::KeypadAction keypadAction) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnKeypadClosed(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnKeypadOpened(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnKeypadWillOpen(Tizen::Ui::Control &source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::IList* pPlaylistList; + SetFormBackEventListener(this); + if (GetFooter() != null) + { + GetFooter()->AddActionEventListener(*this); + } + if (pArgs != null) + { + __selectedPlaylistIndex = static_cast(pArgs->GetAt(0))->ToInt(); + + delete pArgs; + pArgs = null; + } + pPlaylistList = __pPlaylistEditorPresentationModel->GetAllPlayListNameN(); + + __playlistName = *static_cast(pPlaylistList->GetAt(__selectedPlaylistIndex)); + __orignalPlaylistName = __playlistName; + if (__pPlaylistEditField->GetTextLength() == 0) + { + __pPlaylistEditField->SetText(__playlistName); + } + __pPlaylistEditField->ShowKeypad(); + + pPlaylistList->RemoveAll(true); + delete pPlaylistList; + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_SAVE: + { + __playlistName.Trim(); + __pPlaylistEditField->HideKeypad(); + + if (__playlistName.GetLength() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_RENAME_PLAYLIST"), MSGBOX_STYLE_NONE, 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditField->ShowKeypad(); + break; + } + String* previousName = static_cast(__pPlaylistEditorPresentationModel->GetAllPlayListNameN()->GetAt(__selectedPlaylistIndex)); + ArrayList* pArgs = null; + if(!previousName->Equals(__playlistName,true)) + { + result r = __pPlaylistEditorPresentationModel->SetPlayListName(*(static_cast(__pPlaylistEditorPresentationModel->GetAllPlayListNameN()->GetAt(__selectedPlaylistIndex))), __playlistName); + if (r != E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_POP_UNABLE_RENAME_PLAYLIST"), MSGBOX_STYLE_NONE, 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + __pPlaylistEditField->SetFocus(); + __pPlaylistEditField->ShowKeypad(); + return; + } + else + { + pArgs = new (std::nothrow) ArrayList(); + pArgs->Construct(); + pArgs->Add(new (std::nothrow) Integer(1)); + } + } + + pSceneManager->GoBackward(BackwardSceneTransition(),pArgs); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnTextValueChanged(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + + EditArea* pEditArea = const_cast(static_cast(&source)); + __playlistName = pEditArea->GetText(); + AppLogDebug("%ls", __playlistName.GetPointer()); + + if (__playlistName.GetLength() == INIT_VALUE) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + else if (__pPlaylistEditorPresentationModel->IsPlaylistExist(__orignalPlaylistName) == true) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnTextValueChangeCanceled(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->GoBackward(BackwardSceneTransition()); + AppLogDebug("EXIT"); +} + +void +PlaylistReNameForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + if (__pPlaylistEditorPresentationModel->IsPlaylistExist(__orignalPlaylistName) == false) + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, false); + } + } + else + { + if (pFooter != null) + { + CommonUtil::SetFooterItemEnabled(*pFooter, true); + } + } + AppLogDebug("EXIT"); +} diff --git a/src/MpResourceManager.cpp b/src/MpResourceManager.cpp new file mode 100644 index 0000000..cfb3b50 --- /dev/null +++ b/src/MpResourceManager.cpp @@ -0,0 +1,64 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpResourceManager.cpp + * @brief This is the implementation file for ResourceManager class. + */ + +#include +#include +#include +#include "MpResourceManager.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; + +Bitmap* +ResourceManager::GetBitmapN(const Tizen::Base::String& resourceName) +{ + AppLogDebug("ENTER"); + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + if (pAppResource == null) + { + AppLogDebug("EXIT"); + return null; + } + AppLogDebug("EXIT"); + return pAppResource->GetBitmapN(resourceName); +} + +String +ResourceManager::GetString(const Tizen::Base::String& id) +{ + AppLogDebug("ENTER"); + String localizedText; + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + localizedText.Clear(); + + if (pAppResource == null) + { + AppLogDebug("EXIT"); + return localizedText; + } + + pAppResource->GetString(id, localizedText); + + AppLogDebug("EXIT"); + return localizedText; +} \ No newline at end of file diff --git a/src/MpSceneRegister.cpp b/src/MpSceneRegister.cpp new file mode 100644 index 0000000..4f65e94 --- /dev/null +++ b/src/MpSceneRegister.cpp @@ -0,0 +1,174 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpAlbumListEditorPanel.cpp + * @brief This is the implementation file for AlbumListEditorPanel class. + */ + +#include "MpFormFactory.h" +#include "MpPanelFactory.h" +#include "MpSceneRegister.h" + +using namespace Tizen::Ui::Scenes; + +const wchar_t* IDSCN_ALL_LIST = L"AllList"; +const wchar_t* IDSCN_ALL_LIST_EDITOR = L"AllListEditor"; +const wchar_t* IDSCN_ALL_CONTENT_PICKER = L"AllContentPicker"; + +const wchar_t* IDSCN_PLAYLIST_LIST = L"PlaylistList"; +const wchar_t* IDSCN_PLAYLIST_LIST_EDITOR = L"PlaylistListEditor"; +const wchar_t* IDSCN_PLAYLIST_CREATOR = L"PlaylistCreator"; +const wchar_t* IDSCN_PLAYLIST_RENAME = L"PlaylistNameEditor"; +const wchar_t* IDSCN_PLAYLIST_CONTENT_LIST = L"PlaylistContentList"; +const wchar_t* IDSCN_PLAYLIST_CONTENT_LIST_EDITOR = L"PlaylistContentListEditor"; +const wchar_t* IDSCN_USER_PLAYLIST_CONTENT_LIST = L"UserPlaylistContentList"; + +const wchar_t* IDSCN_ALBUM_LIST = L"AlbumList"; +const wchar_t* IDSCN_ALBUM_LIST_EDITOR = L"AlbumListEditor"; +const wchar_t* IDSCN_ALBUM_PICKER = L"AlbumPicker"; +const wchar_t* IDSCN_ALBUM_CONTENT_PICKER = L"AlbumContentPicker"; +const wchar_t* IDSCN_ALBUM_CONTENT_LIST = L"AlbumContentList"; +const wchar_t* IDSCN_ALBUM_CONTENT_LIST_EDITOR = L"AlbumContentListEditor"; + +const wchar_t* IDSCN_ARTIST_LIST = L"ArtistList"; +const wchar_t* IDSCN_ARTIST_LIST_EDITOR = L"ArtistListEditor"; +const wchar_t* IDSCN_ARTIST_PICKER = L"ArtistPicker"; +const wchar_t* IDSCN_ARTIST_CONTENT_PICKER = L"ArtistContentPicker"; +const wchar_t* IDSCN_ARTIST_CONTENT_LIST = L"ArtistContentList"; +const wchar_t* IDSCN_ARTIST_ALL_SONG_LIST = L"ArtistAllSongList"; +const wchar_t* IDSCN_ARTIST_ALBUM_LIST = L"ArtistAlbumList"; +const wchar_t* IDSCN_ARTIST_ALBUM_SEARCH_LIST = L"ArtistAlbumSearchList"; +const wchar_t* IDSCN_ARTIST_ALBUM_LIST_EDITOR = L"ArtistAlbumListEditor"; + +const wchar_t* IDSCN_GENRE_LIST = L"GenreList"; +const wchar_t* IDSCN_GENRE_LIST_EDITOR = L"GenreListEditor"; +const wchar_t* IDSCN_GENRE_PICKER = L"GenrePicker"; +const wchar_t* IDSCN_GENRE_CONTENT_PICKER = L"GenreContentPicker"; +const wchar_t* IDSCN_GENRE_CONTENT_LIST = L"GenresContentList"; +const wchar_t* IDSCN_GENRE_CONTENT_LIST_EDITOR = L"GenreContentListEditor"; + +const wchar_t* IDSCN_COMPOSER_LIST = L"ComposerList"; +const wchar_t* IDSCN_COMPOSER_LIST_EDITOR = L"ComposerListEditor"; +const wchar_t* IDSCN_COMPOSER_PICKER = L"ComposerPicker"; +const wchar_t* IDSCN_COMPOSER_CONTENT_PICKER = L"ComposerContentPicker"; +const wchar_t* IDSCN_COMPOSER_CONTENT_LIST = L"ComposerContentList"; +const wchar_t* IDSCN_COMPOSER_CONTENT_LIST_EDITOR = L"ComposerContentListEditor"; + +const wchar_t* IDSCN_YEAR_LIST = L"YearList"; +const wchar_t* IDSCN_YEAR_LIST_EDITOR = L"YearListEditor"; +const wchar_t* IDSCN_YEAR_PICKER = L"YearPicker"; +const wchar_t* IDSCN_YEAR_CONTENT_PICKER = L"YearContentPicker"; +const wchar_t* IDSCN_YEAR_CONTENT_LIST = L"YearContentList"; +const wchar_t* IDSCN_YEAR_CONTENT_LIST_EDITOR = L"YearContentListEditor"; + +const wchar_t* IDSCN_FOLDER_LIST = L"FolderList"; +const wchar_t* IDSCN_FOLDER_LIST_EDITOR = L"FolderContentPickerEditor"; +const wchar_t* IDSCN_FOLDER_PICKER = L"FolderPicker"; +const wchar_t* IDSCN_FOLDER_CONTENT_PICKER = L"FolderContentPicker"; +const wchar_t* IDSCN_FOLDER_CONTENT_LIST = L"FolderContentList"; +const wchar_t* IDSCN_FOLDER_CONTENT_LIST_EDIT = L"FolderContentListEditor"; + +const wchar_t* IDSCN_SEARCH = L"Search"; +const wchar_t* IDSCN_PLAYER = L"Player"; +const wchar_t* IDSCN_MUSIC_SETTING = L"MusicSetting"; +const wchar_t* IDSCN_CONTENT_DETAIL = L"ContentDetail"; + +SceneRegister::SceneRegister(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SceneRegister::~SceneRegister(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +SceneRegister::RegisterAllScenes(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + static const wchar_t* PANEL_BLANK = L""; + static FormFactory formFactory; + static PanelFactory panelFactory; + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + r = pSceneManager->RegisterFormFactory(formFactory); + r = pSceneManager->RegisterPanelFactory(panelFactory); + + r = pSceneManager->RegisterScene(IDSCN_PLAYER, IDC_PLAYER_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_MUSIC_SETTING, IDC_MUSIC_SETTING_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_SEARCH, IDC_SEARCH_FORM, PANEL_BLANK); + + r = pSceneManager->RegisterScene(IDSCN_ALL_LIST, IDC_CONTENT_FORM, IDC_ALL_LIST_PANEL); + r = pSceneManager->RegisterScene(IDSCN_PLAYLIST_LIST, IDC_CONTENT_FORM, IDC_PLAYLIST_LIST_PANEL); + r = pSceneManager->RegisterScene(IDSCN_ALBUM_LIST, IDC_CONTENT_FORM, IDC_ALBUM_LIST_PANEL); + r = pSceneManager->RegisterScene(IDSCN_ARTIST_LIST, IDC_CONTENT_FORM, IDC_ARTIST_LIST_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_GENRE_LIST, IDC_CONTENT_FORM, IDC_GENRES_LIST_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_COMPOSER_LIST, IDC_CONTENT_FORM, IDC_COMPOSER_LIST_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_YEAR_LIST, IDC_CONTENT_FORM, IDC_YEAR_LIST_PANEL); + r = pSceneManager->RegisterScene(IDSCN_FOLDER_LIST, IDC_CONTENT_FORM, IDC_FOLDER_LIST_PANEL); + + r = pSceneManager->RegisterScene(IDSCN_ALL_LIST_EDITOR, IDC_CONTENT_FORM, IDC_ALL_LIST_EDITOR_PANEL); + r = pSceneManager->RegisterScene(IDSCN_PLAYLIST_LIST_EDITOR, IDC_CONTENT_FORM, IDC_PLAYLIST_LIST_EDITOR_PANEL); + r = pSceneManager->RegisterScene(IDSCN_ALBUM_LIST_EDITOR, IDC_CONTENT_FORM, IDC_ALBUM_LIST_EDITOR_PANEL); + r = pSceneManager->RegisterScene(IDSCN_ARTIST_LIST_EDITOR, IDC_CONTENT_FORM, IDC_ARTIST_LIST_EDITOR_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_GENRE_LIST_EDITOR, IDC_CONTENT_FORM, IDC_GENRES_LIST_EDITOR_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_COMPOSER_LIST_EDITOR, IDC_CONTENT_FORM, IDC_COMPOSER_LIST_EDITOR_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_YEAR_LIST_EDITOR, IDC_CONTENT_FORM, IDC_YEAR_LIST_EDITOR_PANEL); + r = pSceneManager->RegisterScene(IDSCN_FOLDER_LIST_EDITOR, IDC_CONTENT_FORM, IDC_FOLDER_LIST_EDITOR_PANEL); + +// r = pSceneManager->RegisterScene(IDSCN_ALBUM_PICKER, IDC_CONTENT_FORM, IDC_ALBUM_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_PICKER, IDC_CONTENT_FORM, IDC_ARTIST_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_GENRE_PICKER, IDC_CONTENT_FORM, IDC_GENRE_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_COMPOSER_PICKER,IDC_CONTENT_FORM, IDC_COMPOSER_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_YEAR_PICKER, IDC_CONTENT_FORM, IDC_YEAR_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_FOLDER_PICKER, IDC_CONTENT_FORM, IDC_FOLDER_PICKER_PANEL); + + r = pSceneManager->RegisterScene(IDSCN_ALL_CONTENT_PICKER, IDC_CONTENT_PICKER_FORM, IDC_ALL_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_ALBUM_CONTENT_PICKER, IDC_CONTENT_FORM, IDC_ALBUM_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_CONTENT_PICKER, IDC_CONTENT_FORM, IDC_ARTIST_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_GENRE_CONTENT_PICKER, IDC_CONTENT_FORM, IDC_GENRE_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_COMPOSER_CONTENT_PICKER,IDC_CONTENT_FORM, IDC_COMPOSER_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_YEAR_CONTENT_PICKER, IDC_CONTENT_FORM, IDC_YEAR_CONTENT_PICKER_PANEL); +// r = pSceneManager->RegisterScene(IDSCN_FOLDER_CONTENT_PICKER, IDC_CONTENT_FORM, IDC_FOLDER_CONTENT_PICKER_PANEL); + + r = pSceneManager->RegisterScene(IDSCN_ALBUM_CONTENT_LIST, IDC_ALBUM_CONTENT_LIST_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_ARTIST_CONTENT_LIST, IDC_ARTIST_CONTENT_LIST_FORM, PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_GENRE_CONTENT_LIST, IDC_GENRE_CONTENT_LIST_FORM, PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_COMPOSER_CONTENT_LIST, IDC_COMPOSER_CONTENT_LIST_FORM,PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_YEAR_CONTENT_LIST, IDC_YEAR_CONTENT_LIST_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_FOLDER_CONTENT_LIST, IDC_FOLDER_CONTENT_LIST_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_PLAYLIST_CONTENT_LIST, IDC_PLAYLIST_CONTENT_LIST_FORM, PANEL_BLANK); + +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_ALBUM_LIST, IDC_ARTIST_ALBUM_LIST_FORM, PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_ALBUM_SEARCH_LIST, IDC_ARTIST_ALBUM_LIST_SEARCH_FORM,PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_ALBUM_LIST_EDITOR, IDC_ARTIST_ALBUM_LIST_EDIT_FORM, PANEL_BLANK); +// r = pSceneManager->RegisterScene(IDSCN_ARTIST_ALL_SONG_LIST, IDC_ARTIST_ALL_SONG_LIST_FORM, PANEL_BLANK); + + r = pSceneManager->RegisterScene(IDSCN_PLAYLIST_CREATOR, IDC_PLAYLIST_CREATOR_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_PLAYLIST_RENAME, IDC_PLAYLIST_RENAME_FORM, PANEL_BLANK); + r = pSceneManager->RegisterScene(IDSCN_USER_PLAYLIST_CONTENT_LIST, IDC_USER_PLAYLIST_CONTENT_LIST_FORM, PANEL_BLANK); + + r = pSceneManager->RegisterScene(IDSCN_CONTENT_DETAIL, IDC_CONTENT_DETAIL_FORM, PANEL_BLANK); + AppLogDebug("EXIT"); + return r; +} diff --git a/src/MpSearchForm.cpp b/src/MpSearchForm.cpp new file mode 100644 index 0000000..bb8c465 --- /dev/null +++ b/src/MpSearchForm.cpp @@ -0,0 +1,806 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchForm.cpp + * @brief This is the implementation file for SearchForm class. + */ + +#include "MpSearchForm.h" +#include "MpSearchListItem.h" +#include "MpMusicPlayerApp.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int H_SEARCH_BAR = 86; +static const int H_GROUP_NAME = 80; +static const int X_GAP = 16; +static const int SEARCH_FONT_SIZE = 50; +static const int IDA_GROUP_ITEM_ELEMENT = 100; +static const int IDA_SEARCH_ITEM_MAIN_ELEMENT = 101; +static const int IDA_SEARCH_ITEM_SUB_ELEMENT = 102; +static const Tizen::Graphics::Color COLOR_GROUP_NAME_BG (127, 127, 127); +static const Tizen::Graphics::Color COLOR_GROUP_TEXT (255, 255, 255); + +SearchForm::SearchForm(void) + : __pSearchListView(null) + , __pSearchBar(null) + , __pNoContentTextLabel(null) + , __pSceneId(null) + , __itemHeight(ITEM_HEIGHT_MAIN_TEXT_NORMAL) + , __fontSize(FONT_MAIN_TEXT_SIZE_NORMAL) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SearchForm::~SearchForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +SearchForm::Initialize(void) +{ + AppLogDebug("ENTER"); + + Construct(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_PORTRAIT_INDICATOR | FORM_STYLE_LANDSCAPE_INDICATOR_AUTO_HIDE); + + AppLogDebug("EXIT"); + return true; +} + +result +SearchForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + AddOrientationEventListener(*this); + SetOrientation(ORIENTATION_AUTOMATIC_FOUR_DIRECTION); + + GetHeader()->SetTitleText(ResourceManager::GetString("IDS_COM_BODY_SEARCH")); + + __pPresentationModel = SearchPresentationModel::GetInstance(); + __pSearchBar = new (std::nothrow) SearchBar(); + __pSearchBar->Construct(Rectangle(0, 0, GetClientAreaBounds().width, H_SEARCH_BAR)); + __pSearchBar->SetGuideText(ResourceManager::GetString("IDS_COM_BODY_SEARCH")); + __pSearchBar->AddSearchBarEventListener(*this); + __pSearchBar->AddTextEventListener(*this); + __pSearchBar->AddKeypadEventListener(*this); +// __pSearchBar->SetLowerCaseModeEnabled(true); + AddControl(__pSearchBar); + __pSearchListView = new (std::nothrow) ListView(); + __pSearchListView->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height - __pSearchBar->GetHeight()), + true, + SCROLL_STYLE_FADE_OUT); + + __pSearchListView->SetItemProvider(*this); + __pSearchListView->AddListViewItemEventListener(*this); + __pSearchListView->AddTouchEventListener(*this); + __pSearchListView->AddScrollEventListener(*this); + __pSearchBar->SetContent(__pSearchListView); + + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __fontSize = CommonUtil::GetFontSize(__fontSizeValue); + + if (GetFooter() != null) + { + GetFooter()->SetBackButton(); + } + + SetFormBackEventListener(this); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +SearchForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __pSearchListView->Destroy(); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +SearchForm::OnSearchBarModeChanged(Tizen::Ui::Controls::SearchBar& source, + Tizen::Ui::Controls::SearchBarMode mode) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveSearchResult(); + + if (__pSearchListView != null) + { + __pSearchListView->UpdateList(); + __pSearchListView->ScrollToItem(INIT_VALUE); + __pSearchListView->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnSearchBarContentAreaResized(Tizen::Ui::Controls::SearchBar& source, + Dimension& size) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTextValueChanged(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + if (__pSearchBar->GetText().GetLength() != INIT_VALUE) + { + __pPresentationModel->InitializeContentList(__pSearchBar->GetText()); + } + else + { + __pPresentationModel->RemoveSearchResult(); + } + + if (__pSearchListView != null) + { + __pSearchListView->UpdateList(); + __pSearchListView->ScrollToItem(INIT_VALUE); + __pSearchListView->Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTextValueChangeCanceled(const Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnKeypadActionPerformed(Tizen::Ui::Control& source, + Tizen::Ui::KeypadAction keypadAction) +{ + AppLogDebug("ENTER"); + if (keypadAction == KEYPAD_ACTION_SEARCH) + { + __pSearchBar->HideKeypad(); + + if (__pSearchBar->GetTextLength() != INIT_VALUE) + { + __pPresentationModel->InitializeContentList(__pSearchBar->GetText()); + } + else + { + __pPresentationModel->RemoveSearchResult(); + } + if (__pSearchListView != null) + { + __pSearchListView->UpdateList(); + __pSearchListView->ScrollToItem(INIT_VALUE); + __pSearchListView->Invalidate(true); + } + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnKeypadClosed(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + if (GetFooter() != null) + { + GetFooter()->SetShowState(true); + } + + FloatRectangle clientRect = GetClientAreaBoundsF(); + FloatRectangle searchBarBounds = CoordinateSystem::AlignToDevice(FloatRectangle(__pSearchBar->GetBoundsF())); + __pSearchBar->SetContentAreaSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + __pSearchListView->SetSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + if (__pNoContentTextLabel != null) + { + __pNoContentTextLabel->SetBounds(FloatRectangle(X_GAP,(searchBarBounds.y+searchBarBounds.height),GetWidth() - (X_GAP * 2),clientRect.height - (searchBarBounds.y+searchBarBounds.height))); + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnKeypadOpened(Tizen::Ui::Control& source) +{ + AppLogDebug("ENTER"); + FloatRectangle clientRect = CoordinateSystem::AlignToDevice(GetClientAreaBoundsF()); + FloatRectangle searchBarBounds = CoordinateSystem::AlignToDevice(FloatRectangle(__pSearchBar->GetBoundsF())); + __pSearchBar->SetContentAreaSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + __pSearchListView->SetSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + + if (__pNoContentTextLabel != null) + { + __pNoContentTextLabel->SetBounds(Rectangle(X_GAP,(searchBarBounds.y+searchBarBounds.height),GetWidth() - (X_GAP * 2),clientRect.height - (searchBarBounds.y+searchBarBounds.height))); + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnKeypadWillOpen(Tizen::Ui::Control &source) +{ + AppLogDebug("ENTER"); +// GetFooter()->SetShowState(false); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnKeypadBoundsChanged(Tizen::Ui::Control& source) +{ + FloatRectangle clientRect = GetClientAreaBoundsF(); + FloatRectangle searchBarBounds = CoordinateSystem::AlignToDevice(FloatRectangle(__pSearchBar->GetBoundsF())); + __pSearchBar->SetContentAreaSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + __pSearchListView->SetSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + + if (__pNoContentTextLabel != null && __pNoContentTextLabel->GetShowState()) + { + __pNoContentTextLabel->SetBounds(Rectangle(X_GAP,(searchBarBounds.y+searchBarBounds.height),GetWidth() - (X_GAP * 2),clientRect.height - (searchBarBounds.y+searchBarBounds.height))); + } +} + +int +SearchForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + int contentCount = __pPresentationModel->GetTotalContentCount(); + + if ( __pNoContentTextLabel != null) + { + if (contentCount == 0) + { + __pNoContentTextLabel->SetShowState(true); + } + else + { + __pNoContentTextLabel->SetShowState(false); + } + } + + Invalidate(true); + AppLogDebug("EXIT"); + return contentCount; +} + +Tizen::Ui::Controls::ListItemBase* +SearchForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + int artistIndex = __pPresentationModel->GetArtistIndex(); + int albumIndex = __pPresentationModel->GetAlbumIndex(); + int songIndex = __pPresentationModel->GetSongIndex(); + + ContentInformation* pContentInfo = null; + CustomItem* pItem = new (std::nothrow) CustomItem(); + + result r = pItem->Construct(Dimension(itemWidth, H_GROUP_NAME), LIST_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + if (artistIndex == itemIndex) + { + r = CreateGroupNameTableViewItem(pItem, ResourceManager::GetString(L"IDS_MUSIC_TAB4_ARTISTS")); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return pItem; + } + else if (albumIndex == itemIndex) + { + r = CreateGroupNameTableViewItem(pItem, ResourceManager::GetString(L"IDS_MUSIC_BODY_ALBUMS")); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return pItem; + } + else if (songIndex == itemIndex) + { + r = CreateGroupNameTableViewItem(pItem, ResourceManager::GetString(L"IDS_MUSIC_HEADER_SONGS")); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return pItem; + } + else + { + delete pItem; + } + + pItem = new (std::nothrow) CustomItem(); + r = pItem->Construct(Dimension(itemWidth, __itemHeight), LIST_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + if (artistIndex != -1 && itemIndex > artistIndex) + { + bool addArtist = true; + + if(albumIndex != -1 && itemIndex > albumIndex) + { + addArtist = false; + } + + if(songIndex != -1 && albumIndex == -1 && itemIndex > songIndex) + { + addArtist = false; + } + + if(addArtist) + { + CreateSearchResultText(pItem, pContentInfo->ArtistName, SEARCH_NAME_ARTIST); + } + } + + if(albumIndex != -1 && itemIndex > albumIndex) + { + bool addAlbum = true; + if(songIndex != -1 && itemIndex > songIndex) + { + addAlbum = false; + } + + if(addAlbum) + { + CreateSearchResultText(pItem, pContentInfo->AlbumName, SEARCH_NAME_ALBUM); + CreateSubArtistNameText(pItem, pContentInfo->ArtistName); + } + } + if(songIndex != -1 && itemIndex > songIndex) + { + CreateSearchResultText(pItem, pContentInfo->TitleName, SEARCH_NAME_SONG); + } + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +void +SearchForm::CreateSearchResultText(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& searchName, const SearchName name) +{ + SearchListItem* pSearchItem = null; + String keyword = __pSearchBar->GetText(); + keyword.ToLowerCase(); + pSearchItem = new (std::nothrow) SearchListItem(keyword, searchName, __fontSize, __itemHeight, name); + + if (name == SEARCH_NAME_ALBUM) + { + pItem->AddElement(Rectangle(X_GAP_THUMBNAIL, 0, GetClientAreaBounds().width - X_GAP_THUMBNAIL, __itemHeight - 50), IDA_SEARCH_ITEM_MAIN_ELEMENT, *pSearchItem); + } + else + { + pItem->AddElement(Rectangle(X_GAP_THUMBNAIL, 0, GetClientAreaBounds().width - X_GAP_THUMBNAIL, __itemHeight - 20), IDA_SEARCH_ITEM_MAIN_ELEMENT, *pSearchItem); + pItem->SetElementTextVerticalAlignment(IDA_SEARCH_ITEM_MAIN_ELEMENT, ALIGNMENT_MIDDLE); + } + + return; +} + +void +SearchForm::CreateSubArtistNameText(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& ArtistName) +{ + Font font; + TextElement* pArtist = null; + EnrichedText* pArtistName = new (std::nothrow) EnrichedText(); + pArtistName->Construct(Dimension(GetClientAreaBounds().width - X_GAP_THUMBNAIL, 50)); + pArtistName->SetVerticalAlignment(TEXT_ALIGNMENT_MIDDLE); + pArtistName->SetHorizontalAlignment(TEXT_ALIGNMENT_LEFT); + font.Construct(FONT_STYLE_BOLD, SUB_TEXT_SIZE); + pArtist = new (std::nothrow) TextElement(); + pArtist->Construct(ArtistName); + pArtist->SetFont(font); + pArtist->SetTextColor(COLOR_SUB_TEXT); + pArtistName->Add(*pArtist); + pItem->AddElement(Rectangle(X_GAP_THUMBNAIL, __itemHeight - 50, GetClientAreaBounds().width - X_GAP_THUMBNAIL, 50), IDA_SEARCH_ITEM_SUB_ELEMENT, *pArtistName); + pItem->SetElementTextVerticalAlignment(IDA_SEARCH_ITEM_SUB_ELEMENT, ALIGNMENT_TOP); + pArtistName->RemoveAllTextElements(true); + delete pArtistName; + return; +} +bool +SearchForm::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + AppLogDebug("ENTER"); + + AppLogDebug("EXIT"); + return false; +} + +void +SearchForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +SearchForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +SearchForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView& listView, + int index, + int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + AppLogDebug("ENTER"); + if (status != LIST_ITEM_STATUS_SELECTED) + { + return; + } + + if (index == __pPresentationModel->GetArtistIndex() + || index == __pPresentationModel->GetAlbumIndex() + || index == __pPresentationModel->GetSongIndex()) + { + __pSearchBar->HideKeypad(); + Invalidate(true); + return; + } + + int albumIndex = __pPresentationModel->GetAlbumIndex(); + int songIndex = __pPresentationModel->GetSongIndex(); + + ContentInformation* pContentInfo; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (songIndex != -1 && index > songIndex) //song result + { + __pSearchBar->HideKeypad(); + pContentInfo = __pPresentationModel->GetContentInfoN(index); + ArrayList* pPath = new (std::nothrow) ArrayList(); + pPath->Construct(); + pPath->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(MUSIC))); + pData->Add(*(new (std::nothrow) Integer(0))); + pData->Add(*(pPath)); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pData); + } + else if (albumIndex != -1 && index > albumIndex)//album item + { + pContentInfo = __pPresentationModel->GetContentInfoN(index); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(IDSCN_SEARCH))); + pData->Add(*(new (std::nothrow) String(pContentInfo->AlbumName))); + pData->Add(*(new (std::nothrow) Integer(index))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALBUM_CONTENT_LIST), pData); + } + else//artist item + { + pContentInfo = __pPresentationModel->GetContentInfoN(index); + + ArrayList* pData = new (std::nothrow) ArrayList(); + pData->Construct(); + pData->Add(*(new (std::nothrow) String(IDSCN_ARTIST_LIST))); + pData->Add(*(new (std::nothrow) String(pContentInfo->ArtistName))); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ARTIST_CONTENT_LIST), pData); + } + + delete pContentInfo; + pContentInfo = null; + AppLogDebug("EXIT"); +} + + +void +SearchForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (__pSceneId == null) + { + __pSceneId = new (std::nothrow) String(previousSceneId); + } + + if (__pPresentationModel->GetTotalContentCount() == 0) + { + FloatRectangle clientBounds = GetClientAreaBoundsF(); + FloatRectangle searchBarBounds = __pSearchBar->GetBoundsF(); + if (__pNoContentTextLabel == null) + { + __pNoContentTextLabel = new (std::nothrow) Label(); + __pNoContentTextLabel->Construct(FloatRectangle(X_GAP,searchBarBounds.y+searchBarBounds.height, + GetWidth() - (X_GAP * 2),clientBounds.height - (searchBarBounds.height+searchBarBounds.y)),ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pNoContentTextLabel->SetTextConfig(SEARCH_FONT_SIZE, LABEL_TEXT_STYLE_BOLD); + AddControl(__pNoContentTextLabel); + } + else + { + __pNoContentTextLabel->SetBounds(FloatRectangle(X_GAP, (searchBarBounds.y+searchBarBounds.height),GetWidth() - (X_GAP * 2),clientBounds.height - (searchBarBounds.y+searchBarBounds.height))); + __pNoContentTextLabel->SetShowState(true); + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + + if (__pSearchBar->GetMode() != SEARCH_BAR_MODE_INPUT) + { + __pSearchBar->SetMode(SEARCH_BAR_MODE_INPUT); + } + + Invalidate(true); + return; + } + + if (__pNoContentTextLabel->GetShowState() == false) + { + Invalidate(true); + __pNoContentTextLabel->SetShowState(false); + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + + if (__pSearchBar != null) + { + __pSearchBar->HideKeypad(); + Invalidate(true); + } +// __pPresentationModel->RemoveSearchResult(); +// __pSearchTableView->UpdateTableView(); + +// if (__pSearchBar->GetKeypadAction() == true) +// { +// __pSearchBar->HideKeypad(); +// } +// +// __pSearchBar->RemoveSearchBarEventListener(*this); +// __pSearchBar->RemoveKeypadEventListener(*this); +// +// __pSearchTableView->RemoveTableViewItemEventListener(*this); +// __pSearchTableView->RemoveTouchEventListener(*this); +// __pSearchTableView->RemoveScrollEventListener(*this); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + AppLogDebug("OnActionPerformed : %d", actionId); + AppLogDebug("EXIT"); +} + +result +SearchForm::CreateGroupNameTableViewItem(Tizen::Ui::Controls::CustomItem* pItem, const Tizen::Base::String& GroupName) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + pItem->AddElement(Rectangle(10, 0, W_CLIENT_AREA, H_GROUP_NAME), IDA_GROUP_ITEM_ELEMENT, GroupName, MAIN_TEXT_SIZE, COLOR_GROUP_TEXT, COLOR_GROUP_TEXT, COLOR_GROUP_TEXT, true); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, COLOR_GROUP_NAME_BG); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED, COLOR_GROUP_NAME_BG); + pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_PRESSED, COLOR_GROUP_NAME_BG); + pItem->SetElementTextHorizontalAlignment(IDA_GROUP_ITEM_ELEMENT, ALIGNMENT_LEFT); + pItem->SetElementSelectionEnabled(IDA_GROUP_ITEM_ELEMENT, false); + AppLogDebug("EXIT"); + return r; +} + +Tizen::Base::String +SearchForm::MakeQuery(const Tizen::Base::String& WhereExpr, const Tizen::Base::String& SearchName) +{ + AppLogDebug("ENTER"); + if (WhereExpr == null || SearchName == null) + { + return String(); + } + + String strMakeQuery = WhereExpr; + + strMakeQuery.Append(L" like '%"); + strMakeQuery.Append(SearchName); + strMakeQuery.Append(L"%'"); + + AppLogDebug("MakeQuery : %ls", strMakeQuery.GetPointer()); + AppLogDebug("EXIT"); + return strMakeQuery; +} + +void +SearchForm::OnTouchDoublePressed (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchFocusIn (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchFocusOut (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchLongPressed (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchMoved (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchPressed (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnTouchReleased (const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnScrollEndReached (Tizen::Ui::Control& source, Tizen::Ui::Controls::ScrollEndEvent type) +{ + AppLogDebug( "ENTER"); + AppLogDebug( "EXIT"); +} + +void +SearchForm::OnScrollPositionChanged (Tizen::Ui::Control& source, int scrollPos) +{ + AppLogDebug( "ENTER"); + AppLogDebug( "EXIT"); +} + +void +SearchForm::OnScrollStopped (Tizen::Ui::Control& source) +{ + AppLogDebug( "ENTER"); + AppLogDebug( "EXIT"); +} + +void +SearchForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + __pPresentationModel->RemoveSearchResult(); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(__pSceneId->GetPointer(), SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY)); + AppLogDebug("EXIT"); +} + +void +SearchForm::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + if (__pSearchBar->GetText().GetLength() != INIT_VALUE) + { + __pPresentationModel->InitializeContentList(__pSearchBar->GetText()); + } + else + { + __pPresentationModel->RemoveSearchResult(); + } + + if (__pSearchListView != null) + { + __pSearchListView->UpdateList(); + __pSearchListView->ScrollToItem(INIT_VALUE); + } + AppLogDebug("EXIT"); +} + +void +SearchForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __fontSize = CommonUtil::GetFontSize(__fontSizeValue); + __pSearchListView->UpdateList(); +} + +void +SearchForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView& listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ + // Empty Implementation +} + +void +SearchForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView& listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus status) +{ + // Empty Implementation +} + +void +SearchForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + FloatRectangle clientRect = GetClientAreaBoundsF(); + __pSearchBar->SetBounds(Rectangle(0, 0, clientRect.width, H_SEARCH_BAR)); + FloatRectangle searchBarBounds = CoordinateSystem::AlignToDevice(FloatRectangle(__pSearchBar->GetBoundsF())); + __pSearchBar->SetContentAreaSize(FloatDimension(clientRect.width, clientRect.height - searchBarBounds.height)); + __pSearchListView->SetSize(FloatDimension(clientRect.width, clientRect.height - __pSearchBar->GetHeightF())); + if (__pNoContentTextLabel != null) + { + __pNoContentTextLabel->SetBounds(Rectangle(X_GAP,(searchBarBounds.y+searchBarBounds.height),GetWidth() - (X_GAP * 2),clientRect.height-(searchBarBounds.y+searchBarBounds.height))); + } + Invalidate(true); +} diff --git a/src/MpSearchListItem.cpp b/src/MpSearchListItem.cpp new file mode 100644 index 0000000..1c22992 --- /dev/null +++ b/src/MpSearchListItem.cpp @@ -0,0 +1,139 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchListItem.cpp + * @brief This is the implementation file for the SearchListItem class. + */ + +#include "MpSearchListItem.h" + +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; + +SearchListItem::SearchListItem(const Tizen::Base::String& searchKey, const Tizen::Base::String& searchName, int fontsize, int itemHeight, const SearchName name) + : __fontSize(fontsize) + , __itemHeight(itemHeight) + , __keyword(searchKey) + , __searchedText(searchName) + , __name(name) +{ +} + +SearchListItem::~SearchListItem(void) +{ +} + +Tizen::Graphics::EnrichedText* +SearchListItem::GetDisplayEnrichedTextN(const Tizen::Graphics::Rectangle& rect, Tizen::Ui::Controls::ListItemDrawingStatus itemStatus, bool isSearchingTextVisible) +{ + EnrichedText* pEnrichedText = null; + Font font; + String originalText; + Color textColor; + Color searchedTextColor; + String firstSubString, secondSubString, thirdSubString; + int index = -1; + __searchedText.ToLowerCase(originalText); + result r = originalText.IndexOf(__keyword, 0, index); + if (r == E_SUCCESS) + { + __searchedText.SubString(0, index, firstSubString); + __searchedText.SubString(index, __keyword.GetLength(), secondSubString); + __searchedText.SubString(__keyword.GetLength()+index, __searchedText.GetLength()-(firstSubString.GetLength()+secondSubString.GetLength()), thirdSubString); + } + + pEnrichedText = new (std::nothrow) EnrichedText(); + pEnrichedText->Construct(Dimension(rect.width - X_GAP_THUMBNAIL, rect.height)); + pEnrichedText->SetVerticalAlignment(TEXT_ALIGNMENT_MIDDLE); + pEnrichedText->SetHorizontalAlignment(TEXT_ALIGNMENT_LEFT); + pEnrichedText->SetTextWrapStyle(TEXT_WRAP_NONE); + pEnrichedText->SetTextAbbreviationEnabled(true); + font.Construct(FONT_STYLE_PLAIN, __fontSize - 8); + + if (itemStatus == LIST_ITEM_DRAWING_STATUS_NORMAL) + { + textColor = COLOR_MAIN_TEXT; + searchedTextColor = COLOR_SEARCH_TEXT; + } + else if (itemStatus == LIST_ITEM_DRAWING_STATUS_PRESSED || itemStatus == LIST_ITEM_DRAWING_STATUS_HIGHLIGHTED) + { + textColor = COLOR_MAIN_TEXT;//Color::GetColor(COLOR_ID_WHITE); + searchedTextColor = Color::GetColor(COLOR_ID_WHITE);; + } + if (firstSubString.GetLength() > 0) + { + TextElement* first = new (std::nothrow) TextElement(); + first->Construct(firstSubString); + first->SetFont(font); + first->SetTextColor(textColor); + pEnrichedText->Add(*first); + } + if (secondSubString.GetLength() > 0) + { + TextElement* second = new (std::nothrow) TextElement(); + second->Construct(secondSubString); + second->SetFont(font); + second->SetTextColor(searchedTextColor); + pEnrichedText->Add(*second); + } + if (thirdSubString.GetLength() > 0) + { + TextElement* third = new (std::nothrow) TextElement(); + third->Construct(thirdSubString); + third->SetFont(font); + third->SetTextColor(textColor); + pEnrichedText->Add(*third); + } + + return pEnrichedText; +} + +bool +SearchListItem::OnDraw(Tizen::Graphics::Canvas& canvas, const Tizen::Graphics::Rectangle& rect, Tizen::Ui::Controls::ListItemDrawingStatus itemStatus) +{ + result r = E_SUCCESS; + bool ret = true; + EnrichedText* pEnrichedText = null; + Rectangle enrichedTextBounds = rect; + Font font; + + font.Construct(FONT_STYLE_PLAIN , __fontSize - 8); + canvas.SetFont(font); + + if (__name == SEARCH_NAME_ALBUM) + { + enrichedTextBounds.height = __itemHeight - 50; + } + else + { + enrichedTextBounds.height = __itemHeight - 20; + } + + pEnrichedText = GetDisplayEnrichedTextN(enrichedTextBounds, itemStatus); + r = canvas.DrawText(Point(rect.x, rect.y), *pEnrichedText); + TryCatch(r == E_SUCCESS, ret = false, "Unable to draw text."); + +CATCH: + if (pEnrichedText != null) + { + pEnrichedText->RemoveAllTextElements(true); + delete pEnrichedText; + } + + return ret; +} diff --git a/src/MpSearchPresentationModel.cpp b/src/MpSearchPresentationModel.cpp new file mode 100644 index 0000000..a40217a --- /dev/null +++ b/src/MpSearchPresentationModel.cpp @@ -0,0 +1,302 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSearchPresentationModel.cpp + * @brief This is the implementation file for SearchPresentationModel class. + */ + +#include "MpSearchPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +static const wchar_t* QUERY_PREFIX = L" like '%"; +static const wchar_t* QUERY_SUFFIX = L"%'"; + +SearchPresentationModel* SearchPresentationModel::pSearchPresentationModelInstance = null; + +SearchPresentationModel::SearchPresentationModel(void) + : __pSearchList(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SearchPresentationModel::~SearchPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +SearchPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + AppLogDebug("EXIT"); + return r; +} + +SearchPresentationModel* +SearchPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pSearchPresentationModelInstance == null) + { + pSearchPresentationModelInstance = new (std::nothrow) SearchPresentationModel(); + TryReturn(pSearchPresentationModelInstance != null, null, "SearchPresentationModel instance is not created."); + + result r = pSearchPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "SearchPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pSearchPresentationModelInstance; + +CATCH: + delete pSearchPresentationModelInstance; + return null; +} + +int +SearchPresentationModel::GetAlbumIndex(void) +{ + AppLogDebug("ENTER"); + int index = -1; + if (__pSearchList == null) + { + return index; + } + __pSearchList->IndexOf(STRING_SORT_ALBUM, index); + + AppLogDebug("EXIT"); + return index; +} + +int +SearchPresentationModel::GetArtistIndex(void) +{ + AppLogDebug("ENTER"); + int index = -1; + if (__pSearchList == null) + { + return index; + } + __pSearchList->IndexOf(STRING_SORT_ARTIST, index); + + AppLogDebug("EXIT"); + return index; +} + +int +SearchPresentationModel::GetSongIndex(void) +{ + AppLogDebug("ENTER"); + int index = -1; + if (__pSearchList == null) + { + return index; + } + __pSearchList->IndexOf(STRING_SORT_TITLE, index); + + AppLogDebug("EXIT"); + return index; +} + +int +SearchPresentationModel::GetTotalContentCount(void) +{ + AppLogDebug("ENTER"); + if (__pSearchList == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pSearchList->GetCount(); +} + +void +SearchPresentationModel::RemoveSearchResult(void) +{ + AppLogDebug("ENTER"); + if (__pSearchList != null) + { + __pSearchList->RemoveAll(true); + } + AppLogDebug("EXIT"); +} + +void +SearchPresentationModel::InitializeContentList(const Tizen::Base::String& keyword) +{ + AppLogDebug("ENTER"); + if (__pSearchList != null) + { + __pSearchList->RemoveAll(true); + delete __pSearchList; + __pSearchList = null; + } + + IList* pArtistSearch = CommonUtil::SearchContentList(MakeQuery(STRING_SORT_ARTIST, keyword), STRING_SORT_ARTIST); + IList* pAlbumSearch = CommonUtil::SearchContentList(MakeQuery(STRING_SORT_ALBUM, keyword), STRING_SORT_ALBUM); + IList* pSongSearch = CommonUtil::SearchContentList(MakeQuery(STRING_SORT_TITLE, keyword), STRING_SORT_TITLE); + + if (pArtistSearch != null && pArtistSearch->GetCount() != 0) + { + RemoveDuplicateEntries(*pArtistSearch); + pArtistSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_ARTIST)), 0); + __pSearchList = pArtistSearch; + + if (pAlbumSearch != null && pAlbumSearch->GetCount() != 0) + { + RemoveDuplicateEntries(*pAlbumSearch, false); + pAlbumSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_ALBUM)), 0); + __pSearchList->AddItems(*pAlbumSearch); + } + + if (pSongSearch != null && pSongSearch->GetCount() != 0) + { + pSongSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_TITLE)), 0); + __pSearchList->AddItems(*pSongSearch); + } + } + else if (pAlbumSearch != null && pAlbumSearch->GetCount() != 0) + { + RemoveDuplicateEntries(*pAlbumSearch, false); + pAlbumSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_ALBUM)), 0); + __pSearchList = pAlbumSearch; + + if (pSongSearch != null && pSongSearch->GetCount() != 0) + { + pSongSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_TITLE)), 0); + __pSearchList->AddItems(*pSongSearch); + } + } + else if (pSongSearch != null && pSongSearch->GetCount() != 0) + { + pSongSearch->InsertAt(*(new (std::nothrow) String(STRING_SORT_TITLE)), 0); + __pSearchList = pSongSearch; + } + else + { + __pSearchList = null; + } + AppLogDebug("EXIT"); +} + +void +SearchPresentationModel::Release(void) +{ + AppLogDebug("ENTER"); + if (pSearchPresentationModelInstance != null) + { + delete pSearchPresentationModelInstance; + pSearchPresentationModelInstance = null; + } + AppLogDebug("EXIT"); +} + +ContentInformation* +SearchPresentationModel::GetContentInfoN(int index) +{ + AppLogDebug("ENTER"); + if (__pSearchList == null || index < INIT_VALUE) + { + AppLogDebug("EXIT(index(%d) MUST be greater than or equal to 0 OR __pSearchList is null)", index); + return null; + } + + ContentInformation* pContentInfoStruct = null; + ContentSearchResult* pResult = static_cast(__pSearchList->GetAt(index)); + if (pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + AudioContentInfo* pAudioContentInfo = static_cast(pResult->GetContentInfo()); + pContentInfoStruct = CommonUtil::GetContentInformationN(*pAudioContentInfo); + } + + AppLogDebug("EXIT"); + return pContentInfoStruct; +} + +Tizen::Base::String +SearchPresentationModel::MakeQuery(const Tizen::Base::String& WhereExpr, const Tizen::Base::String& keyword) +{ + AppLogDebug("ENTER"); + if (WhereExpr == null || keyword == null) + { + return String(); + } + + String strMakeQuery = WhereExpr; + strMakeQuery.Append(QUERY_PREFIX); + strMakeQuery.Append(CommonUtil::SpecialReplaceChange(keyword)); + strMakeQuery.Append(QUERY_SUFFIX); + + AppLogDebug("EXIT"); + return strMakeQuery; +} + +void +SearchPresentationModel::RemoveDuplicateEntries(Tizen::Base::Collection::IList& contentList, const bool isArtist) +{ + if (contentList.GetCount()) + { + ArrayList* pList = new (std::nothrow) ArrayList(); + pList->Construct(); + + for (int count = 0; count < contentList.GetCount(); count++) + { + ContentSearchResult* pSearchResult = static_cast(contentList.GetAt(count)); + bool foundContent = false; + + for (int copiedCount = 0; copiedCount < pList->GetCount(); copiedCount++) + { + ContentSearchResult* pTempSearchResult = static_cast(pList->GetAt(copiedCount)); + if (pTempSearchResult) + { + + if (isArtist && (static_cast(pTempSearchResult->GetContentInfo())->GetArtist().CompareTo(static_cast(pSearchResult->GetContentInfo())->GetArtist()) == 0)) + { + foundContent = true; + break; + } + else if (!isArtist && (static_cast(pTempSearchResult->GetContentInfo())->GetAlbumName().CompareTo(static_cast(pSearchResult->GetContentInfo())->GetAlbumName()) == 0)) + { + foundContent = true; + break; + } + } + } + if (!foundContent) + { + pList->Add(pSearchResult); + } + else + { + delete pSearchResult; + } + } + + contentList.RemoveAll(false); + contentList.AddItems(*pList); + delete pList; + } +} diff --git a/src/MpSetAsPopup.cpp b/src/MpSetAsPopup.cpp new file mode 100644 index 0000000..785f9c7 --- /dev/null +++ b/src/MpSetAsPopup.cpp @@ -0,0 +1,498 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSetAsPopup.cpp + * @brief This is the implementation file for SetAsPopup class. + */ + +#include +#include +#include +#include +#include +#include "MpMusicPlayerApp.h" +#include "MpResourceManager.h" +#include "MpSetAsPopup.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +enum SetAsId +{ + SET_AS_CALL_RINGTONE = 0, + SET_AS_CALLER_RINGTONE, + SET_AS_END +}; + +SetAsPopup::SetAsPopup(void) + : __pSetAsItemTableView(null) + , __pCancelButton(null) + , __pControl(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SetAsPopup::~SetAsPopup(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +SetAsPopup::Initialize(Tizen::Ui::Control* pControl) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + r = Construct(IDL_SET_AS_POPUP); + TryCatch(r == E_SUCCESS, r = E_OUT_OF_MEMORY, "Unable to construct popup.\n"); + SetTitleText(ResourceManager::GetString("IDS_COM_SK_SET_AS")); + AddTouchEventListener(*this); + SetPropagatedKeyEventListener(this); + __pSetAsItemTableView = static_cast(GetControl(IDC_TABLEVIEW)); + TryCatch(__pSetAsItemTableView != null, r = E_OUT_OF_MEMORY, "Unable to construct table view.\n"); + __pSetAsItemTableView->AddTableViewItemEventListener(*this); + __pSetAsItemTableView->SetItemProvider(this); + + __pCancelButton = static_cast(GetControl(IDC_CANCEL_BUTTON)); + TryCatch(__pCancelButton != null, r = E_OUT_OF_MEMORY, "Unable to construct cancel button.\n"); + __pCancelButton->SetActionId(IDA_BUTTON_CANCEL); + __pCancelButton->AddActionEventListener(*this); + + __pControl = pControl; + + AppLogDebug("EXIT"); + return r; + +CATCH: + //AppLogException("[%ls]", GetErrorMessage(r)); + if (__pCancelButton != null) + { + delete __pCancelButton; + __pCancelButton = null; + } + if ( __pSetAsItemTableView != null) + { + delete __pSetAsItemTableView; + __pSetAsItemTableView = null; + } + return r; +} + +void +SetAsPopup::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + if (actionId == IDA_BUTTON_CANCEL) + { + SetShowState(false); + Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (GetShowState() + && (currentPosition.x < 0 + || currentPosition.y < 0 + || this->GetBounds().width + || this->GetBounds().height)) + { +// SetShowState(false); +// Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +SetAsPopup::OnKeyPressed(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (KEY_BACK == keyEventInfo.GetKeyCode() || KEY_ESC == keyEventInfo.GetKeyCode()) + { + return true; + } + AppLogDebug("EXIT"); + return false; +} + +bool +SetAsPopup::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (KEY_BACK == keyEventInfo.GetKeyCode() || KEY_ESC == keyEventInfo.GetKeyCode()) + { + SetShowState(false); + Show(); + return true; + } + + AppLogDebug("EXIT"); + return false; + +} + +int +SetAsPopup::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return SET_AS_END; +} + +Tizen::Ui::Controls::TableViewItem* +SetAsPopup::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + + result r = pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + if (itemIndex < SET_AS_END) + { + String labelName = L""; + switch (itemIndex) + { + case SET_AS_CALL_RINGTONE: + { + labelName = ResourceManager::GetString(L"IDS_MUSIC_OPT_CALL_RINGTONE"); + } + break; + + case SET_AS_CALLER_RINGTONE: + { + labelName = ResourceManager::GetString(L"IDS_MUSIC_OPT_SETAS_CALLER_RINGTONE"); + } + break; + + default: + break; + } + + r = CreateTableViewItem(*pItem, labelName); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + } + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + return null; +} + +bool +SetAsPopup::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +SetAsPopup::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +SetAsPopup::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +SetAsPopup::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + if (itemIndex == 0) + { + result r = Tizen::System::SettingInfo::SetValue(CALL_RINGTONE_KEY, *__pCurrentContentPath); + if (r == E_SUCCESS) + { + SetShowState(false); + Invalidate(true); + + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + 3000); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + } + else + { + AppControl* pAppControl = AppManager::FindAppControlN(PROVIDER_ID_CONTACT, OPERATION_ID_SOCIAL_PICK); + if (pAppControl == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SELECTION_MODE), new (std::nothrow) String(APPCONTROL_OPTION_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_ITEM_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_PERSON)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SOCIAL_RESULT_TYPE), new (std::nothrow) String(APPCONTROL_OPTION_ITEM_ID)); + +// Tizen::Base::Collection::ArrayList* pData = new (std::nothrow) Tizen::Base::Collection::ArrayList(); +// pData->Construct(); +// pData->Add(*(new (std::nothrow) String(SELECTION_MODE))); +// pData->Add(*(new (std::nothrow) String(RETURN_TYPE))); + + r = pAppControl->Start(null, null, pDataList, this); + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + SetShowState(false); + Invalidate(true); + + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + delete pAppControl; + } + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SetAsPopup::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +SetAsPopup::CreateTableViewItem(Tizen::Ui::Container& parent, + Tizen::Base::String& labelName) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Label* pStrLabel = new (std::nothrow) Label(); + if (pStrLabel == null) + { + return E_INIT_FAILED; + } + + r = pStrLabel->Construct(Rectangle(0, 0, POPUP_ITEM_WIDTH, ITEM_HEIGHT), L""); + if (r != E_SUCCESS) + { + return E_INIT_FAILED; + } + + pStrLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pStrLabel->SetTextConfig(32, LABEL_TEXT_STYLE_NORMAL); + pStrLabel->SetText(labelName); + + parent.AddControl(pStrLabel); + + AppLogDebug("EXIT"); + return r; +} + +void +SetAsPopup::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("End"); + return; + } + + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(PROVIDER_ID_CONTACT))/* && operationId.Equals(String(OPERATION_ID_PICK))*/) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + + int contactId = -1; + String* pKey = null; + ArrayList* pArrayListValue = null; + String* pResultString = null; + result r = E_SUCCESS; + if (pExtraData != null) + { + IMapEnumerator* pEnum = pExtraData->GetMapEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + pKey = static_cast(pEnum->GetKey()); + if (pKey->Equals(APPCONTROL_KEY_SOCIAL_ITEM_ID, true)) + { + pArrayListValue = static_cast(pEnum->GetValue()); + } + } + delete pEnum; + + if (pArrayListValue != null && pArrayListValue->GetCount() > 0) + { + for (int iCount = 0; iCount < pArrayListValue->GetCount(); iCount++) + { + pResultString = static_cast(pArrayListValue->GetAt(iCount)); + AppLogDebug("extraData : %ls:%ls total contacts %d", pKey->GetPointer(), pResultString->GetPointer(),pArrayListValue->GetCount()); + Integer::Parse(*pResultString, contactId); + pResultString->Clear(); + if (contactId < 0) + { + AppLogDebug("pKey is invaild"); + break; + } + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, *__pCurrentContentPath); + r = pAddressbook->UpdateContact(*pContact); + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + + } + + else + { + AppLogDebug("pExtraData is null"); + return; + } + + if (r == E_SUCCESS) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + if (pSceneManager != null) + { + pSceneManager->GetCurrentScene()->GetForm()->SendUserEvent(ID_SHOW_SUCCESS_MESSAGE,null); + } + } + + } + } + AppLogDebug("EXIT"); +} + +void +SetAsPopup::SetCurrentContentPath(Tizen::Base::String* contentPath) +{ + AppLogDebug("ENTER"); + __pCurrentContentPath = contentPath; + AppLogDebug("EXIT"); +} diff --git a/src/MpSettingForm.cpp b/src/MpSettingForm.cpp new file mode 100644 index 0000000..0f846ad --- /dev/null +++ b/src/MpSettingForm.cpp @@ -0,0 +1,769 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSettingForm.cpp + * @brief This is the implementation file for SettingForm class. + */ + +#include +#include +#include +#include +#include "MpAllListPresentationModel.h" +#include "MpNowPlayContentPanel.h" +#include "MpSceneRegister.h" +#include "MpSettingForm.h" +#include "MpSettingPresentationModel.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int SETTING_ITEM_HEIGHT = 115; + +static const int ID_MAIN_DEFAULT_PLAYLIST_ITEM = 1; +static const int ID_SUB_MOST_PLAYED_ITEM = 0; +static const int ID_SUB_RECENTLY_PLAYED_ITEM = 1; +static const int ID_SUB_RECENTLY_ADD_ITEM = 2; + +static const int ID_MAIN_AUTO_OFF_ITEM = 0; +static const int ID_SUB_ZERO_ITEM = 0; +static const int ID_SUB_FIFTEEN_ITEM = 1; +static const int ID_SUB_THIRTY_ITEM = 2; +static const int ID_SUB_ONE_HOUR_ITEM = 3; +static const int ID_SUB_ONE_HOUR_THIRTY_ITEM = 4; +static const int ID_SUB_TWO_HOURS_ITEM = 5; + +static const int ID_MAIN_DEFAULT_PLAYLIST_ITEM_COUNT = 3; +static const int ID_MAIN_AUTO_OFF_ITEM_COUNT = 6; +static const unsigned int COLOR_SUB_TEXT_SETTINGS = Color32<42, 137, 194>::Value; + +SettingForm::SettingForm(void) + : __pSettingPresentationModel(null) + , __pSettingTableView(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SettingForm::~SettingForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::Initialize(void) +{ + AppLogDebug("ENTER"); + Construct(IDL_SETTING_FORM); + AppLogDebug("EXIT"); +} + +result +SettingForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + SetFormBackEventListener(this); + + __pSettingTableView = static_cast(GetControl(IDC_GROUPEDTABLEVIEW_CONTENT_LIST)); + __pSettingTableView->SetItemProvider(this); + __pSettingTableView->AddGroupedTableViewItemEventListener(*this); + + __pSettingPresentationModel = SettingPresentationModel::GetInstance(); +// __pSettingPresentationModel->InitializeSettingValue(); + __pPresentationModel = AllListPresentationModel::GetInstance(); + __pSettingTableView->UpdateTableView(); + __pSettingTableView->CollapseAllGroup(); +// for (int itemIndex = 0; itemIndex < ID_MAIN_DEFAULT_PLAYLIST_ITEM_COUNT; itemIndex++) +// { +// __pSettingTableView->SetItemChecked(0, itemIndex, __pSettingPresentationModel->IsTabEnable(itemIndex)); +// } + __pSettingTableView->SetItemChecked(ID_MAIN_AUTO_OFF_ITEM, __pSettingPresentationModel->GetAutoOffTime(), true); + + Invalidate(true); + AppLogDebug("EXIT"); + return r; +} + +result +SettingForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + /*Frame* pFrame = Application::GetInstance()->GetAppFrame()->GetFrame(); + Form* pForm = static_cast(pFrame->GetControl(CONTENT_FORM_REQUSEST_ID)); + if (pForm != null) + { + AppLogDebug("AForm"); + pForm->SendUserEvent(0, null); + }*/ +// __pSettingPresentationModel->DestroySettingPresentationModel(); + + AppLogDebug("EXIT"); + return r; +} + +int +SettingForm::GetGroupCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return 1; +} + +int +SettingForm::GetItemCount(int groupIndex) +{ + AppLogDebug("ENTER"); + int itemCount = 0; + + switch (groupIndex) + { + case ID_MAIN_DEFAULT_PLAYLIST_ITEM: + { + itemCount = ID_MAIN_DEFAULT_PLAYLIST_ITEM_COUNT; + } + break; + + case ID_MAIN_AUTO_OFF_ITEM: + { + itemCount = ID_MAIN_AUTO_OFF_ITEM_COUNT; + } + break; + + default: + break; + } + AppLogDebug("EXIT"); + return itemCount; +} + +TableViewGroupItem* +SettingForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + AppLogDebug("ENTER %d", groupIndex); + RelativeLayout layout; + layout.Construct(); + + TableViewGroupItem* pItem = new (std::nothrow) TableViewGroupItem(); + pItem->Construct(layout, Dimension(itemWidth, SETTING_ITEM_HEIGHT)); + Panel* pGroupTableViewItem = new (std::nothrow) Panel(); + switch (groupIndex) + { + case ID_MAIN_DEFAULT_PLAYLIST_ITEM: + { + if (IsFailed(pGroupTableViewItem->Construct(IDL_SETTING_PLAYLIST_SET_ITEM_PANEL))) + { + AppLogDebug("Construct(IDL_SETTING_PLAYLIST_SET_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + delete pGroupTableViewItem; + delete pItem; + return null; + } + } + break; + + case ID_MAIN_AUTO_OFF_ITEM: + { + Label* pSubTextLabel = null; + Label* pMainTextLabel = null; + + if (IsFailed(pGroupTableViewItem->Construct(IDL_SETTING_OFF_SET_ITEM_PANEL))) + { + AppLogDebug("Construct(IDL_SETTING_PLAYLIST_SET_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + delete pGroupTableViewItem; + delete pItem; + return null; + } + + pSubTextLabel = static_cast(pGroupTableViewItem->GetControl(IDC_LABEL_SUB_TEXT)); + pSubTextLabel->SetText(GetAutoOffString()); + pSubTextLabel->AddTouchEventListener(*this); + pMainTextLabel = static_cast(pGroupTableViewItem->GetControl(IDC_LABEL_MAIN_TEXT)); + pMainTextLabel->AddTouchEventListener(*this); + static_cast(pGroupTableViewItem->GetControl(IDC_LABEL_EX))->AddTouchEventListener(*this); + pItem->AddKeyEventListener(*this); + pItem->AddFocusEventListener(*this); + } + break; + + default: + break; + } + + pItem->AddControl(pGroupTableViewItem); + pItem->SetIndividualSelectionEnabled(pGroupTableViewItem, true); + CommonUtil::SetLayoutFitToContainer(*pItem, *pGroupTableViewItem); + + AppLogDebug("EXIT"); + return pItem; +} + +bool +SettingForm::DeleteGroupItem(int groupIndex, TableViewGroupItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +TableViewItem* +SettingForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + Panel* pGroupTableViewItem = new (std::nothrow) Panel(); + + result r = pGroupTableViewItem->Construct(IDL_GROUPEDTABLEVIEW_ITEM_PANEL); + TryCatch(r == E_SUCCESS, delete pItem, "pGroupTableViewItem->Construct(%s)", GetErrorMessage(r)); + + if (groupIndex == ID_MAIN_DEFAULT_PLAYLIST_ITEM) + { + r = pItem->Construct(layout, Dimension(W_CLIENT_AREA, SETTING_ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + Label* pMainText = static_cast(pGroupTableViewItem->GetControl(IDC_LABEL_MAIN_TEXT)); + + switch (itemIndex) + { + case ID_SUB_MOST_PLAYED_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_MOST_PLAYED")); + } + break; + + case ID_SUB_RECENTLY_PLAYED_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_PLAYLIST_RECENTLY_PLAYED")); + } + break; + + case ID_SUB_RECENTLY_ADD_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_RECENTLY_ADDED")); + } + break; + + default: + break; + } + } + else + { + r = pItem->Construct(layout, Dimension(W_CLIENT_AREA, SETTING_ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_RADIO); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + + Label* pMainText = static_cast(pGroupTableViewItem->GetControl(IDC_LABEL_MAIN_TEXT)); + + switch (itemIndex) + { + case ID_SUB_ZERO_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_NOT_USED")); + } + break; + + case ID_SUB_FIFTEEN_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_OPT_AFTER_15_MIN_ABB")); + } + break; + + case ID_SUB_THIRTY_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_30_MIN")); + } + break; + + case ID_SUB_ONE_HOUR_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_1_HOUR")); + } + break; + + case ID_SUB_ONE_HOUR_THIRTY_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_POP_AFTER_1_HOUR_30_MIN")); + } + break; + + case ID_SUB_TWO_HOURS_ITEM: + { + pMainText->SetText(ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_2_HOURS")); + } + break; + + default: + break; + } + } + + pItem->AddControl(pGroupTableViewItem); + pItem->SetIndividualSelectionEnabled(pGroupTableViewItem, true); + CommonUtil::SetLayoutFitToContainer(*pItem, *pGroupTableViewItem); + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pGroupTableViewItem; + return null; +} + +void +SettingForm::UpdateItem(int groupIndex, int itemIndex, TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::UpdateGroupItem(int groupIndex, TableViewGroupItem* pItem) +{ + AppLogDebug("ENTER"); + if (groupIndex == ID_MAIN_AUTO_OFF_ITEM) + { + Label* pLabelSubtext = static_cast(pItem->GetControl(IDC_LABEL_SUB_TEXT, true)); + pLabelSubtext->SetText(GetAutoOffString()); + pLabelSubtext->Invalidate(false); + } + __pSettingTableView->Invalidate(true); + AppLogDebug("EXIT"); +} + +int +SettingForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return SETTING_ITEM_HEIGHT; +} + +int +SettingForm::GetDefaultGroupItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return SETTING_ITEM_HEIGHT; +} + +bool +SettingForm::DeleteItem(int groupIndex, int itemIndex, TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +SettingForm::OnGroupedTableViewGroupItemStateChanged(GroupedTableView& tableView, int groupIndex, TableViewGroupItem* pItem, TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (tableView.IsGroupExpanded(groupIndex) == true) + { + Label* pLabel = static_cast(pItem->GetControl(IDC_LABEL_EX, true)); + Bitmap* pBitmap = ResourceManager::GetBitmapN(L"00_button_expand_closed.png"); + pLabel->SetBackgroundBitmap(*pBitmap); + pLabel->Invalidate(false); + delete pBitmap; + + if (groupIndex == ID_MAIN_AUTO_OFF_ITEM) + { + Label* pLabelSubtext = static_cast(pItem->GetControl(IDC_LABEL_SUB_TEXT, true)); + pLabelSubtext->SetText(GetAutoOffString()); + pLabelSubtext->Invalidate(false); + } + + AppLogDebug("CollapseGroup %d",groupIndex); + tableView.CollapseGroup(groupIndex); + } + else + { + Label* pLabel = static_cast(pItem->GetControl(IDC_LABEL_EX, true)); + Bitmap* pBitmap = ResourceManager::GetBitmapN(L"00_button_expand_opened.png"); + pLabel->SetBackgroundBitmap(*pBitmap); + pLabel->Invalidate(false); + delete pBitmap; + + AppLogDebug("ExpandGroup %d",groupIndex); + tableView.ExpandGroup(groupIndex); + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnGroupedTableViewItemStateChanged(GroupedTableView& tableView, int groupIndex, int itemIndex, TableViewItem* pItem, TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + bool isChecked = false; + switch (groupIndex) + { + case ID_MAIN_DEFAULT_PLAYLIST_ITEM: + { + if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + isChecked = true; + } + __pSettingPresentationModel->SetTabEnable(itemIndex, isChecked); + Frame* pFrame = Application::GetInstance()->GetAppFrame()->GetFrame(); + Form* pForm = static_cast(pFrame->GetControl(CONTENT_FORM_REQUSEST_ID)); + if (pForm != null) + { + AppLogDebug("AForm"); + pForm->SendUserEvent(0, null); + } + } + break; + + case ID_MAIN_AUTO_OFF_ITEM: + { + int timerInterval = 0; + result r = E_SUCCESS; + timerInterval = __pSettingPresentationModel->SetAutoOffTime(itemIndex); + r = GetLastResult(); + for (int i = 0; i < __pSettingTableView->GetItemCountAt(ID_MAIN_AUTO_OFF_ITEM); i++) + { + if (i == itemIndex) + { + AppLogDebug("true : %d", i); + __pSettingTableView->SetItemChecked(groupIndex, i, true); + } + else + { + AppLogDebug("false : %d", i); + __pSettingTableView->SetItemChecked(groupIndex, i, false); + } + } + + if (r == E_STORAGE_FULL) + { + int messageResult = 0; + MessageBox messageBox; + __pSettingTableView->SetItemChecked(groupIndex, itemIndex, false); + __pSettingTableView->SetItemChecked(groupIndex, __pSettingPresentationModel->GetAutoOffTime(), true); + messageBox.Construct(L"",IDS_STORAGE_FULL,MSGBOX_STYLE_NONE,COUNT_MESSAGE_BOX_TIMEOUT); + messageBox.ShowAndWait(messageResult); + App::GetInstance()->Terminate(); + return; + } + + if (timerInterval >= 0) + { + __pPresentationModel->StartAutoOffTimer(timerInterval); + tableView.RefreshItem(groupIndex, -1, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + } + else + { + //show message of IDS_UNABLE_TO_CHANGE_SETTINGS + __pSettingTableView->SetItemChecked(groupIndex, itemIndex, false); + __pSettingTableView->SetItemChecked(groupIndex, __pSettingPresentationModel->GetAutoOffTime(), true); + int messgeResult = 0; + MessageBox messageBox; +// messageBox.Construct(L"Error", ResourceManager::GetString(L"IDS_UNABLE_TO_CHANGE_SETTINGS"), MSGBOX_STYLE_NONE,3000); + messageBox.Construct(L"Error", L"Unable to change the setting.", MSGBOX_STYLE_NONE,3000); + messageBox.ShowAndWait(messgeResult); + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnGroupedTableViewContextItemActivationStateChanged(GroupedTableView& tableView, int groupIndex, int itemIndex, TableViewContextItem* pContextItem, bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::OnFocusGained(const Control& source) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::OnFocusLost(const Control& source) +{ + AppLogDebug("ENTER"); + const TableViewGroupItem* pSourcePanel = dynamic_cast(&source); + + if (pSourcePanel != null) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + + if (pLabel) + { + pLabel->SetTextColor(COLOR_SUB_TEXT_SETTINGS); + pLabel->Invalidate(false); + } + } + + AppLogDebug("EXIT"); +} + +void +SettingForm::OnKeyLongPressed(const Control& source, KeyCode keyCode) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::OnKeyPressed(const Control& source, KeyCode keyCode) +{ + AppLogDebug("ENTER %ls", source.GetName().GetPointer()); + if(keyCode == KEY_ENTER) + { + const TableViewGroupItem* pSourcePanel = dynamic_cast(&source); + + if (pSourcePanel != null) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + + if (pLabel) + { + pLabel->SetTextColor(Color::GetColor(COLOR_ID_WHITE)); + pLabel->Invalidate(false); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnKeyReleased(const Control& source, KeyCode keyCode) +{ + AppLogDebug("ENTER %ls", source.GetName().GetPointer()); + if (keyCode == KEY_ENTER) + { + const TableViewGroupItem* pSourcePanel = dynamic_cast(&source); + + if (pSourcePanel != null) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + + if (pLabel) + { + pLabel->SetTextColor(COLOR_SUB_TEXT_SETTINGS); + pLabel->Invalidate(false); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnTouchCanceled(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER %ls",source.GetName().GetPointer()); + if (source.GetName().Equals(IDC_LABEL_SUB_TEXT,true) + || source.GetName().Equals(IDC_LABEL_MAIN_TEXT,true) + || source.GetName().Equals(IDC_LABEL_EX,true)) + { + Panel* pSourcePanel = dynamic_cast(source.GetParent()); + if (pSourcePanel) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + if (pLabel) + { + pLabel->SetTextColor(COLOR_SUB_TEXT_SETTINGS); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnTouchMoved(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER %ls",source.GetName().GetPointer()); + if (source.GetName().Equals(IDC_LABEL_SUB_TEXT,true) + || source.GetName().Equals(IDC_LABEL_MAIN_TEXT,true) + || source.GetName().Equals(IDC_LABEL_EX,true)) + { + Panel* pSourcePanel = dynamic_cast(source.GetParent()); + if (pSourcePanel) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + if (pLabel) + { + pLabel->SetTextColor(COLOR_SUB_TEXT_SETTINGS); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnTouchPressed(const Control& source, const Point& currentPosition, const TouchEventInfo & touchInfo) +{ + AppLogDebug("ENTER %ls", source.GetName().GetPointer()); + if (source.GetName().Equals(IDC_LABEL_SUB_TEXT,true) + || source.GetName().Equals(IDC_LABEL_MAIN_TEXT,true) + || source.GetName().Equals(IDC_LABEL_EX,true)) + { + Panel* pSourcePanel = dynamic_cast(source.GetParent()); + if (pSourcePanel) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + if (pLabel) + { + pLabel->SetTextColor(Color::GetColor(COLOR_ID_WHITE)); +// pLabel->Invalidate(false); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnTouchReleased(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER %ls",source.GetName().GetPointer()); + if (source.GetName().Equals(IDC_LABEL_SUB_TEXT,true) + || source.GetName().Equals(IDC_LABEL_MAIN_TEXT,true) + || source.GetName().Equals(IDC_LABEL_EX,true)) + { + Panel* pSourcePanel = dynamic_cast(source.GetParent()); + if (pSourcePanel) + { + Label* pLabel = static_cast(pSourcePanel->GetControl(IDC_LABEL_SUB_TEXT,true)); + if (pLabel) + { + pLabel->SetTextColor(COLOR_SUB_TEXT_SETTINGS); +// pLabel->Invalidate(false); + } + } + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnActionPerformed(const Control& source, int actionId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingForm::OnFormBackRequested(Form& source) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + result r = pSceneManager->GoBackward(BackwardSceneTransition()); + if (r != E_SUCCESS) + { + __pSettingPresentationModel->DestroySettingPresentationModel(); + UiApp* pApp = UiApp::GetInstance(); + pApp->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnSceneActivatedN(const SceneId& previousSceneId, + const SceneId& currentSceneId, + IList* pArgs) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + CommonUtil::SetSimpleTitleStyle(*GetHeader(), ResourceManager::GetString(L"IDS_MUSIC_BODY_MUSIC_SETTINGS")); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +SettingForm::OnSceneDeactivated(const SceneId& currentSceneId, + const SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +String +SettingForm::GetAutoOffString(void) +{ + AppLogDebug("ENTER"); + switch (__pSettingPresentationModel->GetAutoOffTime()) + { + case ID_SUB_ZERO_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_BODY_NOT_USED"); + } + break; + + case ID_SUB_FIFTEEN_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_OPT_AFTER_15_MIN_ABB"); + } + break; + + case ID_SUB_THIRTY_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_30_MIN"); + } + break; + + case ID_SUB_ONE_HOUR_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_1_HOUR"); + } + break; + + case ID_SUB_ONE_HOUR_THIRTY_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_POP_AFTER_1_HOUR_30_MIN"); + } + break; + + case ID_SUB_TWO_HOURS_ITEM: + { + return ResourceManager::GetString(L"IDS_MUSIC_BODY_AFTER_2_HOURS"); + } + break; + + default: + break; + } + + AppLogDebug("EXIT"); + return ResourceManager::GetString(L"IDS_MUSIC_BODY_NOT_USED"); +} diff --git a/src/MpSettingPresentationModel.cpp b/src/MpSettingPresentationModel.cpp new file mode 100644 index 0000000..ad89b87 --- /dev/null +++ b/src/MpSettingPresentationModel.cpp @@ -0,0 +1,251 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSettingPresentationModel.cpp + * @brief This is the implementation file for SettingPresentationModel class. + */ + +#include "MpCommonUtil.h" +#include "MpIMusicSettingEventListener.h" +#include "MpSettingPresentationModel.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Io; + +static const int FIFTEEN_MINUTE = 15 * 60 * 1000; +static const int THIRTY_MINUTE = 30 * 60 * 1000; +static const int ONE_HOUR = 60 * 60 * 1000; +static const int ONE_HOUR_THIRTY_MINUTE = 90 * 60 * 1000; +static const int TWO_HOURS = 120 * 60 * 1000; + +static const int ID_SUB_MOST_PLAYED_ITEM = 0; +static const int ID_SUB_RECENTLY_PLAYED_ITEM = 1; +static const int ID_SUB_RECENTLY_ADD_ITEM = 2; + +SettingPresentationModel* SettingPresentationModel::pSettingPresentationModel = null; + +SettingPresentationModel* +SettingPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pSettingPresentationModel == null) + { + pSettingPresentationModel = new (std::nothrow) SettingPresentationModel(); + TryReturn(pSettingPresentationModel != null, null, "SettingPresentationModel instance is not created."); + + result r = pSettingPresentationModel->Construct(); + TryCatch(r == E_SUCCESS, , null, "PlayerPresentationModel instance is not constructed."); + pSettingPresentationModel->InitializeSettingValue(); + } + AppLogDebug("EXIT"); + return pSettingPresentationModel; + +CATCH: + //AppLogException("SettingPresentationModel::GetInstance(void) Error"); + delete pSettingPresentationModel; + + return null; +} + +SettingPresentationModel::SettingPresentationModel(void) + : __autoOffTime(null) + , __isMostPlayed(false) + , __isRecentlyPlayed(false) + , __isRecentlyAdd(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SettingPresentationModel::~SettingPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SettingPresentationModel::DestroySettingPresentationModel(void) +{ + AppLogDebug("ENTER"); + if (pSettingPresentationModel != null) + { + delete pSettingPresentationModel; + pSettingPresentationModel = null; + } + AppLogDebug("EXIT"); +} + +void +SettingPresentationModel::InitializeSettingValue(void) +{ + AppLogDebug("ENTER"); + __isMostPlayed = static_cast(CommonUtil::GetValue(MOST_PLAYED)); + __isRecentlyPlayed = static_cast(CommonUtil::GetValue(RECENTLY_PLAYED)); + __isRecentlyAdd = static_cast(CommonUtil::GetValue(RECENTLY_ADD)); + __autoOffTime = CommonUtil::GetValue(AUTO_OFF_LEVEL); + AppLogDebug("EXIT"); +} + +result +SettingPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +SettingPresentationModel::SetTabEnable(int tabId, bool enabled) +{ + AppLogDebug("ENTER"); + switch (tabId) + { + case ID_SUB_MOST_PLAYED_ITEM: + { + __isMostPlayed = enabled; + CommonUtil::SetValue(MOST_PLAYED, static_cast(enabled)); + } + break; + + case ID_SUB_RECENTLY_PLAYED_ITEM: + { + __isRecentlyPlayed = enabled; + CommonUtil::SetValue(RECENTLY_PLAYED, static_cast(enabled)); + } + break; + + case ID_SUB_RECENTLY_ADD_ITEM: + { + __isRecentlyAdd = enabled; + CommonUtil::SetValue(RECENTLY_ADD, static_cast(enabled)); + } + break; + + default: + break; + } + + AppLogDebug("EXIT"); +} +bool +SettingPresentationModel::IsTabEnable(int tabId) +{ + AppLogDebug("ENTER"); + bool enable = false; + switch (tabId) + { + case ID_SUB_MOST_PLAYED_ITEM: + { + enable = __isMostPlayed; + } + break; + + case ID_SUB_RECENTLY_PLAYED_ITEM: + { + enable = __isRecentlyPlayed; + } + break; + + case ID_SUB_RECENTLY_ADD_ITEM: + { + enable = __isRecentlyAdd; + } + break; + + default: + break; + } + AppLogDebug("EXIT"); + return enable; +} + +int +SettingPresentationModel::SetAutoOffTime(int autoOffTime)// 0 - 5 (OFF, 15 MIN, 30 MIN, 1 HOUR, 1 HOUR 30 MIN, 2 HOURS) +{ + AppLogDebug("ENTER"); + int millisecondValue = 0; + result r = E_SUCCESS; + + switch (autoOffTime) + { + case 0: + { + } + break; + + case 1: + { + millisecondValue = FIFTEEN_MINUTE; + } + break; + + case 2: + { + millisecondValue = THIRTY_MINUTE; + } + break; + + case 3: + { + millisecondValue = ONE_HOUR; + } + break; + + case 4: + { + millisecondValue = ONE_HOUR_THIRTY_MINUTE; + } + break; + + case 5: + { + millisecondValue = TWO_HOURS; + } + break; + + default: + break; + } + r = CommonUtil::SetValue(AUTO_OFF_LEVEL, autoOffTime); + if (IsFailed(r)) + { + millisecondValue = -1; + + if (r == E_STORAGE_FULL) + { + SetLastResult(r); + } + } + else + { + __autoOffTime = autoOffTime; + } + AppLogDebug("EXIT"); + return millisecondValue; +} + +int +SettingPresentationModel::GetAutoOffTime(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __autoOffTime; +} diff --git a/src/MpSharePopup.cpp b/src/MpSharePopup.cpp new file mode 100644 index 0000000..c8d518d --- /dev/null +++ b/src/MpSharePopup.cpp @@ -0,0 +1,395 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSharePopup.cpp + * @brief This is the implementation file for SharePopup class. + */ + +#include +#include "MpMusicPlayerApp.h" +#include "MpResourceManager.h" +#include "MpSharePopup.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +static const int INDEX_SHART_ITEM_MESSAGE = 1; +static const int INDEX_SHART_ITEM_EMAIL = 0;//NEED +//static const int INDEX_SHARE_TOTAL_BLUETOOTH = 2; +static const int SHARE_TOTAL_COUNT = 2;//NEED 3 +static const int HEIGHT_POPUP_ITEM = 110; + +const wchar_t* EMPTY_SPACE = L""; + +SharePopup::SharePopup(void) + : __pShareItemTableView(null) + , __pCancelButton(null) + , __pDataList(null) + , __pControl(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +SharePopup::~SharePopup(void) +{ + AppLogDebug("ENTER"); + if (__pDataList != null) + { + __pDataList->RemoveAll(true); + delete __pDataList; + __pDataList = null; + } + AppLogDebug("EXIT"); +} + +result +SharePopup::Initialize(Tizen::Ui::Control* pControl) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + Construct(IDL_SHARE_VIA_POPUP); + SetTitleText(ResourceManager::GetString(L"IDS_IV_BODY_SHARE_VIA")); + + SetPropagatedKeyEventListener(this); + AddTouchEventListener(*this); + + __pShareItemTableView = static_cast(GetControl(IDC_TABLEVIEW)); + __pShareItemTableView->AddTableViewItemEventListener(*this); + __pShareItemTableView->SetItemProvider(this); + + __pCancelButton = static_cast(GetControl(IDC_CANCEL_BUTTON)); + __pCancelButton->SetActionId(IDA_BUTTON_CANCEL); + __pCancelButton->AddActionEventListener(*this); + __pCancelButton->SetText(ResourceManager::GetString(L"IDS_COM_BODY_EDIT_CANCEL")); + __pControl = pControl; + AppLogDebug("EXIT"); + return r; +} + +void +SharePopup::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + pDataList->Add(*(new (std::nothrow) Boolean(false))); + + if (actionId == IDA_BUTTON_CANCEL) + { + SetShowState(false); + Invalidate(true); + __pControl->SendUserEvent(ID_DESTORY_SHARE_POPUP, pDataList); + } + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchDoublePressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchLongPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchFocusIn(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchFocusOut(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchMoved(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchPressed(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + if (GetShowState() && (currentPosition.x < 0 || currentPosition.y < 0 || GetBounds().width || GetBounds().height)) + { +// SetShowState(false); +// Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTouchReleased(const Tizen::Ui::Control& source, + const Tizen::Graphics::Point& currentPosition, + const Tizen::Ui::TouchEventInfo& touchInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +SharePopup::OnKeyPressed(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + if (KEY_BACK == keyEventInfo.GetKeyCode() || KEY_ESC == keyEventInfo.GetKeyCode()) + { + return true; + } + AppLogDebug("EXIT"); + return false; +} + +bool +SharePopup::OnKeyReleased(Control& source, const KeyEventInfo& keyEventInfo) +{ + AppLogDebug("ENTER"); + + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + SetShowState(false); + Show(); + return true; + } + AppLogDebug("EXIT"); + return false; +} + +int +SharePopup::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT");; + return SHARE_TOTAL_COUNT; +} + +Tizen::Ui::Controls::TableViewItem* +SharePopup::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + result r = pItem->Construct(Dimension(itemWidth, HEIGHT_POPUP_ITEM), TABLE_VIEW_ANNEX_STYLE_NORMAL); + if (IsFailed(r)) + { + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + delete pItem; + return null; + } + + //String shareItemName[] = {L"Message", L"Email", L"Bluetooth"};//NEED STRING Bluetooth + String shareItemName[] = {ResourceManager::GetString(L"IDS_COM_BODY_EMAIL"), ResourceManager::GetString(L"IDS_COM_BODY_MESSAGE")}; + Label* pShareItemLabel = new (std::nothrow) Label(); + pShareItemLabel->Construct(Rectangle(0, 0, POPUP_ITEM_WIDTH, HEIGHT_POPUP_ITEM), L""); + pShareItemLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pShareItemLabel->SetTextConfig(SUB_TEXT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pShareItemLabel->SetText(shareItemName[itemIndex]); + + pItem->AddControl(pShareItemLabel); + + AppLogDebug("EXIT"); + return pItem; +} + +bool +SharePopup::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +SharePopup::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +SharePopup::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return HEIGHT_POPUP_ITEM; +} + +void +SharePopup::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + result r = E_SUCCESS; + + switch (itemIndex) + { + case INDEX_SHART_ITEM_MESSAGE: //NEED + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + pDataList->Add(*(new (std::nothrow) Boolean(true))); + + r = LaunchAppControl(OPERATION_ID_COMPOSE, PROVIDER_ID_MESSAGE); + pDataList->Add(new (std::nothrow) Integer(r)); + __pControl->SendUserEvent(ID_DESTORY_SHARE_POPUP, pDataList); + } + break; + + case INDEX_SHART_ITEM_EMAIL: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + pDataList->Add(*(new (std::nothrow) Boolean(true))); + + r = LaunchAppControl(OPERATION_ID_COMPOSE, PROVIDER_ID_EMAIL); + pDataList->Add(new (std::nothrow) Integer(r)); + __pControl->SendUserEvent(ID_DESTORY_SHARE_POPUP, pDataList); + } + break; + +// case INDEX_SHARE_TOTAL_BLUETOOTH: NEED +// { +// LaunchAppControl(OPERATION_ID_COMPOSE, PROVIDER_ID_EMAIL); +// } +// break; + + default: + break; + } + SetShowState(false); + Invalidate(true); + } + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +SharePopup::SetArguments(Tizen::Base::Collection::IList* pIList) +{ + AppLogDebug("ENTER"); + if (pIList != null) + { + /* String combineText; + String path; + + int loopCount = pIList->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + path = *(static_cast(pIList->GetAt(i))); + + if (combineText.CompareTo(EMPTY_SPACE) != 0) + { + combineText.Append(L";"); + } + combineText.Append(path); + } + AppLogDebug("%ls", combineText.GetPointer()); */ + + AppLogDebug("Path(%ls)", static_cast(pIList->GetAt(0))->GetPointer()); + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_PATH), static_cast(pIList)); + if (__pDataList != null) + { + delete __pDataList; + } + __pDataList = pDataList; + AppLogDebug("EXIT"); + } +} + +result +SharePopup::LaunchAppControl(const Tizen::Base::String& operationId, const Tizen::Base::String& providerId) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + AppControl* pAc = AppManager::FindAppControlN(providerId, operationId); + if (pAc == null) + { + AppLogDebug("EXIT"); + return E_FAILURE; + } + + r = pAc->Start(null, null, __pDataList, null); + + if (r == E_SUCCESS) + { + Frame* pFrame = MusicPlayerApp::GetInstance()->GetFrameAt(0); + AppAssert(pFrame); + pFrame->SetEnabled(false); + } + else + { + AppLogDebug("AppControl Start fail"); + } + + delete pAc; + AppLogDebug("EXIT"); + return r; +} diff --git a/src/MpSoundPathPopup.cpp b/src/MpSoundPathPopup.cpp new file mode 100644 index 0000000..6b60241 --- /dev/null +++ b/src/MpSoundPathPopup.cpp @@ -0,0 +1,741 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpSoundPathPopup.cpp + * @brief This is the implementation file for SoundPathPopup class. + */ + +#include "MpResourceManager.h" +#include "MpSoundPathPopup.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Graphics; +using namespace Tizen::Media; +using namespace Tizen::Ui::Controls; + +static const int W_SOUNDPATH_POPUP = 550; +static const int H_SOUNDPATH_POPUP = 450; + +static const int IDA_BUTTON_CHECK1ST_CHECKED = 100; +static const int IDA_BUTTON_CHECK1ST_UNCHECKED = 101; +static const int IDA_BUTTON_CHECK2ND_CHECKED = 102; +static const int IDA_BUTTON_CHECK2ND_UNCHECKED = 103; +static const int IDA_BUTTON_CLOSE = 104; + +static const int X_CHECK_BUTTON_1ST = 0; +static const int Y_CHECK_BUTTON_1ST = 0; +static const int W_CHECK_BUTTON_1ST = 510; +static const int H_CHECK_BUTTON_1ST = 90; + +static const int X_CHECK_BUTTON_2ND = 0; +static const int Y_CHECK_BUTTON_2ND = 90; +static const int W_CHECK_BUTTON_2ND = 510; +static const int H_CHECK_BUTTON_2ND = 90; + +static const int X_CLOSE_BUTTON = 65; +static const int Y_CLOSE_BUTTON = 210; +static const int W_CLOSE_BUTTON = 400; +static const int H_CLOSE_BUTTON = 90; + +SoundPathPopup::SoundPathPopup(void) + : __pCloseButton(null) + , __pCheckButton1st(null) + , __pCheckButton2nd(null) + , __pAudioRouteManager(null) + , __selectedAudioRouteMode(0) +{ + AppLogDebug("ENTER"); + for (int count = 0; count < AUDIO_ROUTE_MAX; count++) + { + __availableAudioRoute[count] = false; + } + AppLogDebug("EXIT"); +} + +SoundPathPopup::~SoundPathPopup(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result SoundPathPopup::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + int listCount = 0; + String checkBoxString = L""; + + AudioRouteInfo* tempRouteInfo = null; + IList* availableAudioRouteList = null; + + AudioRouteInfo currentAudioRoute(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE); + AudioRouteInfo availableRouteInfo(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE); + + r = Popup::Construct(true, Dimension(W_SOUNDPATH_POPUP, H_SOUNDPATH_POPUP)); + TryCatch(r == E_SUCCESS, , "Popup::Construct() Failed:%s", GetErrorMessage(r)); + + __pCheckButton1st = new (std::nothrow) CheckButton(); + + __pCheckButton2nd = new (std::nothrow) CheckButton(); + + __pCloseButton = new (std::nothrow) Button(); + + checkBoxString = ResourceManager::GetString("IDS_MUSIC_HEADER_SELECT_DEVICE"); + + r = SetTitleText(checkBoxString); + TryCatch(r == E_SUCCESS, , "SetTitleText() Failed:%s", GetErrorMessage(r)); + + __pAudioRouteManager = AudioRouteManager::GetInstance(); + __pAudioRouteManager->SetAudioRouteEventListener(this); + + availableAudioRouteList = __pAudioRouteManager->GetAvailableAudioRouteListN(); + + for (listCount = 0; listCount < availableAudioRouteList->GetCount(); listCount++) + { + tempRouteInfo = static_cast(availableAudioRouteList->GetAt(listCount)); + availableRouteInfo = *tempRouteInfo; + + if (availableRouteInfo.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_NONE) + { + __availableAudioRoute[AUDIO_ROUTE_NONE] = true; + } + else if (availableRouteInfo.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_SPEAKER) + { + __availableAudioRoute[AUDIO_ROUTE_SPEAKER] = true; + } + else if (availableRouteInfo.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_RECEIVER) + { + __availableAudioRoute[AUDIO_ROUTE_RECEIVER] = true; + } + else if (availableRouteInfo.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY) + { + __availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] = true; + } + else if (availableRouteInfo.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_BT_SCO) + { + __availableAudioRoute[AUDIO_ROUTE_BT_SCO] = true; + } + else + { + __availableAudioRoute[AUDIO_ROUTE_BT_A2DP] = true; + } + } + + currentAudioRoute = __pAudioRouteManager->GetActiveAudioRoute(); + + if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_BT_A2DP) + { + if (__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == true) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, __pAudioRouteManager->GetActiveBluetoothA2dpName()); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_WIRED_ACCESSORY; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else if (__availableAudioRoute[AUDIO_ROUTE_SPEAKER] == true) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, __pAudioRouteManager->GetActiveBluetoothA2dpName()); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_VCALL_BODY_BT_HEADSET")); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, L"Speaker"); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + } + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY) + { + if (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == true) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, __pAudioRouteManager->GetActiveBluetoothA2dpName()); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_WIRED_ACCESSORY; + + __pCheckButton1st->SetSelected(false); + __pCheckButton2nd->SetSelected(true); + } + else + { + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + } + else if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_SPEAKER) + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_VCALL_BODY_BT_HEADSET")); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB")); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_SPEAKER_ONLY; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == true) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER; + + __pCheckButton1st->SetSelected(false); + __pCheckButton2nd->SetSelected(true); + } + else if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == true)) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, __pAudioRouteManager->GetActiveBluetoothA2dpName()); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_VCALL_BODY_BT_HEADSET")); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB")); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + } + else if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_NONE) + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_VCALL_BODY_BT_HEADSET")); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB")); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_SPEAKER_ONLY; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == true) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER; + + __pCheckButton1st->SetSelected(false); + __pCheckButton2nd->SetSelected(true); + } + else if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == true)) + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, __pAudioRouteManager->GetActiveBluetoothA2dpName()); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + else + { + r = __pCheckButton1st->Construct(Rectangle(X_CHECK_BUTTON_1ST, Y_CHECK_BUTTON_1ST, W_CHECK_BUTTON_1ST, H_CHECK_BUTTON_1ST), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_VCALL_BODY_BT_HEADSET")); + TryCatch(r == E_SUCCESS, , "__pCheckButton1st->Construct() Failed:%s", GetErrorMessage(r)); + + r = __pCheckButton2nd->Construct(Rectangle(X_CHECK_BUTTON_2ND, Y_CHECK_BUTTON_2ND, W_CHECK_BUTTON_2ND, H_CHECK_BUTTON_2ND), CHECK_BUTTON_STYLE_ONOFF, BACKGROUND_STYLE_DEFAULT, false, ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB")); + TryCatch(r == E_SUCCESS, , "__pCheckButton2nd->Construct() Failed:%s", GetErrorMessage(r)); + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + } + + checkBoxString = ResourceManager::GetString("IDS_COM_BODY_CLOSE"); + + r = __pCloseButton->Construct(Rectangle(X_CLOSE_BUTTON, Y_CLOSE_BUTTON, W_CLOSE_BUTTON, H_CLOSE_BUTTON), checkBoxString); + TryCatch(r == E_SUCCESS, , "__pCloseButton->Construct() Failed:%s", GetErrorMessage(r)); + + __pCheckButton1st->SetActionId(IDA_BUTTON_CHECK1ST_CHECKED, IDA_BUTTON_CHECK1ST_UNCHECKED); + __pCheckButton2nd->SetActionId(IDA_BUTTON_CHECK2ND_CHECKED, IDA_BUTTON_CHECK2ND_UNCHECKED); + __pCloseButton->SetActionId(IDA_BUTTON_CLOSE); + + __pCheckButton1st->AddActionEventListener(*this); + __pCheckButton2nd->AddActionEventListener(*this); + __pCloseButton->AddActionEventListener(*this); + + r = AddControl(__pCheckButton1st); + TryCatch(r == E_SUCCESS, , "AddControl(__pCheckButton1st) Failed:%s", GetErrorMessage(r)); + + r = AddControl(__pCheckButton2nd); + TryCatch(r == E_SUCCESS, , "AddControl(__pCheckButton2nd) Failed:%s", GetErrorMessage(r)); + + r = AddControl(__pCloseButton); + TryCatch(r == E_SUCCESS, , "AddControl(__CloseButton) Failed:%s", GetErrorMessage(r)); + + AppLogDebug("EXIT"); + return r; + +CATCH: + delete __pCheckButton1st; + __pCheckButton1st = null; + + delete __pCheckButton2nd; + __pCheckButton2nd = null; + + delete __pCloseButton; + __pCloseButton = null; + + return r; +} + +void +SoundPathPopup::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + AudioRouteInfo currentAudioRoute(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE); + AudioRouteInfo audioRouteSpeaker(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_SPEAKER); + AudioRouteInfo audioRouteWiredAccessory(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY); + AudioRouteInfo audioRouteBluetooth(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_BT_A2DP); + + currentAudioRoute = __pAudioRouteManager->GetActiveAudioRoute(); + + switch (actionId) + { + case IDA_BUTTON_CHECK1ST_CHECKED: + // fall through + case IDA_BUTTON_CHECK1ST_UNCHECKED: + { + if (__selectedAudioRouteMode == AUDIO_ROUTE_SPEAKER_ONLY) + { + AppLogDebug("AUDIO_ROUTE_SPEAKER_ONLY"); + } + else if (__selectedAudioRouteMode == AUDIO_ROUTE_BT_A2DP_AND_SPEAKER) + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_BT_A2DP) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteBluetooth); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + else if (__selectedAudioRouteMode == AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER) + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteWiredAccessory); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + else + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_BT_A2DP) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteBluetooth); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + break; + + case IDA_BUTTON_CHECK2ND_CHECKED: + // fall through + case IDA_BUTTON_CHECK2ND_UNCHECKED: + { + if (__selectedAudioRouteMode == AUDIO_ROUTE_SPEAKER_ONLY) + { + AppLogDebug("AUDIO_ROUTE_SPEAKER_ONLY"); + } + else if (__selectedAudioRouteMode == AUDIO_ROUTE_BT_A2DP_AND_SPEAKER) + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_SPEAKER) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteSpeaker); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + else if (__selectedAudioRouteMode == AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER) + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_SPEAKER) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteSpeaker); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + else + { + if (currentAudioRoute.GetOutputAudioDevice() != OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY) + { + r = __pAudioRouteManager->SetActiveAudioRoute(audioRouteWiredAccessory); + TryReturnVoid(r == E_SUCCESS, "__pAudioRouteManager->SetActiveAudioRoute() failed:%s", GetErrorMessage(r)); + } + } + + __pCheckButton1st->SetSelected(false); + __pCheckButton2nd->SetSelected(true); + } + break; + + case IDA_BUTTON_CLOSE: + { + r = SetShowState(false); + TryReturnVoid(r == E_SUCCESS, "SetShowState() failed:%s", GetErrorMessage(r)); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +SoundPathPopup::OnActiveAudioRouteChanged(const Tizen::Media::AudioRouteInfo& route) +{ + AppLogDebug("ENTER"); + String checkBoxString = L""; + + switch (route.GetOutputAudioDevice()) + { + case OUTPUT_AUDIO_DEVICE_BT_A2DP: + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == true) + && (__availableAudioRoute[AUDIO_ROUTE_SPEAKER] == true)) + { + __pCheckButton1st->SetText(__pAudioRouteManager->GetActiveBluetoothA2dpName()); + + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + __pCheckButton2nd->SetText(checkBoxString); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_WIRED_ACCESSORY; + } + else if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_SPEAKER] == true)) + { + __pCheckButton1st->SetText(__pAudioRouteManager->GetActiveBluetoothA2dpName()); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + __pCheckButton2nd->SetText(checkBoxString); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_SPEAKER; + } + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + + if (GetShowState() == true) + { + Invalidate(true); + } + } + break; + + case OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY: + { + if (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == true) + { + __pCheckButton1st->SetText(__pAudioRouteManager->GetActiveBluetoothA2dpName()); + + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + __pCheckButton2nd->SetText(checkBoxString); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_WIRED_ACCESSORY; + + __pCheckButton1st->SetSelected(false); + __pCheckButton2nd->SetSelected(true); + } + else + { + checkBoxString = ResourceManager::GetString(L"IDS_COM_OPT_HEADPHONES_ABB"); + + __pCheckButton1st->SetText(checkBoxString); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + __pCheckButton2nd->SetText(checkBoxString); + + __selectedAudioRouteMode = AUDIO_ROUTE_WIRED_ACCESSORY_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + + if (GetShowState() == true) + { + Invalidate(true); + } + } + break; + + case OUTPUT_AUDIO_DEVICE_SPEAKER: + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + if (GetShowState() == true) + { + SetShowState(false); + } + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +SoundPathPopup::OnAudioRouteAdded(const Tizen::Media::AudioRouteInfo& route) +{ + AppLogDebug("ENTER"); + switch (route.GetOutputAudioDevice()) + { + case OUTPUT_AUDIO_DEVICE_NONE: + { + __availableAudioRoute[AUDIO_ROUTE_NONE] = true; + } + break; + + case OUTPUT_AUDIO_DEVICE_SPEAKER: + { + __availableAudioRoute[AUDIO_ROUTE_SPEAKER] = true; + } + break; + + case OUTPUT_AUDIO_DEVICE_RECEIVER: + { + __availableAudioRoute[AUDIO_ROUTE_RECEIVER] = true; + } + break; + + case OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY: + { + __availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] = true; + } + break; + + case OUTPUT_AUDIO_DEVICE_BT_SCO: + { + __availableAudioRoute[AUDIO_ROUTE_BT_SCO] = true; + } + break; + + case OUTPUT_AUDIO_DEVICE_BT_A2DP: + { + __availableAudioRoute[AUDIO_ROUTE_BT_A2DP] = true; + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +SoundPathPopup::OnAudioRouteRemoved(const Tizen::Media::AudioRouteInfo& route) +{ + AppLogDebug("ENTER"); + String checkBoxString = L""; + + AudioRouteInfo currentAudioRoute(INPUT_AUDIO_DEVICE_NONE, OUTPUT_AUDIO_DEVICE_NONE); + + currentAudioRoute = __pAudioRouteManager->GetActiveAudioRoute(); + + switch (route.GetOutputAudioDevice()) + { + case OUTPUT_AUDIO_DEVICE_NONE: + { + __availableAudioRoute[AUDIO_ROUTE_NONE] = false; + } + break; + + case OUTPUT_AUDIO_DEVICE_SPEAKER: + { + __availableAudioRoute[AUDIO_ROUTE_SPEAKER] = false; + } + break; + + case OUTPUT_AUDIO_DEVICE_RECEIVER: + { + __availableAudioRoute[AUDIO_ROUTE_RECEIVER] = false; + } + break; + + case OUTPUT_AUDIO_DEVICE_WIRED_ACCESSORY: + { + __availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] = false; + } + break; + + case OUTPUT_AUDIO_DEVICE_BT_SCO: + { + __availableAudioRoute[AUDIO_ROUTE_BT_SCO] = false; + } + break; + + case OUTPUT_AUDIO_DEVICE_BT_A2DP: + { + __availableAudioRoute[AUDIO_ROUTE_BT_A2DP] = false; + } + break; + + default: + break; + } + + if (currentAudioRoute.GetOutputAudioDevice() != route.GetOutputAudioDevice()) + { + if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_BT_A2DP) + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_SPEAKER] == true)) + { + __pCheckButton1st->SetText(__pAudioRouteManager->GetActiveBluetoothA2dpName()); + + checkBoxString = ResourceManager::GetString("IDS_COM_OPT_SPEAKER_ABB"); + + __pCheckButton2nd->SetText(checkBoxString); + + __selectedAudioRouteMode = AUDIO_ROUTE_BT_A2DP_AND_SPEAKER; + + __pCheckButton1st->SetSelected(true); + __pCheckButton2nd->SetSelected(false); + } + + if (GetShowState() == true) + { + Invalidate(true); + } + } + else if (currentAudioRoute.GetOutputAudioDevice() == OUTPUT_AUDIO_DEVICE_SPEAKER) + { + if ((__availableAudioRoute[AUDIO_ROUTE_WIRED_ACCESSORY] == false) + && (__availableAudioRoute[AUDIO_ROUTE_BT_A2DP] == false)) + { + if (GetShowState() == true) + { + SetShowState(false); + } + } + } + } + AppLogDebug("EXIT"); +} + +void +SoundPathPopup::ShowPopup(bool state) +{ + AppLogDebug("ENTER"); + result r = E_FAILURE; + + r = SetShowState(state); + TryReturnVoid(r == E_SUCCESS, "SetShowState() failed:%s", GetErrorMessage(r)); + + r = Show(); + TryReturnVoid(r == E_SUCCESS, "Show() failed:%s", GetErrorMessage(r)); + AppLogDebug("EXIT"); +} diff --git a/src/MpTableviewItemTag.cpp b/src/MpTableviewItemTag.cpp new file mode 100644 index 0000000..65ab5e2 --- /dev/null +++ b/src/MpTableviewItemTag.cpp @@ -0,0 +1,37 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpTableviewItemTag.cpp + * @brief This is the implementation file for TableviewItemTag class. + */ + +#include +#include "MpTableviewItemTag.h" + +TableviewItemTag::TableviewItemTag(int groupIndex, int itemIndex) + : __groupIndex(groupIndex) + , __itemIndex(itemIndex) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +TableviewItemTag::~TableviewItemTag(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} \ No newline at end of file diff --git a/src/MpThumbnailBase.cpp b/src/MpThumbnailBase.cpp new file mode 100644 index 0000000..2bdef2e --- /dev/null +++ b/src/MpThumbnailBase.cpp @@ -0,0 +1,176 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailBase.cpp + * @brief This is the implementation file for ThumbnailBase class. + */ + +#include +#include +#include "MpIThumbnailProviderHandler.h" +#include "MpThumbnailBase.h" +#include "MpThumbnailEventArg.h" +#include "MpThumbnailProvider.h" +#include "MpThumbnailInfo.h" +#include "MpTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Graphics; + +ThumbnailBase::ThumbnailBase(void) + : __pIThumbnailProviderHandler(null) + , __pThumbnailEvent(null) + , __isForceStop(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ThumbnailBase::~ThumbnailBase(void) +{ + AppLogDebug("ENTER"); + RemoveThumbnailEventListner(); + delete __pThumbnailEvent; + __pThumbnailEvent = null; + __pIThumbnailProviderHandler = null; + AppLogDebug("EXIT"); +} + +result +ThumbnailBase::Construct(void) +{ + AppLogDebug("ENTER"); + __pIThumbnailProviderHandler = ThumbnailProvider::GetInstance(); + if (__pIThumbnailProviderHandler == null) + { + AppLogDebug("ThumbnailProvider::GetInstance() is null"); + return E_FAILURE; + } + + SetThumbnailEventListner(); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +ThumbnailBase::Stop(void) +{ + AppLogDebug("ENTER"); + __isForceStop = true; + CancelAllThumbnailRequest(); + RemoveThumbnailEventListner(); + AppLogDebug("EXIT"); +} + +void +ThumbnailBase::SetThumbnailEventListner(void) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + + if (__pThumbnailEvent != null) + { + delete __pThumbnailEvent; + __pThumbnailEvent = null; + } + + __pThumbnailEvent = new (std::nothrow) ThumbnailEvent(); + __pThumbnailEvent->AddListener(*(static_cast(this))); + AppLogDebug("EXIT"); +} + +void +ThumbnailBase::RemoveThumbnailEventListner(void) +{ + AppLogDebug("ENTER"); + __pThumbnailEvent->RemoveListener(*(static_cast(this))); + AppLogDebug("EXIT"); +} + +void +ThumbnailBase::CancelAllThumbnailRequest(void) +{ + AppLogDebug("ENTER"); + if(__pIThumbnailProviderHandler != null) + { + __pIThumbnailProviderHandler->CancelAllThumbnailRequest(__pThumbnailEvent); + } + AppLogDebug("EXIT"); +} + +void +ThumbnailBase::RequestThumbnail(const Tizen::Content::ContentId& contentId, Tizen::Base::Object* pParam) const +{ + AppLogDebug("ENTER"); + if (__isForceStop == true) + { + AppLogDebug("EXIT"); + delete pParam; + return; + } + if (__pIThumbnailProviderHandler != null) + { + __pIThumbnailProviderHandler->RequestThumbnail(contentId, __pThumbnailEvent, pParam); + } + else + { + delete pParam; + pParam = null; + } + AppLogDebug("EXIT"); +} + +const Tizen::Graphics::Bitmap* +ThumbnailBase::GetDefaultThumbnail(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + if (__pIThumbnailProviderHandler != null) + { + return __pIThumbnailProviderHandler->GetDefaultThumbnail(); + } + else + { + return null; + } +} + +void +ThumbnailBase::OnThumbnailReceivedN(Tizen::Base::Runtime::IEventArg& eventArg) +{ + AppLogDebug("ENTER"); + ThumbnailInfo* pThumbnailInfo = GetThumbnailInfo(eventArg); + if (pThumbnailInfo != null && __isForceStop == false) + { + OnThumbnailInfoReveivedN(pThumbnailInfo); + } + else + { + delete pThumbnailInfo; + } + AppLogDebug("EXIT"); +} + +ThumbnailInfo* +ThumbnailBase::GetThumbnailInfo(Tizen::Base::Runtime::IEventArg& eventArg) +{ + AppLogDebug("ENTER"); + ThumbnailEventArg& pThumbnailEventArg = static_cast(eventArg); + ThumbnailInfo* pThumbnailInfo = pThumbnailEventArg.GetThumbnailInfoN(); + AppLogDebug("EXIT"); + return pThumbnailInfo; +} \ No newline at end of file diff --git a/src/MpThumbnailEvent.cpp b/src/MpThumbnailEvent.cpp new file mode 100644 index 0000000..4038f9f --- /dev/null +++ b/src/MpThumbnailEvent.cpp @@ -0,0 +1,44 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailEvent.cpp + * @brief This is the implementation file for ThumbnailEvent class. + */ + +#include +#include "MpThumbnailEvent.h" +#include "MpThumbnailEventListener.h" + +using namespace Tizen::Base::Runtime; + +ThumbnailEvent::~ThumbnailEvent(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +ThumbnailEvent::FireImpl(IEventListener& listener, const IEventArg& eventArg) +{ + AppLogDebug("ENTER"); + IThumbnailEventListener* plistener = static_cast(&listener); + if (plistener != null) + { + plistener->OnThumbnailReceivedN(*(const_cast(&eventArg))); + } + AppLogDebug("EXIT"); +} \ No newline at end of file diff --git a/src/MpThumbnailEventArg.cpp b/src/MpThumbnailEventArg.cpp new file mode 100644 index 0000000..a4dec88 --- /dev/null +++ b/src/MpThumbnailEventArg.cpp @@ -0,0 +1,58 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailEventArg.cpp + * @brief This is the implementation file for ThumbnailEventArg class. + */ + +#include +#include "MpThumbnailEventArg.h" +#include "MpThumbnailInfo.h" + +using namespace Tizen::Graphics; + +ThumbnailEventArg::ThumbnailEventArg(ThumbnailInfo* pThumbnailInfo) + : _pThumbnailInfo(pThumbnailInfo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ThumbnailEventArg::~ThumbnailEventArg(void) +{ + AppLogDebug("ENTER"); + delete _pThumbnailInfo; + _pThumbnailInfo = null; + AppLogDebug("EXIT"); +} + +ThumbnailInfo* +ThumbnailEventArg::GetThumbnailInfoN(void) +{ + AppLogDebug("ENTER"); + if (_pThumbnailInfo == null) + { + return null; + } + + Bitmap* pBitmap = _pThumbnailInfo->GetBitmapN(); + ThumbnailInfo* pThumbnailInfo = new (std::nothrow) ThumbnailInfo(); + pThumbnailInfo->Construct(_pThumbnailInfo->GetContentId(), *pBitmap, _pThumbnailInfo->GetUserParamN()); + + AppLogDebug("EXIT"); + return pThumbnailInfo; +} \ No newline at end of file diff --git a/src/MpThumbnailInfo.cpp b/src/MpThumbnailInfo.cpp new file mode 100644 index 0000000..09d3387 --- /dev/null +++ b/src/MpThumbnailInfo.cpp @@ -0,0 +1,100 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailInfo.cpp + * @brief This is the implementation file for ThumbnailInfo class. + */ + +#include +#include "MpThumbnailInfo.h" + +using namespace Tizen::Base; +using namespace Tizen::Content; +using namespace Tizen::Graphics; + +ThumbnailInfo::ThumbnailInfo(void) + : __pBitmap(null) + , __pParam(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ThumbnailInfo::~ThumbnailInfo(void) +{ + AppLogDebug("ENTER"); + delete __pBitmap; + __pBitmap = null; + delete __pParam; + __pParam = null; + AppLogDebug("EXIT"); +} + +void +ThumbnailInfo::Construct(const Tizen::Content::ContentId& contentId, + const Tizen::Graphics::Bitmap& bitmap, Tizen::Base::Object* pParam) +{ + AppLogDebug("ENTER"); + __contentId = contentId; + __pBitmap = &bitmap; + __pParam = pParam; + AppLogDebug("EXIT"); +} + +ContentId +ThumbnailInfo::GetContentId(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __contentId; +} + +Bitmap* +ThumbnailInfo::GetBitmapN(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return CloneBitmapN(*__pBitmap); +} + +Tizen::Base::Object* +ThumbnailInfo::GetUserParamN(void) const +{ + AppLogDebug("ENTER"); + Object* pUserParam = __pParam; + __pParam = null; + AppLogDebug("EXIT"); + return pUserParam; +} + +Bitmap* +ThumbnailInfo::CloneBitmapN(const Bitmap& bitmap) const +{ + AppLogDebug("ENTER"); + Bitmap* pResultBitmap = null; + if (&bitmap != null) + { + Rectangle mainRect(0, 0, bitmap.GetWidth(), bitmap.GetHeight()); + Canvas mainCanvas; + mainCanvas.Construct(mainRect); + mainCanvas.DrawBitmap(mainRect, bitmap); + pResultBitmap = new (std::nothrow) Bitmap(); + pResultBitmap->Construct(mainCanvas, mainRect); + } + AppLogDebug("EXIT"); + return pResultBitmap; +} \ No newline at end of file diff --git a/src/MpThumbnailJob.cpp b/src/MpThumbnailJob.cpp new file mode 100644 index 0000000..0e78bf2 --- /dev/null +++ b/src/MpThumbnailJob.cpp @@ -0,0 +1,89 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailJob.cpp + * @brief This is the implementation file for ThumbnailJob class. + */ + +#include +#include "MpThumbnailEvent.h" +#include "MpThumbnailJob.h" + +using namespace Tizen::Base::Runtime; +using namespace Tizen::Content; + +ThumbnailJob::ThumbnailJob(void) + : __requestId(0) + , __pParam(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +ThumbnailJob::~ThumbnailJob(void) +{ + AppLogDebug("ENTER"); + delete __pParam; + __pParam = null; + AppLogDebug("EXIT"); +} + +void +ThumbnailJob::Construct(const ContentId& contentId, const unsigned long requestId, + const ThumbnailEvent* pRequestEvent, Tizen::Base::Object* pParam) +{ + AppLogDebug("ENTER"); + __contentId = contentId; + __requestId = requestId; + __pRequestEvent = pRequestEvent; + __pParam = pParam; + AppLogDebug("EXIT"); +} + +ContentId +ThumbnailJob::GetContentId(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __contentId; +} + +unsigned long +ThumbnailJob::GetRequestId(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __requestId; +} + +const ThumbnailEvent* +ThumbnailJob::GetEvent(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pRequestEvent; +} + +Tizen::Base::Object* +ThumbnailJob::GetUserParamN(void) const +{ + AppLogDebug("ENTER"); + Object* pUserParam = __pParam; + __pParam = null; + AppLogDebug("EXIT"); + return pUserParam; +} \ No newline at end of file diff --git a/src/MpThumbnailProvider.cpp b/src/MpThumbnailProvider.cpp new file mode 100644 index 0000000..277892c --- /dev/null +++ b/src/MpThumbnailProvider.cpp @@ -0,0 +1,462 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpThumbnailProvider.cpp + * @brief This is the implementation file for ThumbnailProvider class. + */ + +#include +#include +#include +#include +#include "MpThumbnailEvent.h" +#include "MpThumbnailEventArg.h" +#include "MpThumbnailJob.h" +#include "MpThumbnailProvider.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Utility; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Media; + +static const int W_THUMBNAIL = 112; +static const int H_THUMBNAIL = 112; +static const Tizen::Base::String DEFAULT_THUMBNAIL = L"34_thumb_07.png"; + +ThumbnailProvider* ThumbnailProvider::__pThumbnailProviderInstance = null; + +ThumbnailProvider::ThumbnailProvider(void) + : __pMutexCmd(null) + , __pCmdQueue(null) + , __pDefaultThumbnail(null) + , __requestId(0) + , __isForceClose(false) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailProvider::~ThumbnailProvider(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance != null) + { + __pThumbnailProviderInstance->Stop(); + __pThumbnailProviderInstance->Join(); + } + + if (__pMutexCmd != null) + { + delete __pMutexCmd; + } + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + } + + DestroyDefaultThumbnailBitmap(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +IThumbnailProviderHandler* +ThumbnailProvider::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance == null) + { + if (!IsFailed(CreateInstance())) + { + __pThumbnailProviderInstance->Start(); + } + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return __pThumbnailProviderInstance; +} + +result +ThumbnailProvider::Construct(void) +{ + AppLogDebug("ENTER"); + __pMutexCmd = new (std::nothrow) Mutex(); + result r = __pMutexCmd->Create(); + TryCatch(r == E_SUCCESS, , "[%s] Unable to create mutex", GetErrorMessage(r)); + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + __pCmdQueue = null; + } + __pCmdQueue = new (std::nothrow) ArrayList(SingleObjectDeleter); + r = __pCmdQueue->Construct(); + TryCatch(r == E_SUCCESS, , "[%s] Unable to construct queue", GetErrorMessage(r)); + + CreateDefaultThumbnailBitmap(); + __isForceClose = false; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return EventDrivenThread::Construct(); + +CATCH: + if (__pMutexCmd != null) + { + delete __pMutexCmd; + __pMutexCmd = null; + } + + if (__pCmdQueue != null) + { + delete __pCmdQueue; + __pCmdQueue = null; + } + + AppLogDebug("EXIT with exception(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; +} + +result +ThumbnailProvider::CreateInstance(void) +{ + AppLogDebug("ENTER"); + __pThumbnailProviderInstance = new (std::nothrow) ThumbnailProvider(); + result r = __pThumbnailProviderInstance->Construct(); + if (IsFailed(r)) + { + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + + return r; + } + + std::atexit(DestroyInstance); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return E_SUCCESS; +} + +void +ThumbnailProvider::DestroyInstance(void) +{ + AppLogDebug("ENTER"); + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::Release(void) +{ + AppLogDebug("ENTER"); + if (__pThumbnailProviderInstance != null) + { + delete __pThumbnailProviderInstance; + __pThumbnailProviderInstance = null; + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::RequestThumbnail(const ContentId& contentId, const ThumbnailEvent* event, Tizen::Base::Object* pParam) +{ + AppLogDebug("ENTER"); + AppLogDebug("[THREAD] Request Job - (MainThread)"); + + if (contentId.ToString().IsEmpty() == true || event == null + || __pMutexCmd == null || __pCmdQueue == null || __isForceClose == true) + { + AppLogDebug("EXIT 1(%s)", GetErrorMessage(GetLastResult())); + delete pParam; + return; + } + + __pMutexCmd->Acquire(); + + ThumbnailJob* pThumbnailJob = new (std::nothrow) ThumbnailJob(); + pThumbnailJob->Construct(contentId, ++__requestId, event, pParam); + __pCmdQueue->Add(pThumbnailJob); + + __pMutexCmd->Release(); + + SendUserEvent(null, null); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::CancelThumbnailRequest(const ContentId& contentId, const ThumbnailEvent* event) +{ + AppLogDebug("ENTER"); + ThumbnailJob* pThumbnailJob = null; + + __pMutexCmd->Acquire(); + + int loopCount = __pCmdQueue->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pThumbnailJob = static_cast(__pCmdQueue->GetAt(i)); + + if (pThumbnailJob != null + && pThumbnailJob->GetContentId() == contentId + && pThumbnailJob->GetEvent() == event) + { + AppLogDebug("ENTER i(%d) event(%x)", i, event); + __pCmdQueue->RemoveAt(i, true); + break; + } + } + __pMutexCmd->Release(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::CancelAllThumbnailRequest(const ThumbnailEvent* event) +{ + AppLogDebug("ENTER"); + ThumbnailJob* pThumbnailJob = null; + + __pMutexCmd->Acquire(); + int loopCount = __pCmdQueue->GetCount(); + for (int i = 0; i < loopCount; ++i) + { + pThumbnailJob = static_cast(__pCmdQueue->GetAt(i)); + + if (pThumbnailJob != null + && pThumbnailJob->GetEvent() == event) + { + AppLogDebug("ENTER i(%d) event(%x)", i, event); + __pCmdQueue->RemoveAt(i, true); + } + } + __pMutexCmd->Release(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::ClearThumbnailRequests(void) +{ + AppLogDebug("ENTER"); + if(__pCmdQueue != null) + { + __pCmdQueue->RemoveAll(true); + } + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +const Tizen::Graphics::Bitmap* +ThumbnailProvider::GetDefaultThumbnail(void) const +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return __pDefaultThumbnail; +} + +bool +ThumbnailProvider::OnStart(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return true; +} + +void +ThumbnailProvider::OnStop(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +result +ThumbnailProvider::Quit(void) +{ + AppLogDebug("ENTER"); + __pMutexCmd->Acquire(); + __isForceClose = true; + ClearThumbnailRequests(); + __pMutexCmd->Release(); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return EventDrivenThread::Quit(); +} + +void +ThumbnailProvider::OnUserEventReceivedN(RequestId requestId, IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("[THREAD] Receive Job Message - (SubThread)"); + if (__pMutexCmd == null || __pCmdQueue == null) + { + delete pArgs; + AppLogDebug("EXIT1(%s)", GetErrorMessage(GetLastResult())); + return; + } + + __pMutexCmd->Acquire(); + if (__pCmdQueue->GetCount() > 0) + { + ThumbnailJob* pThumbnailJob = static_cast(__pCmdQueue->GetAt(0)); + if (pThumbnailJob == null) + { + __pCmdQueue->RemoveAt(0); + __pMutexCmd->Release(); + return; + } + + unsigned long requestId = pThumbnailJob->GetRequestId(); + ContentId contentId = pThumbnailJob->GetContentId(); +// __pMutexCmd->Release(); + + ThumbnailInfo* pThumbnailInfo = GetThumbnailInfoN(contentId, pThumbnailJob->GetUserParamN()); + if (pThumbnailInfo == null) + { +// __pMutexCmd->Acquire(); + __pCmdQueue->RemoveAt(0, true); + __pMutexCmd->Release(); + AppLogDebug("pThumbnailInfo null"); + return; + } + +// __pMutexCmd->Acquire(); + pThumbnailJob = static_cast(__pCmdQueue->GetAt(0)); + if (pThumbnailJob != null && requestId == pThumbnailJob->GetRequestId()) + { + ThumbnailEvent* pThumbnailEvent = const_cast(pThumbnailJob->GetEvent()); + if (pThumbnailEvent != null && __isForceClose == false) + { + ThumbnailEventArg* pSendingArg = new (std::nothrow) ThumbnailEventArg(pThumbnailInfo); + pThumbnailEvent->Fire(*pSendingArg); + pThumbnailInfo = null; + } + + __pCmdQueue->RemoveAt(0, true); + if (pThumbnailInfo != null) + { + delete pThumbnailInfo; + pThumbnailInfo = null; + } + } + else + { + __pCmdQueue->RemoveAt(0, true); + delete pThumbnailInfo; + } + } + __pMutexCmd->Release(); + + delete pArgs; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +ThumbnailInfo* +ThumbnailProvider::GetThumbnailInfoN(const ContentId& contentId, Tizen::Base::Object* pParam) const +{ + AppLogDebug("ENTER"); + ThumbnailInfo* pNewThumbnailInfo = null; + Bitmap* pBitmap = null; + ContentInfo* pContentInfo = null; + + ContentManager contentManager; + result r = contentManager.Construct(); + TryCatch(r == E_SUCCESS, , "ContentManager.Construct() failed(%s)", GetErrorMessage(r)); + + pContentInfo = contentManager.GetContentInfoN(contentId); + TryCatch(GetLastResult() == E_SUCCESS, , "ContentManager.GetContentInfoN() failed(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pContentInfo, "pContentInfo is null(%s)", GetErrorMessage(GetLastResult())); + + pBitmap = pContentInfo->GetThumbnailN(); + if (pBitmap == null) + { + pBitmap = GetThumbnailByDecodeN(pContentInfo->GetContentPath(), pContentInfo->GetContentType()); + TryCatch(pBitmap != null, delete pContentInfo; pContentInfo = null , "GetThumbnailByDecodeN failed(%s)", GetErrorMessage(GetLastResult())); + } + pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + + pNewThumbnailInfo = new (std::nothrow) ThumbnailInfo(); + pNewThumbnailInfo->Construct(contentId, *pBitmap, pParam); + + AppLogDebug("EXIT"); + delete pContentInfo; + return pNewThumbnailInfo; + +CATCH: + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return null; +} + +Bitmap* +ThumbnailProvider::GetThumbnailByDecodeN(const String& filePath, const ContentType contentType) const +{ + AppLogDebug("ENTER"); + Bitmap* pBitmap = null; + if (&filePath == null || filePath.GetLength() <= 0) + { + pBitmap = new (std::nothrow) Bitmap(); + if (__pDefaultThumbnail != null) + { + pBitmap->Construct(*__pDefaultThumbnail,FloatRectangle(0,0,__pDefaultThumbnail->GetWidthF(),__pDefaultThumbnail->GetHeightF())); + pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + } + else + { + pBitmap->Construct(Dimension(W_THUMBNAIL, H_THUMBNAIL), BITMAP_PIXEL_FORMAT_RGB565); + } + } + else + { + AudioMetadata* pAudioMeta = ContentManagerUtil::GetAudioMetaN(filePath); + TryReturn(pAudioMeta != null, null, "filepath is [%ls]", filePath.GetPointer()); + + pBitmap = pAudioMeta->GetAlbumArtN(); + delete pAudioMeta; + if (pBitmap == null) + { + if (__pDefaultThumbnail != null) + { + pBitmap = new (std::nothrow) Bitmap(); + pBitmap->Construct(*__pDefaultThumbnail,FloatRectangle(0,0,__pDefaultThumbnail->GetWidthF(),__pDefaultThumbnail->GetHeightF())); + pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + } + AppLogDebug("There is not a AlbumArt image"); + return pBitmap; + } + + pBitmap->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + } + + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); + return pBitmap; +} + +void +ThumbnailProvider::CreateDefaultThumbnailBitmap(void) +{ + AppLogDebug("ENTER"); + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + __pDefaultThumbnail = pAppResource->GetBitmapN(DEFAULT_THUMBNAIL); + __pDefaultThumbnail->Scale(Dimension(W_THUMBNAIL, H_THUMBNAIL)); + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} + +void +ThumbnailProvider::DestroyDefaultThumbnailBitmap(void) +{ + AppLogDebug("ENTER"); + delete __pDefaultThumbnail; + __pDefaultThumbnail = null; + AppLogDebug("EXIT(%s)", GetErrorMessage(GetLastResult())); +} diff --git a/src/MpTypes.cpp b/src/MpTypes.cpp new file mode 100644 index 0000000..7464cce --- /dev/null +++ b/src/MpTypes.cpp @@ -0,0 +1,287 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpTypes.cpp + * @brief This is the implementation file for Types class. + */ + +#include +#include +#include "MpTypes.h" + +using namespace Tizen::Graphics; +using namespace Tizen::System; + +const Tizen::Base::String IDS_ALBUM_CONTENT_COUNT = L"AlbumContentCount"; + +const unsigned int COLOR_PANEL_BACKGROUND_GRAY_BLUE = Color32<182, 200, 214>::Value; +const unsigned int COLOR_WHITE = Color32<255, 255, 255>::Value; + +//XML LIST +const wchar_t* IDL_CONTENT_EDITOR_PANEL = L"IDL_CONTENT_EDITOR_PANEL"; +const wchar_t* IDC_CONTENT_EDITOR_TABLEVIEW = L"IDC_CONTENT_EDITOR_TABLEVIEW"; +const wchar_t* IDC_NO_CONTENT_IMAGE_LABEL = L"IDC_NO_CONTENT_IMAGE_LABEL"; +const wchar_t* IDC_NO_CONTENT_TEXT_LABEL = L"IDC_NO_CONTENT_TEXT_LABEL"; +const wchar_t* IDC_CHECKED_ITEM_COUNT_TEXT_LABEL = L"IDC_CHECKED_ITEM_COUNT_TEXT_LABEL"; + +//_XML IDL_ +const wchar_t* IDL_CONTENT_LIBARY_ALL_LIST_PANEL = L"IDL_CONTENT_LIBARY_ALL_LIST_PANEL"; +const wchar_t* IDL_CONTENT_LIBARY_COMMON_PANEL = L"IDL_CONTENT_LIBARY_COMMON_PANEL"; +const wchar_t* IDL_CONTENT_FORM = L"IDL_CONTENT_FORM"; +const wchar_t* IDL_MINI_PLYAER_PANEL = L"IDL_MINI_PLYAER_PANEL"; +const wchar_t* IDL_CONTENTS_DELETE_POPUP = L"IDL_CONTENTS_DELETE_POPUP"; +const wchar_t* IDL_CONTENTS_UPDATE_POPUP = L"IDL_CONTENTS_UPDATE_POPUP"; +const wchar_t* IDL_CREATE_PLAYLIST_POPUP = L"IDL_CREATE_PLAYLIST_POPUP"; +const wchar_t* IDL_SHARE_VIA_POPUP = L"IDL_SHARE_VIA_POPUP"; +const wchar_t* IDL_SET_AS_POPUP = L"IDL_SET_AS_POPUP"; +const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT = L"IDL_SWEEP_QUICK_MENU_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_SWEEP_QUICK_MENU_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT = L"IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_PANEL = L"IDL_CONTENTS_LIBARY_EDITOR_PANEL"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_MUSIC_PLAYER_FORM = L"IDL_MUSIC_PLAYER_FORM"; +const wchar_t* IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL = L"IDL_MUSIC_PLAYER_CONTENTS_ALBUM_VIEW_PANEL"; +const wchar_t* IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL = L"IDL_MUSIC_PLAYER_CONTENTS_LIST_VIEW_PANEL"; +const wchar_t* IDL_PLAYLIST_CREATOR_FORM = L"IDL_PLAYLIST_CREATOR_FORM"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT = L"IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_LIBARY_ITEM_SUBTEXT_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT = L"IDL_SWEEP_QUICK_ITEM2_PANEL_DEFAULT"; +const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT = L"IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE = L"IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE = L"IDL_SWEEP_QUICK_ITEM2_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT = L"IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_SWEEP_QUICK_PLAYALL_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_LIBARY_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_LIBARY_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_PLAYLIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTEXT_ITEM_PLAYALL_ADDTO = L"IDL_CONTEXT_ITEM_PLAYALL_ADDTO"; +const wchar_t* IDL_PLAYLIST_RENAME_FORM = L"IDL_PLAYLIST_RENAME_FORM"; +const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT = L"IDL_SWEEP_QUICK_ALBUM_PANEL_DEFAULT"; +const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT = L"IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE = L"IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE = L"IDL_SWEEP_QUICK_ALBUM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT = L"IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_LIBARY_ALBUM_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENTS_ARTIST_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENTS_DETAIL_FORM = L"IDL_CONTENTS_DETAIL_FORM"; +const wchar_t* IDL_CONTENT_LIST_FORM = L"IDL_CONTENT_LIST_FORM"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_LIST_FOLDER_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_LIST_FOLDER_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENT_LIST_ALBUM_INFO_PANEL = L"IDL_CONTENT_LIST_ALBUM_INFO_PANEL"; +const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT = L"IDL_ALBUM_CONTENT_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_ALBUM_CONTENT_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT = L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT= L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL = L"IDL_ALBUM_CONTENT_EDIT_ITEM_PANEL"; +const wchar_t* IDL_SETTING_FORM = L"IDL_SETTING_FORM"; +const wchar_t* IDL_SETTING_OFF_SET_ITEM_PANEL = L"IDL_SETTING_OFF_SET_ITEM_PANEL"; +const wchar_t* IDL_SETTING_PLAYLIST_SET_ITEM_PANEL = L"IDL_SETTING_PLAYLIST_SET_ITEM_PANEL"; +const wchar_t* IDL_GROUPEDTABLEVIEW_ITEM_PANEL = L"IDL_GROUPEDTABLEVIEW_ITEM_PANEL"; +const wchar_t* IDL_CONTENT_LIST_ARTIST_FORM = L"IDL_CONTENT_LIST_ARTIST_FORM"; +const wchar_t* IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL = L"IDL_CONTENT_LIST_ARTIST_GROUPITEM_PANEL"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_NOTHUMBNAIL_ITEM_PANEL_FONT_SIZE_GIANT"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT = L"IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_DEFAULT"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL = L"IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE = L"IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE = L"IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE"; +const wchar_t* IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT = L"IDL_CONTENT_NOTHUMBNAIL_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT"; +//_XML_IDL_ + +//_XML_IDC_ +const wchar_t* IDC_PALY_TOGGLE_CONTROL_BUTTON = L"IDC_PALY_TOGGLE_CONTROL_BUTTON"; +const wchar_t* IDC_PREVIOUS_CONTROL_BUTTON = L"IDC_PREVIOUS_CONTROL_BUTTON"; +const wchar_t* IDC_NEXT_CONTROL_BUTTON = L"IDC_NEXT_CONTROL_BUTTON"; +const wchar_t* IDC_NOW_PLAYING_STATE = L"IDC_NOW_PLAYING_STATE"; +const wchar_t* IDC_PROGRESS_BAR = L"IDC_PROGRESS_BAR"; +const wchar_t* IDC_BACK_BUTTON = L"IDC_BACK_BUTTON"; +const wchar_t* IDC_MORE_CONTEXT_MENU_BUTTON = L"IDC_MORE_CONTEXT_MENU_BUTTON"; +const wchar_t* IDC_CONTENTS_THUMBNAIL = L"IDC_CONTENTS_THUMBNAIL"; +const wchar_t* IDC_CONTENT_THUMBNAIL = L"IDC_CONTENT_THUMBNAIL"; +const wchar_t* IDC_CONTENTS_ARTIST_NAME = L"IDC_CONTENTS_ARTIST_NAME"; +const wchar_t* IDC_CONTENTS_TITLE_NAME = L"IDC_CONTENTS_TITLE_NAME"; +const wchar_t* IDC_MINI_PLAYER_REGISTER_BAR = L"IDC_MINI_PLAYER_REGISTER_BAR"; +const wchar_t* IDC_NO_CONTENTS_LABEL = L"IDC_NO_CONTENTS_LABEL"; +const wchar_t* IDC_CONTENTS_TABLEVIEW = L"IDC_CONTENTS_TABLEVIEW"; +const wchar_t* IDC_DELETE_BUTTON = L"IDC_DELETE_BUTTON"; +const wchar_t* IDC_CANCEL_BUTTON = L"IDC_CANCEL_BUTTON"; +const wchar_t* IDC_LABEL_DELETE_Q = L"IDC_LABEL_DELETE_Q"; +const wchar_t* IDC_SHARE_BUTTON = L"IDC_SHARE_BUTTON"; +const wchar_t* IDC_SET_AS_BUTTON = L"IDC_SET_AS_BUTTON"; +const wchar_t* IDC_ADD_TO_BUTTON = L"IDC_ADD_TO_BUTTON"; +const wchar_t* IDC_BUTTON_DELETE = L"IDC_BUTTON_DELETE"; +const wchar_t* IDC_PLAY_CONTENT_DURATION = L"IDC_PLAY_CONTENT_DURATION"; +const wchar_t* IDC_CONTENTS_EDIT_TABLEVIEW = L"IDC_CONTENTS_EDIT_TABLEVIEW"; +const wchar_t* IDC_ITEM_SELECTED_COUNT_LABEL = L"IDC_ITEM_SELECTED_COUNT_LABEL"; +const wchar_t* IDC_PANEL_REGISTER_BAR = L"IDC_PANEL_REGISTER_BAR"; +const wchar_t* IDC_PLAYER_CONTROL_BAR = L"IDC_PLAYER_CONTROL_BAR"; +const wchar_t* IDC_OPTION_VOLUMN = L"IDC_OPTION_VOLUMN"; +const wchar_t* IDC_OPTION_SHUFFLE = L"IDC_OPTION_SHUFFLE"; +const wchar_t* IDC_OPTION_PLAY_LIST_ADD = L"IDC_OPTION_PLAY_LIST_ADD"; +const wchar_t* IDC_OPTION_REPEAT = L"IDC_OPTION_REPEAT"; +const wchar_t* IDC_CURRENT_PLAYING_TIME = L"IDC_CURRENT_PLAYING_TIME"; +const wchar_t* IDC_CONTENT_TOTAL_TIME = L"IDC_CONTENT_TOTAL_TIME"; +const wchar_t* IDC_ALBUM_THUMBANIL_BACKGROUND = L"IDC_ALBUM_THUMBANIL_BACKGROUND"; +const wchar_t* IDC_ALBUM_TURN_TABLE = L"IDC_ALBUM_TURN_TABLE"; +const wchar_t* IDC_CONTENTS_VIEW_TOGGLE_BUTTON = L"IDC_CONTENTS_VIEW_TOGGLE_BUTTON"; +const wchar_t* IDC_SLIDER_BAR = L"IDC_SLIDER_BAR"; +const wchar_t* IDC_CREATE_BUTTON = L"IDC_CREATE_BUTTON"; +const wchar_t* IDC_TABLEVIEW = L"IDC_TABLEVIEW"; +const wchar_t* IDC_SPLIT_BAR = L"IDC_SPLIT_BAR"; +const wchar_t* IDC_EDITFIELD = L"IDC_EDITFIELD"; +const wchar_t* IDC_CONTENT_TOTAL_COUNT = L"IDC_CONTENT_TOTAL_COUNT"; +const wchar_t* IDC_THUMBNAIL_INNER_STROKE = L"IDC_THUMBNAIL_INNER_STROKE"; +const wchar_t* IDC_PLAY_ALL_BUTTON = L"IDC_PLAY_ALL_BUTTON"; +const wchar_t* IDC_STORAGE_TYPE_ICON = L"IDC_STORAGE_TYPE_ICON"; +const wchar_t* IDC_FOLDER_PATH = L"IDC_FOLDER_PATH"; +const wchar_t* IDC_FOLDER_NAME = L"IDC_FOLDER_NAME"; +const wchar_t* IDC_CONTENTS_ITEM_COUNT = L"IDC_CONTENTS_ITEM_COUNT"; +const wchar_t* IDC_BUTTON_EDIT = L"IDC_BUTTON_EDIT"; +const wchar_t* IDC_PLAY_ALL = L"IDC_PLAY_ALL"; +const wchar_t* IDC_ADD_TO_PLAYLIST = L"IDC_ADD_TO_PLAYLIST"; +const wchar_t* IDC_CONTENT_LIST_TABLEVIEW = L"IDC_CONTENT_LIST_TABLEVIEW"; +const wchar_t* IDC_PLAY_CONTENT_COUNT = L"IDC_PLAY_CONTENT_COUNT"; +const wchar_t* IDC_CONTENT_DURATION = L"IDC_CONTENT_DURATION"; +const wchar_t* IDC_CONTENT_FOLDER_STORAGE_ICON = L"IDC_CONTENT_FOLDER_STORAGE_ICON"; +const wchar_t* IDC_CONTENT_TITLE_NAME = L"IDC_CONTENT_TITLE_NAME"; +const wchar_t* IDC_CHECK_BOX_LABEL = L"IDC_CHECK_BOX_LABEL"; +const wchar_t* IDC_CONTENT_ADDITIONAL_REGISTER_BAR = L"IDC_CONTENT_ADDITIONAL_REGISTER_BAR"; +const wchar_t* IDC_ARTIST_NAME_LABEL = L"IDC_ARTIST_NAME_LABEL"; +const wchar_t* IDC_NAME_DATA_LABEL = L"IDC_NAME_DATA_LABEL"; +const wchar_t* IDC_FORMAT_DATA_LABEL = L"IDC_FORMAT_DATA_LABEL"; +const wchar_t* IDC_SIZE_DATA_LABEL = L"IDC_SIZE_DATA_LABEL"; +const wchar_t* IDC_FORWARDING_DATA_LABEL = L"IDC_FORWARDING_DATA_LABEL"; +const wchar_t* IDC_DATE_DATA_LABEL = L"IDC_DATE_DATA_LABEL"; +const wchar_t* IDC_LOCATION_DATA_LABEL = L"IDC_LOCATION_DATA_LABEL"; +//const wchar_t* IDC_TITLE_LABEL = L"IDC_TITLE_LABEL"; +const wchar_t* IDC_BALLOON_TOOLTIP_LABEL = L"IDC_BALLOON_TOOLTIP_LABEL"; +const wchar_t* IDC_NO_CONTENT_LABEL = L"IDC_NO_CONTENT_LABEL"; +const wchar_t* IDC_CONTENT_GROUPED_TABLEVIEW = L"IDC_CONTENT_GROUPED_TABLEVIEW"; +const wchar_t* IDC_LABEL_MAIN_TEXT = L"IDC_LABEL_MAIN_TEXT"; +const wchar_t* IDC_LABEL_SUB_TEXT = L"IDC_LABEL_SUB_TEXT"; +const wchar_t* IDC_LABEL_EX = L"IDC_LABEL_EX"; +const wchar_t* IDC_MEDIA_INFO_LABEL = L"IDC_MEDIA_INFO_LABEL"; +const wchar_t* IDC_NAME_LABEL = L"IDC_NAME_LABEL"; +const wchar_t* IDC_FORMAT_LABEL = L"IDC_FORMAT_LABEL"; +const wchar_t* IDC_SIZE_LABEL = L"IDC_SIZE_LABEL"; +const wchar_t* IDC_FORWARDING_LABEL = L"IDC_FORWARDING_LABEL"; +const wchar_t* IDC_DATE_LABEL = L"IDC_DATE_LABEL"; +const wchar_t* IDC_LOCATION_LABEL = L"IDC_LOCATION_LABEL"; +const wchar_t* IDC_NO_CONTENTS_PANEL = L"IDC_NO_CONTENTS_PANEL"; +//__XML_IDC_ + +//<--__XML_IDC_ORDERING PREFIX : IDC_CONTROLTYPE_ EX) IDC_BUTTON_TOGGLE_PLAY +const wchar_t* IDC_LABEL_BALLOON_TOOLTIP = L"IDC_LABEL_BALLOON_TOOLTIP"; +const wchar_t* IDC_LABEL_NO_CONTENT = L"IDC_LABEL_NO_CONTENT"; +const wchar_t* IDC_GROUPEDTABLEVIEW_CONTENT_LIST = L"IDC_GROUPEDTABLEVIEW_CONTENT_LIST"; +const wchar_t* IDC_TABLEVIEW_CONTENT_LIST = L"IDC_TABLEVIEW_CONTENT_LIST"; +const wchar_t* IDC_LABEL_CONTENT_THUMBNAIL = L"IDC_LABEL_CONTENT_THUMBNAIL"; +const wchar_t* IDC_LABEL_CONTENT_TITLE_NAME = L"IDC_LABEL_CONTENT_TITLE_NAME"; +const wchar_t* IDC_LABEL_THUMBNAIL_INNER_STROKE = L"IDC_LABEL_THUMBNAIL_INNER_STROKE"; +const wchar_t* IDC_LABEL_CONTENT_ADDITIONAL_INFO = L"IDC_LABEL_CONTENT_ADDITIONAL_INFO"; +const wchar_t* IDC_LABEL_ALBUM_BACKGROUND = L"IDC_LABEL_ALBUM_BACKGROUND"; +//__XML_IDC_ORDERING--> + +//IMAGE +const wchar_t* IDB_STORAGE_SDCARD = L"T02_folder_storage_icon_memory.png"; +const wchar_t* IDB_STORAGE_PHONE = L"T02_folder_storage_icon_inner_memory.png"; +const wchar_t* IDB_STORAGE_EXTERNAL = L"T02_folder_storage_icon_memory.png"; +const wchar_t* IDB_NO_CONTENTS = L"T02_nocomposers.png"; +const wchar_t* IDB_MUSIC_LINE_CONTENT_FORM = L"T02_music_line.png"; + +//COLOR +const unsigned int COLOR_HEADER_TITLE_TEXT = Color32<59, 115, 182>::Value; +const unsigned int COLOR_HEADER_DESCRIPTION_TEXT = Color32<155, 154, 150>::Value; +const unsigned int COLOR_ITEM_SUB_TEXT = Color32<128, 128, 128>::Value; + +//COMMON +const Tizen::Base::String IDS_SEPARATOR_SLASH = L"/"; +//const Tizen::Base::String IDS_STORAGE_PHONE_PATH = Environment::GetMediaPath() + L"Sounds/"; +const Tizen::Base::String IDS_STORAGE_PHONE_PATH = Environment::GetMediaPath(); +const Tizen::Base::String IDS_STORAGE_SDCARD_PATH = Environment::GetExternalStoragePath(); +const Tizen::Base::String IDS_STORAGE_FULL = L"Storage Full"; +const wchar_t* PARAM_FONT_SIZE = L"http://tizen.org/setting/font.size" ; +const wchar_t* PARAM_STORAGE_MEMORY_INTERNAL = L"http://tizen.org/runtime/storage.available.internal"; +//SIZE,POINT +const int H_TABLEVIEW_IITEM = 140; +const int H_TABLEVIEW_GROUP_ITEM = 144; +const int H_BALLOON_TOOL_TIP = 48; +const int X_POINT_FOOTER_MORE = 57; +const int Y_POINT_PORTRAIT_FOOTER_MORE = 1200; +const int Y_POINT_LANDSCAPE_FOOTER_MORE = 646; +const int W_WVGA_RESOLUTION = 480; +const float MARGIN_LEFT_THUMBNAIL_INNER_STROKE = 20.0f; +const float MARGIN_TOP_THUMBNAIL_INNER_STROKE = 16.0f; +//VALUE +const int MAX_PLAY_STATE_SLIDER_COUNT = 100; +const int MIN_PLAY_STATE_SLIDER_COUNT = 0; +const int STORAGE_THRESHOLD_VALUE = 102400; +//timer values +const int COUNT_MESSAGE_BOX_TIMEOUT = 3000; +const int MESSAGE_BOX_DELAY = 20; + diff --git a/src/MpUserPlaylistContentListForm.cpp b/src/MpUserPlaylistContentListForm.cpp new file mode 100644 index 0000000..af98f66 --- /dev/null +++ b/src/MpUserPlaylistContentListForm.cpp @@ -0,0 +1,829 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpUserPlaylistContentListForm.cpp + * @brief This is the implementation file for UserPlaylistContentListForm class. + */ + +#include "MpAllListPresentationModel.h" +#include "MpPlaylistListPresentationModel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" +#include "MpUserPlaylistContentListForm.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +UserPlaylistContentListForm::UserPlaylistContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pContentListTableView(null) + , __pThumbnail(null) + , __pPresentationModel(null) + , __checkedItemCount(0) + , __activatedStateContextItem(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +UserPlaylistContentListForm::~UserPlaylistContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +UserPlaylistContentListForm::Initialize(void) +{ + AppLogDebug("ENTER"); + if (IsFailed(Form::Construct(IDL_CONTENT_LIST_FORM))) + { + AppLogDebug("Construct(IDL_CONTENT_LIST_FORM) failed(%s)", GetErrorMessage(GetLastResult())); + return false; + } + + AppLogDebug("EXIT"); + return Construct(); +} + +result +UserPlaylistContentListForm::Construct(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView = static_cast(GetControl(IDC_TABLEVIEW_CONTENT_LIST)); + __pContentListTableView->AddTableViewItemEventListener(*this); + __pContentListTableView->SetItemProvider(this); + + SetContentList(__pContentListTableView); + AppLogDebug("EXIT"); + return ContentListForm::Construct(); +} + +result +UserPlaylistContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +UserPlaylistContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + ThumbnailBase::Stop(); + __pPresentationModel = null; + AppLogDebug("EXIT"); + return ContentListForm::OnTerminating(); +} + +void +UserPlaylistContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_HEADER_BUTTON_SELECTE_ALL: + { + bool isChecked = true; + if (__checkedItemCount == __pContentListTableView->GetItemCount()) + { + isChecked = false; + } + SetItemCheckedAll(isChecked); + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + LanucherPicker(PICKER_TYPE_SHARE_PICKER); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + LanucherPicker(PICKER_TYPE_PLAY_LIST_PICKER); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH, SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY)); + } + break; + + case IDA_CONTEXT_MENU_ITEM_EDIT: + { + ToggleScreenState(SCREEN_STATE_EDITOR); + } + break; + + case IDA_CONTEXT_MENU_ITEM_SHARE_VIA: + { + ToggleScreenState(SCREEN_STATE_SHARE_VIA); + } + break; + + case IDA_FOOTER_BUTTON_MORE: + { + CreateOptionMenuN(source); + if (IsEmptyContentList()) + { + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_ADD); + } + else + { + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_ADD | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + SetCommonPopup(CommonUtil::CreateContentDeletePopup(*this, IDA_COMMON_POPUP_DELETE, IDA_COMMON_POPUP_CANCEL),this); + } + break; + + case IDA_COMMON_POPUP_DELETE: + { + int totalCount = __pPresentationModel->GetContentCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + __pContentListTableView->SetItemChecked(iCount, false); + __checkedItemCount--; + + if (pContentInfoStruct == null) + { + return; + } + __pPresentationModel->DeleteContent(USER_CONTENT, *pContentInfoStruct); + + delete pContentInfoStruct; + } + } + RemoveCheckedTableviewItem(false); + __pPresentationModel->UpdatePlaylistContentList(USER_CONTENT, __headerTitle); + UpdateScreenState(); + UpdateTableView(); + + if(__pPresentationModel->GetContentCount() == 0) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + } + } + break; + + case IDA_COMMON_POPUP_CANCEL: + { + // empty statement + } + break; + + case IDA_CONTEXT_MENU_ITEM_STYLE_ADD: + { + AllListPresentationModel* pPresentationModel = AllListPresentationModel::GetInstance(); + pPresentationModel->UpdateContentList(); + if (pPresentationModel->GetTotalCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_MUSIC_HEADER_NO_SONGS"), MSGBOX_STYLE_NONE, 500); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + else + { + CommonUtil::SetAddtoPlaylistState(true); + CommonUtil::SetAddtoPlaylistName(__headerTitle); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_ALL_CONTENT_PICKER)); + } + } + break; + + default: + break; + } + TryRemoveCommonPopup(actionId); + TryRemoveContextMenu(actionId); + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null && previousSceneId.Equals(IDSCN_PLAYLIST_LIST, true) == true) + { + __prevSceneId.Clear(); + __headerTitle.Clear(); + __prevSceneId.Append(*static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME))); + __headerTitle.Append(*static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME))); + + __pPresentationModel = PlaylistListPresentationModel::GetInstance(); + __pPresentationModel->UpdatePlaylistContentList(USER_CONTENT, __headerTitle); + + SetHeader(); + UpdateScreenState(); + UpdateTableView(); + + pArgs->RemoveAll(true); + delete pArgs; + } + else if (pArgs != null && previousSceneId.Equals(IDSCN_PLAYLIST_CREATOR, false)) + { + SetItemCheckedAll(false); + pArgs->RemoveAll(true); + delete pArgs; + } + else if (!(__headerTitle.Equals(L"", false))) + { + __pPresentationModel->UpdatePlaylistContentList(USER_CONTENT, __headerTitle); + UpdateScreenState(); + if (!previousSceneId.Equals(IDSCN_PLAYER,true)) + { + UpdateTableView(); + } + } + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +UserPlaylistContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + AppLogDebug("EXIT"); + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(); +} + +Tizen::Ui::Controls::TableViewItem* +UserPlaylistContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + RelativeLayout layout; + layout.Construct(); + + TableViewAnnexStyle tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_NORMAL; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + tableViewAnnexStyle = TABLE_VIEW_ANNEX_STYLE_MARK; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(itemIndex); + + result r = pItem->Construct(layout, Dimension(itemWidth, __itemHeight), tableViewAnnexStyle); + TryCatch(r == E_SUCCESS, delete pItem, "pItem->Construct(%s)", GetErrorMessage(r)); + TryCatch(pContentInfo != null, delete pItem, "pContentInfo is null", GetErrorMessage(GetLastResult())); + + r = CreateTableViewItem(*pItem, *pContentInfo); + TryCatch(r == E_SUCCESS, delete pItem, "CreateTableViewItem failed(%s)", GetErrorMessage(r)); + + RequestThumbnail(pContentInfo->contentId, (new (std::nothrow) Integer(itemIndex))); + delete pContentInfo; + + AppLogDebug("EXIT"); + return pItem; + +CATCH: + AppLogDebug("EXIT(%ls)", GetErrorMessage(GetLastResult())); + delete pContentInfo; + return null; +} + +void +UserPlaylistContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + SetItemCheckedStateChanged(status); + AppLogDebug("EXIT"); + return; + } + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + ArrayList* pSceneArg = MakePlayerSceneParam(itemIndex); + if (pSceneArg != null) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), pSceneArg); + } + } + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (itemIndex >= 0) + { + __activatedStateContextItem = itemIndex; + } + AppLogDebug("EXIT"); +} + +int +UserPlaylistContentListForm::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +bool +UserPlaylistContentListForm::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +UserPlaylistContentListForm::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +UserPlaylistContentListForm::CreateTableViewItem(Tizen::Ui::Container& parent, const ContentInformation& contentInfo) +{ + AppLogDebug("ENTER"); + Panel* pTableViewItem = new (std::nothrow) Panel(); + + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_EDITOR_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + else + { + if (__fontSizeValue.Equals(STRING_FONT_SIZE_GIANT, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_GIANT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_HUGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_HUGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_LARGE, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_LARGE))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else if (__fontSizeValue.Equals(STRING_FONT_SIZE_SMALL, false)) + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_FONT_SIZE_SMALL))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + else + { + if (IsFailed(pTableViewItem->Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL_DEFAULT))) + { + AppLogDebug("Construct(IDL_CONTENTS_LIBARY_ITEM_PANEL) failed(%s)", GetErrorMessage(GetLastResult())); + return E_FAILURE; + } + } + } + + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_TITLE_NAME))->SetText(contentInfo.TitleName); + static_cast(pTableViewItem->GetControl(IDC_CONTENTS_ARTIST_NAME))->SetText(contentInfo.ArtistName); +// static_cast(pTableViewItem->GetControl(IDC_CONTENTS_THUMBNAIL))->SetBackgroundBitmap(*GetDefaultThumbnail()); + + parent.AddControl(pTableViewItem); + CommonUtil::SetLayoutFitToContainer(parent, *pTableViewItem); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +UserPlaylistContentListForm::SetHeader(void) +{ + AppLogDebug("ENTER"); + CommonUtil::SetSimpleTitleStyle(*GetHeader(), __headerTitle); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +bool +UserPlaylistContentListForm::IsEmptyContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel->GetContentCount() != INIT_VALUE) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +Tizen::Base::Collection::ArrayList* +UserPlaylistContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pArgs = new (std::nothrow) ArrayList(); + result r = pArgs->Construct(); + if (IsFailed(r)) + { + AppLogDebug("pArgs->Construct failed(%s)", GetErrorMessage(r)); + return null; + } + + pArgs->Add(*(new (std::nothrow) String(MUSIC))); + pArgs->Add(*(new (std::nothrow) Integer(startIndex))); + pArgs->Add(*(__pPresentationModel->GetContentPathListN(USER_CONTENT))); + + AppLogDebug("EXIT"); + return pArgs; +} + +void +UserPlaylistContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + __pThumbnail = pThumbnailInfo->GetBitmapN(); + Object* pParam = pThumbnailInfo->GetUserParamN(); + if (pParam != null) + { + __pContentListTableView->RefreshItem((static_cast(pParam))->ToInt(), TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pParam; + } + + delete pThumbnailInfo; + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + ContentListForm::OnUserEventReceivedN(requestId, pArgs); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + __pPresentationModel->UpdatePlaylistContentList(USER_CONTENT, __headerTitle); + __pContentListTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + + if (pItem == null) + { + AppLogDebug("pItem is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + Label* pThumbnailLabel = static_cast(pItem->GetControl(IDC_CONTENTS_THUMBNAIL, true)); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} + +int +UserPlaylistContentListForm::GetCheckedItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __checkedItemCount; +} + +void +UserPlaylistContentListForm::UpdateTableView(void) +{ + AppLogDebug("ENTER"); + __pContentListTableView->UpdateTableView(); + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + __pPresentationModel->UpdatePlaylistContentList(USER_CONTENT, __headerTitle); + + if(__pPresentationModel->GetContentCount() == 0) + { +// __headerTitle.Clear(); + CommonUtil::SetAddtoPlaylistState(false); +// CommonUtil::SetAddtoPlaylistName(__headerTitle); + ToggleScreenState(SCREEN_STATE_NORMAL); + } + else + { + UpdateTableView(); + } + + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::SetItemCheckedAll(bool isChecked) +{ + AppLogDebug("ENTER"); + if (isChecked == true) + { + __checkedItemCount = __pContentListTableView->GetItemCount(); + } + else + { + __checkedItemCount = INIT_VALUE; + } + CommonUtil::SetItemCheckedAll(isChecked, *__pContentListTableView); + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), isChecked); + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::RemoveCheckedTableviewItem(bool itemRemove) +{ + AppLogDebug("ENTER"); + if (itemRemove) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + __pContentListTableView->SetItemChecked(iCount, false); + __checkedItemCount--; + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo != null) + { + RemoveContentAt(pContentInfo->contentId); + delete pContentInfo; + } + } + } + } + else + { + SetItemCheckedAll(false); + } + + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::SetItemCheckedStateChanged(Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + if (status == TABLE_VIEW_ITEM_STATUS_UNCHECKED) + { + __checkedItemCount--; + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), false); + } + } + } + else if (status == TABLE_VIEW_ITEM_STATUS_CHECKED) + { + if (__checkedItemCount == INIT_VALUE) + { + if (GetFooter() != null) + { + CommonUtil::SetFooterItemEnabled(*GetFooter(), true); + } + } + + __checkedItemCount++; + } + + SetCheckedCountBallonTooltip(GetCheckedItemCount()); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::IList* +UserPlaylistContentListForm::GetPickerArgumentListN(PickerType pickerType, PickerArgumentType argumentType) +{ + AppLogDebug("ENTER"); + Tizen::Base::Collection::ArrayList* pContentFilePathList = new (std::nothrow) ArrayList(SingleObjectDeleter); + if (IsFailed(pContentFilePathList->Construct())) + { + AppLogDebug("pContentList->Construct failed(%s)", GetErrorMessage(GetLastResult())); + delete pContentFilePathList; + return null; + } + + if (argumentType == PICKER_ARGUMENT_TYPE_ACTIVATED_STATE_CONTEXT_ITEM) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__activatedStateContextItem); + if (pContentInfo == null) + { + delete pContentFilePathList; + AppLogDebug("GetContentInfoN(%d) is null", __activatedStateContextItem); + return null; + } + + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + delete pContentInfo; + } + else if (argumentType == PICKER_ARGUMENT_TYPE_CHECKED_ITEM_ALL) + { + int totalCount = __pContentListTableView->GetItemCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentListTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfo == null) + { + AppLogDebug("GetContentInfoN(%d) is null", iCount); + delete pContentFilePathList; + return null; + } + + if (pickerType == PICKER_TYPE_PLAY_LIST_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + else if (pickerType == PICKER_TYPE_SHARE_PICKER) + { + pContentFilePathList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + } + delete pContentInfo; + } + } + } + AppLogDebug("EXIT"); + return pContentFilePathList; +} + +void +UserPlaylistContentListForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + ArrayList* pList = null; + if (GetScreenState() != SCREEN_STATE_NORMAL) + { + ToggleScreenState(SCREEN_STATE_NORMAL); + AppLogDebug("EXIT"); + return; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pList = new (std::nothrow) ArrayList(); + pList->Construct(); + pSceneManager->GoBackward(BackwardSceneTransition(), pList); + AppLogDebug("EXIT"); +} + +void +UserPlaylistContentListForm::OnFormMenuRequested(Tizen::Ui::Controls::Form& source) +{ + if (GetScreenState() == SCREEN_STATE_NORMAL) + { + CreateOptionMenuN(source); + if (IsEmptyContentList()) + { + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_ADD); + } + else + { + SetOptionMenuItem(CONTEXT_MENU_ITEM_STYLE_ADD | CONTEXT_MENU_ITEM_STYLE_SHARE_VIA | CONTEXT_MENU_ITEM_STYLE_EDIT); + } + } +} + +void +UserPlaylistContentListForm::OnFontSizeChanged(void) +{ + __fontSizeValue = CommonUtil::GetFontSizeValue(); + __itemHeight = CommonUtil::GetItemHeight(__fontSizeValue); + __pContentListTableView->UpdateTableView(); +} diff --git a/src/MpYearContentListForm.cpp b/src/MpYearContentListForm.cpp new file mode 100644 index 0000000..5d87dc0 --- /dev/null +++ b/src/MpYearContentListForm.cpp @@ -0,0 +1,920 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearContentListForm.cpp + * @brief This is the implementation file for YearContentListForm class. + */ +#if 0 +#include +#include "MpPlaylistPickerPopup.h" +#include "MpSharePopup.h" +#include "MpThumbnailInfo.h" +#include "MpYearContentListForm.h" +#include "MpYearListPresentationModel.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const int X_OFFSET_EDIT_STYLE_TABLE_VIEW = 96; + +static const Tizen::Graphics::Rectangle RECT_YEAR_ITEM_THUMBNAIL (16, 8, 112, 112); +static const Tizen::Graphics::Rectangle RECT_YEAR_ITEM_TITLE_NAME (144, 8, 300, 66); +static const Tizen::Graphics::Rectangle RECT_YEAR_ITEM_TIME (444, 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_YEAR_ITEM_ARTIST_NAME (144, 66, 560, 46); + +static const Tizen::Graphics::Rectangle RECT_YEAR_EDIT_ITEM_TITLE_NAME (144, 8, (300 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 66); +static const Tizen::Graphics::Rectangle RECT_YEAR_EDIT_ITEM_TIME ((444 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 8, 260, 66); +static const Tizen::Graphics::Rectangle RECT_YEAR_EDIT_ITEM_ARTIST_NAME (144, 66, (560 - X_OFFSET_EDIT_STYLE_TABLE_VIEW), 46); + + +YearContentListForm::YearContentListForm(void) + : ContentListForm::ContentListForm() + , ThumbnailBase::ThumbnailBase() + , __pThumbnail(null) + , __pPresentationModel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearContentListForm::~YearContentListForm(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +YearContentListForm::OnInitializing(void) +{ + AppLogDebug("ENTER"); + CreateTableview(); + CreateSelectAllCheckedButton(); + CreateCheckedCountLabel(); + CreateNoContentImage(L"IDS_MUSIC_HEADER_NO_SONGS"); + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(GetClientAreaBounds().width, ITEM_HEIGHT)); + CreateTableViewContextItem(*__pContextItem); + CreateDeletePopup(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +YearContentListForm::OnTerminating(void) +{ + AppLogDebug("ENTER"); + __checkedItemCount = 0; + RemovePlayListPicker(); + + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +YearContentListForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + if (pArgs != null) + { + __pStrSceneId = static_cast(pArgs->GetAt(DATA_ITEM_SCENE_NAME)); + __pStrContentName = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_NAME)); + __currentContentIndex = static_cast(pArgs->GetAt(DATA_ITEM_CONTENT_TYPE))->ToInt(); + __pPresentationModel = YearListPresentationModel::GetInstance(); + __pPresentationModel->UpdateYearList(); + __pPresentationModel->InitializeContentList(__currentContentIndex); + } + else + { + // Empty statement + } + + ContentInformation* pContentInfoStruct = null; + pContentInfoStruct = __pPresentationModel->GetContentInfoN(0); + if (pContentInfoStruct == null) + { + return; + } + + InitializeHeader(*pContentInfoStruct); + if (__checkEdit == true) + { + Footer* pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + } + else + { + Footer* pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + } + __pContentTableView->UpdateTableView(); + + delete pContentInfoStruct; + pContentInfoStruct = null; + AppLogDebug("EXIT"); +} + +void +YearContentListForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +void +YearContentListForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FLICK_BUTTON_SHARE: + // fall through + case IDA_FLICK_BUTTON_SET: + { + CreateContextMenu(source); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + ContentInformation* pContentInfo; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(pContentInfo->ContentFilePath))); + + delete pContentInfo; + pContentInfo = null; + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + } + break; + + case IDA_FLICK_BUTTON_DELETE: + { + if (__pDeletePopup != null) + { + __pDeletePopup->SetShowState(true); + __pDeletePopup->Show(); + } + } + break; + + case IDA_DELETE_POPUP_DELETE: + // fall through + case IDA_DELETE_POPUP_CANCEL: + { + __pDeletePopup->SetShowState(false); + __pDeletePopup->Show(); + if (actionId == IDA_DELETE_POPUP_DELETE && __pPresentationModel != null) + { + ContentManager contentManager; + contentManager.Construct(); + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + contentManager.DeleteContent(pContentInfo->contentId); + Footer* pFooter = GetFooter(); + + delete pContentInfo; + pContentInfo = null; + + __pPresentationModel->RefreshContentList(__currentContentIndex); + + if (__pPresentationModel->GetContentCount(__currentContentIndex) <= INIT_VALUE) + { + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_EDIT_FOOTER_EDIT, false); + pFooter->Invalidate(true); + } + + __pContentTableView->RefreshItem(__itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } + } + break; + + case IDA_SHARE_CONTEXT_MENU_EMAIL: + // fall through + case IDA_SHARE_CONTEXT_MENU_MESSAGE: + { + String providerID = ((actionId == IDA_SHARE_CONTEXT_MENU_EMAIL) ? PROVIDER_ID_EMAIL : PROVIDER_ID_MESSAGE); + AppControl* pAppControl = AppManager::FindAppControlN(providerID, OPERATION_ID_COMPOSE); + if (pAppControl == null) + { + return; + } + + ContentInformation* pContentInfo = null; + pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_ATTACHMENTS), new (std::nothrow) String(pContentInfo->ContentFilePath)); + + pAppControl->Start(null, null, pDataList, this); + + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + + delete pContentInfo; + pContentInfo = null; + } + break; + + case IDA_SET_CONTEXT_MENU_CALL: + { + result r = E_SUCCESS; + ContentInformation* pContentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + + if (pContentInfo == null) + { + return; + } + r = SettingInfo::SetValue(CALL_RINGTONE_KEY, pContentInfo->ContentFilePath); + + delete pContentInfo; + pContentInfo = null; + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + } + break; + + case IDA_SET_CONTEXT_MENU_CALLER: + { + AppControl* pAppControl = AppManager::FindAppControlN(TIZEN_APPCONTROL_PROVIDER_CONTACT, TIZEN_APPCONTROL_OPERATION_PICK); + if (pAppControl == null) + { + return; + } + + HashMap* pDataList = new (std::nothrow) HashMap(SingleObjectDeleter); + pDataList->Construct(); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_SINGLE_MODE), new (std::nothrow) String(APPCONTROL_VALUE_SINGLE)); + pDataList->Add(new (std::nothrow) String(APPCONTROL_KEY_RETURNTYPE), new (std::nothrow) String(APPCONTROL_VALUE_CONTACTID)); + + pAppControl->Start(null, null, pDataList, this); + if (pAppControl != null) + { + delete pAppControl; + pAppControl = null; + } + } + break; + + case IDA_FOOTER_BUTTON_EDIT: + { + ToggleViewMode(false); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + __checkedItemCount = INIT_VALUE; + __pSelectAllCheckedButton->SetSelected(false); + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + ToggleViewMode(true); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_CHECK_BUTTON: + { + __checkedItemCount = __pPresentationModel->GetContentCount(__currentContentIndex); + if (__checkedItemCount > INIT_VALUE) + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + } + CommonUtil::SetAllCheckState(true, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_UNCHECK_BUTTON: + { + Footer* pFooter = GetFooter(); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, __pPresentationModel->GetContentCount(__currentContentIndex)); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case IDA_FOOTER_BUTTON_DELETE: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + int iCount = 0; + + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + pFooter->Invalidate(true); + + contentManager.Construct(); + for (iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pContentTableView->SetItemChecked(iCount,false); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + contentManager.DeleteContent(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + __pPresentationModel->RefreshContentList(__currentContentIndex); + __pContentTableView->UpdateTableView(); + __pContentTableView->Invalidate(true); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + + if (__pPresentationModel->GetContentCount(__currentContentIndex) > 0) + { + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + } + else + { + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + } + break; + + case IDA_FOOTER_BUTTON_SHARE: + { + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + Footer* pFooter = GetFooter(); + int totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pDataList->Construct(); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfoStruct == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + pDataList->Add(*(new (std::nothrow) String(L"attachment:" + pContentInfoStruct->ContentFilePath))); + + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + Invalidate(true); + if (__pSharePopup == null) + { + __pSharePopup = new (std::nothrow) SharePopup(); + __pSharePopup->Initialize(); + } + __pSharePopup->SetShowState(true); + __pSharePopup->Show(); + __pSharePopup->SetArguments(pDataList); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + ContentManager contentManager; + Footer* pFooter = GetFooter(); + Tizen::Base::Collection::ArrayList* pDataList = new (std::nothrow) ArrayList(); + int totalCount = 0; + + if (__checkedItemCount <= 0) + { + return; + } + + pDataList->Construct(); + contentManager.Construct(); + totalCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(iCount); + if (pContentInfoStruct == null) + { + pDataList->RemoveAll(true); + delete pDataList; + pDataList = null; + return; + } + + pDataList->Add(*(new (std::nothrow) String(pContentInfoStruct->ContentFilePath))); + __pContentTableView->SetItemChecked(iCount, false); + + delete pContentInfoStruct; + pContentInfoStruct = null; + } + } + + if (IsFailed(CreatePlayListPickerPopup(pDataList))) + { + AppLogDebug("CreatePlayListPickerPopup failed(%s)", GetLastResult()); + return; + } + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + Invalidate(true); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +int +YearContentListForm::GetItemCount(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__currentContentIndex); +} + +Tizen::Ui::Controls::TableViewItem* +YearContentListForm::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = null; + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + if (__checkEdit) + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); + } + else + { + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); + pItem->SetContextItem(__pContextItem); + } +// pItem->SetBackgroundColor(COLOR_WHITE); + + pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + delete pItem; + pItem = null; + return null; + } + + RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CreateTableViewItem(*pItem, *pContentInfoStruct); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +void +YearContentListForm::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + Footer* pFooter = GetFooter(); + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, true); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, true); + + pFooter->Invalidate(true); + if (__checkedItemCount == __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(true); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + Footer* pFooter = GetFooter(); + + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + + if (__checkedItemCount == INIT_VALUE) + { + pFooter->SetItemEnabled(INDEX_FOOTER_DELETE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_SHARE, false); + pFooter->SetItemEnabled(INDEX_FOOTER_ADDTOPLATLIST, false); + + pFooter->Invalidate(true); + } + + if (__checkedItemCount != __pPresentationModel->GetContentCount(__currentContentIndex)) + { + __pSelectAllCheckedButton->SetSelected(false); + } + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *this); + } + break; + + case TABLE_VIEW_ITEM_STATUS_SELECTED: + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + ArrayList* tempArg; + AppAssert(pSceneManager); + tempArg = MakePlayerSceneParam(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYER), tempArg); + + if (tempArg != null) + { + tempArg->RemoveAll(); + delete tempArg; + tempArg = null; + } + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +YearContentListForm::MakePlayerSceneParam(int startIndex) +{ + AppLogDebug("ENTER"); + ArrayList* pTempList = new (std::nothrow) ArrayList(); + ArrayList* pSelectedMusicContent = null; + + pSelectedMusicContent = __pPresentationModel->GetContentPathListN(__currentContentIndex); + if (pTempList == null || pSelectedMusicContent == null) + { + AppLogDebug("EXIT"); + return null; + } + pTempList->Construct(); + + pTempList->Add(*(new (std::nothrow) String(MUSIC))); + pTempList->Add(*(new (std::nothrow) Integer(startIndex))); + pTempList->Add(*(pSelectedMusicContent)); + + AppLogDebug("EXIT"); + return pTempList; +} + +result +YearContentListForm::CreateTableViewItem(Tizen::Ui::Container& parent, + const ContentInformation& contentInfoStruct) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + Rectangle rectTitleName; + Rectangle rectPlayTime; + Rectangle rectArtistName; + + if (__checkEdit) + { + rectTitleName = RECT_YEAR_EDIT_ITEM_TITLE_NAME; + rectArtistName = RECT_YEAR_EDIT_ITEM_ARTIST_NAME; + rectPlayTime = RECT_YEAR_EDIT_ITEM_TIME; + } + else + { + rectTitleName = RECT_YEAR_ITEM_TITLE_NAME; + rectArtistName = RECT_YEAR_ITEM_ARTIST_NAME; + rectPlayTime = RECT_YEAR_ITEM_TIME; + } + + Label* pThumbnailLabel = new (std::nothrow) Label(); + pThumbnailLabel->Construct(RECT_YEAR_ITEM_THUMBNAIL, L""); + pThumbnailLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pThumbnailLabel->SetBackgroundBitmap(*GetDefaultThumbnail()); + pThumbnailLabel->SetName(L"pThumbnailLabel"); + + Label* pTitleLabel = new (std::nothrow) Label(); + pTitleLabel->Construct(rectTitleName, L""); + pTitleLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTitleLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pTitleLabel->SetText(contentInfoStruct.TitleName); + + Label* pArtistNameLabel = new (std::nothrow) Label(); + pArtistNameLabel->Construct(rectArtistName, L""); + pArtistNameLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pArtistNameLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pArtistNameLabel->SetText(contentInfoStruct.ArtistName); + + Label* pTimeLabel = new (std::nothrow) Label(); + pTimeLabel->Construct(rectPlayTime, L""); + pTimeLabel->SetTextConfig(FONT_SIZE, LABEL_TEXT_STYLE_NORMAL); + pTimeLabel->SetTextHorizontalAlignment(ALIGNMENT_RIGHT); + pTimeLabel->SetText(CommonUtil::GetFormatDate(contentInfoStruct.Duration)); + + parent.AddControl(pThumbnailLabel); + parent.AddControl(pTitleLabel); + parent.AddControl(pArtistNameLabel); + parent.AddControl(pTimeLabel); + AppLogDebug("EXIT"); + return r; +} + +void +YearContentListForm::ToggleViewMode(bool editMode) +{ + AppLogDebug("ENTER"); + Footer* pFooter = GetFooter(); + + if (editMode) + { + int currentAlbumContentCount = 0; + currentAlbumContentCount = __pPresentationModel->GetContentCount(__currentContentIndex); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + pFooter = CommonUtil::CreateEditFooter(*this); + pFooter->AddActionEventListener(*this); + pFooter->SetBackButton(); + SetFormBackEventListener(this); + + if ( currentAlbumContentCount > INIT_VALUE) + { + SetTitleText(__strHeaderName); + } + else + { + SetTitleText("No songs"); + CommonUtil::ShowNoContentImage(INIT_VALUE, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + pFooter->SetItemEnabled(INDEX_FOOTER_EDIT, false); + } + + __pSelectAllCheckedButton->SetEnabled(false); + __pSelectAllCheckedButton->SetShowState(false); + + __checkEdit = false; + __pContentTableView->SetBounds(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height)); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + else + { + SetTitleText(ResourceManager::GetString("IDS_COM_BODY_EDIT")); + + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + + pFooter = CommonUtil::CreateDeleteFooter(*this); + pFooter->AddActionEventListener(*this); + + __pSelectAllCheckedButton->SetEnabled(true); + __pSelectAllCheckedButton->SetShowState(true); + + __checkEdit = true; + __pContentTableView->SetBounds(Rectangle(0, __pSelectAllCheckedButton->GetHeight(), GetClientAreaBounds().width, (GetClientAreaBounds().height - __pSelectAllCheckedButton->GetHeight()))); + __pContentTableView->Invalidate(true); + __pContentTableView->UpdateTableView(); + } + Invalidate(true); + AppLogDebug("EXIT"); +} + +void +YearContentListForm::OnAppControlCompleteResponseReceived(const AppId& appId, + const String& operationId, AppCtrlResult appControlResult, + const IMap* pExtraData) +{ + AppLogDebug("ENTER"); + if (pExtraData == null) + { + AppLogDebug("EXIT"); + return; + } + AppLogDebug("%ls, %ls", appId.GetPointer(), operationId.GetPointer()); + if (appId.Equals(String(TIZEN_APPCONTROL_PROVIDER_CONTACT))) + { + if (appControlResult == APP_CTRL_RESULT_SUCCEEDED) + { + const String* pContactId = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_RETURNTYPE))); + if (pContactId->Equals(APPCONTROL_VALUE_CONTACTID, true)) + { + const String* pResultString = static_cast(pExtraData->GetValue(String(APPCONTROL_KEY_VALUE))); + + AppLogDebug("%ls", pResultString->GetPointer()); + int contactId; + Integer::Parse(*pResultString, contactId); + + AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance(); + Addressbook* pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID); + + ContentInformation* pCcontentInfo = __pPresentationModel->GetContentInfoN(__itemIndex); + if (pCcontentInfo == null) + { + delete pAddressbook; + pAddressbook = null; + return; + } + + Contact* pContact = pAddressbook->GetContactN(contactId); + pContact->SetValue(CONTACT_PROPERTY_ID_RINGTONE, pCcontentInfo->ContentFilePath); + result r = pAddressbook->UpdateContact(*pContact); + + if (r == E_SUCCESS) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_POP_SUCCESS"), + MSGBOX_STYLE_OK, + COUNT_MESSAGE_BOX_TIMEOUT); + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + } + + delete pCcontentInfo; + pCcontentInfo = null; + + delete pContact; + pContact = null; + + delete pAddressbook; + pAddressbook = null; + } + } + } + AppLogDebug("EXIT"); +} + +void +YearContentListForm::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +YearContentListForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +YearContentListForm::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} +#endif diff --git a/src/MpYearContentPickerPanel.cpp b/src/MpYearContentPickerPanel.cpp new file mode 100644 index 0000000..5516f56 --- /dev/null +++ b/src/MpYearContentPickerPanel.cpp @@ -0,0 +1,342 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearContentPickerPanel.cpp + * @brief This is the implementation file for YearContentPickerPanel class. + */ + +#include "MpYearContentPickerPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +YearContentPickerPanel::YearContentPickerPanel(void) + : __checkedItemCount(0) + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearContentPickerPanel::~YearContentPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +YearContentPickerPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +YearContentPickerPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = YearListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +result +YearContentPickerPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +YearContentPickerPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentYearIndex()); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= 0) + { + return; + } + + int totalCount = __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentYearIndex()); + + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + __pPresentationModel->AddContent(CommonUtil::GetAddtoPlaylistName(), iCount); + __pContentTableView->SetItemChecked(iCount, false); + } + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + CommonUtil::SetAddtoPlaylistState(false); + + Invalidate(true); + + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +YearContentPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + __pPresentationModel->UpdateYearList(); + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +YearContentPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + AppLogDebug("EXIT"); +} + +int +YearContentPickerPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetContentCount(__pPresentationModel->GetCurrentYearIndex()); +} + +Tizen::Ui::Controls::TableViewItem* +YearContentPickerPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetContentInfoN(itemIndex); + if (pContentInfoStruct == null) + { + AppLogDebug("EXIT"); + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + CommonUtil::CreateContentPikerTableViewItem(*pItem, pContentInfoStruct->TitleName, CommonUtil::GetFormatDate(pContentInfoStruct->Duration)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +YearContentPickerPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +void +YearContentPickerPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +int +YearContentPickerPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +YearContentPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetAllYearCount()) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + AppLogDebug("EXIT"); +} + +void +YearContentPickerPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +YearContentPickerPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} diff --git a/src/MpYearListEditorPanel.cpp b/src/MpYearListEditorPanel.cpp new file mode 100644 index 0000000..8ce0475 --- /dev/null +++ b/src/MpYearListEditorPanel.cpp @@ -0,0 +1,423 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListEditPanel.cpp + * @brief This is the implementation file for MpYearListEditPanel class. + */ + +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" +#include "MpYearListEditorPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +YearsListEditorPanel::YearsListEditorPanel(void) + : ThumbnailBase::ThumbnailBase() + , __pContentTableView(null) + , __pSelectAllCheckedButton(null) + , __pCheckedCountLabel(null) + , __pThumbnail(null) + , __checkedItemCount(0) + , __pPlayListPickerPopup(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearsListEditorPanel::~YearsListEditorPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +YearsListEditorPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = BasePanel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +YearsListEditorPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateEditorTableView(width, height); + __pContentTableView->AddTableViewItemEventListener(*this); + __pContentTableView->SetItemProvider(this); + + __pSelectAllCheckedButton = CommonUtil::CreateSelectAllCheckedButton(width); + __pSelectAllCheckedButton->AddActionEventListener(*this); + + __pCheckedCountLabel = CommonUtil::CreateCheckedCountLabel(width, height); + __pCheckedCountLabel->SetShowState(false); + + AddControl(__pContentTableView); + AddControl(__pSelectAllCheckedButton); + AddControl(__pCheckedCountLabel); + + __pPresentationModel = YearListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +YearsListEditorPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +YearsListEditorPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + int totalCount = __pPresentationModel->GetAllYearCount(); + + switch (actionId) + { + case IDA_CHECK_BUTTON: + { + __checkedItemCount = totalCount; + CommonUtil::SetAllCheckState(true, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_UNCHECK_BUTTON: + { + __checkedItemCount = INIT_VALUE; + CommonUtil::SetAllCheckState(false, *__pContentTableView, totalCount); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + } + break; + + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__checkedItemCount <= INIT_VALUE) + { + return; + } + + ArrayList* pDataList = new (std::nothrow) ArrayList(); + pDataList->Construct(); + + int totalCount = __pPresentationModel->GetAllYearCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + if (__pContentTableView->IsItemChecked(iCount) == true) + { + pDataList->AddItems(*(__pPresentationModel->GetContentPathListN(iCount))); + } + } + + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, pDataList); + + //__pPlayListPickerPopup->SetCollectedContent(pDataList); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + case IDA_FOOTER_BUTTON_CANCEL: + { + pSceneManager->GoBackward(BackwardSceneTransition()); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount, actionId); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = CommonUtil::CreateAddtoPlaylistPickerFooter(*pForm); + pFooter->AddActionEventListener(*this); + + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + UpdateContentList(); + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + + __checkedItemCount = INIT_VALUE; + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + int totalCount = __pPresentationModel->GetAllYearCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + __pContentTableView->SetItemChecked(iCount, false); + } + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +YearsListEditorPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllYearCount(); +} + +Tizen::Ui::Controls::TableViewItem* +YearsListEditorPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetYearInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_MARK); +// pItem->SetBackgroundColor(COLOR_ITEM); + + String strYear = Integer::ToString(pContentInfoStruct->ReleaseYear); + if (strYear.Equals(L"0", true)) + { + strYear = STRING_UNKNOWN; + } +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateEditListTableViewItem(*pItem, *GetDefaultThumbnail(), strYear, __pPresentationModel->GetContentCount(itemIndex)); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +YearsListEditorPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +YearsListEditorPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +YearsListEditorPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + switch (status) + { + case TABLE_VIEW_ITEM_STATUS_CHECKED: + { + __checkedItemCount++; + tableView.SetItemChecked(itemIndex, true); + } + break; + + case TABLE_VIEW_ITEM_STATUS_UNCHECKED: + { + __checkedItemCount--; + tableView.SetItemChecked(itemIndex, false); + } + break; + + default: + break; + } + + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + CommonUtil::SetButtonEnabled(*pForm, __checkedItemCount); + + CommonUtil::ShowSelectAllCheckButton(*__pSelectAllCheckedButton); + + if (__checkedItemCount == __pPresentationModel->GetAllYearCount()) + { + __pSelectAllCheckedButton->SetSelected(true); + } + + Invalidate(true); + CommonUtil::ShowCheckedCountLabel(*__pCheckedCountLabel, __checkedItemCount, *__pContentTableView, *pForm); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateYearList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +YearsListEditorPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpYearListPanel.cpp b/src/MpYearListPanel.cpp new file mode 100644 index 0000000..f0644d5 --- /dev/null +++ b/src/MpYearListPanel.cpp @@ -0,0 +1,500 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListPanel.cpp + * @brief This is the implementation file for YearListPanel class. + */ + +#include "MpNowPlayContentPanel.h" +#include "MpPlaylistPickerPopup.h" +#include "MpThumbnailInfo.h" +#include "MpYearListPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +YearsListPanel::YearsListPanel(void) + : ThumbnailBase::ThumbnailBase() + , __itemIndex(-1) + , __pNowPlayContentPanel(null) + , __pPlayListPickerPopup(null) + , __pContextItem(null) + , __pContentTableView(null) + , __pNoContentImageLabel(null) + , __pNoContentTextLabel(null) + , __pThumbnail(null) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearsListPanel::~YearsListPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +bool +YearsListPanel::Initialize(void) +{ + AppLogDebug("ENTER"); + result r = BasePanel::Construct(Rectangle(INIT_VALUE, INIT_VALUE, INIT_VALUE, INIT_VALUE)); + if (IsFailed(r)) + { + return false; + } + AppLogDebug("EXIT"); + return true; +} + +result +YearsListPanel::OnInitializing(void) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + int width = pForm->GetClientAreaBounds().width; + int height = pForm->GetClientAreaBounds().height; + + SetBounds(INIT_VALUE, INIT_VALUE, width, height); + + __pContentTableView = CommonUtil::CreateTableView(width, height); + __pContentTableView->SetItemProvider(this); + __pContentTableView->AddTableViewItemEventListener(*this); + + __pNoContentImageLabel = new (std::nothrow) Label(); + __pNoContentImageLabel->Construct(Rectangle((pForm->GetWidth() - W_NO_CONTENT) / 2, Y_GAP_NO_CONTENT, W_NO_CONTENT, H_NO_CONTENT), L""); + __pNoContentImageLabel->SetBackgroundBitmap(*(ResourceManager::GetBitmapN(IDB_NO_CONTENTS))); + + __pNoContentTextLabel = new (std::nothrow) Label(); + __pNoContentTextLabel->Construct(Rectangle(0, + __pNoContentImageLabel->GetHeight() + __pNoContentImageLabel->GetY(), + pForm->GetWidth(), + H_TEXT_NO_CONTENT), + ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS")); + __pNoContentTextLabel->SetTextConfig(FONT_SIZE_NO_CONTENT, LABEL_TEXT_STYLE_BOLD); + + __pContextItem = new (std::nothrow) TableViewContextItem(); + __pContextItem->Construct(Dimension(width, ITEM_HEIGHT)); + CommonUtil::CreateTableViewContextItem(*__pContextItem, *this); + + AddControl(__pNoContentImageLabel); + AddControl(__pNoContentTextLabel); + AddControl(__pContentTableView); + + __pPresentationModel = YearListPresentationModel::GetInstance(); + + AppLogDebug("EXIT"); + return ThumbnailBase::Construct(); +} + +result +YearsListPanel::OnTerminating(void) +{ + AppLogDebug("ENTER"); + delete __pContextItem; + __pContextItem = null; + + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +void +YearsListPanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST: + { + if (__pPresentationModel->GetAllYearCount() == 0) + { + MessageBox messageBox; + messageBox.Construct(L"", ResourceManager::GetString(L"IDS_COM_BODY_NO_ITEMS"), MSGBOX_STYLE_NONE, 500); + + int modalResult = 0; + messageBox.ShowAndWait(modalResult); + break; + } + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_YEAR_LIST_EDITOR)); + } + break; + + case IDA_FOOTER_BUTTON_SEARCH: + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SEARCH)); + } + break; + + case IDA_FLICK_BUTTON_ADD_TO_PALYLIST: + { + __pPlayListPickerPopup = new (std::nothrow) PlayListPickerPopup(); + __pPlayListPickerPopup->Initialize(this, __pPresentationModel->GetContentPathListN(__itemIndex)); + //__pPlayListPickerPopup->SetCollectedContent(__pPresentationModel->GetContentPathListN(__itemIndex)); + __pPlayListPickerPopup->SetShowState(true); + __pPlayListPickerPopup->Show(); + } + break; + + default: + break; + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + AppLogDebug("ENTER"); + if (CommonUtil::GetAddtoPlaylistState() == true) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_PLAYLIST_LIST, + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_DESTROY)); + CommonUtil::SetAddtoPlaylistState(false); + } + else + { + Tizen::App::Application::GetInstance()->Terminate(); + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + pForm->SetFormBackEventListener(this); + + Footer* pFooter = CommonUtil::CreateContentListFooter(*pForm); + pFooter->SetBackButton(); + pFooter->AddActionEventListener(*this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + + UpdateContentList(); + if (__pPresentationModel != null) + { + int totalYearCount = __pPresentationModel->GetAllYearCount(); + CommonUtil::SetButtonEnabled(*pForm, totalYearCount, IDA_FOOTER_BUTTON_ADD_TO_PLAYLIST); + +// CommonUtil::ShowNoContentImage(totalYearCount, *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + } + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + pFooter->RemoveActionEventListener(*this); + CancelAllThumbnailRequest(); + AppLogDebug("EXIT"); +} + +int +YearsListPanel::GetItemCount(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pPresentationModel->GetAllYearCount(); +} + +Tizen::Ui::Controls::TableViewItem* +YearsListPanel::CreateItem(const int itemIndex, int itemWidth) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetYearInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(Dimension(itemWidth, ITEM_HEIGHT), TABLE_VIEW_ANNEX_STYLE_NORMAL); +// pItem->SetBackgroundColor(COLOR_ITEM); + + String strYear = Integer::ToString(pContentInfoStruct->ReleaseYear); + if (strYear.Equals(L"0", true)) + { + strYear = STRING_UNKNOWN; + } + +// RequestThumbnail(pContentInfoStruct->contentId, (new (std::nothrow) int(itemIndex))); + CommonUtil::CreateTableViewItem(*pItem, *GetDefaultThumbnail(), strYear, __pPresentationModel->GetContentCount(itemIndex)); + pItem->SetContextItem(__pContextItem); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pItem; +} + +bool +YearsListPanel::DeleteItem(const int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return false; +} + +int +YearsListPanel::GetDefaultItemHeight(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return ITEM_HEIGHT; +} + +void +YearsListPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_YEAR_CONTENT_LIST), GetContentListN(itemIndex)); + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewContextItem* pContextItem, + bool activated) +{ + AppLogDebug("ENTER"); + if (activated == true) + { + __itemIndex = itemIndex; + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnTableViewItemReordered(Tizen::Ui::Controls::TableView& tableView, + int itemIndexFrom, + int itemIndexTo) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +Tizen::Base::Collection::ArrayList* +YearsListPanel::GetContentListN(int itemIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = __pPresentationModel->GetYearInfoN(itemIndex); + if (pContentInfoStruct == null) + { + return null; + } + + String SceneId = IDSCN_YEAR_LIST; + String YearsName = Integer::ToString(pContentInfoStruct->ReleaseYear);; + if (YearsName.Equals(L"0", true)) + { + YearsName = STRING_UNKNOWN; + } + + YearsName = CommonUtil::SpecialReplaceChange(YearsName); + YearsName = CommonUtil::MakeQuery(STRING_SORT_YEAR, YearsName); + + ArrayList* pRetList = new (std::nothrow) ArrayList(); + pRetList->Construct(); + + pRetList->Add(*(new (std::nothrow) String(SceneId))); + pRetList->Add(*(new (std::nothrow) String(YearsName))); + pRetList->Add(*(new (std::nothrow) Integer(itemIndex))); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + AppLogDebug("EXIT"); + return pRetList; +} + +void +YearsListPanel::OnFastScrollIndexSelected(Tizen::Ui::Control& source, Tizen::Base::String& index) +{ + AppLogDebug("ENTER"); + int totalCount = __pPresentationModel->GetAllYearCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + String* pName = __pPresentationModel->GetYearName(iCount); + String firstCharacter; + + pName->SubString(0, 1, firstCharacter); + firstCharacter.ToUpper(); + + mchar language; + firstCharacter.GetCharAt(0, language); + + if (Character::GetUnicodeCategory(language) == UNICODE_HANGUL) + { + Tizen::Base::String HangulIndex[] = {"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ" , "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"}; + + wchar_t songName; + pName->GetCharAt(0, songName); + + wchar_t UnicodeValue = (songName - 0xAC00); + wchar_t InitialConsonant = ((UnicodeValue - (UnicodeValue % 28)) / 28) / 21; + int tempIndex = static_cast(InitialConsonant); + + if (HangulIndex[tempIndex].CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + else if (index.CompareTo("0") == 0 && Character::IsDigit(language) == true) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + else if (firstCharacter.CompareTo(index) == 0) + { + __pContentTableView->ScrollToItem(iCount); + break; + } + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnMusicContentUpdateCompleted(void) +{ + AppLogDebug("ENTER"); + UpdateContentList(); + AppLogDebug("EXIT"); +} + +void +YearsListPanel::UpdateContentList(void) +{ + AppLogDebug("ENTER"); + if (__pPresentationModel != null && __pContentTableView != null) + { + __pPresentationModel->UpdateYearList(); + __pContentTableView->UpdateTableView(); + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnThumbnailInfoReveivedN(ThumbnailInfo* pThumbnailInfo) +{ + AppLogDebug("ENTER"); + int itemIndex = 0; + void* pParam = null; + __pThumbnail = pThumbnailInfo->GetBitmapN(); + pParam = pThumbnailInfo->GetUserParamN(); + if (pParam) + { + itemIndex = *(static_cast(pParam)); + } + __pContentTableView->RefreshItem(itemIndex, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + delete pThumbnailInfo; + delete static_cast(pParam); + AppLogDebug("EXIT"); +} + +void +YearsListPanel::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + AppLogDebug("OnUserEventReceivedN %d", requestId); + if (requestId == ID_DESTORY_PLAY_LIST_PICKER_POPUP) + { + if (__pPlayListPickerPopup != null) + { + delete __pPlayListPickerPopup; + __pPlayListPickerPopup = null; + } + } + AppLogDebug("EXIT"); +} + +void +YearsListPanel::UpdateItem(int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + AppLogDebug("ENTER"); + Label* pThumbnailLabel = static_cast(pItem->GetControl(L"pSongThumbnailLabel")); + if (__pThumbnail == null || pThumbnailLabel == null) + { + AppLogDebug("__pThumbnail or pThumbnailLabel is null"); + delete __pThumbnail; + __pThumbnail = null; + return; + } + pThumbnailLabel->SetBackgroundBitmap(*__pThumbnail); + delete __pThumbnail; + __pThumbnail = null; + pThumbnailLabel->Invalidate(true); + AppLogDebug("EXIT"); +} diff --git a/src/MpYearListPresentationModel.cpp b/src/MpYearListPresentationModel.cpp new file mode 100644 index 0000000..6f4b85b --- /dev/null +++ b/src/MpYearListPresentationModel.cpp @@ -0,0 +1,295 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearListPresentationModel.cpp + * @brief This is the implementation file for YearListPresentationModel class. + */ + +#include "MpYearListPresentationModel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui::Controls; + +YearListPresentationModel* YearListPresentationModel::pYearListPresentationModelInstance = null; + +YearListPresentationModel* +YearListPresentationModel::GetInstance(void) +{ + AppLogDebug("ENTER"); + if (pYearListPresentationModelInstance == null) + { + pYearListPresentationModelInstance = new (std::nothrow) YearListPresentationModel(); + TryReturn(pYearListPresentationModelInstance != null, null, "YearListPresentationModel instance is not created."); + + result r = pYearListPresentationModelInstance->Construct(); + TryCatch(r == E_SUCCESS, , null, "YearListPresentationModel instance is not constrcuted."); + } + AppLogDebug("EXIT"); + return pYearListPresentationModelInstance; + +CATCH: + delete pYearListPresentationModelInstance; + return null; +} + +int +YearListPresentationModel::GetContentCount(int yearIndex) +{ + AppLogDebug("ENTER"); + int totalCount = INIT_VALUE; + + if (__pYearList == null) + { + return INIT_VALUE; + } + + if ((__pContentList != null) && (__currentYearIndex == yearIndex)) + { + totalCount = __pContentList->GetCount(); + } + else + { + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pYearList->GetAt(yearIndex))), STRING_SORT_YEAR, STRING_SORT_YEAR); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return INIT_VALUE; + } + + totalCount = pContentSearchResultList->GetCount(); + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + } + AppLogDebug("EXIT"); + return totalCount; +} + +int +YearListPresentationModel::GetAllYearCount(void) +{ + AppLogDebug("ENTER"); + if (__pYearList == null) + { + return INIT_VALUE; + } + AppLogDebug("EXIT"); + return __pYearList->GetCount(); +} + +YearListPresentationModel::YearListPresentationModel(void) + : __pYearList(null) + , __pContentList(null) + , __currentYearIndex(-1) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearListPresentationModel::~YearListPresentationModel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +result +YearListPresentationModel::Construct(void) +{ + AppLogDebug("ENTER"); +/* + if (__pYearList != null) + { + __pYearList->RemoveAll(true); + delete __pYearList; + } + + __pYearList = CommonUtil::SearchContentList(STRING_SORT_YEAR); +*/ + AppLogDebug("EXIT"); + return E_SUCCESS; +} + +ContentInformation* +YearListPresentationModel::GetYearInfoN(int yearIndex) +{ + AppLogDebug("ENTER"); + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pYearList->GetAt(yearIndex))), STRING_SORT_YEAR, STRING_SORT_YEAR); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ContentInformation* pContentInformation = null; + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(INIT_VALUE)); + if (pResult!= null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentInformation; +} + +Tizen::Base::String* +YearListPresentationModel::GetYearName(int yearIndex) +{ + AppLogDebug("ENTER"); + if (__pYearList == null) + { + return null; + } + AppLogDebug("EXIT"); + return static_cast(__pYearList->GetAt(yearIndex)); +} + +void +YearListPresentationModel::InitializeContentList(int yearIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pYearList->GetAt(yearIndex))), STRING_SORT_YEAR, STRING_SORT_TITLE); + __currentYearIndex = yearIndex; + AppLogDebug("EXIT"); +} + +ContentInformation* +YearListPresentationModel::GetContentInfoN(int contentIndex) +{ + AppLogDebug("ENTER"); + ContentSearchResult* pResult = static_cast(__pContentList->GetAt(contentIndex)); + ContentInformation* pContentInformation = null; + if (pResult != null && pResult->GetContentType() == CONTENT_TYPE_AUDIO) + { + pContentInformation = CommonUtil::GetContentInformationN(*static_cast(pResult->GetContentInfo())); + } + + AppLogDebug("EXIT"); + return pContentInformation; +} + +Tizen::Base::Collection::ArrayList* +YearListPresentationModel::GetContentPathListN(int yearIndex) +{ + AppLogDebug("ENTER"); + IList* pContentSearchResultList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pYearList->GetAt(yearIndex))), STRING_SORT_YEAR, STRING_SORT_TITLE); + if (pContentSearchResultList == null) + { + AppLogDebug("CommonUtil::ContentSearchResultListN() failed"); + return null; + } + + ArrayList* pContentPath = new (std::nothrow) ArrayList(); + pContentPath->Construct(); + + int totalCount = pContentSearchResultList->GetCount(); + for (int iCount = 0; iCount < totalCount; iCount++) + { + ContentSearchResult* pResult = static_cast(pContentSearchResultList->GetAt(iCount)); + pContentPath->Add(*(new (std::nothrow) String(pResult->GetContentInfo()->GetContentPath()))); + } + + pContentSearchResultList->RemoveAll(true); + delete pContentSearchResultList; + + AppLogDebug("EXIT"); + return pContentPath; +} + +void +YearListPresentationModel::RefreshContentList(int yearIndex) +{ + AppLogDebug("ENTER"); + if (__pContentList != null) + { + __pContentList->RemoveAll(true); + delete __pContentList; + } + + __pContentList = CommonUtil::ContentSearchResultListN( + *(static_cast(__pYearList->GetAt(yearIndex))), STRING_SORT_YEAR, STRING_SORT_TITLE); + if (__pContentList != null && __pContentList->GetCount() == INIT_VALUE) + { + __pContentList->RemoveAll(true); + delete __pContentList; + __pContentList = null; + } + + __currentYearIndex = yearIndex; + AppLogDebug("EXIT"); +} + +int +YearListPresentationModel::GetCurrentYearIndex(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); + return __currentYearIndex; +} + +void +YearListPresentationModel::AddContent(Tizen::Base::String path, int playlistIndex) +{ + AppLogDebug("ENTER"); + ContentInformation* pContentInfoStruct = GetContentInfoN(playlistIndex); + PlayList* pPlayList = PlayListManager::GetInstance()->GetPlayListN(path); + pPlayList->AddItem(pContentInfoStruct->contentId); + + delete pContentInfoStruct; + pContentInfoStruct = null; + + delete pPlayList; + pPlayList = null; + AppLogDebug("EXIT"); +} + +result +YearListPresentationModel::UpdateYearList(void) +{ + AppLogDebug("ENTER"); + result r = E_SUCCESS; + + if (__pYearList != null) + { + __pYearList->RemoveAll(true); + delete __pYearList; + } + + __pYearList = CommonUtil::SearchContentList(STRING_SORT_YEAR); + TryCatch(__pYearList != null, r = E_FAILURE, "__pYearList is null"); + AppLogDebug("EXIT"); + return r; + +CATCH: + return r; +} \ No newline at end of file diff --git a/src/MpYearPickerPanel.cpp b/src/MpYearPickerPanel.cpp new file mode 100644 index 0000000..66b61a7 --- /dev/null +++ b/src/MpYearPickerPanel.cpp @@ -0,0 +1,112 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * @file MpYearPickerPanel.cpp + * @brief This is the implementation file for YearPickerPanel class. + */ + +#include "MpYearPickerPanel.h" +#include "MpNowPlayContentPanel.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Content; +using namespace Tizen::Graphics; +using namespace Tizen::Social; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +YearPickerPanel::YearPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +YearPickerPanel::~YearPickerPanel(void) +{ + AppLogDebug("ENTER"); + AppLogDebug("EXIT"); +} + +void +YearPickerPanel::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + CommonUtil::CreateCancelFooter(*pForm); + pForm->SetFormBackEventListener(this); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + __pPresentationModel->UpdateYearList(); +// CommonUtil::ShowNoContentImage(__pPresentationModel->GetAllYearCount(), *__pContentTableView, *__pNoContentImageLabel, *__pNoContentTextLabel); + + if (pSceneManager->IsSceneAlive(IDSCN_PLAYER)) + { + if (__pNowPlayContentPanel == null) + { + __pNowPlayContentPanel = new (std::nothrow) NowPlayContentPanel(); + __pNowPlayContentPanel->Initialize(); + AddControl(__pNowPlayContentPanel); + } + CommonUtil::ShowNowPlayPanel(*__pContentTableView, __pNowPlayContentPanel->GetPlayStatus(), pForm->GetClientAreaBounds()); + } + + if (pArgs != null) + { + pArgs->RemoveAll(true); + delete pArgs; + } + AppLogDebug("EXIT"); +} + +void +YearPickerPanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("ENTER"); + Form* pForm = dynamic_cast(GetParent()); + AppAssert(pForm); + + Footer* pFooter = pForm->GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->RemoveAllItems(); + AppLogDebug("EXIT"); +} + +void +YearPickerPanel::OnTableViewItemStateChanged(Tizen::Ui::Controls::TableView& tableView, + int itemIndex, + Tizen::Ui::Controls::TableViewItem* pItem, + Tizen::Ui::Controls::TableViewItemStatus status) +{ + AppLogDebug("ENTER"); + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (status == TABLE_VIEW_ITEM_STATUS_SELECTED) + { + __pPresentationModel->InitializeContentList(itemIndex); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_YEAR_CONTENT_PICKER)); + } + AppLogDebug("EXIT"); +} -- 2.7.4