diff --git a/.gitignore b/.gitignore index 3c405f9e..49b27082 100644 --- a/.gitignore +++ b/.gitignore @@ -169,4 +169,5 @@ proguard_logs/ .idea/workspace.xml .idea/misc.xml .idea/tasks.xml -.idea/*.iws \ No newline at end of file +.idea/*.iws +.idea/dictionaries/*.xml diff --git a/.idea/dictionaries/Josh.xml b/.idea/dictionaries/Josh.xml index 866fc4fc..f62fffec 100644 --- a/.idea/dictionaries/Josh.xml +++ b/.idea/dictionaries/Josh.xml @@ -1,6 +1,7 @@ + bahnsen bitrate deserialize deserialized diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a509d6c0..3106a10f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,8 +2,8 @@ + a:versionCode="41" + a:versionName="1.3.0.1" > @@ -58,7 +58,10 @@ a:launchMode="standard" /> + a:configChanges="orientation|keyboardHidden" /> + diff --git a/assets/html/img/ultrasonic.png b/assets/html/img/ultrasonic.png index 3e8c9f56..77218d6c 100644 Binary files a/assets/html/img/ultrasonic.png and b/assets/html/img/ultrasonic.png differ diff --git a/res/drawable-hdpi-v11/ic_stat_ultrasonic.png b/res/drawable-hdpi-v11/ic_stat_ultrasonic.png index 4b21c12b..48ffc78e 100644 Binary files a/res/drawable-hdpi-v11/ic_stat_ultrasonic.png and b/res/drawable-hdpi-v11/ic_stat_ultrasonic.png differ diff --git a/res/drawable-hdpi-v14/menu_arrow.png b/res/drawable-hdpi-v14/menu_arrow.png index add3b361..0c765739 100644 Binary files a/res/drawable-hdpi-v14/menu_arrow.png and b/res/drawable-hdpi-v14/menu_arrow.png differ diff --git a/res/drawable-hdpi-v9/ic_stat_ultrasonic.png b/res/drawable-hdpi-v9/ic_stat_ultrasonic.png index 6ceb2439..87a40aab 100644 Binary files a/res/drawable-hdpi-v9/ic_stat_ultrasonic.png and b/res/drawable-hdpi-v9/ic_stat_ultrasonic.png differ diff --git a/res/drawable-hdpi/appwidget_art_default.png b/res/drawable-hdpi/appwidget_art_default.png index c37d2656..3e73c4c7 100644 Binary files a/res/drawable-hdpi/appwidget_art_default.png and b/res/drawable-hdpi/appwidget_art_default.png differ diff --git a/res/drawable-hdpi/btn_check_off_focused_holo_dark.png b/res/drawable-hdpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 00000000..a20c68e8 Binary files /dev/null and b/res/drawable-hdpi/btn_check_off_focused_holo_dark.png differ diff --git a/res/drawable-hdpi/btn_check_off_focused_holo_light.png b/res/drawable-hdpi/btn_check_off_focused_holo_light.png new file mode 100644 index 00000000..ffb64d41 Binary files /dev/null and b/res/drawable-hdpi/btn_check_off_focused_holo_light.png differ diff --git a/res/drawable-hdpi/btn_check_off_holo_dark.png b/res/drawable-hdpi/btn_check_off_holo_dark.png new file mode 100644 index 00000000..952434cf Binary files /dev/null and b/res/drawable-hdpi/btn_check_off_holo_dark.png differ diff --git a/res/drawable-hdpi/btn_check_off_holo_light.png b/res/drawable-hdpi/btn_check_off_holo_light.png new file mode 100644 index 00000000..c3834add Binary files /dev/null and b/res/drawable-hdpi/btn_check_off_holo_light.png differ diff --git a/res/drawable-hdpi/btn_check_on_focused_holo_dark.png b/res/drawable-hdpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 00000000..3de1e356 Binary files /dev/null and b/res/drawable-hdpi/btn_check_on_focused_holo_dark.png differ diff --git a/res/drawable-hdpi/btn_check_on_focused_holo_light.png b/res/drawable-hdpi/btn_check_on_focused_holo_light.png new file mode 100644 index 00000000..17009b08 Binary files /dev/null and b/res/drawable-hdpi/btn_check_on_focused_holo_light.png differ diff --git a/res/drawable-hdpi/btn_check_on_holo_dark.png b/res/drawable-hdpi/btn_check_on_holo_dark.png new file mode 100644 index 00000000..a6501efe Binary files /dev/null and b/res/drawable-hdpi/btn_check_on_holo_dark.png differ diff --git a/res/drawable-hdpi/btn_check_on_holo_light.png b/res/drawable-hdpi/btn_check_on_holo_light.png new file mode 100644 index 00000000..ff360d2b Binary files /dev/null and b/res/drawable-hdpi/btn_check_on_holo_light.png differ diff --git a/res/drawable-hdpi/ic_drag_queue.9.png b/res/drawable-hdpi/ic_drag_queue.9.png new file mode 100644 index 00000000..fe8fe0a0 Binary files /dev/null and b/res/drawable-hdpi/ic_drag_queue.9.png differ diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png index 68c0dc45..2885b037 100644 Binary files a/res/drawable-hdpi/ic_launcher.png and b/res/drawable-hdpi/ic_launcher.png differ diff --git a/res/drawable-hdpi/ic_menu_about_dark.png b/res/drawable-hdpi/ic_menu_about_dark.png new file mode 100644 index 00000000..cc430a1a Binary files /dev/null and b/res/drawable-hdpi/ic_menu_about_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_about_light.png b/res/drawable-hdpi/ic_menu_about_light.png new file mode 100644 index 00000000..ba9658f3 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_about_light.png differ diff --git a/res/drawable-hdpi/ic_menu_add_to_queue_dark.png b/res/drawable-hdpi/ic_menu_add_to_queue_dark.png new file mode 100644 index 00000000..bbabc613 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_add_to_queue_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_add_to_queue_light.png b/res/drawable-hdpi/ic_menu_add_to_queue_light.png new file mode 100644 index 00000000..f7caa2c4 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_add_to_queue_light.png differ diff --git a/res/drawable-hdpi/ic_menu_backward_dark.png b/res/drawable-hdpi/ic_menu_backward_dark.png new file mode 100644 index 00000000..2faf489d Binary files /dev/null and b/res/drawable-hdpi/ic_menu_backward_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_backward_light.png b/res/drawable-hdpi/ic_menu_backward_light.png new file mode 100644 index 00000000..3f07760b Binary files /dev/null and b/res/drawable-hdpi/ic_menu_backward_light.png differ diff --git a/res/drawable-hdpi/ic_menu_bookmark_dark.png b/res/drawable-hdpi/ic_menu_bookmark_dark.png new file mode 100644 index 00000000..eff9f1d9 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_bookmark_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_bookmark_light.png b/res/drawable-hdpi/ic_menu_bookmark_light.png new file mode 100644 index 00000000..61742f3c Binary files /dev/null and b/res/drawable-hdpi/ic_menu_bookmark_light.png differ diff --git a/res/drawable-hdpi/ic_menu_browse_dark.png b/res/drawable-hdpi/ic_menu_browse_dark.png new file mode 100644 index 00000000..5532d391 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_browse_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_browse_light.png b/res/drawable-hdpi/ic_menu_browse_light.png new file mode 100644 index 00000000..f8fe8371 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_browse_light.png differ diff --git a/res/drawable-hdpi/ic_menu_chat_dark.png b/res/drawable-hdpi/ic_menu_chat_dark.png new file mode 100644 index 00000000..c2d31ac5 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_chat_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_chat_light.png b/res/drawable-hdpi/ic_menu_chat_light.png new file mode 100644 index 00000000..a6569c83 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_chat_light.png differ diff --git a/res/drawable-hdpi/ic_menu_chat_send_dark.png b/res/drawable-hdpi/ic_menu_chat_send_dark.png new file mode 100644 index 00000000..ebd80b59 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_chat_send_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_chat_send_light.png b/res/drawable-hdpi/ic_menu_chat_send_light.png new file mode 100644 index 00000000..dcb9d6a2 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_chat_send_light.png differ diff --git a/res/drawable-hdpi/ic_menu_exit_dark.png b/res/drawable-hdpi/ic_menu_exit_dark.png new file mode 100644 index 00000000..e0ee7319 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_exit_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_exit_light.png b/res/drawable-hdpi/ic_menu_exit_light.png new file mode 100644 index 00000000..1a857830 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_exit_light.png differ diff --git a/res/drawable-hdpi/ic_menu_forward_dark.png b/res/drawable-hdpi/ic_menu_forward_dark.png new file mode 100644 index 00000000..476dc2ab Binary files /dev/null and b/res/drawable-hdpi/ic_menu_forward_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_forward_light.png b/res/drawable-hdpi/ic_menu_forward_light.png new file mode 100644 index 00000000..10515596 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_forward_light.png differ diff --git a/res/drawable-hdpi/ic_menu_help_dark.png b/res/drawable-hdpi/ic_menu_help_dark.png new file mode 100644 index 00000000..055bd745 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_help_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_help_light.png b/res/drawable-hdpi/ic_menu_help_light.png new file mode 100644 index 00000000..c20f4ec0 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_help_light.png differ diff --git a/res/drawable-hdpi/ic_menu_home_dark.png b/res/drawable-hdpi/ic_menu_home_dark.png new file mode 100644 index 00000000..9d99242e Binary files /dev/null and b/res/drawable-hdpi/ic_menu_home_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_home_light.png b/res/drawable-hdpi/ic_menu_home_light.png new file mode 100644 index 00000000..c9b96ced Binary files /dev/null and b/res/drawable-hdpi/ic_menu_home_light.png differ diff --git a/res/drawable-hdpi/ic_menu_playlists_dark.png b/res/drawable-hdpi/ic_menu_playlists_dark.png new file mode 100644 index 00000000..1e317002 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_playlists_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_playlists_light.png b/res/drawable-hdpi/ic_menu_playlists_light.png new file mode 100644 index 00000000..bce7a556 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_playlists_light.png differ diff --git a/res/drawable-hdpi/ic_menu_remove_all_dark.png b/res/drawable-hdpi/ic_menu_remove_all_dark.png new file mode 100644 index 00000000..25992020 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_remove_all_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_remove_all_light.png b/res/drawable-hdpi/ic_menu_remove_all_light.png new file mode 100644 index 00000000..a9f1e7b5 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_remove_all_light.png differ diff --git a/res/drawable-hdpi/ic_menu_save_dark.png b/res/drawable-hdpi/ic_menu_save_dark.png new file mode 100644 index 00000000..b89ea1b3 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_save_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_save_light.png b/res/drawable-hdpi/ic_menu_save_light.png new file mode 100644 index 00000000..648f96c8 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_save_light.png differ diff --git a/res/drawable-hdpi/ic_menu_screen_on_off_dark.png b/res/drawable-hdpi/ic_menu_screen_on_off_dark.png new file mode 100644 index 00000000..618fd2f1 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_screen_on_off_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_screen_on_off_light.png b/res/drawable-hdpi/ic_menu_screen_on_off_light.png new file mode 100644 index 00000000..1149b5d1 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_screen_on_off_light.png differ diff --git a/res/drawable-hdpi/ic_menu_search_holo_dark.png b/res/drawable-hdpi/ic_menu_search_holo_dark.png new file mode 100644 index 00000000..415b9d46 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_search_holo_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_search_holo_light.png b/res/drawable-hdpi/ic_menu_search_holo_light.png new file mode 100644 index 00000000..a351e451 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_search_holo_light.png differ diff --git a/res/drawable-hdpi/ic_menu_select_all_dark.png b/res/drawable-hdpi/ic_menu_select_all_dark.png new file mode 100644 index 00000000..14517cc8 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_select_all_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_select_all_light.png b/res/drawable-hdpi/ic_menu_select_all_light.png new file mode 100644 index 00000000..cb27e031 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_select_all_light.png differ diff --git a/res/drawable-hdpi/ic_menu_select_folder_dark.png b/res/drawable-hdpi/ic_menu_select_folder_dark.png new file mode 100644 index 00000000..5f452c6f Binary files /dev/null and b/res/drawable-hdpi/ic_menu_select_folder_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_select_folder_light.png b/res/drawable-hdpi/ic_menu_select_folder_light.png new file mode 100644 index 00000000..3aab46ee Binary files /dev/null and b/res/drawable-hdpi/ic_menu_select_folder_light.png differ diff --git a/res/drawable-hdpi/ic_menu_settings_dark.png b/res/drawable-hdpi/ic_menu_settings_dark.png new file mode 100644 index 00000000..1793b4b2 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_settings_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_settings_light.png b/res/drawable-hdpi/ic_menu_settings_light.png new file mode 100644 index 00000000..79dcbcfc Binary files /dev/null and b/res/drawable-hdpi/ic_menu_settings_light.png differ diff --git a/res/drawable-hdpi/ic_menu_share_dark.png b/res/drawable-hdpi/ic_menu_share_dark.png new file mode 100644 index 00000000..8c437fd7 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_share_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_share_light.png b/res/drawable-hdpi/ic_menu_share_light.png new file mode 100644 index 00000000..9e600e68 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_share_light.png differ diff --git a/res/drawable-hdpi/ic_menu_unpin_dark.png b/res/drawable-hdpi/ic_menu_unpin_dark.png new file mode 100644 index 00000000..fe26bec7 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_unpin_dark.png differ diff --git a/res/drawable-hdpi/ic_menu_unpin_light.png b/res/drawable-hdpi/ic_menu_unpin_light.png new file mode 100644 index 00000000..f8a29550 Binary files /dev/null and b/res/drawable-hdpi/ic_menu_unpin_light.png differ diff --git a/res/drawable-hdpi/ic_star_full_dark.png b/res/drawable-hdpi/ic_star_full_dark.png new file mode 100644 index 00000000..c454a316 Binary files /dev/null and b/res/drawable-hdpi/ic_star_full_dark.png differ diff --git a/res/drawable-hdpi/ic_star_full_light.png b/res/drawable-hdpi/ic_star_full_light.png new file mode 100644 index 00000000..62deead2 Binary files /dev/null and b/res/drawable-hdpi/ic_star_full_light.png differ diff --git a/res/drawable-hdpi/ic_star_hollow_dark.png b/res/drawable-hdpi/ic_star_hollow_dark.png new file mode 100644 index 00000000..2c86eedd Binary files /dev/null and b/res/drawable-hdpi/ic_star_hollow_dark.png differ diff --git a/res/drawable-hdpi/ic_star_hollow_light.png b/res/drawable-hdpi/ic_star_hollow_light.png new file mode 100644 index 00000000..48aae9aa Binary files /dev/null and b/res/drawable-hdpi/ic_star_hollow_light.png differ diff --git a/res/drawable-hdpi/ic_stat_play_light.png b/res/drawable-hdpi/ic_stat_play_light.png index 1e3bc97a..fc79cf55 100644 Binary files a/res/drawable-hdpi/ic_stat_play_light.png and b/res/drawable-hdpi/ic_stat_play_light.png differ diff --git a/res/drawable-hdpi/ic_stat_ultrasonic.png b/res/drawable-hdpi/ic_stat_ultrasonic.png index 37f56faa..42d70a45 100644 Binary files a/res/drawable-hdpi/ic_stat_ultrasonic.png and b/res/drawable-hdpi/ic_stat_ultrasonic.png differ diff --git a/res/drawable-hdpi/list_longpressed_holo.9.png b/res/drawable-hdpi/list_longpressed_holo.9.png index eda10e61..16183caf 100644 Binary files a/res/drawable-hdpi/list_longpressed_holo.9.png and b/res/drawable-hdpi/list_longpressed_holo.9.png differ diff --git a/res/drawable-hdpi/list_pressed_holo_dark.9.png b/res/drawable-hdpi/list_pressed_holo_dark.9.png index e4b33935..6fd19b2d 100644 Binary files a/res/drawable-hdpi/list_pressed_holo_dark.9.png and b/res/drawable-hdpi/list_pressed_holo_dark.9.png differ diff --git a/res/drawable-hdpi/list_pressed_holo_light.9.png b/res/drawable-hdpi/list_pressed_holo_light.9.png index e4b33935..6fd19b2d 100644 Binary files a/res/drawable-hdpi/list_pressed_holo_light.9.png and b/res/drawable-hdpi/list_pressed_holo_light.9.png differ diff --git a/res/drawable-hdpi/media_backward_normal_dark.png b/res/drawable-hdpi/media_backward_normal_dark.png new file mode 100644 index 00000000..60347d7a Binary files /dev/null and b/res/drawable-hdpi/media_backward_normal_dark.png differ diff --git a/res/drawable-hdpi/media_backward_normal_light.png b/res/drawable-hdpi/media_backward_normal_light.png new file mode 100644 index 00000000..734ab8ab Binary files /dev/null and b/res/drawable-hdpi/media_backward_normal_light.png differ diff --git a/res/drawable-hdpi/media_forward_normal_dark.png b/res/drawable-hdpi/media_forward_normal_dark.png new file mode 100644 index 00000000..676dc6fe Binary files /dev/null and b/res/drawable-hdpi/media_forward_normal_dark.png differ diff --git a/res/drawable-hdpi/media_forward_normal_light.png b/res/drawable-hdpi/media_forward_normal_light.png new file mode 100644 index 00000000..2eb548d4 Binary files /dev/null and b/res/drawable-hdpi/media_forward_normal_light.png differ diff --git a/res/drawable-hdpi/media_pause_normal_dark.png b/res/drawable-hdpi/media_pause_normal_dark.png new file mode 100644 index 00000000..93f2f525 Binary files /dev/null and b/res/drawable-hdpi/media_pause_normal_dark.png differ diff --git a/res/drawable-hdpi/media_pause_normal_light.png b/res/drawable-hdpi/media_pause_normal_light.png new file mode 100644 index 00000000..df9a5668 Binary files /dev/null and b/res/drawable-hdpi/media_pause_normal_light.png differ diff --git a/res/drawable-hdpi/media_repeat_all.png b/res/drawable-hdpi/media_repeat_all.png index 742fbc28..19056440 100644 Binary files a/res/drawable-hdpi/media_repeat_all.png and b/res/drawable-hdpi/media_repeat_all.png differ diff --git a/res/drawable-hdpi/media_repeat_off_dark.png b/res/drawable-hdpi/media_repeat_off_dark.png new file mode 100644 index 00000000..1cb057c7 Binary files /dev/null and b/res/drawable-hdpi/media_repeat_off_dark.png differ diff --git a/res/drawable-hdpi/media_repeat_off_light.png b/res/drawable-hdpi/media_repeat_off_light.png new file mode 100644 index 00000000..a0f4328a Binary files /dev/null and b/res/drawable-hdpi/media_repeat_off_light.png differ diff --git a/res/drawable-hdpi/media_shuffle_normal_dark.png b/res/drawable-hdpi/media_shuffle_normal_dark.png new file mode 100644 index 00000000..9cc04659 Binary files /dev/null and b/res/drawable-hdpi/media_shuffle_normal_dark.png differ diff --git a/res/drawable-hdpi/media_shuffle_normal_light.png b/res/drawable-hdpi/media_shuffle_normal_light.png new file mode 100644 index 00000000..49cf97bf Binary files /dev/null and b/res/drawable-hdpi/media_shuffle_normal_light.png differ diff --git a/res/drawable-hdpi/media_start_normal_dark.png b/res/drawable-hdpi/media_start_normal_dark.png new file mode 100644 index 00000000..12fad617 Binary files /dev/null and b/res/drawable-hdpi/media_start_normal_dark.png differ diff --git a/res/drawable-hdpi/media_start_normal_light.png b/res/drawable-hdpi/media_start_normal_light.png new file mode 100644 index 00000000..5e7b04bf Binary files /dev/null and b/res/drawable-hdpi/media_start_normal_light.png differ diff --git a/res/drawable-hdpi/media_stop_normal_dark.png b/res/drawable-hdpi/media_stop_normal_dark.png new file mode 100644 index 00000000..3ad62ab1 Binary files /dev/null and b/res/drawable-hdpi/media_stop_normal_dark.png differ diff --git a/res/drawable-hdpi/media_stop_normal_light.png b/res/drawable-hdpi/media_stop_normal_light.png new file mode 100644 index 00000000..fd9a6c90 Binary files /dev/null and b/res/drawable-hdpi/media_stop_normal_light.png differ diff --git a/res/drawable-hdpi/media_toggle_list_normal_dark.png b/res/drawable-hdpi/media_toggle_list_normal_dark.png new file mode 100644 index 00000000..c6c9044b Binary files /dev/null and b/res/drawable-hdpi/media_toggle_list_normal_dark.png differ diff --git a/res/drawable-hdpi/media_toggle_list_normal_light.png b/res/drawable-hdpi/media_toggle_list_normal_light.png new file mode 100644 index 00000000..731229e1 Binary files /dev/null and b/res/drawable-hdpi/media_toggle_list_normal_light.png differ diff --git a/res/drawable-hdpi/menu_arrow.png b/res/drawable-hdpi/menu_arrow.png index c28d98f3..8333fc2b 100644 Binary files a/res/drawable-hdpi/menu_arrow.png and b/res/drawable-hdpi/menu_arrow.png differ diff --git a/res/drawable-hdpi/menubar_button_disabled.9.png b/res/drawable-hdpi/menubar_button_disabled.9.png deleted file mode 100644 index e51431d8..00000000 Binary files a/res/drawable-hdpi/menubar_button_disabled.9.png and /dev/null differ diff --git a/res/drawable-hdpi/menubar_button_normal.9.png b/res/drawable-hdpi/menubar_button_normal.9.png deleted file mode 100644 index df1cabf2..00000000 Binary files a/res/drawable-hdpi/menubar_button_normal.9.png and /dev/null differ diff --git a/res/drawable-hdpi/notify_panel_notification_icon_bg.png b/res/drawable-hdpi/notify_panel_notification_icon_bg.png deleted file mode 100644 index 59be3140..00000000 Binary files a/res/drawable-hdpi/notify_panel_notification_icon_bg.png and /dev/null differ diff --git a/res/drawable-hdpi/select_album_play_all_normal.png b/res/drawable-hdpi/select_album_play_all_normal.png deleted file mode 100644 index 9c889d52..00000000 Binary files a/res/drawable-hdpi/select_album_play_all_normal.png and /dev/null differ diff --git a/res/drawable-hdpi/select_album_play_all_pressed.png b/res/drawable-hdpi/select_album_play_all_pressed.png deleted file mode 100644 index c3025903..00000000 Binary files a/res/drawable-hdpi/select_album_play_all_pressed.png and /dev/null differ diff --git a/res/drawable-hdpi/stat_sys_download_anim0_dark.png b/res/drawable-hdpi/stat_sys_download_anim0_dark.png new file mode 100644 index 00000000..3a79bb54 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim0_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim0_light.png b/res/drawable-hdpi/stat_sys_download_anim0_light.png new file mode 100644 index 00000000..3ace905e Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim0_light.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim1_dark.png b/res/drawable-hdpi/stat_sys_download_anim1_dark.png new file mode 100644 index 00000000..1ae4b0e1 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim1_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim1_light.png b/res/drawable-hdpi/stat_sys_download_anim1_light.png new file mode 100644 index 00000000..2f25c63e Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim1_light.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim2_dark.png b/res/drawable-hdpi/stat_sys_download_anim2_dark.png new file mode 100644 index 00000000..48d52875 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim2_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim2_light.png b/res/drawable-hdpi/stat_sys_download_anim2_light.png new file mode 100644 index 00000000..ffb5864e Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim2_light.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim3_dark.png b/res/drawable-hdpi/stat_sys_download_anim3_dark.png new file mode 100644 index 00000000..862d5f1c Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim3_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim3_light.png b/res/drawable-hdpi/stat_sys_download_anim3_light.png new file mode 100644 index 00000000..def3fe67 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim3_light.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim4_dark.png b/res/drawable-hdpi/stat_sys_download_anim4_dark.png new file mode 100644 index 00000000..2bcffa39 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim4_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim4_light.png b/res/drawable-hdpi/stat_sys_download_anim4_light.png new file mode 100644 index 00000000..4d4b4399 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim4_light.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim5_dark.png b/res/drawable-hdpi/stat_sys_download_anim5_dark.png new file mode 100644 index 00000000..71107c15 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim5_dark.png differ diff --git a/res/drawable-hdpi/stat_sys_download_anim5_light.png b/res/drawable-hdpi/stat_sys_download_anim5_light.png new file mode 100644 index 00000000..651ec104 Binary files /dev/null and b/res/drawable-hdpi/stat_sys_download_anim5_light.png differ diff --git a/res/drawable-hdpi/unknown_album.png b/res/drawable-hdpi/unknown_album.png index 19e0fe43..f9df287c 100644 Binary files a/res/drawable-hdpi/unknown_album.png and b/res/drawable-hdpi/unknown_album.png differ diff --git a/res/drawable-ldpi-v11/ic_stat_ultrasonic.png b/res/drawable-ldpi-v11/ic_stat_ultrasonic.png index c10c2055..4ae0a39f 100644 Binary files a/res/drawable-ldpi-v11/ic_stat_ultrasonic.png and b/res/drawable-ldpi-v11/ic_stat_ultrasonic.png differ diff --git a/res/drawable-ldpi/btn_check_off_focused_holo_dark.png b/res/drawable-ldpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 00000000..da7aecec Binary files /dev/null and b/res/drawable-ldpi/btn_check_off_focused_holo_dark.png differ diff --git a/res/drawable-ldpi/btn_check_off_focused_holo_light.png b/res/drawable-ldpi/btn_check_off_focused_holo_light.png new file mode 100644 index 00000000..27b88650 Binary files /dev/null and b/res/drawable-ldpi/btn_check_off_focused_holo_light.png differ diff --git a/res/drawable-ldpi/btn_check_off_holo_dark.png b/res/drawable-ldpi/btn_check_off_holo_dark.png new file mode 100644 index 00000000..56530f81 Binary files /dev/null and b/res/drawable-ldpi/btn_check_off_holo_dark.png differ diff --git a/res/drawable-ldpi/btn_check_off_holo_light.png b/res/drawable-ldpi/btn_check_off_holo_light.png new file mode 100644 index 00000000..d31072f4 Binary files /dev/null and b/res/drawable-ldpi/btn_check_off_holo_light.png differ diff --git a/res/drawable-ldpi/btn_check_on_focused_holo_dark.png b/res/drawable-ldpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 00000000..728ae5c1 Binary files /dev/null and b/res/drawable-ldpi/btn_check_on_focused_holo_dark.png differ diff --git a/res/drawable-ldpi/btn_check_on_focused_holo_light.png b/res/drawable-ldpi/btn_check_on_focused_holo_light.png new file mode 100644 index 00000000..ae423ae1 Binary files /dev/null and b/res/drawable-ldpi/btn_check_on_focused_holo_light.png differ diff --git a/res/drawable-ldpi/btn_check_on_holo_dark.png b/res/drawable-ldpi/btn_check_on_holo_dark.png new file mode 100644 index 00000000..3e04466f Binary files /dev/null and b/res/drawable-ldpi/btn_check_on_holo_dark.png differ diff --git a/res/drawable-ldpi/btn_check_on_holo_light.png b/res/drawable-ldpi/btn_check_on_holo_light.png new file mode 100644 index 00000000..19bc6829 Binary files /dev/null and b/res/drawable-ldpi/btn_check_on_holo_light.png differ diff --git a/res/drawable-ldpi/ic_launcher.png b/res/drawable-ldpi/ic_launcher.png index e2eb81cc..0f7f738b 100644 Binary files a/res/drawable-ldpi/ic_launcher.png and b/res/drawable-ldpi/ic_launcher.png differ diff --git a/res/drawable-ldpi/ic_menu_about_dark.png b/res/drawable-ldpi/ic_menu_about_dark.png new file mode 100644 index 00000000..35c06703 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_about_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_about_light.png b/res/drawable-ldpi/ic_menu_about_light.png new file mode 100644 index 00000000..510c2aeb Binary files /dev/null and b/res/drawable-ldpi/ic_menu_about_light.png differ diff --git a/res/drawable-ldpi/ic_menu_add_to_queue_dark.png b/res/drawable-ldpi/ic_menu_add_to_queue_dark.png new file mode 100644 index 00000000..8531a6d8 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_add_to_queue_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_add_to_queue_light.png b/res/drawable-ldpi/ic_menu_add_to_queue_light.png new file mode 100644 index 00000000..e80c8aa3 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_add_to_queue_light.png differ diff --git a/res/drawable-ldpi/ic_menu_backward_dark.png b/res/drawable-ldpi/ic_menu_backward_dark.png new file mode 100644 index 00000000..1eddd779 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_backward_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_backward_light.png b/res/drawable-ldpi/ic_menu_backward_light.png new file mode 100644 index 00000000..1f3103d3 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_backward_light.png differ diff --git a/res/drawable-ldpi/ic_menu_bookmark_dark.png b/res/drawable-ldpi/ic_menu_bookmark_dark.png new file mode 100644 index 00000000..3acfd75d Binary files /dev/null and b/res/drawable-ldpi/ic_menu_bookmark_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_bookmark_light.png b/res/drawable-ldpi/ic_menu_bookmark_light.png new file mode 100644 index 00000000..0012deb2 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_bookmark_light.png differ diff --git a/res/drawable-ldpi/ic_menu_browse_dark.png b/res/drawable-ldpi/ic_menu_browse_dark.png new file mode 100644 index 00000000..c75b89be Binary files /dev/null and b/res/drawable-ldpi/ic_menu_browse_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_browse_light.png b/res/drawable-ldpi/ic_menu_browse_light.png new file mode 100644 index 00000000..dc0c5646 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_browse_light.png differ diff --git a/res/drawable-ldpi/ic_menu_chat_dark.png b/res/drawable-ldpi/ic_menu_chat_dark.png new file mode 100644 index 00000000..db20fdcc Binary files /dev/null and b/res/drawable-ldpi/ic_menu_chat_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_chat_light.png b/res/drawable-ldpi/ic_menu_chat_light.png new file mode 100644 index 00000000..a228c991 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_chat_light.png differ diff --git a/res/drawable-ldpi/ic_menu_chat_send_dark.png b/res/drawable-ldpi/ic_menu_chat_send_dark.png new file mode 100644 index 00000000..021210bd Binary files /dev/null and b/res/drawable-ldpi/ic_menu_chat_send_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_chat_send_light.png b/res/drawable-ldpi/ic_menu_chat_send_light.png new file mode 100644 index 00000000..87eb8268 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_chat_send_light.png differ diff --git a/res/drawable-ldpi/ic_menu_exit_dark.png b/res/drawable-ldpi/ic_menu_exit_dark.png new file mode 100644 index 00000000..99925605 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_exit_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_exit_light.png b/res/drawable-ldpi/ic_menu_exit_light.png new file mode 100644 index 00000000..bcd3ad17 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_exit_light.png differ diff --git a/res/drawable-ldpi/ic_menu_forward_dark.png b/res/drawable-ldpi/ic_menu_forward_dark.png new file mode 100644 index 00000000..97199b38 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_forward_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_forward_light.png b/res/drawable-ldpi/ic_menu_forward_light.png new file mode 100644 index 00000000..fda475a7 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_forward_light.png differ diff --git a/res/drawable-ldpi/ic_menu_help_dark.png b/res/drawable-ldpi/ic_menu_help_dark.png new file mode 100644 index 00000000..d4a5c92c Binary files /dev/null and b/res/drawable-ldpi/ic_menu_help_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_help_light.png b/res/drawable-ldpi/ic_menu_help_light.png new file mode 100644 index 00000000..3f3edf7b Binary files /dev/null and b/res/drawable-ldpi/ic_menu_help_light.png differ diff --git a/res/drawable-ldpi/ic_menu_home_dark.png b/res/drawable-ldpi/ic_menu_home_dark.png new file mode 100644 index 00000000..b0f33bcf Binary files /dev/null and b/res/drawable-ldpi/ic_menu_home_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_home_light.png b/res/drawable-ldpi/ic_menu_home_light.png new file mode 100644 index 00000000..aad2f575 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_home_light.png differ diff --git a/res/drawable-ldpi/ic_menu_playlists_dark.png b/res/drawable-ldpi/ic_menu_playlists_dark.png new file mode 100644 index 00000000..fc66730f Binary files /dev/null and b/res/drawable-ldpi/ic_menu_playlists_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_playlists_light.png b/res/drawable-ldpi/ic_menu_playlists_light.png new file mode 100644 index 00000000..9111893b Binary files /dev/null and b/res/drawable-ldpi/ic_menu_playlists_light.png differ diff --git a/res/drawable-ldpi/ic_menu_remove_all_dark.png b/res/drawable-ldpi/ic_menu_remove_all_dark.png new file mode 100644 index 00000000..6f54c8aa Binary files /dev/null and b/res/drawable-ldpi/ic_menu_remove_all_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_remove_all_light.png b/res/drawable-ldpi/ic_menu_remove_all_light.png new file mode 100644 index 00000000..a52d94ba Binary files /dev/null and b/res/drawable-ldpi/ic_menu_remove_all_light.png differ diff --git a/res/drawable-ldpi/ic_menu_save_dark.png b/res/drawable-ldpi/ic_menu_save_dark.png new file mode 100644 index 00000000..c14677cd Binary files /dev/null and b/res/drawable-ldpi/ic_menu_save_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_save_light.png b/res/drawable-ldpi/ic_menu_save_light.png new file mode 100644 index 00000000..a1dcf352 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_save_light.png differ diff --git a/res/drawable-ldpi/ic_menu_screen_on_off_dark.png b/res/drawable-ldpi/ic_menu_screen_on_off_dark.png new file mode 100644 index 00000000..3432cff8 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_screen_on_off_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_screen_on_off_light.png b/res/drawable-ldpi/ic_menu_screen_on_off_light.png new file mode 100644 index 00000000..70213ca2 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_screen_on_off_light.png differ diff --git a/res/drawable-ldpi/ic_menu_search_holo_dark.png b/res/drawable-ldpi/ic_menu_search_holo_dark.png new file mode 100644 index 00000000..941e2972 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_search_holo_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_search_holo_light.png b/res/drawable-ldpi/ic_menu_search_holo_light.png new file mode 100644 index 00000000..812d66ef Binary files /dev/null and b/res/drawable-ldpi/ic_menu_search_holo_light.png differ diff --git a/res/drawable-ldpi/ic_menu_select_all_dark.png b/res/drawable-ldpi/ic_menu_select_all_dark.png new file mode 100644 index 00000000..75892a23 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_select_all_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_select_all_light.png b/res/drawable-ldpi/ic_menu_select_all_light.png new file mode 100644 index 00000000..6ac5e33f Binary files /dev/null and b/res/drawable-ldpi/ic_menu_select_all_light.png differ diff --git a/res/drawable-ldpi/ic_menu_select_folder_dark.png b/res/drawable-ldpi/ic_menu_select_folder_dark.png new file mode 100644 index 00000000..ecdf3ca8 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_select_folder_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_select_folder_light.png b/res/drawable-ldpi/ic_menu_select_folder_light.png new file mode 100644 index 00000000..164367a3 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_select_folder_light.png differ diff --git a/res/drawable-ldpi/ic_menu_settings_dark.png b/res/drawable-ldpi/ic_menu_settings_dark.png new file mode 100644 index 00000000..e9648c30 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_settings_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_settings_light.png b/res/drawable-ldpi/ic_menu_settings_light.png new file mode 100644 index 00000000..08504b84 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_settings_light.png differ diff --git a/res/drawable-ldpi/ic_menu_share_dark.png b/res/drawable-ldpi/ic_menu_share_dark.png new file mode 100644 index 00000000..04bbfde1 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_share_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_share_light.png b/res/drawable-ldpi/ic_menu_share_light.png new file mode 100644 index 00000000..bac66f5f Binary files /dev/null and b/res/drawable-ldpi/ic_menu_share_light.png differ diff --git a/res/drawable-ldpi/ic_menu_unpin_dark.png b/res/drawable-ldpi/ic_menu_unpin_dark.png new file mode 100644 index 00000000..3b0fad01 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_unpin_dark.png differ diff --git a/res/drawable-ldpi/ic_menu_unpin_light.png b/res/drawable-ldpi/ic_menu_unpin_light.png new file mode 100644 index 00000000..8a944482 Binary files /dev/null and b/res/drawable-ldpi/ic_menu_unpin_light.png differ diff --git a/res/drawable-ldpi/ic_star_full_dark.png b/res/drawable-ldpi/ic_star_full_dark.png new file mode 100644 index 00000000..4c4d5673 Binary files /dev/null and b/res/drawable-ldpi/ic_star_full_dark.png differ diff --git a/res/drawable-ldpi/ic_star_full_light.png b/res/drawable-ldpi/ic_star_full_light.png new file mode 100644 index 00000000..08038c12 Binary files /dev/null and b/res/drawable-ldpi/ic_star_full_light.png differ diff --git a/res/drawable-ldpi/ic_star_hollow_dark.png b/res/drawable-ldpi/ic_star_hollow_dark.png new file mode 100644 index 00000000..6320e9eb Binary files /dev/null and b/res/drawable-ldpi/ic_star_hollow_dark.png differ diff --git a/res/drawable-ldpi/ic_star_hollow_light.png b/res/drawable-ldpi/ic_star_hollow_light.png new file mode 100644 index 00000000..7805afe7 Binary files /dev/null and b/res/drawable-ldpi/ic_star_hollow_light.png differ diff --git a/res/drawable-ldpi/ic_stat_ultrasonic.png b/res/drawable-ldpi/ic_stat_ultrasonic.png index 0070841b..034c5dd9 100644 Binary files a/res/drawable-ldpi/ic_stat_ultrasonic.png and b/res/drawable-ldpi/ic_stat_ultrasonic.png differ diff --git a/res/drawable-ldpi/media_backward_normal_dark.png b/res/drawable-ldpi/media_backward_normal_dark.png new file mode 100644 index 00000000..bf8822a7 Binary files /dev/null and b/res/drawable-ldpi/media_backward_normal_dark.png differ diff --git a/res/drawable-ldpi/media_backward_normal_light.png b/res/drawable-ldpi/media_backward_normal_light.png new file mode 100644 index 00000000..7f53fe81 Binary files /dev/null and b/res/drawable-ldpi/media_backward_normal_light.png differ diff --git a/res/drawable-ldpi/media_forward_normal_dark.png b/res/drawable-ldpi/media_forward_normal_dark.png new file mode 100644 index 00000000..d9358ce4 Binary files /dev/null and b/res/drawable-ldpi/media_forward_normal_dark.png differ diff --git a/res/drawable-ldpi/media_forward_normal_light.png b/res/drawable-ldpi/media_forward_normal_light.png new file mode 100644 index 00000000..cdad66d7 Binary files /dev/null and b/res/drawable-ldpi/media_forward_normal_light.png differ diff --git a/res/drawable-ldpi/media_pause_normal_dark.png b/res/drawable-ldpi/media_pause_normal_dark.png new file mode 100644 index 00000000..fde959f2 Binary files /dev/null and b/res/drawable-ldpi/media_pause_normal_dark.png differ diff --git a/res/drawable-ldpi/media_pause_normal_light.png b/res/drawable-ldpi/media_pause_normal_light.png new file mode 100644 index 00000000..e122bca4 Binary files /dev/null and b/res/drawable-ldpi/media_pause_normal_light.png differ diff --git a/res/drawable-ldpi/media_repeat_off_dark.png b/res/drawable-ldpi/media_repeat_off_dark.png new file mode 100644 index 00000000..ea8fa4b9 Binary files /dev/null and b/res/drawable-ldpi/media_repeat_off_dark.png differ diff --git a/res/drawable-ldpi/media_repeat_off_light.png b/res/drawable-ldpi/media_repeat_off_light.png new file mode 100644 index 00000000..9235174a Binary files /dev/null and b/res/drawable-ldpi/media_repeat_off_light.png differ diff --git a/res/drawable-ldpi/media_shuffle_normal_dark.png b/res/drawable-ldpi/media_shuffle_normal_dark.png new file mode 100644 index 00000000..61f77eb9 Binary files /dev/null and b/res/drawable-ldpi/media_shuffle_normal_dark.png differ diff --git a/res/drawable-ldpi/media_shuffle_normal_light.png b/res/drawable-ldpi/media_shuffle_normal_light.png new file mode 100644 index 00000000..ad0f607d Binary files /dev/null and b/res/drawable-ldpi/media_shuffle_normal_light.png differ diff --git a/res/drawable-ldpi/media_start_normal_dark.png b/res/drawable-ldpi/media_start_normal_dark.png new file mode 100644 index 00000000..8f6e0ca0 Binary files /dev/null and b/res/drawable-ldpi/media_start_normal_dark.png differ diff --git a/res/drawable-ldpi/media_start_normal_light.png b/res/drawable-ldpi/media_start_normal_light.png new file mode 100644 index 00000000..d554ec85 Binary files /dev/null and b/res/drawable-ldpi/media_start_normal_light.png differ diff --git a/res/drawable-ldpi/media_stop_normal_dark.png b/res/drawable-ldpi/media_stop_normal_dark.png new file mode 100644 index 00000000..27ac25ca Binary files /dev/null and b/res/drawable-ldpi/media_stop_normal_dark.png differ diff --git a/res/drawable-ldpi/media_stop_normal_light.png b/res/drawable-ldpi/media_stop_normal_light.png new file mode 100644 index 00000000..e1539a71 Binary files /dev/null and b/res/drawable-ldpi/media_stop_normal_light.png differ diff --git a/res/drawable-ldpi/media_toggle_list_normal_dark.png b/res/drawable-ldpi/media_toggle_list_normal_dark.png new file mode 100644 index 00000000..598d48a3 Binary files /dev/null and b/res/drawable-ldpi/media_toggle_list_normal_dark.png differ diff --git a/res/drawable-ldpi/media_toggle_list_normal_light.png b/res/drawable-ldpi/media_toggle_list_normal_light.png new file mode 100644 index 00000000..60792d4e Binary files /dev/null and b/res/drawable-ldpi/media_toggle_list_normal_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim0_dark.png b/res/drawable-ldpi/stat_sys_download_anim0_dark.png new file mode 100644 index 00000000..c98d9769 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim0_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim0_light.png b/res/drawable-ldpi/stat_sys_download_anim0_light.png new file mode 100644 index 00000000..ba43c5aa Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim0_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim1_dark.png b/res/drawable-ldpi/stat_sys_download_anim1_dark.png new file mode 100644 index 00000000..fb869a6e Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim1_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim1_light.png b/res/drawable-ldpi/stat_sys_download_anim1_light.png new file mode 100644 index 00000000..b2b2cf86 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim1_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim2_dark.png b/res/drawable-ldpi/stat_sys_download_anim2_dark.png new file mode 100644 index 00000000..bbbfa5f0 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim2_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim2_light.png b/res/drawable-ldpi/stat_sys_download_anim2_light.png new file mode 100644 index 00000000..1c7a2318 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim2_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim3_dark.png b/res/drawable-ldpi/stat_sys_download_anim3_dark.png new file mode 100644 index 00000000..d4678282 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim3_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim3_light.png b/res/drawable-ldpi/stat_sys_download_anim3_light.png new file mode 100644 index 00000000..2eb67a5b Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim3_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim4_dark.png b/res/drawable-ldpi/stat_sys_download_anim4_dark.png new file mode 100644 index 00000000..6bdadea2 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim4_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim4_light.png b/res/drawable-ldpi/stat_sys_download_anim4_light.png new file mode 100644 index 00000000..c1f373df Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim4_light.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim5_dark.png b/res/drawable-ldpi/stat_sys_download_anim5_dark.png new file mode 100644 index 00000000..3468f676 Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim5_dark.png differ diff --git a/res/drawable-ldpi/stat_sys_download_anim5_light.png b/res/drawable-ldpi/stat_sys_download_anim5_light.png new file mode 100644 index 00000000..99cf5d1c Binary files /dev/null and b/res/drawable-ldpi/stat_sys_download_anim5_light.png differ diff --git a/res/drawable-mdpi-v11/ic_stat_ultrasonic.png b/res/drawable-mdpi-v11/ic_stat_ultrasonic.png index 2be4fcf2..aa3e66b7 100644 Binary files a/res/drawable-mdpi-v11/ic_stat_ultrasonic.png and b/res/drawable-mdpi-v11/ic_stat_ultrasonic.png differ diff --git a/res/drawable-mdpi-v14/menu_arrow.png b/res/drawable-mdpi-v14/menu_arrow.png index 26d77595..5e37831f 100644 Binary files a/res/drawable-mdpi-v14/menu_arrow.png and b/res/drawable-mdpi-v14/menu_arrow.png differ diff --git a/res/drawable-mdpi-v9/ic_stat_ultrasonic.png b/res/drawable-mdpi-v9/ic_stat_ultrasonic.png index f03973c6..d540bec3 100644 Binary files a/res/drawable-mdpi-v9/ic_stat_ultrasonic.png and b/res/drawable-mdpi-v9/ic_stat_ultrasonic.png differ diff --git a/res/drawable-mdpi/btn_check_off_focused_holo_dark.png b/res/drawable-mdpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 00000000..7aad423b Binary files /dev/null and b/res/drawable-mdpi/btn_check_off_focused_holo_dark.png differ diff --git a/res/drawable-mdpi/btn_check_off_focused_holo_light.png b/res/drawable-mdpi/btn_check_off_focused_holo_light.png new file mode 100644 index 00000000..6d3c3484 Binary files /dev/null and b/res/drawable-mdpi/btn_check_off_focused_holo_light.png differ diff --git a/res/drawable-mdpi/btn_check_off_holo_dark.png b/res/drawable-mdpi/btn_check_off_holo_dark.png new file mode 100644 index 00000000..7b6f874a Binary files /dev/null and b/res/drawable-mdpi/btn_check_off_holo_dark.png differ diff --git a/res/drawable-mdpi/btn_check_off_holo_light.png b/res/drawable-mdpi/btn_check_off_holo_light.png new file mode 100644 index 00000000..aa47d423 Binary files /dev/null and b/res/drawable-mdpi/btn_check_off_holo_light.png differ diff --git a/res/drawable-mdpi/btn_check_on_focused_holo_dark.png b/res/drawable-mdpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 00000000..7b6541be Binary files /dev/null and b/res/drawable-mdpi/btn_check_on_focused_holo_dark.png differ diff --git a/res/drawable-mdpi/btn_check_on_focused_holo_light.png b/res/drawable-mdpi/btn_check_on_focused_holo_light.png new file mode 100644 index 00000000..d49d1dee Binary files /dev/null and b/res/drawable-mdpi/btn_check_on_focused_holo_light.png differ diff --git a/res/drawable-mdpi/btn_check_on_holo_dark.png b/res/drawable-mdpi/btn_check_on_holo_dark.png new file mode 100644 index 00000000..c886a405 Binary files /dev/null and b/res/drawable-mdpi/btn_check_on_holo_dark.png differ diff --git a/res/drawable-mdpi/btn_check_on_holo_light.png b/res/drawable-mdpi/btn_check_on_holo_light.png new file mode 100644 index 00000000..d702faa7 Binary files /dev/null and b/res/drawable-mdpi/btn_check_on_holo_light.png differ diff --git a/res/drawable-mdpi/ic_drag_queue.9.png b/res/drawable-mdpi/ic_drag_queue.9.png new file mode 100644 index 00000000..d7d8ddb2 Binary files /dev/null and b/res/drawable-mdpi/ic_drag_queue.9.png differ diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png index 14cbd506..bc49464d 100644 Binary files a/res/drawable-mdpi/ic_launcher.png and b/res/drawable-mdpi/ic_launcher.png differ diff --git a/res/drawable-mdpi/ic_menu_about_dark.png b/res/drawable-mdpi/ic_menu_about_dark.png new file mode 100644 index 00000000..bc411ff7 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_about_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_about_light.png b/res/drawable-mdpi/ic_menu_about_light.png new file mode 100644 index 00000000..6d5f2bb3 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_about_light.png differ diff --git a/res/drawable-mdpi/ic_menu_add_to_queue_dark.png b/res/drawable-mdpi/ic_menu_add_to_queue_dark.png new file mode 100644 index 00000000..5036d962 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_add_to_queue_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_add_to_queue_light.png b/res/drawable-mdpi/ic_menu_add_to_queue_light.png new file mode 100644 index 00000000..1608cbcf Binary files /dev/null and b/res/drawable-mdpi/ic_menu_add_to_queue_light.png differ diff --git a/res/drawable-mdpi/ic_menu_backward_dark.png b/res/drawable-mdpi/ic_menu_backward_dark.png new file mode 100644 index 00000000..645b5b59 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_backward_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_backward_light.png b/res/drawable-mdpi/ic_menu_backward_light.png new file mode 100644 index 00000000..be48ab37 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_backward_light.png differ diff --git a/res/drawable-mdpi/ic_menu_bookmark_dark.png b/res/drawable-mdpi/ic_menu_bookmark_dark.png new file mode 100644 index 00000000..1382cd25 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_bookmark_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_bookmark_light.png b/res/drawable-mdpi/ic_menu_bookmark_light.png new file mode 100644 index 00000000..01949957 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_bookmark_light.png differ diff --git a/res/drawable-mdpi/ic_menu_browse_dark.png b/res/drawable-mdpi/ic_menu_browse_dark.png new file mode 100644 index 00000000..aba99315 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_browse_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_browse_light.png b/res/drawable-mdpi/ic_menu_browse_light.png new file mode 100644 index 00000000..e770e0b0 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_browse_light.png differ diff --git a/res/drawable-mdpi/ic_menu_chat_dark.png b/res/drawable-mdpi/ic_menu_chat_dark.png new file mode 100644 index 00000000..38c00e5c Binary files /dev/null and b/res/drawable-mdpi/ic_menu_chat_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_chat_light.png b/res/drawable-mdpi/ic_menu_chat_light.png new file mode 100644 index 00000000..d4691809 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_chat_light.png differ diff --git a/res/drawable-mdpi/ic_menu_chat_send_dark.png b/res/drawable-mdpi/ic_menu_chat_send_dark.png new file mode 100644 index 00000000..40f71c5d Binary files /dev/null and b/res/drawable-mdpi/ic_menu_chat_send_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_chat_send_light.png b/res/drawable-mdpi/ic_menu_chat_send_light.png new file mode 100644 index 00000000..29ce1f4d Binary files /dev/null and b/res/drawable-mdpi/ic_menu_chat_send_light.png differ diff --git a/res/drawable-mdpi/ic_menu_exit_dark.png b/res/drawable-mdpi/ic_menu_exit_dark.png new file mode 100644 index 00000000..0d7a1d13 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_exit_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_exit_light.png b/res/drawable-mdpi/ic_menu_exit_light.png new file mode 100644 index 00000000..cb5bda5d Binary files /dev/null and b/res/drawable-mdpi/ic_menu_exit_light.png differ diff --git a/res/drawable-mdpi/ic_menu_forward_dark.png b/res/drawable-mdpi/ic_menu_forward_dark.png new file mode 100644 index 00000000..cf263681 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_forward_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_forward_light.png b/res/drawable-mdpi/ic_menu_forward_light.png new file mode 100644 index 00000000..e71a1784 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_forward_light.png differ diff --git a/res/drawable-mdpi/ic_menu_help_dark.png b/res/drawable-mdpi/ic_menu_help_dark.png new file mode 100644 index 00000000..8c686515 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_help_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_help_light.png b/res/drawable-mdpi/ic_menu_help_light.png new file mode 100644 index 00000000..4b2f590c Binary files /dev/null and b/res/drawable-mdpi/ic_menu_help_light.png differ diff --git a/res/drawable-mdpi/ic_menu_home_dark.png b/res/drawable-mdpi/ic_menu_home_dark.png new file mode 100644 index 00000000..f2f60c82 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_home_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_home_light.png b/res/drawable-mdpi/ic_menu_home_light.png new file mode 100644 index 00000000..63d32dfa Binary files /dev/null and b/res/drawable-mdpi/ic_menu_home_light.png differ diff --git a/res/drawable-mdpi/ic_menu_playlists_dark.png b/res/drawable-mdpi/ic_menu_playlists_dark.png new file mode 100644 index 00000000..6803e447 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_playlists_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_playlists_light.png b/res/drawable-mdpi/ic_menu_playlists_light.png new file mode 100644 index 00000000..7285ca8f Binary files /dev/null and b/res/drawable-mdpi/ic_menu_playlists_light.png differ diff --git a/res/drawable-mdpi/ic_menu_remove_all_dark.png b/res/drawable-mdpi/ic_menu_remove_all_dark.png new file mode 100644 index 00000000..4a2620e9 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_remove_all_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_remove_all_light.png b/res/drawable-mdpi/ic_menu_remove_all_light.png new file mode 100644 index 00000000..0b0b595a Binary files /dev/null and b/res/drawable-mdpi/ic_menu_remove_all_light.png differ diff --git a/res/drawable-mdpi/ic_menu_save_dark.png b/res/drawable-mdpi/ic_menu_save_dark.png new file mode 100644 index 00000000..ac2328b5 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_save_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_save_light.png b/res/drawable-mdpi/ic_menu_save_light.png new file mode 100644 index 00000000..41a3b15a Binary files /dev/null and b/res/drawable-mdpi/ic_menu_save_light.png differ diff --git a/res/drawable-mdpi/ic_menu_screen_on_off_dark.png b/res/drawable-mdpi/ic_menu_screen_on_off_dark.png new file mode 100644 index 00000000..ec343013 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_screen_on_off_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_screen_on_off_light.png b/res/drawable-mdpi/ic_menu_screen_on_off_light.png new file mode 100644 index 00000000..b129aed1 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_screen_on_off_light.png differ diff --git a/res/drawable-mdpi/ic_menu_search_holo_dark.png b/res/drawable-mdpi/ic_menu_search_holo_dark.png new file mode 100644 index 00000000..9cc7cc72 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_search_holo_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_search_holo_light.png b/res/drawable-mdpi/ic_menu_search_holo_light.png new file mode 100644 index 00000000..0135d1dd Binary files /dev/null and b/res/drawable-mdpi/ic_menu_search_holo_light.png differ diff --git a/res/drawable-mdpi/ic_menu_select_all_dark.png b/res/drawable-mdpi/ic_menu_select_all_dark.png new file mode 100644 index 00000000..23062e39 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_select_all_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_select_all_light.png b/res/drawable-mdpi/ic_menu_select_all_light.png new file mode 100644 index 00000000..e6e1d11d Binary files /dev/null and b/res/drawable-mdpi/ic_menu_select_all_light.png differ diff --git a/res/drawable-mdpi/ic_menu_select_folder_dark.png b/res/drawable-mdpi/ic_menu_select_folder_dark.png new file mode 100644 index 00000000..244e2d7e Binary files /dev/null and b/res/drawable-mdpi/ic_menu_select_folder_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_select_folder_light.png b/res/drawable-mdpi/ic_menu_select_folder_light.png new file mode 100644 index 00000000..7182f492 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_select_folder_light.png differ diff --git a/res/drawable-mdpi/ic_menu_settings_dark.png b/res/drawable-mdpi/ic_menu_settings_dark.png new file mode 100644 index 00000000..cf814840 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_settings_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_settings_light.png b/res/drawable-mdpi/ic_menu_settings_light.png new file mode 100644 index 00000000..5edd5467 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_settings_light.png differ diff --git a/res/drawable-mdpi/ic_menu_share_dark.png b/res/drawable-mdpi/ic_menu_share_dark.png new file mode 100644 index 00000000..7a63ffe6 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_share_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_share_light.png b/res/drawable-mdpi/ic_menu_share_light.png new file mode 100644 index 00000000..c8b9f308 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_share_light.png differ diff --git a/res/drawable-mdpi/ic_menu_unpin_dark.png b/res/drawable-mdpi/ic_menu_unpin_dark.png new file mode 100644 index 00000000..3f5e3511 Binary files /dev/null and b/res/drawable-mdpi/ic_menu_unpin_dark.png differ diff --git a/res/drawable-mdpi/ic_menu_unpin_light.png b/res/drawable-mdpi/ic_menu_unpin_light.png new file mode 100644 index 00000000..49f110db Binary files /dev/null and b/res/drawable-mdpi/ic_menu_unpin_light.png differ diff --git a/res/drawable-mdpi/ic_star_full_dark.png b/res/drawable-mdpi/ic_star_full_dark.png new file mode 100644 index 00000000..35672d4e Binary files /dev/null and b/res/drawable-mdpi/ic_star_full_dark.png differ diff --git a/res/drawable-mdpi/ic_star_full_light.png b/res/drawable-mdpi/ic_star_full_light.png new file mode 100644 index 00000000..b9623500 Binary files /dev/null and b/res/drawable-mdpi/ic_star_full_light.png differ diff --git a/res/drawable-mdpi/ic_star_hollow_dark.png b/res/drawable-mdpi/ic_star_hollow_dark.png new file mode 100644 index 00000000..b6ab87d2 Binary files /dev/null and b/res/drawable-mdpi/ic_star_hollow_dark.png differ diff --git a/res/drawable-mdpi/ic_star_hollow_light.png b/res/drawable-mdpi/ic_star_hollow_light.png new file mode 100644 index 00000000..d2dd7edf Binary files /dev/null and b/res/drawable-mdpi/ic_star_hollow_light.png differ diff --git a/res/drawable-mdpi/ic_stat_ultrasonic.png b/res/drawable-mdpi/ic_stat_ultrasonic.png index 22e2f630..c5cbeefd 100644 Binary files a/res/drawable-mdpi/ic_stat_ultrasonic.png and b/res/drawable-mdpi/ic_stat_ultrasonic.png differ diff --git a/res/drawable-mdpi/media_backward_normal_dark.png b/res/drawable-mdpi/media_backward_normal_dark.png new file mode 100644 index 00000000..7e3bb857 Binary files /dev/null and b/res/drawable-mdpi/media_backward_normal_dark.png differ diff --git a/res/drawable-mdpi/media_backward_normal_light.png b/res/drawable-mdpi/media_backward_normal_light.png new file mode 100644 index 00000000..a4b6d4ae Binary files /dev/null and b/res/drawable-mdpi/media_backward_normal_light.png differ diff --git a/res/drawable-mdpi/media_forward_normal_dark.png b/res/drawable-mdpi/media_forward_normal_dark.png new file mode 100644 index 00000000..1a4a923f Binary files /dev/null and b/res/drawable-mdpi/media_forward_normal_dark.png differ diff --git a/res/drawable-mdpi/media_forward_normal_light.png b/res/drawable-mdpi/media_forward_normal_light.png new file mode 100644 index 00000000..75f2647d Binary files /dev/null and b/res/drawable-mdpi/media_forward_normal_light.png differ diff --git a/res/drawable-mdpi/media_pause_normal_dark.png b/res/drawable-mdpi/media_pause_normal_dark.png new file mode 100644 index 00000000..0e4ccac5 Binary files /dev/null and b/res/drawable-mdpi/media_pause_normal_dark.png differ diff --git a/res/drawable-mdpi/media_pause_normal_light.png b/res/drawable-mdpi/media_pause_normal_light.png new file mode 100644 index 00000000..cccca211 Binary files /dev/null and b/res/drawable-mdpi/media_pause_normal_light.png differ diff --git a/res/drawable-mdpi/media_repeat_off_dark.png b/res/drawable-mdpi/media_repeat_off_dark.png new file mode 100644 index 00000000..25f51f90 Binary files /dev/null and b/res/drawable-mdpi/media_repeat_off_dark.png differ diff --git a/res/drawable-mdpi/media_repeat_off_light.png b/res/drawable-mdpi/media_repeat_off_light.png new file mode 100644 index 00000000..1f07e47c Binary files /dev/null and b/res/drawable-mdpi/media_repeat_off_light.png differ diff --git a/res/drawable-mdpi/media_shuffle_normal_dark.png b/res/drawable-mdpi/media_shuffle_normal_dark.png new file mode 100644 index 00000000..60153441 Binary files /dev/null and b/res/drawable-mdpi/media_shuffle_normal_dark.png differ diff --git a/res/drawable-mdpi/media_shuffle_normal_light.png b/res/drawable-mdpi/media_shuffle_normal_light.png new file mode 100644 index 00000000..9b4bac94 Binary files /dev/null and b/res/drawable-mdpi/media_shuffle_normal_light.png differ diff --git a/res/drawable-mdpi/media_start_normal_dark.png b/res/drawable-mdpi/media_start_normal_dark.png new file mode 100644 index 00000000..9e93c787 Binary files /dev/null and b/res/drawable-mdpi/media_start_normal_dark.png differ diff --git a/res/drawable-mdpi/media_start_normal_light.png b/res/drawable-mdpi/media_start_normal_light.png new file mode 100644 index 00000000..0284541c Binary files /dev/null and b/res/drawable-mdpi/media_start_normal_light.png differ diff --git a/res/drawable-mdpi/media_stop_normal_dark.png b/res/drawable-mdpi/media_stop_normal_dark.png new file mode 100644 index 00000000..7bd7d7c8 Binary files /dev/null and b/res/drawable-mdpi/media_stop_normal_dark.png differ diff --git a/res/drawable-mdpi/media_stop_normal_light.png b/res/drawable-mdpi/media_stop_normal_light.png new file mode 100644 index 00000000..b3ca300b Binary files /dev/null and b/res/drawable-mdpi/media_stop_normal_light.png differ diff --git a/res/drawable-mdpi/media_toggle_list_normal_dark.png b/res/drawable-mdpi/media_toggle_list_normal_dark.png new file mode 100644 index 00000000..3b5a5646 Binary files /dev/null and b/res/drawable-mdpi/media_toggle_list_normal_dark.png differ diff --git a/res/drawable-mdpi/media_toggle_list_normal_light.png b/res/drawable-mdpi/media_toggle_list_normal_light.png new file mode 100644 index 00000000..fdac2d1b Binary files /dev/null and b/res/drawable-mdpi/media_toggle_list_normal_light.png differ diff --git a/res/drawable-mdpi/menu_arrow.png b/res/drawable-mdpi/menu_arrow.png index ecacda71..a3a5b859 100644 Binary files a/res/drawable-mdpi/menu_arrow.png and b/res/drawable-mdpi/menu_arrow.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim0_dark.png b/res/drawable-mdpi/stat_sys_download_anim0_dark.png new file mode 100644 index 00000000..d6950426 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim0_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim0_light.png b/res/drawable-mdpi/stat_sys_download_anim0_light.png new file mode 100644 index 00000000..eca7e673 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim0_light.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim1_dark.png b/res/drawable-mdpi/stat_sys_download_anim1_dark.png new file mode 100644 index 00000000..ff0e9293 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim1_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim1_light.png b/res/drawable-mdpi/stat_sys_download_anim1_light.png new file mode 100644 index 00000000..ce0cb81f Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim1_light.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim2_dark.png b/res/drawable-mdpi/stat_sys_download_anim2_dark.png new file mode 100644 index 00000000..3cfa42c3 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim2_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim2_light.png b/res/drawable-mdpi/stat_sys_download_anim2_light.png new file mode 100644 index 00000000..a599a46d Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim2_light.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim3_dark.png b/res/drawable-mdpi/stat_sys_download_anim3_dark.png new file mode 100644 index 00000000..2cae5e6b Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim3_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim3_light.png b/res/drawable-mdpi/stat_sys_download_anim3_light.png new file mode 100644 index 00000000..0c3c4381 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim3_light.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim4_dark.png b/res/drawable-mdpi/stat_sys_download_anim4_dark.png new file mode 100644 index 00000000..0c1d6305 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim4_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim4_light.png b/res/drawable-mdpi/stat_sys_download_anim4_light.png new file mode 100644 index 00000000..39df5adf Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim4_light.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim5_dark.png b/res/drawable-mdpi/stat_sys_download_anim5_dark.png new file mode 100644 index 00000000..f3e80433 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim5_dark.png differ diff --git a/res/drawable-mdpi/stat_sys_download_anim5_light.png b/res/drawable-mdpi/stat_sys_download_anim5_light.png new file mode 100644 index 00000000..34372394 Binary files /dev/null and b/res/drawable-mdpi/stat_sys_download_anim5_light.png differ diff --git a/res/drawable-nodpi/bkgd_tile_black.png b/res/drawable-nodpi/bkgd_tile_black.png deleted file mode 100644 index 3b430c53..00000000 Binary files a/res/drawable-nodpi/bkgd_tile_black.png and /dev/null differ diff --git a/res/drawable-nodpi/preview.png b/res/drawable-nodpi/preview.png deleted file mode 100644 index 5b9599ab..00000000 Binary files a/res/drawable-nodpi/preview.png and /dev/null differ diff --git a/res/drawable-nodpi/preview4x1.png b/res/drawable-nodpi/preview4x1.png new file mode 100644 index 00000000..2eae0f1a Binary files /dev/null and b/res/drawable-nodpi/preview4x1.png differ diff --git a/res/drawable-nodpi/preview4x2.png b/res/drawable-nodpi/preview4x2.png new file mode 100644 index 00000000..ff1e414f Binary files /dev/null and b/res/drawable-nodpi/preview4x2.png differ diff --git a/res/drawable-nodpi/preview4x3.png b/res/drawable-nodpi/preview4x3.png new file mode 100644 index 00000000..665aa40c Binary files /dev/null and b/res/drawable-nodpi/preview4x3.png differ diff --git a/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png b/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png index 991913ad..039dc149 100644 Binary files a/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png and b/res/drawable-xhdpi-v11/ic_stat_ultrasonic.png differ diff --git a/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png b/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png index 8e59d012..f4fcb51b 100644 Binary files a/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png and b/res/drawable-xhdpi-v14/appwidget_dark_bg_trans.9.png differ diff --git a/res/drawable-xhdpi-v14/menu_arrow.png b/res/drawable-xhdpi-v14/menu_arrow.png index 6bdcc62e..8ebf4af2 100644 Binary files a/res/drawable-xhdpi-v14/menu_arrow.png and b/res/drawable-xhdpi-v14/menu_arrow.png differ diff --git a/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png b/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png index 7d8ea3eb..256e3b9d 100644 Binary files a/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png and b/res/drawable-xhdpi-v9/ic_stat_ultrasonic.png differ diff --git a/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png b/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png new file mode 100644 index 00000000..9b47d131 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_off_focused_holo_dark.png differ diff --git a/res/drawable-xhdpi/btn_check_off_focused_holo_light.png b/res/drawable-xhdpi/btn_check_off_focused_holo_light.png new file mode 100644 index 00000000..6229decf Binary files /dev/null and b/res/drawable-xhdpi/btn_check_off_focused_holo_light.png differ diff --git a/res/drawable-xhdpi/btn_check_off_holo_dark.png b/res/drawable-xhdpi/btn_check_off_holo_dark.png new file mode 100644 index 00000000..e28af9a4 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_off_holo_dark.png differ diff --git a/res/drawable-xhdpi/btn_check_off_holo_light.png b/res/drawable-xhdpi/btn_check_off_holo_light.png new file mode 100644 index 00000000..bd6a71f5 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_off_holo_light.png differ diff --git a/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png b/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png new file mode 100644 index 00000000..c883b811 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_on_focused_holo_dark.png differ diff --git a/res/drawable-xhdpi/btn_check_on_focused_holo_light.png b/res/drawable-xhdpi/btn_check_on_focused_holo_light.png new file mode 100644 index 00000000..b9caf622 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_on_focused_holo_light.png differ diff --git a/res/drawable-xhdpi/btn_check_on_holo_dark.png b/res/drawable-xhdpi/btn_check_on_holo_dark.png new file mode 100644 index 00000000..92216e97 Binary files /dev/null and b/res/drawable-xhdpi/btn_check_on_holo_dark.png differ diff --git a/res/drawable-xhdpi/btn_check_on_holo_light.png b/res/drawable-xhdpi/btn_check_on_holo_light.png new file mode 100644 index 00000000..d8725e3c Binary files /dev/null and b/res/drawable-xhdpi/btn_check_on_holo_light.png differ diff --git a/res/drawable-xhdpi/ic_drag_queue.9.png b/res/drawable-xhdpi/ic_drag_queue.9.png new file mode 100644 index 00000000..e9816ceb Binary files /dev/null and b/res/drawable-xhdpi/ic_drag_queue.9.png differ diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png index 372e4591..8ad80eb8 100644 Binary files a/res/drawable-xhdpi/ic_launcher.png and b/res/drawable-xhdpi/ic_launcher.png differ diff --git a/res/drawable-xhdpi/ic_menu_about_dark.png b/res/drawable-xhdpi/ic_menu_about_dark.png new file mode 100644 index 00000000..7e123007 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_about_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_about_light.png b/res/drawable-xhdpi/ic_menu_about_light.png new file mode 100644 index 00000000..f85eaad8 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_about_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png b/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png new file mode 100644 index 00000000..c3c7547b Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_add_to_queue_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_add_to_queue_light.png b/res/drawable-xhdpi/ic_menu_add_to_queue_light.png new file mode 100644 index 00000000..5f617a53 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_add_to_queue_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_backward_dark.png b/res/drawable-xhdpi/ic_menu_backward_dark.png new file mode 100644 index 00000000..2febb1a3 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_backward_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_backward_light.png b/res/drawable-xhdpi/ic_menu_backward_light.png new file mode 100644 index 00000000..c2652e9a Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_backward_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_bookmark_dark.png b/res/drawable-xhdpi/ic_menu_bookmark_dark.png new file mode 100644 index 00000000..477c3498 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_bookmark_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_bookmark_light.png b/res/drawable-xhdpi/ic_menu_bookmark_light.png new file mode 100644 index 00000000..89e2f979 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_bookmark_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_browse_dark.png b/res/drawable-xhdpi/ic_menu_browse_dark.png new file mode 100644 index 00000000..7c32960f Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_browse_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_browse_light.png b/res/drawable-xhdpi/ic_menu_browse_light.png new file mode 100644 index 00000000..94bea3f0 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_browse_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_chat_dark.png b/res/drawable-xhdpi/ic_menu_chat_dark.png new file mode 100644 index 00000000..2ebd8bc6 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_chat_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_chat_light.png b/res/drawable-xhdpi/ic_menu_chat_light.png new file mode 100644 index 00000000..51c6426c Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_chat_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_chat_send_dark.png b/res/drawable-xhdpi/ic_menu_chat_send_dark.png new file mode 100644 index 00000000..24284332 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_chat_send_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_chat_send_light.png b/res/drawable-xhdpi/ic_menu_chat_send_light.png new file mode 100644 index 00000000..b6b66d8c Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_chat_send_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_exit_dark.png b/res/drawable-xhdpi/ic_menu_exit_dark.png new file mode 100644 index 00000000..39225d2a Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_exit_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_exit_light.png b/res/drawable-xhdpi/ic_menu_exit_light.png new file mode 100644 index 00000000..4622d4ad Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_exit_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_forward_dark.png b/res/drawable-xhdpi/ic_menu_forward_dark.png new file mode 100644 index 00000000..b82d9779 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_forward_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_forward_light.png b/res/drawable-xhdpi/ic_menu_forward_light.png new file mode 100644 index 00000000..244b8675 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_forward_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_help_dark.png b/res/drawable-xhdpi/ic_menu_help_dark.png new file mode 100644 index 00000000..2a6ce863 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_help_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_help_light.png b/res/drawable-xhdpi/ic_menu_help_light.png new file mode 100644 index 00000000..efa70c6f Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_help_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_home_dark.png b/res/drawable-xhdpi/ic_menu_home_dark.png new file mode 100644 index 00000000..a9bdcd57 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_home_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_home_light.png b/res/drawable-xhdpi/ic_menu_home_light.png new file mode 100644 index 00000000..af85f382 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_home_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_pin.png b/res/drawable-xhdpi/ic_menu_pin.png index 83850be2..2c4e962b 100644 Binary files a/res/drawable-xhdpi/ic_menu_pin.png and b/res/drawable-xhdpi/ic_menu_pin.png differ diff --git a/res/drawable-xhdpi/ic_menu_playlists_dark.png b/res/drawable-xhdpi/ic_menu_playlists_dark.png new file mode 100644 index 00000000..0594ddd1 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_playlists_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_playlists_light.png b/res/drawable-xhdpi/ic_menu_playlists_light.png new file mode 100644 index 00000000..4fbf8bb0 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_playlists_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_remove_all_dark.png b/res/drawable-xhdpi/ic_menu_remove_all_dark.png new file mode 100644 index 00000000..c289b0e9 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_remove_all_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_remove_all_light.png b/res/drawable-xhdpi/ic_menu_remove_all_light.png new file mode 100644 index 00000000..13a9c1c9 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_remove_all_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_save_dark.png b/res/drawable-xhdpi/ic_menu_save_dark.png new file mode 100644 index 00000000..5d496e1b Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_save_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_save_light.png b/res/drawable-xhdpi/ic_menu_save_light.png new file mode 100644 index 00000000..10d8e2d2 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_save_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png b/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png new file mode 100644 index 00000000..49d78886 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_screen_on_off_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_screen_on_off_light.png b/res/drawable-xhdpi/ic_menu_screen_on_off_light.png new file mode 100644 index 00000000..f133bdeb Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_screen_on_off_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_search_holo_dark.png b/res/drawable-xhdpi/ic_menu_search_holo_dark.png new file mode 100644 index 00000000..257ed16c Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_search_holo_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_search_holo_light.png b/res/drawable-xhdpi/ic_menu_search_holo_light.png new file mode 100644 index 00000000..5d3a78a8 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_search_holo_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_select_all_dark.png b/res/drawable-xhdpi/ic_menu_select_all_dark.png new file mode 100644 index 00000000..f8c00c3a Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_select_all_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_select_all_light.png b/res/drawable-xhdpi/ic_menu_select_all_light.png new file mode 100644 index 00000000..6707c37b Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_select_all_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_select_folder_dark.png b/res/drawable-xhdpi/ic_menu_select_folder_dark.png new file mode 100644 index 00000000..cdd2a5e4 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_select_folder_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_select_folder_light.png b/res/drawable-xhdpi/ic_menu_select_folder_light.png new file mode 100644 index 00000000..17cf90b1 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_select_folder_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_settings_dark.png b/res/drawable-xhdpi/ic_menu_settings_dark.png new file mode 100644 index 00000000..14bbc767 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_settings_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_settings_light.png b/res/drawable-xhdpi/ic_menu_settings_light.png new file mode 100644 index 00000000..971fa0c2 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_settings_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_share_dark.png b/res/drawable-xhdpi/ic_menu_share_dark.png new file mode 100644 index 00000000..19f79df9 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_share_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_share_light.png b/res/drawable-xhdpi/ic_menu_share_light.png new file mode 100644 index 00000000..7597f712 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_share_light.png differ diff --git a/res/drawable-xhdpi/ic_menu_unpin_dark.png b/res/drawable-xhdpi/ic_menu_unpin_dark.png new file mode 100644 index 00000000..83406f0d Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_unpin_dark.png differ diff --git a/res/drawable-xhdpi/ic_menu_unpin_light.png b/res/drawable-xhdpi/ic_menu_unpin_light.png new file mode 100644 index 00000000..c075e3c8 Binary files /dev/null and b/res/drawable-xhdpi/ic_menu_unpin_light.png differ diff --git a/res/drawable-xhdpi/ic_star_full_dark.png b/res/drawable-xhdpi/ic_star_full_dark.png new file mode 100644 index 00000000..1de3fe7a Binary files /dev/null and b/res/drawable-xhdpi/ic_star_full_dark.png differ diff --git a/res/drawable-xhdpi/ic_star_full_light.png b/res/drawable-xhdpi/ic_star_full_light.png new file mode 100644 index 00000000..df90593c Binary files /dev/null and b/res/drawable-xhdpi/ic_star_full_light.png differ diff --git a/res/drawable-xhdpi/ic_star_hollow_dark.png b/res/drawable-xhdpi/ic_star_hollow_dark.png new file mode 100644 index 00000000..3d2c63f6 Binary files /dev/null and b/res/drawable-xhdpi/ic_star_hollow_dark.png differ diff --git a/res/drawable-xhdpi/ic_star_hollow_light.png b/res/drawable-xhdpi/ic_star_hollow_light.png new file mode 100644 index 00000000..7f148b12 Binary files /dev/null and b/res/drawable-xhdpi/ic_star_hollow_light.png differ diff --git a/res/drawable-xhdpi/ic_stat_downloading_dark.png b/res/drawable-xhdpi/ic_stat_downloading_dark.png deleted file mode 100644 index acb2fec1..00000000 Binary files a/res/drawable-xhdpi/ic_stat_downloading_dark.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_stat_downloading_light.png b/res/drawable-xhdpi/ic_stat_downloading_light.png deleted file mode 100644 index a76cb393..00000000 Binary files a/res/drawable-xhdpi/ic_stat_downloading_light.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_stat_ultrasonic.png b/res/drawable-xhdpi/ic_stat_ultrasonic.png index bbe4d426..894f5da0 100644 Binary files a/res/drawable-xhdpi/ic_stat_ultrasonic.png and b/res/drawable-xhdpi/ic_stat_ultrasonic.png differ diff --git a/res/drawable-xhdpi/md__list_focused_holo.9.png b/res/drawable-xhdpi/md__list_focused_holo.9.png index b545f8e5..9ac546a3 100644 Binary files a/res/drawable-xhdpi/md__list_focused_holo.9.png and b/res/drawable-xhdpi/md__list_focused_holo.9.png differ diff --git a/res/drawable-xhdpi/md__list_longpressed_holo.9.png b/res/drawable-xhdpi/md__list_longpressed_holo.9.png index eda10e61..16183caf 100644 Binary files a/res/drawable-xhdpi/md__list_longpressed_holo.9.png and b/res/drawable-xhdpi/md__list_longpressed_holo.9.png differ diff --git a/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png b/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png index e4b33935..6fd19b2d 100644 Binary files a/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png and b/res/drawable-xhdpi/md__list_pressed_holo_dark.9.png differ diff --git a/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png b/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png index 88726b69..1e27e937 100644 Binary files a/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png and b/res/drawable-xhdpi/md__list_selector_disabled_holo_dark.9.png differ diff --git a/res/drawable-xhdpi/media_backward_normal_dark.png b/res/drawable-xhdpi/media_backward_normal_dark.png new file mode 100644 index 00000000..a1f71349 Binary files /dev/null and b/res/drawable-xhdpi/media_backward_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_backward_normal_light.png b/res/drawable-xhdpi/media_backward_normal_light.png new file mode 100644 index 00000000..f749f3c3 Binary files /dev/null and b/res/drawable-xhdpi/media_backward_normal_light.png differ diff --git a/res/drawable-xhdpi/media_forward_normal_dark.png b/res/drawable-xhdpi/media_forward_normal_dark.png new file mode 100644 index 00000000..0e531950 Binary files /dev/null and b/res/drawable-xhdpi/media_forward_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_forward_normal_light.png b/res/drawable-xhdpi/media_forward_normal_light.png new file mode 100644 index 00000000..193fcba4 Binary files /dev/null and b/res/drawable-xhdpi/media_forward_normal_light.png differ diff --git a/res/drawable-xhdpi/media_pause_normal_dark.png b/res/drawable-xhdpi/media_pause_normal_dark.png new file mode 100644 index 00000000..b7913a6e Binary files /dev/null and b/res/drawable-xhdpi/media_pause_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_pause_normal_light.png b/res/drawable-xhdpi/media_pause_normal_light.png new file mode 100644 index 00000000..4933c6ff Binary files /dev/null and b/res/drawable-xhdpi/media_pause_normal_light.png differ diff --git a/res/drawable-xhdpi/media_play_next.png b/res/drawable-xhdpi/media_play_next.png index 7090036a..1daa63c4 100644 Binary files a/res/drawable-xhdpi/media_play_next.png and b/res/drawable-xhdpi/media_play_next.png differ diff --git a/res/drawable-xhdpi/media_repeat_all.png b/res/drawable-xhdpi/media_repeat_all.png index 61f885b9..5cc9102e 100644 Binary files a/res/drawable-xhdpi/media_repeat_all.png and b/res/drawable-xhdpi/media_repeat_all.png differ diff --git a/res/drawable-xhdpi/media_repeat_off_dark.png b/res/drawable-xhdpi/media_repeat_off_dark.png new file mode 100644 index 00000000..4d5af562 Binary files /dev/null and b/res/drawable-xhdpi/media_repeat_off_dark.png differ diff --git a/res/drawable-xhdpi/media_repeat_off_light.png b/res/drawable-xhdpi/media_repeat_off_light.png new file mode 100644 index 00000000..77508f1c Binary files /dev/null and b/res/drawable-xhdpi/media_repeat_off_light.png differ diff --git a/res/drawable-xhdpi/media_repeat_single.png b/res/drawable-xhdpi/media_repeat_single.png index 1b37c302..6f95a2bc 100644 Binary files a/res/drawable-xhdpi/media_repeat_single.png and b/res/drawable-xhdpi/media_repeat_single.png differ diff --git a/res/drawable-xhdpi/media_shuffle_normal_dark.png b/res/drawable-xhdpi/media_shuffle_normal_dark.png new file mode 100644 index 00000000..b210171b Binary files /dev/null and b/res/drawable-xhdpi/media_shuffle_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_shuffle_normal_light.png b/res/drawable-xhdpi/media_shuffle_normal_light.png new file mode 100644 index 00000000..7005346c Binary files /dev/null and b/res/drawable-xhdpi/media_shuffle_normal_light.png differ diff --git a/res/drawable-xhdpi/media_start_normal_dark.png b/res/drawable-xhdpi/media_start_normal_dark.png new file mode 100644 index 00000000..e68c45b8 Binary files /dev/null and b/res/drawable-xhdpi/media_start_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_start_normal_light.png b/res/drawable-xhdpi/media_start_normal_light.png new file mode 100644 index 00000000..0fd4ebf9 Binary files /dev/null and b/res/drawable-xhdpi/media_start_normal_light.png differ diff --git a/res/drawable-xhdpi/media_stop_normal_dark.png b/res/drawable-xhdpi/media_stop_normal_dark.png new file mode 100644 index 00000000..eb7f8961 Binary files /dev/null and b/res/drawable-xhdpi/media_stop_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_stop_normal_light.png b/res/drawable-xhdpi/media_stop_normal_light.png new file mode 100644 index 00000000..54010be9 Binary files /dev/null and b/res/drawable-xhdpi/media_stop_normal_light.png differ diff --git a/res/drawable-xhdpi/media_toggle_list_normal_dark.png b/res/drawable-xhdpi/media_toggle_list_normal_dark.png new file mode 100644 index 00000000..fde8c25e Binary files /dev/null and b/res/drawable-xhdpi/media_toggle_list_normal_dark.png differ diff --git a/res/drawable-xhdpi/media_toggle_list_normal_light.png b/res/drawable-xhdpi/media_toggle_list_normal_light.png new file mode 100644 index 00000000..d7938221 Binary files /dev/null and b/res/drawable-xhdpi/media_toggle_list_normal_light.png differ diff --git a/res/drawable-xhdpi/menu_arrow.png b/res/drawable-xhdpi/menu_arrow.png index b1599372..8d1ba7ff 100644 Binary files a/res/drawable-xhdpi/menu_arrow.png and b/res/drawable-xhdpi/menu_arrow.png differ diff --git a/res/drawable-xhdpi/menubar_button_disabled.9.png b/res/drawable-xhdpi/menubar_button_disabled.9.png deleted file mode 100644 index e51431d8..00000000 Binary files a/res/drawable-xhdpi/menubar_button_disabled.9.png and /dev/null differ diff --git a/res/drawable-xhdpi/menubar_button_normal.9.png b/res/drawable-xhdpi/menubar_button_normal.9.png deleted file mode 100644 index df1cabf2..00000000 Binary files a/res/drawable-xhdpi/menubar_button_normal.9.png and /dev/null differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim0_dark.png b/res/drawable-xhdpi/stat_sys_download_anim0_dark.png new file mode 100644 index 00000000..0bb5855c Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim0_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim0_light.png b/res/drawable-xhdpi/stat_sys_download_anim0_light.png new file mode 100644 index 00000000..4c55dfac Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim0_light.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim1_dark.png b/res/drawable-xhdpi/stat_sys_download_anim1_dark.png new file mode 100644 index 00000000..91af06f9 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim1_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim1_light.png b/res/drawable-xhdpi/stat_sys_download_anim1_light.png new file mode 100644 index 00000000..b6ae63fb Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim1_light.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim2_dark.png b/res/drawable-xhdpi/stat_sys_download_anim2_dark.png new file mode 100644 index 00000000..86f32c7a Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim2_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim2_light.png b/res/drawable-xhdpi/stat_sys_download_anim2_light.png new file mode 100644 index 00000000..6527a627 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim2_light.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim3_dark.png b/res/drawable-xhdpi/stat_sys_download_anim3_dark.png new file mode 100644 index 00000000..51677fa1 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim3_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim3_light.png b/res/drawable-xhdpi/stat_sys_download_anim3_light.png new file mode 100644 index 00000000..63b22c34 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim3_light.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim4_dark.png b/res/drawable-xhdpi/stat_sys_download_anim4_dark.png new file mode 100644 index 00000000..7743a011 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim4_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim4_light.png b/res/drawable-xhdpi/stat_sys_download_anim4_light.png new file mode 100644 index 00000000..8d28fe56 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim4_light.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim5_dark.png b/res/drawable-xhdpi/stat_sys_download_anim5_dark.png new file mode 100644 index 00000000..b422bdd1 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim5_dark.png differ diff --git a/res/drawable-xhdpi/stat_sys_download_anim5_light.png b/res/drawable-xhdpi/stat_sys_download_anim5_light.png new file mode 100644 index 00000000..3ab32725 Binary files /dev/null and b/res/drawable-xhdpi/stat_sys_download_anim5_light.png differ diff --git a/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png b/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png index b0353feb..e87889b6 100644 Binary files a/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png and b/res/drawable-xxhdpi/btn_check_off_focused_holo_dark.png differ diff --git a/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png b/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png index 889a67c0..4faf7dba 100644 Binary files a/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png and b/res/drawable-xxhdpi/btn_check_off_focused_holo_light.png differ diff --git a/res/drawable-xxhdpi/btn_check_off_holo_dark.png b/res/drawable-xxhdpi/btn_check_off_holo_dark.png index ecfc08c7..ab8de190 100644 Binary files a/res/drawable-xxhdpi/btn_check_off_holo_dark.png and b/res/drawable-xxhdpi/btn_check_off_holo_dark.png differ diff --git a/res/drawable-xxhdpi/btn_check_off_holo_light.png b/res/drawable-xxhdpi/btn_check_off_holo_light.png index b067b58f..341323dd 100644 Binary files a/res/drawable-xxhdpi/btn_check_off_holo_light.png and b/res/drawable-xxhdpi/btn_check_off_holo_light.png differ diff --git a/res/drawable-xxhdpi/btn_check_on_holo_dark.png b/res/drawable-xxhdpi/btn_check_on_holo_dark.png index 1aafc836..c06b8594 100644 Binary files a/res/drawable-xxhdpi/btn_check_on_holo_dark.png and b/res/drawable-xxhdpi/btn_check_on_holo_dark.png differ diff --git a/res/drawable-xxhdpi/btn_check_on_holo_light.png b/res/drawable-xxhdpi/btn_check_on_holo_light.png index 11598dd2..a3ffb28e 100644 Binary files a/res/drawable-xxhdpi/btn_check_on_holo_light.png and b/res/drawable-xxhdpi/btn_check_on_holo_light.png differ diff --git a/res/drawable-xxhdpi/ic_action_import_export_dark.png b/res/drawable-xxhdpi/ic_action_import_export_dark.png deleted file mode 100644 index 2dccb243..00000000 Binary files a/res/drawable-xxhdpi/ic_action_import_export_dark.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_action_import_export_light.png b/res/drawable-xxhdpi/ic_action_import_export_light.png deleted file mode 100644 index f054a68e..00000000 Binary files a/res/drawable-xxhdpi/ic_action_import_export_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_action_volume_on_dark.png b/res/drawable-xxhdpi/ic_action_volume_on_dark.png deleted file mode 100644 index 87f2bc84..00000000 Binary files a/res/drawable-xxhdpi/ic_action_volume_on_dark.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_action_volume_on_light.png b/res/drawable-xxhdpi/ic_action_volume_on_light.png deleted file mode 100644 index cd668575..00000000 Binary files a/res/drawable-xxhdpi/ic_action_volume_on_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_launcher.png b/res/drawable-xxhdpi/ic_launcher.png index f4e7eabb..4011f1a3 100644 Binary files a/res/drawable-xxhdpi/ic_launcher.png and b/res/drawable-xxhdpi/ic_launcher.png differ diff --git a/res/drawable-xxhdpi/ic_menu_about_dark.png b/res/drawable-xxhdpi/ic_menu_about_dark.png index a7bdf347..fa3e710c 100644 Binary files a/res/drawable-xxhdpi/ic_menu_about_dark.png and b/res/drawable-xxhdpi/ic_menu_about_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_about_light.png b/res/drawable-xxhdpi/ic_menu_about_light.png index 0fe809b9..4eb2314b 100644 Binary files a/res/drawable-xxhdpi/ic_menu_about_light.png and b/res/drawable-xxhdpi/ic_menu_about_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png b/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png index c30aade6..769d5a49 100644 Binary files a/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png and b/res/drawable-xxhdpi/ic_menu_add_to_queue_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png b/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png index 7e3b25e1..32237ac1 100644 Binary files a/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png and b/res/drawable-xxhdpi/ic_menu_add_to_queue_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_backward_dark.png b/res/drawable-xxhdpi/ic_menu_backward_dark.png index 5b41aa4d..e1a24511 100644 Binary files a/res/drawable-xxhdpi/ic_menu_backward_dark.png and b/res/drawable-xxhdpi/ic_menu_backward_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_backward_light.png b/res/drawable-xxhdpi/ic_menu_backward_light.png index 46184bd0..6d94dc7d 100644 Binary files a/res/drawable-xxhdpi/ic_menu_backward_light.png and b/res/drawable-xxhdpi/ic_menu_backward_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_bookmark_dark.png b/res/drawable-xxhdpi/ic_menu_bookmark_dark.png index e4e2fb8c..4ddb2aee 100644 Binary files a/res/drawable-xxhdpi/ic_menu_bookmark_dark.png and b/res/drawable-xxhdpi/ic_menu_bookmark_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_bookmark_light.png b/res/drawable-xxhdpi/ic_menu_bookmark_light.png index cfd237f1..81446fdc 100644 Binary files a/res/drawable-xxhdpi/ic_menu_bookmark_light.png and b/res/drawable-xxhdpi/ic_menu_bookmark_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_browse_dark.png b/res/drawable-xxhdpi/ic_menu_browse_dark.png index 71a5214b..896e1aee 100644 Binary files a/res/drawable-xxhdpi/ic_menu_browse_dark.png and b/res/drawable-xxhdpi/ic_menu_browse_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_browse_light.png b/res/drawable-xxhdpi/ic_menu_browse_light.png index c41ca8c8..b209fc5b 100644 Binary files a/res/drawable-xxhdpi/ic_menu_browse_light.png and b/res/drawable-xxhdpi/ic_menu_browse_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_chat_dark.png b/res/drawable-xxhdpi/ic_menu_chat_dark.png index e88c4699..a2646118 100644 Binary files a/res/drawable-xxhdpi/ic_menu_chat_dark.png and b/res/drawable-xxhdpi/ic_menu_chat_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_chat_light.png b/res/drawable-xxhdpi/ic_menu_chat_light.png index 04000fd0..0300d97a 100644 Binary files a/res/drawable-xxhdpi/ic_menu_chat_light.png and b/res/drawable-xxhdpi/ic_menu_chat_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_chat_send_dark.png b/res/drawable-xxhdpi/ic_menu_chat_send_dark.png index 793f2cb2..b8d8c223 100644 Binary files a/res/drawable-xxhdpi/ic_menu_chat_send_dark.png and b/res/drawable-xxhdpi/ic_menu_chat_send_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_chat_send_light.png b/res/drawable-xxhdpi/ic_menu_chat_send_light.png index 373dde23..5c76b3d6 100644 Binary files a/res/drawable-xxhdpi/ic_menu_chat_send_light.png and b/res/drawable-xxhdpi/ic_menu_chat_send_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_exit_dark.png b/res/drawable-xxhdpi/ic_menu_exit_dark.png index 5dc21435..1865543e 100644 Binary files a/res/drawable-xxhdpi/ic_menu_exit_dark.png and b/res/drawable-xxhdpi/ic_menu_exit_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_exit_light.png b/res/drawable-xxhdpi/ic_menu_exit_light.png index 331c545b..bd197da4 100644 Binary files a/res/drawable-xxhdpi/ic_menu_exit_light.png and b/res/drawable-xxhdpi/ic_menu_exit_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_forward_dark.png b/res/drawable-xxhdpi/ic_menu_forward_dark.png index ae8ffaf1..e2568ce9 100644 Binary files a/res/drawable-xxhdpi/ic_menu_forward_dark.png and b/res/drawable-xxhdpi/ic_menu_forward_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_forward_light.png b/res/drawable-xxhdpi/ic_menu_forward_light.png index fe1d67cf..2ae026e0 100644 Binary files a/res/drawable-xxhdpi/ic_menu_forward_light.png and b/res/drawable-xxhdpi/ic_menu_forward_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_help_dark.png b/res/drawable-xxhdpi/ic_menu_help_dark.png index 7b3662c2..063e4d42 100644 Binary files a/res/drawable-xxhdpi/ic_menu_help_dark.png and b/res/drawable-xxhdpi/ic_menu_help_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_help_light.png b/res/drawable-xxhdpi/ic_menu_help_light.png index c5a34319..399531a8 100644 Binary files a/res/drawable-xxhdpi/ic_menu_help_light.png and b/res/drawable-xxhdpi/ic_menu_help_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_home_dark.png b/res/drawable-xxhdpi/ic_menu_home_dark.png index d25b2541..872aad36 100644 Binary files a/res/drawable-xxhdpi/ic_menu_home_dark.png and b/res/drawable-xxhdpi/ic_menu_home_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_home_light.png b/res/drawable-xxhdpi/ic_menu_home_light.png index 66431785..f0d447c5 100644 Binary files a/res/drawable-xxhdpi/ic_menu_home_light.png and b/res/drawable-xxhdpi/ic_menu_home_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_playlists_dark.png b/res/drawable-xxhdpi/ic_menu_playlists_dark.png index 46004164..3d021db2 100644 Binary files a/res/drawable-xxhdpi/ic_menu_playlists_dark.png and b/res/drawable-xxhdpi/ic_menu_playlists_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_playlists_light.png b/res/drawable-xxhdpi/ic_menu_playlists_light.png index b00a85f6..9f0696e0 100644 Binary files a/res/drawable-xxhdpi/ic_menu_playlists_light.png and b/res/drawable-xxhdpi/ic_menu_playlists_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_remove_all_dark.png b/res/drawable-xxhdpi/ic_menu_remove_all_dark.png index cb1260a4..33658a09 100644 Binary files a/res/drawable-xxhdpi/ic_menu_remove_all_dark.png and b/res/drawable-xxhdpi/ic_menu_remove_all_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_remove_all_light.png b/res/drawable-xxhdpi/ic_menu_remove_all_light.png index b522daff..a81319ec 100644 Binary files a/res/drawable-xxhdpi/ic_menu_remove_all_light.png and b/res/drawable-xxhdpi/ic_menu_remove_all_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_save_dark.png b/res/drawable-xxhdpi/ic_menu_save_dark.png index ccf8c82c..477a36c4 100644 Binary files a/res/drawable-xxhdpi/ic_menu_save_dark.png and b/res/drawable-xxhdpi/ic_menu_save_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_save_light.png b/res/drawable-xxhdpi/ic_menu_save_light.png index 74435004..128476e5 100644 Binary files a/res/drawable-xxhdpi/ic_menu_save_light.png and b/res/drawable-xxhdpi/ic_menu_save_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png b/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png index 463d3aee..653cba9c 100644 Binary files a/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png and b/res/drawable-xxhdpi/ic_menu_screen_on_off_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png b/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png index 33cf3546..84cfbc20 100644 Binary files a/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png and b/res/drawable-xxhdpi/ic_menu_screen_on_off_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_search_holo_dark.png b/res/drawable-xxhdpi/ic_menu_search_holo_dark.png index 4ba4314c..ecf69f08 100644 Binary files a/res/drawable-xxhdpi/ic_menu_search_holo_dark.png and b/res/drawable-xxhdpi/ic_menu_search_holo_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_search_holo_light.png b/res/drawable-xxhdpi/ic_menu_search_holo_light.png index c69d5263..92d0a0b2 100644 Binary files a/res/drawable-xxhdpi/ic_menu_search_holo_light.png and b/res/drawable-xxhdpi/ic_menu_search_holo_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_select_all_dark.png b/res/drawable-xxhdpi/ic_menu_select_all_dark.png index 9825a89a..e6ce24e4 100644 Binary files a/res/drawable-xxhdpi/ic_menu_select_all_dark.png and b/res/drawable-xxhdpi/ic_menu_select_all_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_select_all_light.png b/res/drawable-xxhdpi/ic_menu_select_all_light.png index aa5937ea..49e84ff4 100644 Binary files a/res/drawable-xxhdpi/ic_menu_select_all_light.png and b/res/drawable-xxhdpi/ic_menu_select_all_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_select_folder_dark.png b/res/drawable-xxhdpi/ic_menu_select_folder_dark.png index 51070821..ff60c866 100644 Binary files a/res/drawable-xxhdpi/ic_menu_select_folder_dark.png and b/res/drawable-xxhdpi/ic_menu_select_folder_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_select_folder_light.png b/res/drawable-xxhdpi/ic_menu_select_folder_light.png index 22003198..96130fce 100644 Binary files a/res/drawable-xxhdpi/ic_menu_select_folder_light.png and b/res/drawable-xxhdpi/ic_menu_select_folder_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_settings_dark.png b/res/drawable-xxhdpi/ic_menu_settings_dark.png index fe5fec47..5dce17ad 100644 Binary files a/res/drawable-xxhdpi/ic_menu_settings_dark.png and b/res/drawable-xxhdpi/ic_menu_settings_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_settings_light.png b/res/drawable-xxhdpi/ic_menu_settings_light.png index 530227e2..ace363e1 100644 Binary files a/res/drawable-xxhdpi/ic_menu_settings_light.png and b/res/drawable-xxhdpi/ic_menu_settings_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_share_dark.png b/res/drawable-xxhdpi/ic_menu_share_dark.png index 22ed428f..410c1e93 100644 Binary files a/res/drawable-xxhdpi/ic_menu_share_dark.png and b/res/drawable-xxhdpi/ic_menu_share_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_share_light.png b/res/drawable-xxhdpi/ic_menu_share_light.png index 3e441000..16c97d19 100644 Binary files a/res/drawable-xxhdpi/ic_menu_share_light.png and b/res/drawable-xxhdpi/ic_menu_share_light.png differ diff --git a/res/drawable-xxhdpi/ic_menu_unpin_dark.png b/res/drawable-xxhdpi/ic_menu_unpin_dark.png index ac9dbf06..99b2cd16 100644 Binary files a/res/drawable-xxhdpi/ic_menu_unpin_dark.png and b/res/drawable-xxhdpi/ic_menu_unpin_dark.png differ diff --git a/res/drawable-xxhdpi/ic_menu_unpin_light.png b/res/drawable-xxhdpi/ic_menu_unpin_light.png index ebe32838..3061291e 100644 Binary files a/res/drawable-xxhdpi/ic_menu_unpin_light.png and b/res/drawable-xxhdpi/ic_menu_unpin_light.png differ diff --git a/res/drawable-xxhdpi/ic_star_full_dark.png b/res/drawable-xxhdpi/ic_star_full_dark.png index 953dee08..356958ba 100644 Binary files a/res/drawable-xxhdpi/ic_star_full_dark.png and b/res/drawable-xxhdpi/ic_star_full_dark.png differ diff --git a/res/drawable-xxhdpi/ic_star_full_light.png b/res/drawable-xxhdpi/ic_star_full_light.png index 4b6c12c6..90deaeca 100644 Binary files a/res/drawable-xxhdpi/ic_star_full_light.png and b/res/drawable-xxhdpi/ic_star_full_light.png differ diff --git a/res/drawable-xxhdpi/ic_star_hollow_dark.png b/res/drawable-xxhdpi/ic_star_hollow_dark.png index 436b0ca1..7f0e2cf1 100644 Binary files a/res/drawable-xxhdpi/ic_star_hollow_dark.png and b/res/drawable-xxhdpi/ic_star_hollow_dark.png differ diff --git a/res/drawable-xxhdpi/ic_star_hollow_light.png b/res/drawable-xxhdpi/ic_star_hollow_light.png index 4e62bde7..0e7b4024 100644 Binary files a/res/drawable-xxhdpi/ic_star_hollow_light.png and b/res/drawable-xxhdpi/ic_star_hollow_light.png differ diff --git a/res/drawable-xxhdpi/media_backward_normal_dark.png b/res/drawable-xxhdpi/media_backward_normal_dark.png index 99d6a79f..ee88924c 100644 Binary files a/res/drawable-xxhdpi/media_backward_normal_dark.png and b/res/drawable-xxhdpi/media_backward_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_backward_normal_light.png b/res/drawable-xxhdpi/media_backward_normal_light.png index 3e0997ad..0643280a 100644 Binary files a/res/drawable-xxhdpi/media_backward_normal_light.png and b/res/drawable-xxhdpi/media_backward_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_forward_normal_dark.png b/res/drawable-xxhdpi/media_forward_normal_dark.png index 3c937727..82d5bf17 100644 Binary files a/res/drawable-xxhdpi/media_forward_normal_dark.png and b/res/drawable-xxhdpi/media_forward_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_forward_normal_light.png b/res/drawable-xxhdpi/media_forward_normal_light.png index 7e31df8b..8302f007 100644 Binary files a/res/drawable-xxhdpi/media_forward_normal_light.png and b/res/drawable-xxhdpi/media_forward_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_pause_normal_dark.png b/res/drawable-xxhdpi/media_pause_normal_dark.png index 293f7127..ceec1d6e 100644 Binary files a/res/drawable-xxhdpi/media_pause_normal_dark.png and b/res/drawable-xxhdpi/media_pause_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_pause_normal_light.png b/res/drawable-xxhdpi/media_pause_normal_light.png index c3b376a1..ae83f43e 100644 Binary files a/res/drawable-xxhdpi/media_pause_normal_light.png and b/res/drawable-xxhdpi/media_pause_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_repeat_off_dark.png b/res/drawable-xxhdpi/media_repeat_off_dark.png index c46ffa91..0639871b 100644 Binary files a/res/drawable-xxhdpi/media_repeat_off_dark.png and b/res/drawable-xxhdpi/media_repeat_off_dark.png differ diff --git a/res/drawable-xxhdpi/media_repeat_off_light.png b/res/drawable-xxhdpi/media_repeat_off_light.png index b94d29fb..43705a31 100644 Binary files a/res/drawable-xxhdpi/media_repeat_off_light.png and b/res/drawable-xxhdpi/media_repeat_off_light.png differ diff --git a/res/drawable-xxhdpi/media_repeat_single_dark.png b/res/drawable-xxhdpi/media_repeat_single_dark.png deleted file mode 100644 index 499bfe11..00000000 Binary files a/res/drawable-xxhdpi/media_repeat_single_dark.png and /dev/null differ diff --git a/res/drawable-xxhdpi/media_repeat_single_light.png b/res/drawable-xxhdpi/media_repeat_single_light.png deleted file mode 100644 index d9561b3b..00000000 Binary files a/res/drawable-xxhdpi/media_repeat_single_light.png and /dev/null differ diff --git a/res/drawable-xxhdpi/media_shuffle_normal_dark.png b/res/drawable-xxhdpi/media_shuffle_normal_dark.png index a2e1785c..800e72bf 100644 Binary files a/res/drawable-xxhdpi/media_shuffle_normal_dark.png and b/res/drawable-xxhdpi/media_shuffle_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_shuffle_normal_light.png b/res/drawable-xxhdpi/media_shuffle_normal_light.png index 61b73f12..090271e6 100644 Binary files a/res/drawable-xxhdpi/media_shuffle_normal_light.png and b/res/drawable-xxhdpi/media_shuffle_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_start_normal_dark.png b/res/drawable-xxhdpi/media_start_normal_dark.png index 97ff9b07..c0aed835 100644 Binary files a/res/drawable-xxhdpi/media_start_normal_dark.png and b/res/drawable-xxhdpi/media_start_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_start_normal_light.png b/res/drawable-xxhdpi/media_start_normal_light.png index df599471..e9c5fe51 100644 Binary files a/res/drawable-xxhdpi/media_start_normal_light.png and b/res/drawable-xxhdpi/media_start_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_stop_normal_dark.png b/res/drawable-xxhdpi/media_stop_normal_dark.png index c86dbb15..70d360a7 100644 Binary files a/res/drawable-xxhdpi/media_stop_normal_dark.png and b/res/drawable-xxhdpi/media_stop_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_stop_normal_light.png b/res/drawable-xxhdpi/media_stop_normal_light.png index f42d5252..ee251f8d 100644 Binary files a/res/drawable-xxhdpi/media_stop_normal_light.png and b/res/drawable-xxhdpi/media_stop_normal_light.png differ diff --git a/res/drawable-xxhdpi/media_toggle_list_normal_dark.png b/res/drawable-xxhdpi/media_toggle_list_normal_dark.png index 121d6ce1..b5029b58 100644 Binary files a/res/drawable-xxhdpi/media_toggle_list_normal_dark.png and b/res/drawable-xxhdpi/media_toggle_list_normal_dark.png differ diff --git a/res/drawable-xxhdpi/media_toggle_list_normal_light.png b/res/drawable-xxhdpi/media_toggle_list_normal_light.png index 9e2cb958..0aab7367 100644 Binary files a/res/drawable-xxhdpi/media_toggle_list_normal_light.png and b/res/drawable-xxhdpi/media_toggle_list_normal_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png index 6bcd8313..63bb4c80 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim0_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim0_light.png b/res/drawable-xxhdpi/stat_sys_download_anim0_light.png index ef7785a4..88583fae 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim0_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim0_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png index 1923c84f..b980a727 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim1_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim1_light.png b/res/drawable-xxhdpi/stat_sys_download_anim1_light.png index cc08ad4f..cd444db3 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim1_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim1_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png index 3a1aac56..a738764f 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim2_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim2_light.png b/res/drawable-xxhdpi/stat_sys_download_anim2_light.png index d81a7810..a30bcefb 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim2_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim2_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png index 92fde1cb..702ac98d 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim3_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim3_light.png b/res/drawable-xxhdpi/stat_sys_download_anim3_light.png index c22ceb94..bebc07f5 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim3_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim3_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png index 904c8169..12da6056 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim4_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim4_light.png b/res/drawable-xxhdpi/stat_sys_download_anim4_light.png index 7f512721..2e3cc82e 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim4_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim4_light.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png b/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png index c1513fe7..9b4c4381 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png and b/res/drawable-xxhdpi/stat_sys_download_anim5_dark.png differ diff --git a/res/drawable-xxhdpi/stat_sys_download_anim5_light.png b/res/drawable-xxhdpi/stat_sys_download_anim5_light.png index b0514360..a77736cb 100644 Binary files a/res/drawable-xxhdpi/stat_sys_download_anim5_light.png and b/res/drawable-xxhdpi/stat_sys_download_anim5_light.png differ diff --git a/res/drawable-xxxhdpi/ic_launcher.png b/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 00000000..64b3c40d Binary files /dev/null and b/res/drawable-xxxhdpi/ic_launcher.png differ diff --git a/res/drawable/border.xml b/res/drawable/border.xml deleted file mode 100644 index 09aa00f4..00000000 --- a/res/drawable/border.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/res/drawable/buttonbar_selector.xml b/res/drawable/buttonbar_selector.xml deleted file mode 100644 index ee4233b0..00000000 --- a/res/drawable/buttonbar_selector.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/res/drawable/list_background.xml b/res/drawable/list_background.xml deleted file mode 100644 index 271c1dfb..00000000 --- a/res/drawable/list_background.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/res/drawable/pinstripe_tile.xml b/res/drawable/pinstripe_tile.xml deleted file mode 100644 index d55e74db..00000000 --- a/res/drawable/pinstripe_tile.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/res/drawable/select_album_play_all.xml b/res/drawable/select_album_play_all.xml deleted file mode 100644 index 7c26364f..00000000 --- a/res/drawable/select_album_play_all.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/drawable/status_bg.xml b/res/drawable/status_bg.xml deleted file mode 100644 index 99e5ea61..00000000 --- a/res/drawable/status_bg.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/res/layout-port/download.xml b/res/layout-port/download.xml index e9e84727..1e5bc28e 100644 --- a/res/layout-port/download.xml +++ b/res/layout-port/download.xml @@ -22,9 +22,9 @@ a:id="@+id/download_album_art_image" a:layout_width="wrap_content" a:layout_height="wrap_content" + a:scaleType="fitCenter" a:layout_alignParentTop="true" - a:layout_centerHorizontal="true" - a:scaleType="fitCenter" /> + a:layout_centerInParent="true"/> + a:src="@drawable/unknown_album_large" /> + a:src="@drawable/unknown_album_large" /> + a:src="@drawable/unknown_album_large" /> + a:src="@drawable/unknown_album_large" /> - + + + - diff --git a/res/layout/menu_row_item.xml b/res/layout/menu_row_item.xml deleted file mode 100644 index b13619d0..00000000 --- a/res/layout/menu_row_item.xml +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/res/layout/play_video.xml b/res/layout/play_video.xml deleted file mode 100644 index 4966dd07..00000000 --- a/res/layout/play_video.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/res/layout/progress.xml b/res/layout/progress.xml deleted file mode 100644 index 35db0fa6..00000000 --- a/res/layout/progress.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/res/layout/select_share.xml b/res/layout/select_share.xml new file mode 100644 index 00000000..7b0641c9 --- /dev/null +++ b/res/layout/select_share.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/share_details.xml b/res/layout/share_details.xml index ffd906a8..3dc5b32d 100644 --- a/res/layout/share_details.xml +++ b/res/layout/share_details.xml @@ -10,30 +10,55 @@ a:layout_width="wrap_content" a:layout_height="wrap_content"> + + + a:singleLine="false" + a:layout_marginTop="4dip" + a:layout_marginBottom="4dip" /> - + a:layout_height="wrap_content" + a:text="@string/settings.share_expiration" + a:textAllCaps="true" + a:textColor="@color/cyan" + a:id="@+id/textViewExpiration" + a:layout_gravity="center_horizontal"/> - + a:layout_marginTop="4dip" + a:layout_marginBottom="4dip" /> + a:layout_height="wrap_content" + a:layout_marginTop="4dip" + a:layout_marginBottom="4dip" /> + + diff --git a/res/layout/share_list_item.xml b/res/layout/share_list_item.xml new file mode 100644 index 00000000..a1580129 --- /dev/null +++ b/res/layout/share_list_item.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/song_details.xml b/res/layout/song_details.xml index d1f9afb9..2568acb4 100644 --- a/res/layout/song_details.xml +++ b/res/layout/song_details.xml @@ -1,23 +1,23 @@ + a:layout_width="0dip" + a:layout_height="wrap_content" + a:layout_gravity="center_vertical" + a:layout_weight="1" + a:orientation="vertical"> + a:orientation="horizontal"> + a:textAppearance="?android:attr/textAppearanceMedium"/> + a:textAppearance="?android:attr/textAppearanceMedium"/> + a:id="@+id/song_status" + a:layout_width="wrap_content" + a:layout_height="wrap_content" + a:layout_gravity="right|center_vertical" + a:drawablePadding="1dip" + a:paddingRight="6dip"/> + a:orientation="horizontal"> + a:textAppearance="?android:attr/textAppearanceSmall"/> + a:textAppearance="?android:attr/textAppearanceSmall"/> \ No newline at end of file diff --git a/res/layout/song_list_item.xml b/res/layout/song_list_item.xml index 9cfc7572..0591cf9c 100644 --- a/res/layout/song_list_item.xml +++ b/res/layout/song_list_item.xml @@ -33,6 +33,6 @@ a:focusable="false" a:gravity="center_vertical" a:paddingRight="3dip" - a:src="?attr/drag_and_drop" /> + a:src="@drawable/ic_drag_queue" /> \ No newline at end of file diff --git a/res/layout/time_span_dialog.xml b/res/layout/time_span_dialog.xml new file mode 100644 index 00000000..30b9be60 --- /dev/null +++ b/res/layout/time_span_dialog.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/menu/nowplaying.xml b/res/menu/nowplaying.xml index abd97d61..24ddb18d 100644 --- a/res/menu/nowplaying.xml +++ b/res/menu/nowplaying.xml @@ -15,7 +15,7 @@ a:id="@+id/menu_item_share" a:icon="?attr/share" a:showAsAction="ifRoom|withText" - a:title="@string/download.share"/> + a:title="@string/download.share_playlist"/> + a:title="@string/menu.share"/> \ No newline at end of file diff --git a/res/menu/select_share_context.xml b/res/menu/select_share_context.xml new file mode 100644 index 00000000..eebe5383 --- /dev/null +++ b/res/menu/select_share_context.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml deleted file mode 100644 index d4931d56..00000000 --- a/res/values-fr/arrays.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 13f3cf40..171d9e00 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -20,8 +20,8 @@ Commenter Confirmer Supprimer - Download - Details + Télécharger + Détails Genres multiples Nom OK @@ -32,7 +32,6 @@ Jouer aleatoirement Public Enregistrer - Voir Artiste Détacher Artistes divers Voulez-vous supprimer %1$s @@ -46,11 +45,10 @@ La télécommande n\'est pas pris en charge. Mise à jour du serveur Subsonic requise. Volume de la télécommande Égaliseur - Jukebox Off - Jukebox On + Jukebox éteintes + Jukebox sur Paroles Retirer le morceau - Tout retirer Enregistrer la playlist Désactiver l\'écran Sur l\'écran @@ -75,13 +73,8 @@ Égaliseur Sélection prédéfinie Erreur - Retour - Fermer - Aide - Chargement… - Bienvenue dans UltraSonic ! file:///android_asset/html/en/index.html - Jukebox par defaut + Jukebox par défaut Aucunes paroles trouvées Alphabétique par artiste Alphabétique par nom @@ -96,28 +89,20 @@ Genres Musique Hors-ligne - Tous les genres - Sélectionner le genre Sélectionner un serveur - Paramètres Lecture aléatoire - Genre Aléatoire Favoris Titres - Videos + Vidéos Bienvenue dans UltraSonic ! L\'application n\'est pas configurée. Après avoir configuré votre serveur personnel (disponible à partir de subsonic.org), veuillez accéder aux Paramètres et modifier la configuration pour vous y connecter. Bienvenue! À propos - Ajouer à la playlist Général Playlist %s supprimée Echec de suppression playlist %s Quitter - Aide Navigation - Supprimer de la playlist - Recherche Paramètres Bibliothèque musicale Musique hors-ligne @@ -133,9 +118,7 @@ Mise à jour des informations Informations de la playlist %s mises à jour Echec de mise à jour des informations pour la playlist %s - Echec de récupération de la liste des playlists Veuillez patienter… - %1$s titre(s) enlevé(s) de \"%2$s\" Albums Artistes Recherche @@ -149,20 +132,14 @@ Obtenez des téléchargements illimités en faisant un don pour Subsonic. Maintenant Aucun titre trouvé - Plus %d Pistes sélectionnées. %d Pistes non sélectionnés. Avis: Aucun réseau disponible. Erreur: Aucune carte SD disponible. Serveur sans licence. %d jours d\'essai restant. - Hors-ligne Tout jouer - Recherche en cours… - Tout sélectionner Tous les dossiers - Aucun artistes trouvés Sélectionner le dossier - Rafraîchir Aucun genres trouvés Aucune playlist sur le serveur Contact du serveur, veuillez patienter. @@ -283,22 +260,18 @@ 75 Historique des recherches effacé Paramètres de recherche - Send album art over Bluetooth (May cause Bluetooth notifications to fail) - Album Art Over Bluetooth - Send playback notifications via Bluetooth - Send Bluetooth Notification + Envoyer pochette de l\'album via Bluetooth (peut causer des notifications à l\'échec) + Pochette de l\'album via Bluetooth + Envoyer des notifications lecture via Bluetooth + Envoyer une notification Bluetooth Ajouter un serveur Adresse du serveur Nom - Nombres de serveurs Mot de passe Supprimer ce serveur Télécharger des images redimensionnées à partir du serveur au lieu des tailles de bases (bande passante réduite) Album serveur mis à l\'échelle de la couverture Inutilisé - Inutilisé 1 - Inutilisé 2 - Inutilisé 3 Nom d\'utilisateur Serveurs Contrôles sur l\'écran de verrouillage @@ -318,13 +291,10 @@ Sombre Clair Thème - Paramètres d\'UltraSonic Utilisez des dossiers pour les noms d\'artistes Dossier de niveau supérieur devient le nom de l\'artiste de l\'album Naviguer en utilisant ID3 Tags Utiliser ID3 tag à la place du système de fichier basique - Utiliser un proxy - Support de lecture de flux à travers un proxy (peut provoquer des fritures) Vidéo Lecteur vidéo Actualisation de la vue @@ -340,44 +310,55 @@ 5 secondes Lire uniquement les flux médias si connecté au réseau Wi-Fi Wi-Fi en streaming uniquement - Année de fin: - Genre: - Année de début: %1$s%2$s %d Kb/s - %1$s titre(s) ajouté(s) à \"%2$s\" - Echec de mise à jour \"%s\", veuillez essayer plus tard. 0 o 0.00 Go 0 Ko 0.00 Mo -:-- 0:00 - MX Player is not installed. Get it for free on Play Store, or change video settings. - Get MX Player + MX Player n\'est pas installé. Recevez gratuitement sur Play Store, ou modifier les paramètres vidéo. + Obtenez MX Player Touchez pour sélectionner un titre Carte SD non disponible Aucune carte SD - Default Share Description - Sharing - Always ask for description and expiration when creating a share - Always Ask For Details - Default Expiration Date - Do not show dialog again - Set Share Options - Description - None - One Day - One Week - One Month - One Year - No Expiration - Share - Toggle Playlist - Set Bookmark - Delete Bookmark - Star - Clear Playlist + Partage par défaut description + Répartition + Toujours demander pour la description et l\'expiration lors de la création d\'une collection partagée + Toujours demander pour plus de détails + Temps d\'expiration par défaut + Ne montrent pas de dialogue à nouveau + Définir les options de partage + Aucune date d\'expiration + Changer de vue playlist + Mettre en signet + Supprimer le signet + Étoiler + Effacer la playlist + Partages + Pas d\'partages disponibles sur le serveur + Partager supprimé %s + Pas supprimer partager %s + Millisecondes + Secondes + Minutes + Heures + Journées + Désactiver + Pas activé + Enregistrer par défaut + Commentaire + Temps à expiration + \"%s\" retiré de la playlist + Partager playlist + Partage par défaut voeux + Consultez cette musique j\'ai partagé de %s + De partager des chansons via + MX Player + Défaut + Flash + Partager Aucun titre diff --git a/res/values-hu/arrays.xml b/res/values-hu/arrays.xml deleted file mode 100644 index 54f4e790..00000000 --- a/res/values-hu/arrays.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - light - dark - - - @string/settings.theme_light - @string/settings.theme_dark - - - 1 - 2 - 3 - 5 - 10 - -1 - - - @string/settings.preload_1 - @string/settings.preload_2 - @string/settings.preload_3 - @string/settings.preload_5 - @string/settings.preload_10 - @string/settings.preload_unlimited - - - 100 - 200 - 500 - 1000 - 2000 - 5000 - 10000 - 20000 - -1 - - - @string/settings.cache_size_100 - @string/settings.cache_size_200 - @string/settings.cache_size_500 - @string/settings.cache_size_1000 - @string/settings.cache_size_2000 - @string/settings.cache_size_5000 - @string/settings.cache_size_10000 - @string/settings.cache_size_20000 - @string/settings.cache_size_unlimited - - - 32 - 64 - 80 - 96 - 112 - 128 - 160 - 192 - 256 - 320 - 0 - - - @string/settings.max_bitrate_32 - @string/settings.max_bitrate_64 - @string/settings.max_bitrate_80 - @string/settings.max_bitrate_96 - @string/settings.max_bitrate_112 - @string/settings.max_bitrate_128 - @string/settings.max_bitrate_160 - @string/settings.max_bitrate_192 - @string/settings.max_bitrate_256 - @string/settings.max_bitrate_320 - @string/settings.max_bitrate_unlimited - - - 1 - 2 - 5 - 8 - 10 - 12 - 15 - 20 - 30 - - - 1000 - 2000 - 5000 - 8000 - 10000 - 12000 - 15000 - 20000 - 30000 - - - 0 - 1000 - 2000 - 5000 - 8000 - 10000 - 12000 - 15000 - 20000 - 30000 - 60000 - 120000 - - - @string/settings.buffer_length_0 - @string/settings.buffer_length_1 - @string/settings.buffer_length_2 - @string/settings.buffer_length_5 - @string/settings.buffer_length_8 - @string/settings.buffer_length_10 - @string/settings.buffer_length_12 - @string/settings.buffer_length_15 - @string/settings.buffer_length_20 - @string/settings.buffer_length_30 - @string/settings.buffer_length_60 - @string/settings.buffer_length_120 - - - 0 - 60 - 120 - 300 - 600 - 1800 - 3600 - - - @string/settings.directory_cache_time_0 - @string/settings.directory_cache_time_1 - @string/settings.directory_cache_time_2 - @string/settings.directory_cache_time_5 - @string/settings.directory_cache_time_10 - @string/settings.directory_cache_time_30 - @string/settings.directory_cache_time_60 - - - @string/settings.buffer_length_1 - @string/settings.buffer_length_2 - @string/settings.buffer_length_5 - @string/settings.buffer_length_8 - @string/settings.buffer_length_10 - @string/settings.buffer_length_12 - @string/settings.buffer_length_15 - @string/settings.buffer_length_20 - @string/settings.buffer_length_30 - - - 15000 - 30000 - 45000 - 60000 - 75000 - 90000 - 105000 - 120000 - - - @string/settings.network_timeout_15000 - @string/settings.network_timeout_30000 - @string/settings.network_timeout_45000 - @string/settings.network_timeout_60000 - @string/settings.network_timeout_75000 - @string/settings.network_timeout_90000 - @string/settings.network_timeout_105000 - @string/settings.network_timeout_120000 - - - 1 - 3 - 5 - 10 - 15 - 20 - 25 - 30 - 40 - 50 - 75 - 100 - 250 - 500 - - - @string/settings.search_1 - @string/settings.search_3 - @string/settings.search_5 - @string/settings.search_10 - @string/settings.search_15 - @string/settings.search_20 - @string/settings.search_25 - @string/settings.search_30 - @string/settings.search_40 - @string/settings.search_50 - @string/settings.search_75 - @string/settings.search_100 - @string/settings.search_250 - @string/settings.search_500 - - - mx - default - flash - - - MX Player - Alapértelmezett - Flash - - - - - diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 8d2c2bc5..f0ef4294 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -32,7 +32,6 @@ Véletlen sorrendű lejátszás Nyilvános Mentés - Előadó megjelenítése Visszavonás Különféle előadók Biztos, hogy törölni akarja? %1$s @@ -50,7 +49,6 @@ Jukebox be Dalszövegek Dal eltávolítása - Összes eltávolítása Lejátszási lista mentése Kijelző ki Kijelző be @@ -75,11 +73,6 @@ Equalizer Profil kiválasztása Hiba! - Vissza - Bezár - Súgó - Betöltés… - Üdvözli az UltraSonic! file:///android_asset/html/en/index.html Jukebox alapértelmezettként Dalszöveg nem található! @@ -96,12 +89,8 @@ Műfajok Zenék Kapcsolat nélküli - Összes műfaj - Műfaj kiválasztása Kiszolgáló kiválasztása - Beállítások Véletlen sorrendű - Műfaj szerint Véletlenszerű Csillagozott Dalok @@ -109,15 +98,11 @@ Üdvözli az UltraSonic! Az alkalmazás még nincs beállítva. Miután konfigurálta saját kiszolgálóját (elérhető: subsonic.org), húzza jobbra a képernyőt, lépjen be a Beállítások menüpontba, és adja meg csatlakozási adatokat! Üdvözlet! Névjegy - Hozzáadás a lejátszási listához Általános Törölt lejátszási lista %s Lejátszási lista törlése sikertelen %s Kilépés - Súgó Navigáció - Törlés a lejátszási listáról - Keresés Beállítások Mediakönyvtár Kapcsolat nélküli médiák @@ -133,9 +118,7 @@ Módosítás Módosított lejátszási lista %s Lejátszási lista módosítása sikertelen %s - Nem sikerült elérni a lejátszási lista adatait! Kérem várjon!… - %1$s eltávolítva: \"%2$s\" Albumok Előadók Keresés @@ -149,20 +132,14 @@ Korlátlan letöltéshez juthat a Subsonic támogatásával. Most Nem található média! - Egyéb %d dal kijelölve. %d dal visszavonva. Figyelem: Hálózat nem áll rendelkezésre! Hiba: SD kártya nem áll rendelkezésre! A kiszolgálónak nincs licence! %d próba nap van hátra! - Kapcsolat nélküli Összes lejátszása - Keresés… - Összes kijelölése Összes mappa - Előadók nem találhatók! Mappa kiválasztása - Frissítés Műfajok nem találhatók! Nincs mentett lejátszási lista a kiszolgálón. Csatlakozás a kiszolgálóhoz, kérem várjon! @@ -290,15 +267,11 @@ Kiszolgáló hozzáadása Kiszolgáló címe Név - Kiszolgálók száma Jelszó Kiszolgáló eltávolítása Teljes méretű helyett átméretezett képek letöltése a kiszolgálóról (sávszélesség-takarékos). Albumborító átméretezés (Kiszolgáló-oldali) Kiszolgáló - Kiszolgáló 1 - Kiszolgáló 2 - Kiszolgáló 3 Felhasználónév Kiszolgálók Képernyőzár kezelése @@ -318,13 +291,10 @@ Sötét Világos Téma - UltraSonic beállításai Mappanevek használata az előadók neveként Feltételezi, hogy a legfelső szintű mappa az elődó neve. Böngészés ID3 Tag használatával ID3 Tag módszer használata a fájlredszer alapú mód helyett. - Stream Proxy használata - Média lejátszása stream proxy-n keresztül (akadozások elkerülése érdekében). Videó Videólejátszó Megtekinté Frissítési @@ -340,13 +310,8 @@ 5 másodperc Streaming, csak ha rendelkezésre áll Wi-Fi kapcsolat. Csak Wi-Fi streaming - Utolsó év: - Műfaj: - Első év: %1$s%2$s %d kbps - %1$s dal hozzáadva: \"%2$s\" - Frissítés sikertelen: \"%s\", próbálja később! 0 B 0.00 GB 0 KB @@ -358,26 +323,42 @@ Érintse meg a zene kiválasztásához Az SD kártya nem elérhető! Nincs SD kártya! - Default Share Description - Sharing - Always ask for description and expiration when creating a share - Always Ask For Details - Default Expiration Date - Do not show dialog again - Set Share Options - Description - None - One Day - One Week - One Month - One Year - No Expiration - Share - Toggle Playlist - Set Bookmark - Delete Bookmark - Star - Clear Playlist + Alapértelmezett share leírás + Megosztása + Mindig kérjen leírása és lejárati létrehozásakor a részvény + Mindig kérjen részleteket + Alapértelmezett idő a lejárati + Ne mutassa párbeszédablak többé + Megosztási lehetőségek + Nincs lejárati + Kapcsoló lejátszási lista nézet + Beállított könyvjelző + Könyvjelző törlése + Csillag + Törölje a lejátszási lista + Dalok osztani másokkal + Nincs dalok osztani másokkal elérhető a szerveren + Megosztani törölték %s + Nem törölheti megosztott dal másokkal %s + Milliszekundum + Másodperc + Perc + Óra + Nap + Tiltsa + Rokkant + Menteni az alapértelmezett + Megjegyzés + Lejárati + \"%s\" ez a dal törölték + Ossza meg ezt a lejátszási lista + Alapértelmezett megosztási üdvözlő + Nézd meg ezt a zenét közös nektek %s + Megosztani dalok + MX Player + Alapértelmezett + Flash + Megosztani Nincsenek dalok diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 18ce1b09..5a926a61 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -210,9 +210,9 @@ flash - MX Player - Default - Flash + @string/settings.video_mx_player + @string/settings.video_default + @string/settings.video_flash @string/settings.view_refresh_500 @@ -239,19 +239,11 @@ 5000 - @string/settings.share_none - @string/settings.share_one_day - @string/settings.share_one_week - @string/settings.share_one_month - @string/settings.share_one_year + @string/settings.share_milliseconds + @string/settings.share_seconds + @string/settings.share_minutes + @string/settings.share_hours + @string/settings.share_days - - -1 - 86400000 - 604800000 - 2592000000 - 31536000000 - - \ No newline at end of file diff --git a/res/values/colors.xml b/res/values/colors.xml index 74af4813..3479317c 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -1,23 +1,12 @@ - #000000 - #F0F0F0 #555555 #FFFFFF - #ff0099cc - #FFFFFF - #FFFFFF - #ff0099cc - #ffffffff - #ff000000 #00000000 - #ffe0e0e0 #ff0099cc #8033b5e5 #00000000 - #B0000000 #80000000 - #FF555555 #ff000000 #fff3f3f3 \ No newline at end of file diff --git a/res/values/integers.xml b/res/values/integers.xml deleted file mode 100644 index 82a991a3..00000000 --- a/res/values/integers.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 150 - 220 - - \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index b8976f56..5527acb8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -32,7 +32,6 @@ Play Shuffled Public Save - Show Artist Unpin Various Artists Do you want to delete %1$s @@ -50,7 +49,6 @@ Jukebox On Lyrics Remove Song - Remove All Save Playlist Screen Off Screen On @@ -75,11 +73,6 @@ Equalizer Select Preset Error - Back - Close - Help - Loading… - Welcome to UltraSonic file:///android_asset/html/en/index.html Jukebox By Default No lyrics found @@ -96,12 +89,8 @@ Genres Music Offline - All Genres - Select Genre Select Server - Settings Shuffle Play - By Genre Random Starred Songs @@ -109,15 +98,11 @@ Welcome to UltraSonic! The app is currently not configured. After you\'ve set up your personal server (available from subsonic.org), please go to Settings and change the configuration to connect to it. Welcome! About - Add To Playlist Common Deleted playlist %s Failed to delete playlist %s Exit - Help Navigation - Remove From Playlist - Search Settings Media Library Offline Media @@ -133,9 +118,7 @@ Update Information Updated playlist information for %s Failed to update playlist information for %s - Failed to grab list of playlists Please wait… - Removed %1$s songs from \"%2$s\" Albums Artists Search @@ -149,20 +132,14 @@ Get unlimited downloads by donating to Subsonic. Now No media found - More %d tracks selected. %d tracks unselected. Warning: No network available. Error: No SD card available. Server not licensed. %d trial days left. - Offline Play All - Searching… - Select All All Folders - No artists found Select Folder - Refresh No genres found No saved playlists on server Contacting server, please wait. @@ -290,15 +267,11 @@ Add Server Server Address Name - Number Of Servers Password Remove Server Download scaled images from the server instead of full size (saves bandwidth) Server-Side Album Art Scaling Unused - Unused 1 - Unused 2 - Unused 3 Username Servers Show Lock Screen Controls @@ -318,13 +291,10 @@ Dark Light Theme - UltraSonic Settings Use Folders For Artist Name Assume top-level folder is the name of the album artist Browse Using ID3 Tags Use ID3 tag methods instead of file system based methods - Use Stream Proxy - Stream media playback through a proxy (may help stutter) Video Video player View Refresh @@ -340,13 +310,8 @@ 5 seconds Only stream media if connected to Wi-Fi Wi-Fi Streaming Only - End Year: - Genre: - Start Year: %1$s%2$s %d kbps - Added %1$s songs to \"%2$s\" - Failed to update \"%s\", please try later. 0 B 0.00 GB 0 KB @@ -362,22 +327,38 @@ Sharing Always ask for description and expiration when creating a share Always Ask For Details - Default Expiration Date + Default Expiration Time Do not show dialog again Set Share Options - Description - None - One Day - One Week - One Month - One Year No Expiration - Share Toggle Playlist Set Bookmark Delete Bookmark Star Clear Playlist + Shares + No shares available on server + Deleted share %s + Failed to delete share %s + Milliseconds + Seconds + Minutes + Hours + Days + Disable + Disabled + Save as default + Comment + Time To Expiration + \"%s\" was removed from playlist + Share Playlist + Default Share Greeting + Check out this music I shared from %s + Share songs via + MX Player + Default + Flash + Share No songs diff --git a/res/values/styles.xml b/res/values/styles.xml index a6cb48b9..80b9672d 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -89,7 +89,6 @@ - diff --git a/res/values/themes.xml b/res/values/themes.xml index ce7a2c05..f6302ced 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -32,7 +32,7 @@ @drawable/media_pause_normal_dark @drawable/media_repeat_all @drawable/media_repeat_off_dark - @drawable/media_repeat_single_dark + @drawable/media_repeat_single @drawable/media_shuffle_normal_dark @drawable/media_start_normal_dark @drawable/media_play_next @@ -43,7 +43,6 @@ @drawable/ic_menu_chat_send_dark @drawable/ic_menu_bookmark_dark @drawable/btn_check_custom_dark - @drawable/ic_action_import_export_dark \ No newline at end of file diff --git a/res/xml/appwidget_info_4x1.xml b/res/xml/appwidget_info_4x1.xml index 40a318b6..7993869d 100644 --- a/res/xml/appwidget_info_4x1.xml +++ b/res/xml/appwidget_info_4x1.xml @@ -4,6 +4,6 @@ a:minHeight="40dp" a:updatePeriodMillis="0" a:resizeMode="none" - a:previewImage="@drawable/preview" + a:previewImage="@drawable/preview4x1" a:widgetCategory="home_screen|keyguard" a:initialLayout="@layout/appwidget4x1"/> \ No newline at end of file diff --git a/res/xml/appwidget_info_4x2.xml b/res/xml/appwidget_info_4x2.xml index 5b690304..9f3a9078 100644 --- a/res/xml/appwidget_info_4x2.xml +++ b/res/xml/appwidget_info_4x2.xml @@ -4,6 +4,6 @@ a:minHeight="110dp" a:updatePeriodMillis="0" a:resizeMode="none" - a:previewImage="@drawable/preview" + a:previewImage="@drawable/preview4x2" a:widgetCategory="home_screen|keyguard" a:initialLayout="@layout/appwidget4x2"/> \ No newline at end of file diff --git a/res/xml/appwidget_info_4x3.xml b/res/xml/appwidget_info_4x3.xml index 571b8bad..3ecdfa72 100644 --- a/res/xml/appwidget_info_4x3.xml +++ b/res/xml/appwidget_info_4x3.xml @@ -4,6 +4,6 @@ a:minHeight="180dp" a:updatePeriodMillis="0" a:resizeMode="none" - a:previewImage="@drawable/preview" + a:previewImage="@drawable/preview4x3" a:widgetCategory="home_screen|keyguard" a:initialLayout="@layout/appwidget4x3"/> \ No newline at end of file diff --git a/res/xml/appwidget_info_4x4.xml b/res/xml/appwidget_info_4x4.xml index d7344426..1129878a 100644 --- a/res/xml/appwidget_info_4x4.xml +++ b/res/xml/appwidget_info_4x4.xml @@ -4,6 +4,6 @@ a:minHeight="250dp" a:updatePeriodMillis="0" a:resizeMode="none" - a:previewImage="@drawable/preview" + a:previewImage="@drawable/preview4x3" a:widgetCategory="home_screen|keyguard" a:initialLayout="@layout/appwidget4x4" /> \ No newline at end of file diff --git a/res/xml/settings.xml b/res/xml/settings.xml index 00d1b803..79f6fc7d 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -127,10 +127,11 @@ - + entries = new ArrayList(); + + if (downloadService != null) { - DownloadService downloadService = getDownloadService(); + List downloadServiceSongs = downloadService.getSongs(); - if (downloadService != null) + if (downloadServiceSongs != null) { - if (currentPlaying == null) + for (DownloadFile downloadFile : downloadServiceSongs) { - currentPlaying = downloadService.getCurrentPlaying(); - } + if (downloadFile != null) + { + Entry playlistEntry = downloadFile.getSong(); - if (currentPlaying != null) - { - entry = currentPlaying.getSong(); + if (playlistEntry != null) + { + entries.add(playlistEntry); + } + } } } } - if (entry != null) - { - List entries = new ArrayList(1); - entries.add(entry); - createShare(entries); - } + createShare(entries); + return true; default: return false; } @@ -1196,8 +1192,8 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi DownloadFile item = adapter.getItem(from); adapter.remove(item); adapter.insert(item, to); - onDownloadListChanged(); - onCurrentChanged(); + //onDownloadListChanged(); + //onCurrentChanged(); } } @@ -1212,7 +1208,14 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi public void remove(int which) { DownloadFile item = adapter.getItem(which); - DownloadFile currentPlaying = getDownloadService().getCurrentPlaying(); + DownloadService downloadService = getDownloadService(); + + if (item == null || downloadService == null) + { + return; + } + + DownloadFile currentPlaying = downloadService.getCurrentPlaying(); if (currentPlaying == item) { @@ -1220,6 +1223,11 @@ public class DownloadActivity extends SubsonicTabActivity implements OnGestureLi } adapter.remove(item); + + String songRemoved = String.format(getResources().getString(R.string.download_song_removed), item.getSong().getTitle()); + + Util.toast(DownloadActivity.this, songRemoved); + onDownloadListChanged(); onCurrentChanged(); } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java index 007a2ab6..bd0de1b0 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/EqualizerActivity.java @@ -33,6 +33,7 @@ import android.widget.TextView; import com.thejoshwa.ultrasonic.androidapp.R; import com.thejoshwa.ultrasonic.androidapp.audiofx.EqualizerController; +import com.thejoshwa.ultrasonic.androidapp.service.DownloadService; import com.thejoshwa.ultrasonic.androidapp.service.DownloadServiceImpl; import java.util.HashMap; @@ -46,7 +47,6 @@ import java.util.Map; */ public class EqualizerActivity extends Activity { - private static final int MENU_GROUP_PRESET = 100; private final Map bars = new HashMap(); @@ -58,32 +58,8 @@ public class EqualizerActivity extends Activity { super.onCreate(bundle); setContentView(R.layout.equalizer); - equalizerController = DownloadServiceImpl.getInstance().getEqualizerController(); - equalizer = equalizerController.getEqualizer(); - initEqualizer(); - - final View presetButton = findViewById(R.id.equalizer_preset); - registerForContextMenu(presetButton); - presetButton.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View view) - { - presetButton.showContextMenu(); - } - }); - - CheckBox enabledCheckBox = (CheckBox) findViewById(R.id.equalizer_enabled); - enabledCheckBox.setChecked(equalizer.getEnabled()); - enabledCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() - { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean b) - { - setEqualizerEnabled(b); - } - }); + setup(); } @Override @@ -93,6 +69,16 @@ public class EqualizerActivity extends Activity equalizerController.saveSettings(); } + @Override + protected void onResume() + { + super.onResume(); + if (equalizerController == null) + { + setup(); + } + } + @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { @@ -122,12 +108,57 @@ public class EqualizerActivity extends Activity @Override public boolean onContextItemSelected(MenuItem menuItem) { - short preset = (short) menuItem.getItemId(); - equalizer.usePreset(preset); - updateBars(); + try + { + short preset = (short) menuItem.getItemId(); + equalizer.usePreset(preset); + updateBars(); + } + catch (Exception ex) + { + //TODO: Show a dialog + } + return true; } + private void setup() + { + DownloadService instance = DownloadServiceImpl.getInstance(); + + if (instance == null) + { + return; + } + + equalizerController = instance.getEqualizerController(); + equalizer = equalizerController.getEqualizer(); + + initEqualizer(); + + final View presetButton = findViewById(R.id.equalizer_preset); + registerForContextMenu(presetButton); + presetButton.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View view) + { + presetButton.showContextMenu(); + } + }); + + CheckBox enabledCheckBox = (CheckBox) findViewById(R.id.equalizer_enabled); + enabledCheckBox.setChecked(equalizer.getEnabled()); + enabledCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) + { + setEqualizerEnabled(b); + } + }); + } + private void setEqualizerEnabled(boolean enabled) { equalizer.setEnabled(enabled); @@ -149,7 +180,7 @@ public class EqualizerActivity extends Activity } catch (Exception ex) { - + //TODO: Show a dialog } } @@ -201,6 +232,7 @@ public class EqualizerActivity extends Activity } catch (Exception ex) { + //TODO: Show a dialog } } updateLevelText(levelTextView, level); @@ -221,7 +253,7 @@ public class EqualizerActivity extends Activity } } } - catch (Exception e) + catch (Exception ex) { //TODO: Show a dialog } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java index 6fe74fb8..cbc72841 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/HelpActivity.java @@ -60,6 +60,7 @@ public final class HelpActivity extends Activity implements OnClickListener private int menuActiveViewId; View chatMenuItem; View bookmarksMenuItem; + View sharesMenuItem; @Override protected void onCreate(Bundle bundle) @@ -81,12 +82,14 @@ public final class HelpActivity extends Activity implements OnClickListener chatMenuItem = findViewById(R.id.menu_chat); bookmarksMenuItem = findViewById(R.id.menu_bookmarks); + sharesMenuItem = findViewById(R.id.menu_shares); View aboutMenuItem = findViewById(R.id.menu_about); findViewById(R.id.menu_home).setOnClickListener(this); findViewById(R.id.menu_browse).setOnClickListener(this); findViewById(R.id.menu_search).setOnClickListener(this); findViewById(R.id.menu_playlists).setOnClickListener(this); + sharesMenuItem.setOnClickListener(this); chatMenuItem.setOnClickListener(this); bookmarksMenuItem.setOnClickListener(this); findViewById(R.id.menu_now_playing).setOnClickListener(this); @@ -156,6 +159,7 @@ public final class HelpActivity extends Activity implements OnClickListener int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE; chatMenuItem.setVisibility(visibility); bookmarksMenuItem.setVisibility(visibility); + sharesMenuItem.setVisibility(visibility); } @Override @@ -269,6 +273,11 @@ public final class HelpActivity extends Activity implements OnClickListener intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Util.startActivityWithoutTransition(this, intent); break; + case R.id.menu_shares: + intent = new Intent(this, ShareActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Util.startActivityWithoutTransition(this, intent); + break; case R.id.menu_chat: Util.startActivityWithoutTransition(this, ChatActivity.class); break; diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java index edf09a40..abe49f53 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/QueryReceiverActivity.java @@ -25,9 +25,9 @@ import android.content.Intent; import android.os.Bundle; import android.provider.SearchRecentSuggestions; +import com.thejoshwa.ultrasonic.androidapp.provider.SearchSuggestionProvider; import com.thejoshwa.ultrasonic.androidapp.util.Constants; import com.thejoshwa.ultrasonic.androidapp.util.Util; -import com.thejoshwa.ultrasonic.androidapp.provider.SearchSuggestionProvider; /** * Receives search queries and forwards to the SelectAlbumActivity. diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java index f09a7a51..3a8c8897 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SearchActivity.java @@ -206,6 +206,16 @@ public class SearchActivity extends SubsonicTabActivity MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.select_album_context, menu); } + + MenuItem shareButton = menu.findItem(R.id.menu_item_share); + MenuItem downloadMenuItem = menu.findItem(R.id.album_menu_download); + + downloadMenuItem.setVisible(!Util.isOffline(this)); + + if (Util.isOffline(this) || isArtist) + { + shareButton.setVisible(false); + } } @Override diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java index 1b558b23..e3041097 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectAlbumActivity.java @@ -36,6 +36,7 @@ import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.thejoshwa.ultrasonic.androidapp.R; import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory; +import com.thejoshwa.ultrasonic.androidapp.domain.Share; import com.thejoshwa.ultrasonic.androidapp.service.DownloadFile; import com.thejoshwa.ultrasonic.androidapp.service.MusicService; import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory; @@ -222,6 +223,8 @@ public class SelectAlbumActivity extends SubsonicTabActivity String name = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_NAME); String playlistId = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID); String playlistName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME); + String shareId = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_SHARE_ID); + String shareName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_SHARE_NAME); String albumListType = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE); String genreName = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_GENRE_NAME); int albumListTitle = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, 0); @@ -238,6 +241,10 @@ public class SelectAlbumActivity extends SubsonicTabActivity { getPlaylist(playlistId, playlistName); } + else if (shareId != null) + { + getShare(shareId, shareName); + } else if (albumListType != null) { getAlbumList(albumListType, albumListTitle, albumListSize, albumListOffset); @@ -397,8 +404,20 @@ public class SelectAlbumActivity extends SubsonicTabActivity { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.select_album_context, menu); + } - shareButton = menu.findItem(R.id.menu_item_share); + shareButton = menu.findItem(R.id.menu_item_share); + + if (shareButton != null) + { + shareButton.setVisible(!Util.isOffline(this)); + } + + MenuItem downloadMenuItem = menu.findItem(R.id.album_menu_download); + + if (downloadMenuItem != null) + { + downloadMenuItem.setVisible(!Util.isOffline(this)); } } @@ -630,6 +649,37 @@ public class SelectAlbumActivity extends SubsonicTabActivity }.execute(); } + private void getShare(final String shareId, final String shareName) + { + setActionBarSubtitle(shareName); + + new LoadTask() + { + @Override + protected MusicDirectory load(MusicService service) throws Exception + { + List shares = service.getShares(true, SelectAlbumActivity.this, this); + + MusicDirectory md = new MusicDirectory(); + + for (Share share : shares) + { + if (share.getId().equals(shareId)) + { + for (MusicDirectory.Entry entry : share.getEntries()) + { + md.addChild(entry); + } + + break; + } + } + + return md; + } + }.execute(); + } + private void getAlbumList(final String albumListType, final int albumListTitle, final int size, final int offset) { showHeader = false; @@ -964,7 +1014,7 @@ public class SelectAlbumActivity extends SubsonicTabActivity boolean isAlbumList = getIntent().hasExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE); playAllButtonVisible = !(isAlbumList || entries.isEmpty()) && !allVideos; - shareButtonVisible = songCount > 0; + shareButtonVisible = !Util.isOffline(SelectAlbumActivity.this) && songCount > 0; emptyView.setVisibility(entries.isEmpty() ? View.VISIBLE : View.GONE); diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java index 1a51a35a..a10675d2 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectArtistActivity.java @@ -33,8 +33,8 @@ import android.widget.ListView; import android.widget.TextView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.thejoshwa.ultrasonic.androidapp.R; import com.thejoshwa.ultrasonic.androidapp.domain.Artist; import com.thejoshwa.ultrasonic.androidapp.domain.Indexes; @@ -263,6 +263,13 @@ public class SelectArtistActivity extends SubsonicTabActivity implements Adapter menu.setGroupCheckable(MENU_GROUP_MUSIC_FOLDER, true, true); } + + MenuItem downloadMenuItem = menu.findItem(R.id.artist_menu_download); + + if (downloadMenuItem != null) + { + downloadMenuItem.setVisible(!Util.isOffline(this)); + } } @Override diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java index 5057152d..465298db 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectGenreActivity.java @@ -30,8 +30,8 @@ import android.widget.AdapterView; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.thejoshwa.ultrasonic.androidapp.R; import com.thejoshwa.ultrasonic.androidapp.domain.Genre; import com.thejoshwa.ultrasonic.androidapp.service.MusicService; diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java index 8042ba75..074de15f 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SelectPlaylistActivity.java @@ -35,12 +35,12 @@ import android.widget.EditText; import android.widget.ListView; import com.handmark.pulltorefresh.library.PullToRefreshBase; -import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.thejoshwa.ultrasonic.androidapp.R; import com.thejoshwa.ultrasonic.androidapp.domain.Playlist; -import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory; import com.thejoshwa.ultrasonic.androidapp.service.MusicService; +import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory; import com.thejoshwa.ultrasonic.androidapp.service.OfflineException; import com.thejoshwa.ultrasonic.androidapp.service.ServerTooOldException; import com.thejoshwa.ultrasonic.androidapp.util.BackgroundTask; @@ -141,6 +141,13 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt MenuInflater inflater = getMenuInflater(); if (Util.isOffline(this)) inflater.inflate(R.menu.select_playlist_context_offline, menu); else inflater.inflate(R.menu.select_playlist_context, menu); + + MenuItem downloadMenuItem = menu.findItem(R.id.album_menu_download); + + if (downloadMenuItem != null) + { + downloadMenuItem.setVisible(!Util.isOffline(this)); + } } @Override @@ -290,10 +297,12 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt publicBox.setChecked(pub); } - new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert); - new AlertDialog.Builder(this).setTitle(R.string.playlist_update_info); - new AlertDialog.Builder(this).setView(dialogView); - new AlertDialog.Builder(this).setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() + AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); + + alertDialog.setIcon(android.R.drawable.ic_dialog_alert); + alertDialog.setTitle(R.string.playlist_update_info); + alertDialog.setView(dialogView); + alertDialog.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) @@ -327,8 +336,8 @@ public class SelectPlaylistActivity extends SubsonicTabActivity implements Adapt } }); - new AlertDialog.Builder(this).setNegativeButton(R.string.common_cancel, null); - new AlertDialog.Builder(this).show(); + alertDialog.setNegativeButton(R.string.common_cancel, null); + alertDialog.show(); } private class GetDataTask extends AsyncTask diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java index 5f5f3309..73318612 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SettingsActivity.java @@ -49,6 +49,7 @@ import com.thejoshwa.ultrasonic.androidapp.util.Constants; import com.thejoshwa.ultrasonic.androidapp.util.ErrorDialog; import com.thejoshwa.ultrasonic.androidapp.util.FileUtil; import com.thejoshwa.ultrasonic.androidapp.util.ModalBackgroundTask; +import com.thejoshwa.ultrasonic.androidapp.util.TimeSpanPreference; import com.thejoshwa.ultrasonic.androidapp.util.Util; import net.simonvt.menudrawer.MenuDrawer; @@ -90,7 +91,8 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer private ListPreference viewRefresh; private CheckBoxPreference sharingAlwaysAskForDetails; private EditTextPreference sharingDefaultDescription; - private ListPreference sharingDefaultExpiration; + private EditTextPreference sharingDefaultGreeting; + private TimeSpanPreference sharingDefaultExpiration; private int maxServerCount = 10; private int minServerCount = 0; @@ -104,6 +106,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer private int activeServers = 3; View chatMenuItem; View bookmarksMenuItem; + View sharesMenuItem; PreferenceCategory serversCategory; Preference addServerPreference; SharedPreferences settings; @@ -126,11 +129,13 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer chatMenuItem = findViewById(R.id.menu_chat); bookmarksMenuItem = findViewById(R.id.menu_bookmarks); + sharesMenuItem = findViewById(R.id.menu_shares); findViewById(R.id.menu_home).setOnClickListener(this); findViewById(R.id.menu_browse).setOnClickListener(this); findViewById(R.id.menu_search).setOnClickListener(this); findViewById(R.id.menu_playlists).setOnClickListener(this); + sharesMenuItem.setOnClickListener(this); chatMenuItem.setOnClickListener(this); bookmarksMenuItem.setOnClickListener(this); findViewById(R.id.menu_now_playing).setOnClickListener(this); @@ -181,7 +186,10 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer viewRefresh = (ListPreference) findPreference(Constants.PREFERENCES_KEY_VIEW_REFRESH); sharingAlwaysAskForDetails = (CheckBoxPreference) findPreference(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS); sharingDefaultDescription = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION); - sharingDefaultExpiration = (ListPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION); + sharingDefaultGreeting = (EditTextPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING); + sharingDefaultExpiration = (TimeSpanPreference) findPreference(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION); + + sharingDefaultGreeting.setText(Util.getShareGreeting(this)); findPreference(Constants.PREFERENCES_KEY_CLEAR_SEARCH_HISTORY).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @@ -287,6 +295,7 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE; chatMenuItem.setVisibility(visibility); bookmarksMenuItem.setVisibility(visibility); + sharesMenuItem.setVisibility(visibility); } private PreferenceScreen addServer(final int instance) @@ -496,8 +505,9 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer chatRefreshInterval.setSummary(chatRefreshInterval.getEntry()); directoryCacheTime.setSummary(directoryCacheTime.getEntry()); viewRefresh.setSummary(viewRefresh.getEntry()); - sharingDefaultExpiration.setSummary(sharingDefaultExpiration.getEntry()); + sharingDefaultExpiration.setSummary(sharingDefaultExpiration.getText()); sharingDefaultDescription.setSummary(sharingDefaultDescription.getText()); + sharingDefaultGreeting.setSummary(sharingDefaultGreeting.getText()); if (!mediaButtonsEnabled.isChecked()) { @@ -783,6 +793,11 @@ public class SettingsActivity extends PreferenceActivity implements SharedPrefer intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Util.startActivityWithoutTransition(this, intent); break; + case R.id.menu_shares: + intent = new Intent(this, ShareActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Util.startActivityWithoutTransition(this, intent); + break; case R.id.menu_chat: Util.startActivityWithoutTransition(this, ChatActivity.class); break; diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java new file mode 100644 index 00000000..6e1adad2 --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/ShareActivity.java @@ -0,0 +1,369 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + + Copyright 2009 (C) Sindre Mehus + */ + +package com.thejoshwa.ultrasonic.androidapp.activity; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Bundle; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; +import android.text.util.Linkify; +import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; + +import com.handmark.pulltorefresh.library.PullToRefreshBase; +import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; +import com.handmark.pulltorefresh.library.PullToRefreshListView; +import com.thejoshwa.ultrasonic.androidapp.R; +import com.thejoshwa.ultrasonic.androidapp.domain.Share; +import com.thejoshwa.ultrasonic.androidapp.service.MusicService; +import com.thejoshwa.ultrasonic.androidapp.service.MusicServiceFactory; +import com.thejoshwa.ultrasonic.androidapp.service.OfflineException; +import com.thejoshwa.ultrasonic.androidapp.service.ServerTooOldException; +import com.thejoshwa.ultrasonic.androidapp.util.BackgroundTask; +import com.thejoshwa.ultrasonic.androidapp.util.Constants; +import com.thejoshwa.ultrasonic.androidapp.util.LoadingTask; +import com.thejoshwa.ultrasonic.androidapp.util.TabActivityBackgroundTask; +import com.thejoshwa.ultrasonic.androidapp.util.TimeSpan; +import com.thejoshwa.ultrasonic.androidapp.util.TimeSpanPicker; +import com.thejoshwa.ultrasonic.androidapp.util.Util; +import com.thejoshwa.ultrasonic.androidapp.view.ShareAdapter; + +import java.util.List; + +public class ShareActivity extends SubsonicTabActivity implements AdapterView.OnItemClickListener +{ + + private PullToRefreshListView refreshSharesListView; + private ListView sharesListView; + private View emptyTextView; + private ShareAdapter shareAdapter; + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.select_share); + + refreshSharesListView = (PullToRefreshListView) findViewById(R.id.select_share_list); + sharesListView = refreshSharesListView.getRefreshableView(); + + refreshSharesListView.setOnRefreshListener(new OnRefreshListener() + { + @Override + public void onRefresh(PullToRefreshBase refreshView) + { + new GetDataTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + }); + + emptyTextView = findViewById(R.id.select_share_empty); + sharesListView.setOnItemClickListener(this); + registerForContextMenu(sharesListView); + + View sharesMenuItem = findViewById(R.id.menu_shares); + menuDrawer.setActiveView(sharesMenuItem); + + setActionBarTitle(R.string.common_appname); + setActionBarSubtitle(R.string.button_bar_shares); + + load(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + super.onCreateOptionsMenu(menu); + return true; + } + + private void refresh() + { + finish(); + Intent intent = new Intent(this, ShareActivity.class); + intent.putExtra(Constants.INTENT_EXTRA_NAME_REFRESH, true); + Util.startActivityWithoutTransition(this, intent); + } + + private void load() + { + BackgroundTask> task = new TabActivityBackgroundTask>(this, true) + { + @Override + protected List doInBackground() throws Throwable + { + MusicService musicService = MusicServiceFactory.getMusicService(ShareActivity.this); + boolean refresh = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_REFRESH, false); + return musicService.getShares(refresh, ShareActivity.this, this); + } + + @Override + protected void done(List result) + { + sharesListView.setAdapter(shareAdapter = new ShareAdapter(ShareActivity.this, result)); + emptyTextView.setVisibility(result.isEmpty() ? View.VISIBLE : View.GONE); + } + }; + task.execute(); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) + { + super.onCreateContextMenu(menu, view, menuInfo); + + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.select_share_context, menu); + } + + @Override + public boolean onContextItemSelected(MenuItem menuItem) + { + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo(); + Share share = (Share) sharesListView.getItemAtPosition(info.position); + + Intent intent; + switch (menuItem.getItemId()) + { + case R.id.share_menu_pin: + downloadShare(share.getId(), share.getName(), true, true, false, false, true, false, false); + break; + case R.id.share_menu_unpin: + downloadShare(share.getId(), share.getName(), false, false, false, false, true, false, true); + break; + case R.id.share_menu_download: + downloadShare(share.getId(), share.getName(), false, false, false, false, true, false, false); + break; + case R.id.share_menu_play_now: + downloadShare(share.getId(), share.getName(), false, false, true, false, false, false, false); + break; + case R.id.share_menu_play_shuffled: + downloadShare(share.getId(), share.getName(), false, false, true, true, false, false, false); + break; + case R.id.share_menu_delete: + deleteShare(share); + break; + case R.id.share_info: + displayShareInfo(share); + break; + case R.id.share_update_info: + updateShareInfo(share); + break; + default: + return super.onContextItemSelected(menuItem); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + switch (item.getItemId()) + { + case android.R.id.home: + menuDrawer.toggleMenu(); + return true; + } + + return false; + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) + { + Share share = (Share) parent.getItemAtPosition(position); + + Intent intent = new Intent(ShareActivity.this, SelectAlbumActivity.class); + intent.putExtra(Constants.INTENT_EXTRA_NAME_SHARE_ID, share.getId()); + intent.putExtra(Constants.INTENT_EXTRA_NAME_SHARE_NAME, share.getName()); + Util.startActivityWithoutTransition(ShareActivity.this, intent); + } + + private void deleteShare(final Share share) + { + new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.common_confirm).setMessage(getResources().getString(R.string.delete_playlist, share.getName())).setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + new LoadingTask(ShareActivity.this, false) + { + @Override + protected Void doInBackground() throws Throwable + { + MusicService musicService = MusicServiceFactory.getMusicService(ShareActivity.this); + musicService.deleteShare(share.getId(), ShareActivity.this, null); + return null; + } + + @Override + protected void done(Void result) + { + shareAdapter.remove(share); + shareAdapter.notifyDataSetChanged(); + Util.toast(ShareActivity.this, getResources().getString(R.string.menu_deleted_share, share.getName())); + } + + @Override + protected void error(Throwable error) + { + String msg; + msg = error instanceof OfflineException || error instanceof ServerTooOldException ? getErrorMessage(error) : String.format("%s %s", getResources().getString(R.string.menu_deleted_share_error, share.getName()), getErrorMessage(error)); + + Util.toast(ShareActivity.this, msg, false); + } + }.execute(); + } + + }).setNegativeButton(R.string.common_cancel, null).show(); + } + + private void displayShareInfo(final Share share) + { + final TextView textView = new TextView(this); + textView.setPadding(3, 3, 3, 3); + + final SpannableString message = new SpannableString( + "Owner: " + share.getUsername() + + "\nComments: " + ((share.getDescription() == null) ? "" : share.getDescription()) + + "\nURL: " + share.getUrl() + + "\nEntry Count: " + share.getEntries().size() + + "\nVisit Count: " + share.getVisitCount() + + ((share.getCreated() == null) ? "" : ("\nCreation Date: " + share.getCreated().replace('T', ' '))) + + ((share.getLastVisited() == null) ? "" : ("\nLast Visited Date: " + share.getLastVisited().replace('T', ' '))) + + ((share.getExpires() == null) ? "" : ("\nExpiration Date: " + share.getExpires().replace('T', ' '))) + ); + + Linkify.addLinks(message, Linkify.WEB_URLS); + textView.setText(message); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + + new AlertDialog.Builder(this) + .setTitle("Share Details") + .setCancelable(true) + .setIcon(android.R.drawable.ic_dialog_info) + .setView(textView) + .show(); + } + + private void updateShareInfo(final Share share) + { + View dialogView = getLayoutInflater().inflate(R.layout.share_details, null); + final EditText shareDescription = (EditText) dialogView.findViewById(R.id.share_description); + final TimeSpanPicker timeSpanPicker = (TimeSpanPicker) dialogView.findViewById(R.id.date_picker); + + shareDescription.setText(share.getDescription()); + + CheckBox hideDialogCheckBox = (CheckBox) dialogView.findViewById(R.id.hide_dialog); + CheckBox saveAsDefaultsCheckBox = (CheckBox) dialogView.findViewById(R.id.save_as_defaults); + CheckBox noExpirationCheckBox = (CheckBox) dialogView.findViewById(R.id.timeSpanDisableCheckBox); + + noExpirationCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) + { + timeSpanPicker.setEnabled(!b); + } + }); + + timeSpanPicker.setTimeSpanDisableText(getResources().getText(R.string.no_expiration)); + + hideDialogCheckBox.setVisibility(View.GONE); + saveAsDefaultsCheckBox.setVisibility(View.GONE); + + AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); + + alertDialog.setIcon(android.R.drawable.ic_dialog_alert); + alertDialog.setTitle(R.string.playlist_update_info); + alertDialog.setView(dialogView); + alertDialog.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + new LoadingTask(ShareActivity.this, false) + { + @Override + protected Void doInBackground() throws Throwable + { + long millis = timeSpanPicker.getTimeSpan().getTotalMilliseconds(); + + if (millis > 0) + { + millis = TimeSpan.getCurrentTime().add(millis).getTotalMilliseconds(); + } + + MusicService musicService = MusicServiceFactory.getMusicService(ShareActivity.this); + musicService.updateShare(share.getId(), shareDescription.getText().toString(), millis, ShareActivity.this, null); + return null; + } + + @Override + protected void done(Void result) + { + refresh(); + Util.toast(ShareActivity.this, getResources().getString(R.string.playlist_updated_info, share.getName())); + } + + @Override + protected void error(Throwable error) + { + String msg; + msg = error instanceof OfflineException || error instanceof ServerTooOldException ? getErrorMessage(error) : String.format("%s %s", getResources().getString(R.string.playlist_updated_info_error, share.getName()), getErrorMessage(error)); + + Util.toast(ShareActivity.this, msg, false); + } + }.execute(); + } + }); + + alertDialog.setNegativeButton(R.string.common_cancel, null); + alertDialog.show(); + } + + private class GetDataTask extends AsyncTask + { + @Override + protected void onPostExecute(String[] result) + { + refreshSharesListView.onRefreshComplete(); + super.onPostExecute(result); + } + + @Override + protected String[] doInBackground(Void... params) + { + refresh(); + return null; + } + } +} \ No newline at end of file diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java index 0185c854..47684e6c 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/SubsonicTabActivity.java @@ -48,7 +48,6 @@ import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; -import android.widget.DatePicker; import android.widget.EditText; import android.widget.ImageView; import android.widget.RemoteViews; @@ -72,6 +71,8 @@ import com.thejoshwa.ultrasonic.androidapp.util.ModalBackgroundTask; import com.thejoshwa.ultrasonic.androidapp.util.ShareDetails; import com.thejoshwa.ultrasonic.androidapp.util.SilentBackgroundTask; import com.thejoshwa.ultrasonic.androidapp.util.TabActivityBackgroundTask; +import com.thejoshwa.ultrasonic.androidapp.util.TimeSpan; +import com.thejoshwa.ultrasonic.androidapp.util.TimeSpanPicker; import com.thejoshwa.ultrasonic.androidapp.util.Util; import com.thejoshwa.ultrasonic.androidapp.util.VideoPlayerType; @@ -81,11 +82,11 @@ import net.simonvt.menudrawer.Position; import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.regex.Pattern; /** * @author Sindre Mehus @@ -93,6 +94,7 @@ import java.util.List; public class SubsonicTabActivity extends Activity implements OnClickListener { private static final String TAG = SubsonicTabActivity.class.getSimpleName(); + private static final Pattern COMPILE = Pattern.compile(":"); private static ImageLoader IMAGE_LOADER; protected static String theme; private static SubsonicTabActivity instance; @@ -110,15 +112,17 @@ public class SubsonicTabActivity extends Activity implements OnClickListener private View nowPlayingView; View chatMenuItem; View bookmarksMenuItem; + View sharesMenuItem; public static boolean nowPlayingHidden; public static Entry currentSong; public Bitmap nowPlayingImage; boolean licenseValid; NotificationManager notificationManager; private EditText shareDescription; - DatePicker datePicker; + TimeSpanPicker timeSpanPicker; CheckBox hideDialogCheckBox; CheckBox noExpirationCheckBox; + CheckBox saveAsDefaultsCheckBox; ShareDetails shareDetails; @Override @@ -142,11 +146,13 @@ public class SubsonicTabActivity extends Activity implements OnClickListener chatMenuItem = findViewById(R.id.menu_chat); bookmarksMenuItem = findViewById(R.id.menu_bookmarks); + sharesMenuItem = findViewById(R.id.menu_shares); findViewById(R.id.menu_home).setOnClickListener(this); findViewById(R.id.menu_browse).setOnClickListener(this); findViewById(R.id.menu_search).setOnClickListener(this); findViewById(R.id.menu_playlists).setOnClickListener(this); + sharesMenuItem.setOnClickListener(this); chatMenuItem.setOnClickListener(this); bookmarksMenuItem.setOnClickListener(this); findViewById(R.id.menu_now_playing).setOnClickListener(this); @@ -174,6 +180,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener int visibility = Util.isOffline(this) ? View.GONE : View.VISIBLE; chatMenuItem.setVisibility(visibility); bookmarksMenuItem.setVisibility(visibility); + sharesMenuItem.setVisibility(visibility); } @Override @@ -334,7 +341,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener } } - public void showNotification(final Handler handler, final MusicDirectory.Entry song, final DownloadServiceImpl downloadService, final Notification notification, final PlayerState playerState) + public void showNotification(final Handler handler, final Entry song, final DownloadServiceImpl downloadService, final Notification notification, final PlayerState playerState) { if (!Util.isNotificationEnabled(this)) { @@ -460,7 +467,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener }); } - private void showNowPlaying(final Context context, final DownloadService downloadService, final MusicDirectory.Entry song, final PlayerState playerState) + private void showNowPlaying(final Context context, final DownloadService downloadService, final Entry song, final PlayerState playerState) { if (context == null || downloadService == null || song == null || playerState == null) { @@ -527,7 +534,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener intent.putExtra(Constants.INTENT_EXTRA_NAME_NAME, song.getAlbum()); - setOnClickListenerOnUiThread(nowPlayingAlbumArtImage, new View.OnClickListener() + setOnClickListenerOnUiThread(nowPlayingAlbumArtImage, new OnClickListener() { @Override public void onClick(View view) @@ -544,7 +551,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener SwipeDetector swipeDetector = SwipeDetector.Create(SubsonicTabActivity.this, downloadService); setOnTouchListenerOnUiThread(nowPlayingView, swipeDetector); - setOnClickListenerOnUiThread(nowPlayingView, new View.OnClickListener() + setOnClickListenerOnUiThread(nowPlayingView, new OnClickListener() { @Override public void onClick(View v) @@ -552,7 +559,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener } }); - setOnClickListenerOnUiThread(nowPlayingControlPlay, new View.OnClickListener() + setOnClickListenerOnUiThread(nowPlayingControlPlay, new OnClickListener() { @Override public void onClick(View view) @@ -601,13 +608,14 @@ public class SubsonicTabActivity extends Activity implements OnClickListener { shareDescription = (EditText) layout.findViewById(R.id.share_description); hideDialogCheckBox = (CheckBox) layout.findViewById(R.id.hide_dialog); - noExpirationCheckBox = (CheckBox) layout.findViewById(R.id.no_expiration); - datePicker = (DatePicker) layout.findViewById(R.id.date_picker); + noExpirationCheckBox = (CheckBox) layout.findViewById(R.id.timeSpanDisableCheckBox); + saveAsDefaultsCheckBox = (CheckBox) layout.findViewById(R.id.save_as_defaults); + timeSpanPicker = (TimeSpanPicker) layout.findViewById(R.id.date_picker); } AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.share_set_share_options); - builder.setMessage(R.string.share_description); + builder.setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() { @Override @@ -615,9 +623,9 @@ public class SubsonicTabActivity extends Activity implements OnClickListener { if (!noExpirationCheckBox.isChecked()) { - Calendar cal = Calendar.getInstance(); - cal.setTime(Util.getDateFromDatePicker(datePicker)); - shareDetails.Expiration = cal; + TimeSpan timeSpan = timeSpanPicker.getTimeSpan(); + TimeSpan now = TimeSpan.getCurrentTime(); + shareDetails.Expiration = now.add(timeSpan).getTotalMilliseconds(); } shareDetails.Description = String.valueOf(shareDescription.getText()); @@ -627,9 +635,18 @@ public class SubsonicTabActivity extends Activity implements OnClickListener Util.setShouldAskForShareDetails(SubsonicTabActivity.this, false); } + if (saveAsDefaultsCheckBox.isChecked()) + { + String timeSpanType = timeSpanPicker.getTimeSpanType(); + int timeSpanAmount = timeSpanPicker.getTimeSpanAmount(); + Util.setDefaultShareExpiration(SubsonicTabActivity.this, !noExpirationCheckBox.isChecked() && timeSpanAmount > 0 ? String.format("%d:%s", timeSpanAmount, timeSpanType) : ""); + Util.setDefaultShareDescription(SubsonicTabActivity.this, shareDetails.Description); + } + share(); } }); + builder.setNegativeButton(R.string.common_cancel, new DialogInterface.OnClickListener() { @Override @@ -642,15 +659,48 @@ public class SubsonicTabActivity extends Activity implements OnClickListener builder.setView(layout); builder.setCancelable(true); + timeSpanPicker.setTimeSpanDisableText(getResources().getString(R.string.no_expiration)); + noExpirationCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - datePicker.setEnabled(!b); + timeSpanPicker.setEnabled(!b); } }); + String defaultDescription = Util.getDefaultShareDescription(this); + String timeSpan = Util.getDefaultShareExpiration(this); + + String[] split = COMPILE.split(timeSpan); + + if (split.length == 2) + { + int timeSpanAmount = Integer.parseInt(split[0]); + String timeSpanType = split[1]; + + if (timeSpanAmount > 0) + { + noExpirationCheckBox.setChecked(false); + timeSpanPicker.setEnabled(true); + timeSpanPicker.setTimeSpanAmount(String.valueOf(timeSpanAmount)); + timeSpanPicker.setTimeSpanType(timeSpanType); + } + else + { + noExpirationCheckBox.setChecked(true); + timeSpanPicker.setEnabled(false); + } + } + else + { + noExpirationCheckBox.setChecked(true); + timeSpanPicker.setEnabled(false); + } + + shareDescription.setText(defaultDescription); + return builder.create(); } else @@ -659,30 +709,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener } } - @Override - protected void onPrepareDialog(final int id, final Dialog dialog) - { - if (id == DIALOG_ASK_FOR_SHARE_DETAILS) - { - String defaultDescription = Util.getDefaultShareDescription(this); - Calendar cal = Util.getDefaultShareExpirationCalendar(this); - - if (cal != null) { - noExpirationCheckBox.setChecked(false); - datePicker.setEnabled(true); - datePicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); - } - else - { - noExpirationCheckBox.setChecked(true); - datePicker.setEnabled(false); - }; - - shareDescription.setText(defaultDescription); - } - } - - public void createShare(final List entries) + public void createShare(final List entries) { boolean askForDetails = Util.getShouldAskForShareDetails(this); @@ -696,7 +723,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener else { shareDetails.Description = Util.getDefaultShareDescription(this); - shareDetails.Expiration = Util.getDefaultShareExpirationCalendar(this); + shareDetails.Expiration = TimeSpan.getCurrentTime().add(Util.getDefaultShareExpirationInMillis(this)).getTotalMilliseconds(); share(); } } @@ -716,7 +743,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener } else { - for (MusicDirectory.Entry entry : shareDetails.Entries) + for (Entry entry : shareDetails.Entries) { ids.add(entry.getId()); } @@ -726,8 +753,10 @@ public class SubsonicTabActivity extends Activity implements OnClickListener long timeInMillis = 0; - if (shareDetails.Expiration != null) - timeInMillis = shareDetails.Expiration.getTimeInMillis(); + if (shareDetails.Expiration != 0) + { + timeInMillis = shareDetails.Expiration; + } List shares = musicService.createShare(ids, shareDetails.Description, timeInMillis, SubsonicTabActivity.this, this); return shares.get(0); @@ -738,8 +767,8 @@ public class SubsonicTabActivity extends Activity implements OnClickListener { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_TEXT, String.format("Check out this music I shared from UltraSonic\n\n%s", result.getUrl())); - startActivity(Intent.createChooser(intent, "Share via")); + intent.putExtra(Intent.EXTRA_TEXT, String.format("%s\n\n%s", Util.getShareGreeting(SubsonicTabActivity.this), result.getUrl())); + startActivity(Intent.createChooser(intent, getResources().getString(R.string.share_via))); } }; @@ -791,7 +820,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener }); } - public void setOnTouchListenerOnUiThread(final View view, final View.OnTouchListener listener) + public void setOnTouchListenerOnUiThread(final View view, final OnTouchListener listener) { this.runOnUiThread(new Runnable() { @@ -806,7 +835,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener }); } - public void setOnClickListenerOnUiThread(final View view, final View.OnClickListener listener) + public void setOnClickListenerOnUiThread(final View view, final OnClickListener listener) { this.runOnUiThread(new Runnable() { @@ -988,25 +1017,30 @@ public class SubsonicTabActivity extends Activity implements OnClickListener protected void downloadRecursively(final String id, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background, final boolean playNext, final boolean unpin, final boolean isArtist) { - downloadRecursively(id, "", true, save, append, autoplay, shuffle, background, playNext, unpin, isArtist); + downloadRecursively(id, "", false, true, save, append, autoplay, shuffle, background, playNext, unpin, isArtist); + } + + protected void downloadShare(final String id, final String name, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background, final boolean playNext, final boolean unpin) + { + downloadRecursively(id, name, true, false, save, append, autoplay, shuffle, background, playNext, unpin, false); } protected void downloadPlaylist(final String id, final String name, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background, final boolean playNext, final boolean unpin) { - downloadRecursively(id, name, false, save, append, autoplay, shuffle, background, playNext, unpin, false); + downloadRecursively(id, name, false, false, save, append, autoplay, shuffle, background, playNext, unpin, false); } - protected void downloadRecursively(final String id, final String name, final boolean isDirectory, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background, final boolean playNext, final boolean unpin, final boolean isArtist) + protected void downloadRecursively(final String id, final String name, final boolean isShare, final boolean isDirectory, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background, final boolean playNext, final boolean unpin, final boolean isArtist) { - ModalBackgroundTask> task = new ModalBackgroundTask>(this, false) + ModalBackgroundTask> task = new ModalBackgroundTask>(this, false) { private static final int MAX_SONGS = 500; @Override - protected List doInBackground() throws Throwable + protected List doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - List songs = new LinkedList(); + List songs = new LinkedList(); MusicDirectory root; if (!Util.isOffline(SubsonicTabActivity.this) && isArtist && Util.getShouldUseId3Tags(SubsonicTabActivity.this)) @@ -1019,6 +1053,25 @@ public class SubsonicTabActivity extends Activity implements OnClickListener { root = !Util.isOffline(SubsonicTabActivity.this) && Util.getShouldUseId3Tags(SubsonicTabActivity.this) ? musicService.getAlbum(id, name, false, SubsonicTabActivity.this, this) : musicService.getMusicDirectory(id, name, false, SubsonicTabActivity.this, this); } + else if (isShare) + { + root = new MusicDirectory(); + + List shares = musicService.getShares(true, SubsonicTabActivity.this, this); + + for (Share share : shares) + { + if (share.getId().equals(id)) + { + for (Entry entry : share.getEntries()) + { + root.addChild(entry); + } + + break; + } + } + } else { root = musicService.getPlaylist(id, name, SubsonicTabActivity.this, this); @@ -1030,14 +1083,14 @@ public class SubsonicTabActivity extends Activity implements OnClickListener return songs; } - private void getSongsRecursively(MusicDirectory parent, List songs) throws Exception + private void getSongsRecursively(MusicDirectory parent, List songs) throws Exception { if (songs.size() > MAX_SONGS) { return; } - for (MusicDirectory.Entry song : parent.getChildren(false, true)) + for (Entry song : parent.getChildren(false, true)) { if (!song.isVideo()) { @@ -1047,7 +1100,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - for (MusicDirectory.Entry dir : parent.getChildren(true, false)) + for (Entry dir : parent.getChildren(true, false)) { MusicDirectory root; @@ -1067,11 +1120,11 @@ public class SubsonicTabActivity extends Activity implements OnClickListener MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); MusicDirectory artist = musicService.getArtist(id, "", false, SubsonicTabActivity.this, this); - for (MusicDirectory.Entry album : artist.getChildren()) + for (Entry album : artist.getChildren()) { MusicDirectory albumDirectory = musicService.getAlbum(album.getId(), "", false, SubsonicTabActivity.this, this); - for (MusicDirectory.Entry song : albumDirectory.getChildren()) + for (Entry song : albumDirectory.getChildren()) { if (!song.isVideo()) { @@ -1082,7 +1135,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener } @Override - protected void done(List songs) + protected void done(List songs) { if (Util.getShouldSortByDisc(SubsonicTabActivity.this)) { @@ -1130,7 +1183,7 @@ public class SubsonicTabActivity extends Activity implements OnClickListener task.execute(); } - protected void playVideo(MusicDirectory.Entry entry) + protected void playVideo(Entry entry) { if (!Util.isNetworkConnected(this)) { @@ -1380,6 +1433,11 @@ public class SubsonicTabActivity extends Activity implements OnClickListener intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); break; + case R.id.menu_shares: + intent = new Intent(SubsonicTabActivity.this, ShareActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); + break; case R.id.menu_chat: Util.startActivityWithoutTransition(SubsonicTabActivity.this, ChatActivity.class); break; diff --git a/src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java b/src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java index b2872ade..fb106034 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/activity/VoiceQueryReceiverActivity.java @@ -25,9 +25,9 @@ import android.content.Intent; import android.os.Bundle; import android.provider.SearchRecentSuggestions; +import com.thejoshwa.ultrasonic.androidapp.provider.SearchSuggestionProvider; import com.thejoshwa.ultrasonic.androidapp.util.Constants; import com.thejoshwa.ultrasonic.androidapp.util.Util; -import com.thejoshwa.ultrasonic.androidapp.provider.SearchSuggestionProvider; /** * Receives voice search queries and forwards to the SearchActivity. diff --git a/src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java b/src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java index 6a15f12e..ae16bf28 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/domain/Share.java @@ -1,15 +1,11 @@ package com.thejoshwa.ultrasonic.androidapp.domain; -import java.io.Serializable; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Locale; - import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory.Entry; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + public class Share implements Serializable { private static final long serialVersionUID = 1487561657691009668L; @@ -17,9 +13,9 @@ public class Share implements Serializable private String url; private String description; private String username; - private Date created; - private Date lastVisited; - private Date expires; + private String created; + private String lastVisited; + private String expires; private Long visitCount; private List entries; @@ -28,6 +24,11 @@ public class Share implements Serializable entries = new ArrayList(); } + public String getName() + { + return url.replaceFirst(".*/([^/?]+).*", "$1"); + } + public String getId() { return id; @@ -68,76 +69,34 @@ public class Share implements Serializable this.username = username; } - public Date getCreated() + public String getCreated() { - return created; + return this.created; } public void setCreated(String created) { - if (created != null) - { - try - { - this.created = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH).parse(created); - } - catch (ParseException e) - { - this.created = null; - } - } - else - { - this.created = null; - } + this.created = created; } - public Date getLastVisited() + public String getLastVisited() { return lastVisited; } public void setLastVisited(String lastVisited) { - if (lastVisited != null) - { - try - { - this.lastVisited = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH).parse(lastVisited); - } - catch (ParseException e) - { - this.lastVisited = null; - } - } - else - { - this.lastVisited = null; - } + this.lastVisited = lastVisited; } - public Date getExpires() + public String getExpires() { return expires; } public void setExpires(String expires) { - if (expires != null) - { - try - { - this.expires = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH).parse(expires); - } - catch (ParseException e) - { - this.expires = null; - } - } - else - { - this.expires = null; - } + this.expires = expires; } public Long getVisitCount() diff --git a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java b/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java index 2177b61a..d46f4add 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/provider/UltraSonicAppWidgetProvider.java @@ -163,7 +163,7 @@ public class UltraSonicAppWidgetProvider extends AppWidgetProvider Drawable drawable = resources.getDrawable(R.drawable.appwidget_art_default); size = drawable != null ? drawable.getIntrinsicHeight() : 0; - Bitmap bitmap = currentPlaying == null ? null : FileUtil.getAlbumArtBitmap(context, currentPlaying, size, true); + Bitmap bitmap = currentPlaying == null ? null : FileUtil.getAlbumArtBitmap(context, currentPlaying, 240, true); if (bitmap == null) { @@ -172,7 +172,6 @@ public class UltraSonicAppWidgetProvider extends AppWidgetProvider } else { - //bitmap = getRoundedCornerBitmap(bitmap); views.setImageViewBitmap(R.id.appwidget_coverart, bitmap); } } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java b/src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java index 3407fe3d..6e7788a1 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/service/CachedMusicService.java @@ -424,9 +424,9 @@ public class CachedMusicService implements MusicService } @Override - public List getShares(Context context, ProgressListener progressListener) throws Exception + public List getShares(boolean refresh, Context context, ProgressListener progressListener) throws Exception { - return musicService.getShares(context, progressListener); + return musicService.getShares(refresh, context, progressListener); } @Override @@ -503,4 +503,16 @@ public class CachedMusicService implements MusicService { return musicService.createShare(ids, description, expires, context, progressListener); } + + @Override + public void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception + { + musicService.deleteShare(id, context, progressListener); + } + + @Override + public void updateShare(String id, String description, Long expires, Context context, ProgressListener progressListener) throws Exception + { + musicService.updateShare(id, description, expires, context, progressListener); + } } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java b/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java index 3c5a1c2b..f7aece79 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/service/DownloadServiceLifecycleSupport.java @@ -230,7 +230,7 @@ public class DownloadServiceLifecycleSupport return; } - new SerializeTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new SerializeTask().execute(); } public void serializeDownloadQueueNow() @@ -244,7 +244,7 @@ public class DownloadServiceLifecycleSupport state.currentPlayingIndex = downloadService.getCurrentPlayingIndex(); state.currentPlayingPosition = downloadService.getPlayerPosition(); - Log.i(TAG, "Serialized currentPlayingIndex: " + state.currentPlayingIndex + ", currentPlayingPosition: " + state.currentPlayingPosition); + Log.i(TAG, String.format("Serialized currentPlayingIndex: %d, currentPlayingPosition: %d", state.currentPlayingIndex, state.currentPlayingPosition)); FileUtil.serialize(downloadService, state, FILENAME_DOWNLOADS_SER); } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java b/src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java index 814565c8..f963e8cb 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/service/MusicService.java @@ -126,7 +126,7 @@ public interface MusicService JukeboxStatus setJukeboxGain(float gain, Context context, ProgressListener progressListener) throws Exception; - List getShares(Context context, ProgressListener progressListener) throws Exception; + List getShares(boolean refresh, Context context, ProgressListener progressListener) throws Exception; List getChatMessages(Long since, Context context, ProgressListener progressListener) throws Exception; @@ -143,4 +143,8 @@ public interface MusicService UserInfo getUser(String username, Context context, ProgressListener progressListener) throws Exception; List createShare(List ids, String description, Long expires, Context context, ProgressListener progressListener) throws Exception; + + void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception; + + void updateShare(String id, String description, Long expires, Context context, ProgressListener progressListener) throws Exception; } \ No newline at end of file diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java b/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java index d00838a2..f409b1cc 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/service/OfflineMusicService.java @@ -41,8 +41,10 @@ import com.thejoshwa.ultrasonic.androidapp.util.ProgressListener; import com.thejoshwa.ultrasonic.androidapp.util.Util; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; import java.io.Reader; import java.util.ArrayList; import java.util.Collection; @@ -610,7 +612,33 @@ public class OfflineMusicService extends RESTMusicService @Override public void createPlaylist(String id, String name, List entries, Context context, ProgressListener progressListener) throws Exception { - throw new OfflineException("Playlists not available in offline mode"); + File playlistFile = FileUtil.getPlaylistFile(Util.getServerName(context), name); + FileWriter fw = new FileWriter(playlistFile); + BufferedWriter bw = new BufferedWriter(fw); + try + { + fw.write("#EXTM3U\n"); + for (MusicDirectory.Entry e : entries) + { + String filePath = FileUtil.getSongFile(context, e).getAbsolutePath(); + if (!new File(filePath).exists()) + { + String ext = FileUtil.getExtension(filePath); + String base = FileUtil.getBaseName(filePath); + filePath = base + ".complete." + ext; + } + fw.write(filePath + '\n'); + } + } + catch (Exception e) + { + Log.w(TAG, "Failed to save playlist: " + name); + } + finally + { + bw.close(); + fw.close(); + } } @Override @@ -756,6 +784,24 @@ public class OfflineMusicService extends RESTMusicService throw new OfflineException("Creating shares not available in offline mode"); } + @Override + public List getShares(boolean refresh, Context context, ProgressListener progressListener) throws Exception + { + throw new OfflineException("Getting shares not available in offline mode"); + } + + @Override + public void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception + { + throw new OfflineException("Deleting shares not available in offline mode"); + } + + @Override + public void updateShare(String id, String description, Long expires, Context context, ProgressListener progressListener) throws Exception + { + throw new OfflineException("Updating shares not available in offline mode"); + } + private static void listFilesRecursively(File parent, List children) { for (File file : FileUtil.listMediaFiles(parent)) diff --git a/src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java b/src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java index 2b0f51c7..126df11d 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/service/RESTMusicService.java @@ -1079,6 +1079,21 @@ public class RESTMusicService implements MusicService return executeJukeboxCommand(context, progressListener, parameterNames, parameterValues); } + @Override + public List getShares(boolean refresh, Context context, ProgressListener progressListener) throws Exception + { + checkServerVersion(context, "1.6", "Shares not supported."); + Reader reader = getReader(context, progressListener, "getShares", null); + try + { + return new ShareParser(context).parse(reader, progressListener); + } + finally + { + Util.close(reader); + } + } + private JukeboxStatus executeJukeboxCommand(Context context, ProgressListener progressListener, List parameterNames, List parameterValues) throws Exception { checkServerVersion(context, "1.7", "Jukebox not supported."); @@ -1381,22 +1396,6 @@ public class RESTMusicService implements MusicService } } - @Override - public List getShares(Context context, ProgressListener progressListener) throws Exception - { - checkServerVersion(context, "1.6", "Shares not supported."); - - Reader reader = getReader(context, progressListener, "getShares", null); - try - { - return new ShareParser(context).parse(reader, progressListener); - } - finally - { - Util.close(reader); - } - } - @Override public UserInfo getUser(String username, Context context, ProgressListener progressListener) throws Exception { @@ -1597,4 +1596,67 @@ public class RESTMusicService implements MusicService Util.close(reader); } } + + @Override + public void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception + { + checkServerVersion(context, "1.6", "Shares not supported."); + + HttpParams params = new BasicHttpParams(); + HttpConnectionParams.setSoTimeout(params, SOCKET_READ_TIMEOUT_GET_RANDOM_SONGS); + + List parameterNames = new ArrayList(); + List parameterValues = new ArrayList(); + + parameterNames.add("id"); + parameterValues.add(id); + + Reader reader = getReader(context, progressListener, "deleteShare", params, parameterNames, parameterValues); + + try + { + new ErrorParser(context).parse(reader); + } + finally + { + Util.close(reader); + } + } + + @Override + public void updateShare(String id, String description, Long expires, Context context, ProgressListener progressListener) throws Exception + { + checkServerVersion(context, "1.6", "Updating share not supported."); + + HttpParams params = new BasicHttpParams(); + HttpConnectionParams.setSoTimeout(params, SOCKET_READ_TIMEOUT_GET_RANDOM_SONGS); + + List parameterNames = new ArrayList(); + List parameterValues = new ArrayList(); + + parameterNames.add("id"); + parameterValues.add(id); + + if (description != null) + { + parameterNames.add("description"); + parameterValues.add(description); + } + + if (expires > 0) + { + parameterNames.add("expires"); + parameterValues.add(expires); + } + + Reader reader = getReader(context, progressListener, "updateShare", params, parameterNames, parameterValues); + try + { + new ErrorParser(context).parse(reader); + } + finally + { + Util.close(reader); + } + } } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java b/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java index 4623c609..a819731a 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/Constants.java @@ -42,6 +42,8 @@ public final class Constants public static final String INTENT_EXTRA_NAME_QUERY = "subsonic.query"; public static final String INTENT_EXTRA_NAME_PLAYLIST_ID = "subsonic.playlist.id"; public static final String INTENT_EXTRA_NAME_PLAYLIST_NAME = "subsonic.playlist.name"; + public static final String INTENT_EXTRA_NAME_SHARE_ID = "subsonic.share.id"; + public static final String INTENT_EXTRA_NAME_SHARE_NAME = "subsonic.share.name"; public static final String INTENT_EXTRA_NAME_ALBUM_LIST_TYPE = "subsonic.albumlisttype"; public static final String INTENT_EXTRA_NAME_ALBUM_LIST_TITLE = "subsonic.albumlisttitle"; public static final String INTENT_EXTRA_NAME_ALBUM_LIST_SIZE = "subsonic.albumlistsize"; @@ -120,6 +122,7 @@ public final class Constants public static final String PREFERENCES_KEY_VIEW_REFRESH = "viewRefresh"; public static final String PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS = "sharingAlwaysAskForDetails"; public static final String PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION = "sharingDefaultDescription"; + public static final String PREFERENCES_KEY_DEFAULT_SHARE_GREETING = "sharingDefaultGreeting"; public static final String PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION = "sharingDefaultExpiration"; // Name of the preferences file. diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java b/src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java index d5d53a21..35b65626 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/ShareDetails.java @@ -2,7 +2,6 @@ package com.thejoshwa.ultrasonic.androidapp.util; import com.thejoshwa.ultrasonic.androidapp.domain.MusicDirectory; -import java.util.Calendar; import java.util.List; /** @@ -11,6 +10,6 @@ import java.util.List; public class ShareDetails { public String Description; - public Calendar Expiration; + public long Expiration; public List Entries; } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java new file mode 100644 index 00000000..c72bb29a --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpan.java @@ -0,0 +1,166 @@ +package com.thejoshwa.ultrasonic.androidapp.util; + +import java.util.Calendar; +import java.util.Date; + +public class TimeSpan +{ + public static final int MILLISECONDS_IN_DAY = 86400000; + public static final int MILLISECONDS_IN_HOUR = 3600000; + public static final int MILLISECONDS_IN_MINUTE = 60000; + public static final int MILLISECONDS_IN_SECOND = 1000; + public static final int SECONDS_IN_MINUTE = 60; + public static final int MINUTES_IN_HOUR = 60; + public static final int HOURS_IN_DAY = 24; + + private long totalMilliseconds; + private int milliseconds; + private int seconds; + private int minutes; + private int hours; + private int days; + + public TimeSpan(long milliseconds) + { + this.totalMilliseconds = milliseconds; + this.milliseconds = (int) (milliseconds % MILLISECONDS_IN_SECOND); + milliseconds /= MILLISECONDS_IN_SECOND; + this.seconds = (int) (milliseconds % SECONDS_IN_MINUTE); + milliseconds /= SECONDS_IN_MINUTE; + this.minutes = (int) (milliseconds % MINUTES_IN_HOUR); + milliseconds /= MINUTES_IN_HOUR; + this.hours = (int) (milliseconds % HOURS_IN_DAY); + milliseconds /= HOURS_IN_DAY; + this.days = (int) milliseconds; + } + + public static TimeSpan create(int minutes, int seconds) + { + long totalMilliseconds = (seconds * MILLISECONDS_IN_SECOND); + totalMilliseconds += (minutes * MILLISECONDS_IN_MINUTE); + + return new TimeSpan(totalMilliseconds); + } + + public static TimeSpan create(int hours, int minutes, int seconds) + { + long totalMilliseconds = (seconds * MILLISECONDS_IN_SECOND); + totalMilliseconds += (minutes * MILLISECONDS_IN_MINUTE); + totalMilliseconds += (hours * MILLISECONDS_IN_HOUR); + + return new TimeSpan(totalMilliseconds); + } + + public static TimeSpan create(long days, long hours, long minutes, long seconds) + { + long totalMilliseconds = (seconds * MILLISECONDS_IN_SECOND); + totalMilliseconds += (minutes * MILLISECONDS_IN_MINUTE); + totalMilliseconds += (hours * MILLISECONDS_IN_HOUR); + totalMilliseconds += (days * MILLISECONDS_IN_DAY); + + return new TimeSpan(totalMilliseconds); + } + + public static TimeSpan create(long days, long hours, long minutes, long seconds, long milliseconds) + { + long totalMilliseconds = milliseconds; + totalMilliseconds += (seconds * MILLISECONDS_IN_SECOND); + totalMilliseconds += (minutes * MILLISECONDS_IN_MINUTE); + totalMilliseconds += (hours * MILLISECONDS_IN_HOUR); + totalMilliseconds += (days * MILLISECONDS_IN_DAY); + + return new TimeSpan(totalMilliseconds); + } + + public static TimeSpan create(Calendar cal) + { + return new TimeSpan(cal.getTimeInMillis()); + } + + public static TimeSpan create(Date date) + { + return new TimeSpan(date.getTime()); + } + + public static TimeSpan getCurrentTime() + { + return new TimeSpan(System.currentTimeMillis()); + } + + public int getDays() + { + return days; + } + + public int getHours() + { + return hours; + } + + public int getMinutes() + { + return minutes; + } + + public int getSeconds() + { + return seconds; + } + + public int getMilliseconds() + { + return milliseconds; + } + + public double getTotalDays() + { + return totalMilliseconds / (double) (MILLISECONDS_IN_DAY); + } + + public double getTotalHours() + { + return totalMilliseconds / (double) (MILLISECONDS_IN_HOUR); + } + + public double getTotalMinutes() + { + return totalMilliseconds / (double) (MILLISECONDS_IN_MINUTE); + } + + public double getTotalSeconds() + { + return totalMilliseconds / (double) (MILLISECONDS_IN_SECOND); + } + + public long getTotalMilliseconds() + { + return totalMilliseconds; + } + + public TimeSpan add(TimeSpan ts) + { + return new TimeSpan(this.totalMilliseconds + ts.totalMilliseconds); + } + + public TimeSpan add(long milliseconds) + { + return new TimeSpan(this.totalMilliseconds + milliseconds); + } + + public TimeSpan subtract(TimeSpan ts) + { + return new TimeSpan(this.totalMilliseconds - ts.totalMilliseconds); + } + + public static int compare(TimeSpan t1, TimeSpan t2) + { + if (t1.totalMilliseconds < t2.totalMilliseconds) + { + return -1; + } + else + { + return t1.totalMilliseconds == t2.totalMilliseconds ? 0 : 1; + } + } +} \ No newline at end of file diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java new file mode 100644 index 00000000..2f4c7ad4 --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPicker.java @@ -0,0 +1,229 @@ +package com.thejoshwa.ultrasonic.androidapp.util; + +import android.content.Context; +import android.content.res.Resources; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.Spinner; + +import com.thejoshwa.ultrasonic.androidapp.R; + +/** + * Created by Joshua Bahnsen on 12/22/13. + */ +public class TimeSpanPicker extends LinearLayout implements AdapterView.OnItemSelectedListener +{ + private EditText timeSpanEditText; + private Spinner timeSpanSpinner; + private CheckBox timeSpanDisableCheckbox; + private TimeSpan timeSpan; + private ArrayAdapter adapter; + private Context context; + private View dialog; + + public TimeSpanPicker(Context context) { + this(context, null); + + this.context = context; + } + + public TimeSpanPicker(Context context, AttributeSet attrs) { + this(context, attrs, 0); + + this.context = context; + } + + public TimeSpanPicker(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + this.context = context; + + final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + dialog = inflater.inflate(R.layout.time_span_dialog, this, true); + + timeSpan = new TimeSpan(-1); + + timeSpanEditText = (EditText) dialog.findViewById(R.id.timeSpanEditText); + timeSpanEditText.setText("0"); + + timeSpanSpinner = (Spinner) dialog.findViewById(R.id.timeSpanSpinner); + timeSpanDisableCheckbox = (CheckBox) dialog.findViewById(R.id.timeSpanDisableCheckBox); + + timeSpanDisableCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) + { + timeSpanEditText.setEnabled(!b); + timeSpanSpinner.setEnabled(!b); + } + }); + + adapter = ArrayAdapter.createFromResource(context, R.array.shareExpirationNames, android.R.layout.simple_spinner_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + timeSpanSpinner.setAdapter(adapter); + + timeSpanSpinner.setOnItemSelectedListener(this); + } + + @Override + public void setEnabled(boolean enabled) + { + timeSpanEditText.setEnabled(enabled); + timeSpanSpinner.setEnabled(enabled); + } + + public TimeSpan getTimeSpan() + { + if (!timeSpanDisableCheckbox.isChecked()) + { + this.timeSpan = getTimeSpanFromDialog(this.context, dialog); + } + else + { + this.timeSpan = new TimeSpan(0); + } + + return timeSpan; + } + + public boolean getTimeSpanEnabled() + { + return !timeSpanDisableCheckbox.isChecked(); + } + + public String getTimeSpanType() + { + EditText timeSpanEditText = (EditText) dialog.findViewById(R.id.timeSpanEditText); + + if (timeSpanEditText == null) + { + return null; + } + + return (String) timeSpanSpinner.getSelectedItem(); + } + + public int getTimeSpanAmount() + { + Spinner timeSpanSpinner = (Spinner) dialog.findViewById(R.id.timeSpanSpinner); + + if (timeSpanSpinner == null) + { + return -1; + } + + String timeSpanAmountString = timeSpanEditText.getText().toString(); + + int timeSpanAmount = 0; + + if (timeSpanAmountString != null && !"".equals(timeSpanAmountString)) + { + timeSpanAmount = Integer.parseInt(timeSpanAmountString); + } + + return timeSpanAmount; + } + + public void setTimeSpanAmount(CharSequence amount) + { + timeSpanEditText.setText(amount); + } + + public void setTimeSpanType(CharSequence type) + { + timeSpanSpinner.setSelection(adapter.getPosition(type)); + } + + public void setTimeSpanDisableText(CharSequence text) + { + timeSpanDisableCheckbox.setText(text); + } + + public void setTimeSpanDisableCheckboxChecked(boolean checked) + { + timeSpanDisableCheckbox.setChecked(checked); + } + + public static TimeSpan getTimeSpanFromDialog(Context context, View dialog) + { + EditText timeSpanEditText = (EditText) dialog.findViewById(R.id.timeSpanEditText); + Spinner timeSpanSpinner = (Spinner) dialog.findViewById(R.id.timeSpanSpinner); + + if (timeSpanEditText == null || timeSpanSpinner == null) + { + return new TimeSpan(-1); + } + + String timeSpanType = (String) timeSpanSpinner.getSelectedItem(); + String timeSpanAmountString = timeSpanEditText.getText().toString(); + + int timeSpanAmount = 0; + + if (timeSpanAmountString != null && !"".equals(timeSpanAmountString)) + { + timeSpanAmount = Integer.parseInt(timeSpanAmountString); + } + + return calculateTimeSpan(context, timeSpanType, timeSpanAmount); + } + + public static TimeSpan calculateTimeSpan(Context context, String timeSpanType, int timeSpanAmount) + { + TimeSpan timeSpan = null; + + Resources resources = context.getResources(); + + if (resources.getText(R.string.settings_share_milliseconds).equals(timeSpanType)) + { + timeSpan = new TimeSpan(timeSpanAmount); + } + else if (resources.getText(R.string.settings_share_seconds).equals(timeSpanType)) + { + timeSpan = TimeSpan.create(0, timeSpanAmount); + } + else if (resources.getText(R.string.settings_share_minutes).equals(timeSpanType)) + { + timeSpan = TimeSpan.create(timeSpanAmount, 0); + } + else if (resources.getText(R.string.settings_share_hours).equals(timeSpanType)) + { + timeSpan = TimeSpan.create(timeSpanAmount, 0, 0); + } + else if (resources.getText(R.string.settings_share_days).equals(timeSpanType)) + { + timeSpan = TimeSpan.create(timeSpanAmount, 0, 0, 0); + } + + return timeSpan; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int pos, long id) + { + String timeSpanType = (String)parent.getItemAtPosition(pos); + String timeSpanAmountString = timeSpanEditText.getText().toString(); + + int timeSpanAmount = 0; + + if (timeSpanAmountString != null && !"".equals(timeSpanAmountString)) + { + timeSpanAmount = Integer.parseInt(timeSpanAmountString); + } + + this.timeSpan = calculateTimeSpan(this.context, timeSpanType, timeSpanAmount); + } + + @Override + public void onNothingSelected(AdapterView adapterView) + { + + } +} diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java new file mode 100644 index 00000000..0de2f7b2 --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/TimeSpanPreference.java @@ -0,0 +1,97 @@ +package com.thejoshwa.ultrasonic.androidapp.util; + +import android.content.Context; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.View; + +import com.thejoshwa.ultrasonic.androidapp.R; + +import java.util.regex.Pattern; + +/** + * Created by Joshua Bahnsen on 12/22/13. + */ +public class TimeSpanPreference extends DialogPreference +{ + private static final Pattern COMPILE = Pattern.compile(":"); + Context context; + TimeSpanPicker picker; + + public TimeSpanPreference(Context context, AttributeSet attrs) + { + super(context, attrs); + this.context = context; + + setPositiveButtonText(android.R.string.ok); + setNegativeButtonText(android.R.string.cancel); + + setDialogIcon(null); + } + + public String getText() + { + String persisted = getPersistedString(""); + + if (!"".equals(persisted)) + { + return persisted.replace(':', ' '); + } + + return this.context.getResources().getString(R.string.time_span_disabled) ; + } + + @Override + public View onCreateDialogView() + { + picker = new TimeSpanPicker(this.context); + picker.setTimeSpanDisableText(this.context.getResources().getString(R.string.no_expiration)); + + String persisted = getPersistedString(""); + + if (!persisted.equals("")) + { + String[] split = COMPILE.split(persisted); + + if (split.length == 2) + { + String amount = split[0]; + + if ("0".equals(amount) || "".equals(amount)) + { + picker.setTimeSpanDisableCheckboxChecked(true); + } + + picker.setTimeSpanAmount(amount); + picker.setTimeSpanType(split[1]); + } + } + else + { + picker.setTimeSpanDisableCheckboxChecked(true); + } + + return picker; + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + + String persisted = ""; + + if (picker.getTimeSpanEnabled()) + { + int tsAmount = picker.getTimeSpanAmount(); + + if (tsAmount > 0) + { + String tsType = picker.getTimeSpanType(); + + persisted = String.format("%d:%s", tsAmount, tsType); + } + } + + persistString(persisted); + } +} diff --git a/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java b/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java index 3a297289..924fb7e4 100644 --- a/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java +++ b/src/com/thejoshwa/ultrasonic/androidapp/util/Util.java @@ -29,6 +29,7 @@ import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; +import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; @@ -83,10 +84,10 @@ import java.text.NumberFormat; import java.util.Calendar; import java.util.Date; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; /** * @author Sindre Mehus @@ -100,6 +101,7 @@ public class Util extends DownloadActivity private static final DecimalFormat GIGA_BYTE_FORMAT = new DecimalFormat("0.00 GB"); private static final DecimalFormat MEGA_BYTE_FORMAT = new DecimalFormat("0.00 MB"); private static final DecimalFormat KILO_BYTE_FORMAT = new DecimalFormat("0 KB"); + private static final Pattern PATTERN = Pattern.compile(":"); private static DecimalFormat GIGA_BYTE_LOCALIZED_FORMAT; private static DecimalFormat MEGA_BYTE_LOCALIZED_FORMAT; @@ -440,7 +442,7 @@ public class Util extends DownloadActivity * @param input the InputStream to read from * @return the requested byte array * @throws NullPointerException if the input is null - * @throws IOException if an I/O error occurs + * @throws java.io.IOException if an I/O error occurs */ public static byte[] toByteArray(InputStream input) throws IOException { @@ -864,7 +866,7 @@ public class Util extends DownloadActivity public static Drawable getDrawableFromAttribute(Context context, int attr) { int[] attrs = new int[]{attr}; - android.content.res.TypedArray ta = context.obtainStyledAttributes(attrs); + TypedArray ta = context.obtainStyledAttributes(attrs); Drawable drawableFromTheme = null; if (ta != null) @@ -960,7 +962,7 @@ public class Util extends DownloadActivity /** *

Broadcasts the given song info as the new song being played.

*/ - public static void broadcastNewTrackInfo(Context context, MusicDirectory.Entry song) + public static void broadcastNewTrackInfo(Context context, Entry song) { Intent intent = new Intent(EVENT_META_CHANGED); @@ -1595,26 +1597,36 @@ public class Util extends DownloadActivity return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, ""); } - public static long getDefaultShareExpiration(Context context) + public static String getShareGreeting(Context context) { SharedPreferences preferences = getPreferences(context); - return Long.parseLong(preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "-1")); + return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_GREETING, String.format(context.getResources().getString(R.string.share_default_greeting), context.getResources().getString(R.string.common_appname))); } - public static Calendar getDefaultShareExpirationCalendar(Context context) + public static String getDefaultShareExpiration(Context context) { - long expiration = getDefaultShareExpiration(context); + SharedPreferences preferences = getPreferences(context); + return preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0"); + } - if (expiration > 0) + public static long getDefaultShareExpirationInMillis(Context context) + { + SharedPreferences preferences = getPreferences(context); + String preference = preferences.getString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, "0"); + + String[] split = PATTERN.split(preference); + + if (split.length == 2) { - Calendar cal = Calendar.getInstance(Locale.getDefault()); - cal.setTimeInMillis(System.currentTimeMillis() + expiration); - return cal; - } - else - { - return null; + int timeSpanAmount = Integer.parseInt(split[0]); + String timeSpanType = split[1]; + + TimeSpan timeSpan = TimeSpanPicker.calculateTimeSpan(context, timeSpanType, timeSpanAmount); + + return timeSpan.getTotalMilliseconds(); } + + return 0; } public static void setShouldAskForShareDetails(Context context, boolean shouldAskForShareDetails) @@ -1624,4 +1636,20 @@ public class Util extends DownloadActivity editor.putBoolean(Constants.PREFERENCES_KEY_ASK_FOR_SHARE_DETAILS, shouldAskForShareDetails); editor.commit(); } + + public static void setDefaultShareExpiration(Context context, String defaultShareExpiration) + { + SharedPreferences preferences = getPreferences(context); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_EXPIRATION, defaultShareExpiration); + editor.commit(); + } + + public static void setDefaultShareDescription(Context context, String defaultShareDescription) + { + SharedPreferences preferences = getPreferences(context); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString(Constants.PREFERENCES_KEY_DEFAULT_SHARE_DESCRIPTION, defaultShareDescription); + editor.commit(); + } } diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java b/src/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java new file mode 100644 index 00000000..308a8add --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/view/ShareAdapter.java @@ -0,0 +1,54 @@ +package com.thejoshwa.ultrasonic.androidapp.view; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; + +import com.thejoshwa.ultrasonic.androidapp.R; +import com.thejoshwa.ultrasonic.androidapp.activity.SubsonicTabActivity; +import com.thejoshwa.ultrasonic.androidapp.domain.Share; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author Sindre Mehus + */ +public class ShareAdapter extends ArrayAdapter +{ + + private final SubsonicTabActivity activity; + + public ShareAdapter(SubsonicTabActivity activity, List Shares) + { + super(activity, R.layout.share_list_item, Shares); + this.activity = activity; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + Share entry = getItem(position); + ShareView view; + view = convertView != null && convertView instanceof ShareView ? (ShareView) convertView : new ShareView(activity); + view.setShare(entry); + return view; + } + + public static class ShareComparator implements Comparator + { + @Override + public int compare(Share share1, Share share2) + { + return share1.getId().compareToIgnoreCase(share2.getId()); + } + + public static List sort(List shares) + { + Collections.sort(shares, new ShareComparator()); + return shares; + } + + } +} \ No newline at end of file diff --git a/src/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java b/src/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java new file mode 100644 index 00000000..dbfc51d2 --- /dev/null +++ b/src/com/thejoshwa/ultrasonic/androidapp/view/ShareView.java @@ -0,0 +1,53 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + + Copyright 2009 (C) Sindre Mehus + */ +package com.thejoshwa.ultrasonic.androidapp.view; + +import android.content.Context; +import android.view.LayoutInflater; +import android.widget.TextView; + +import com.thejoshwa.ultrasonic.androidapp.R; +import com.thejoshwa.ultrasonic.androidapp.domain.Share; + +/** + * Used to display playlists in a {@code ListView}. + * + * @author Sindre Mehus + */ +public class ShareView extends UpdateView +{ + private TextView titleView; + private TextView descriptionView; + + public ShareView(Context context) + { + super(context); + LayoutInflater.from(context).inflate(R.layout.share_list_item, this, true); + + titleView = (TextView) findViewById(R.id.share_url); + descriptionView = (TextView) findViewById(R.id.share_description); + } + + public void setShare(Share share) + { + titleView.setText(share.getName()); + descriptionView.setText(share.getDescription()); + update(); + } +} \ No newline at end of file