diff --git a/.idea/RetroMusicPlayer.iml b/.idea/RetroMusicPlayer.iml index d6ebd4805..c57968224 100644 --- a/.idea/RetroMusicPlayer.iml +++ b/.idea/RetroMusicPlayer.iml @@ -1,8 +1,18 @@ - - + + + + + + + + - + + + diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 000000000..9f00a5923 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_jsoup_1_11_2_jar_unspecified_jar.xml b/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_jsoup_1_11_2_jar_unspecified_jar.xml new file mode 100644 index 000000000..c6d6bce53 --- /dev/null +++ b/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_jsoup_1_11_2_jar_unspecified_jar.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_juniversalchardet_1_0_3_jar_unspecified_jar.xml b/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_juniversalchardet_1_0_3_jar_unspecified_jar.xml new file mode 100644 index 000000000..69dfd16ff --- /dev/null +++ b/.idea/libraries/Gradle____local_aars____Users_hemanths_Desktop_KeepSafe_RetroMusicPlayer_app_libs_juniversalchardet_1_0_3_jar_unspecified_jar.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml b/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml new file mode 100644 index 000000000..986980375 --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_core_common_1_1_0_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml b/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml new file mode 100644 index 000000000..2d8db5cd3 --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_core_runtime_1_1_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml b/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml new file mode 100644 index 000000000..29c00493f --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_lifecycle_common_1_1_0_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml b/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml new file mode 100644 index 000000000..0f6649019 --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_lifecycle_livedata_core_1_1_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml b/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml new file mode 100644 index 000000000..6e8122d8e --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_lifecycle_runtime_1_1_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml b/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml new file mode 100644 index 000000000..8d493b7ad --- /dev/null +++ b/.idea/libraries/Gradle__android_arch_lifecycle_viewmodel_1_1_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_afollestad_material_cab_0_1_12.xml b/.idea/libraries/Gradle__com_afollestad_material_cab_0_1_12.xml new file mode 100644 index 000000000..5342dd559 --- /dev/null +++ b/.idea/libraries/Gradle__com_afollestad_material_cab_0_1_12.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_afollestad_material_dialogs_commons_0_9_6_0.xml b/.idea/libraries/Gradle__com_afollestad_material_dialogs_commons_0_9_6_0.xml new file mode 100644 index 000000000..1fa5276ea --- /dev/null +++ b/.idea/libraries/Gradle__com_afollestad_material_dialogs_commons_0_9_6_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_afollestad_material_dialogs_core_0_9_6_0.xml b/.idea/libraries/Gradle__com_afollestad_material_dialogs_core_0_9_6_0.xml new file mode 100644 index 000000000..dcb329043 --- /dev/null +++ b/.idea/libraries/Gradle__com_afollestad_material_dialogs_core_0_9_6_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_27_1_1.xml new file mode 100644 index 000000000..31952d8e7 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_animated_vector_drawable_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_appcompat_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_appcompat_v7_27_1_1.xml new file mode 100644 index 000000000..5dfbcbc5e --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_appcompat_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_cardview_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_cardview_v7_27_1_1.xml new file mode 100644 index 000000000..7e8259db9 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_cardview_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_design_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_design_27_1_1.xml new file mode 100644 index 000000000..7094439c0 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_design_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_gridlayout_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_gridlayout_v7_27_1_1.xml new file mode 100644 index 000000000..5120caef0 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_gridlayout_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_multidex_1_0_3.xml b/.idea/libraries/Gradle__com_android_support_multidex_1_0_3.xml new file mode 100644 index 000000000..ba522c416 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_multidex_1_0_3.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_palette_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_palette_v7_27_1_1.xml new file mode 100644 index 000000000..d1c7ac722 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_palette_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_preference_v14_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_preference_v14_27_1_1.xml new file mode 100644 index 000000000..f7746a312 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_preference_v14_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_preference_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_preference_v7_27_1_1.xml new file mode 100644 index 000000000..e346adadc --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_preference_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_recyclerview_v7_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_recyclerview_v7_27_1_1.xml new file mode 100644 index 000000000..086f5b761 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_recyclerview_v7_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml b/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml new file mode 100644 index 000000000..1517ad9ca --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_annotations_27_1_1_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml new file mode 100644 index 000000000..ff5b9c804 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_compat_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml new file mode 100644 index 000000000..56eeee073 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_core_ui_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml new file mode 100644 index 000000000..e34e1e6e2 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_core_utils_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml new file mode 100644 index 000000000..63d68cb92 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_fragment_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml new file mode 100644 index 000000000..d061d5b9d --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_media_compat_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml new file mode 100644 index 000000000..777efd1e8 --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_v4_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_support_vector_drawable_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_27_1_1.xml new file mode 100644 index 000000000..d656d2ead --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_support_vector_drawable_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_android_support_transition_27_1_1.xml b/.idea/libraries/Gradle__com_android_support_transition_27_1_1.xml new file mode 100644 index 000000000..3ca276beb --- /dev/null +++ b/.idea/libraries/Gradle__com_android_support_transition_27_1_1.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_anjlab_android_iab_v3_library_1_0_44_jar.xml b/.idea/libraries/Gradle__com_anjlab_android_iab_v3_library_1_0_44_jar.xml new file mode 100644 index 000000000..55725f31e --- /dev/null +++ b/.idea/libraries/Gradle__com_anjlab_android_iab_v3_library_1_0_44_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_AdrienPoupa_jaudiotagger_2_2_3.xml b/.idea/libraries/Gradle__com_github_AdrienPoupa_jaudiotagger_2_2_3.xml new file mode 100644 index 000000000..0f7c92180 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_AdrienPoupa_jaudiotagger_2_2_3.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_glide_3_8_0_jar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_3_8_0_jar.xml new file mode 100644 index 000000000..c5f9a0031 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_3_8_0_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_okhttp3_integration_1_5_0_jar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_okhttp3_integration_1_5_0_jar.xml new file mode 100644 index 000000000..5166dd06e --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_okhttp3_integration_1_5_0_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_jetradarmobile_android_snowfall_1_1_6.xml b/.idea/libraries/Gradle__com_github_jetradarmobile_android_snowfall_1_1_6.xml new file mode 100644 index 000000000..1c1d7a0dc --- /dev/null +++ b/.idea/libraries/Gradle__com_github_jetradarmobile_android_snowfall_1_1_6.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_kabouzeid_RecyclerView_FastScroll_1_0_16_kmod.xml b/.idea/libraries/Gradle__com_github_kabouzeid_RecyclerView_FastScroll_1_0_16_kmod.xml new file mode 100644 index 000000000..92ac349fd --- /dev/null +++ b/.idea/libraries/Gradle__com_github_kabouzeid_RecyclerView_FastScroll_1_0_16_kmod.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_ksoichiro_android_observablescrollview_1_6_0.xml b/.idea/libraries/Gradle__com_github_ksoichiro_android_observablescrollview_1_6_0.xml new file mode 100644 index 000000000..7cbbe808f --- /dev/null +++ b/.idea/libraries/Gradle__com_github_ksoichiro_android_observablescrollview_1_6_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_gson_gson_2_7_jar.xml b/.idea/libraries/Gradle__com_google_code_gson_gson_2_7_jar.xml new file mode 100644 index 000000000..7ec4e00b0 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_gson_gson_2_7_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_h6ah4i_android_widget_advrecyclerview_advrecyclerview_0_11_0.xml b/.idea/libraries/Gradle__com_h6ah4i_android_widget_advrecyclerview_advrecyclerview_0_11_0.xml new file mode 100644 index 000000000..fb25979e8 --- /dev/null +++ b/.idea/libraries/Gradle__com_h6ah4i_android_widget_advrecyclerview_advrecyclerview_0_11_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_jakewharton_butterknife_8_8_1.xml b/.idea/libraries/Gradle__com_jakewharton_butterknife_8_8_1.xml new file mode 100644 index 000000000..d0af7db60 --- /dev/null +++ b/.idea/libraries/Gradle__com_jakewharton_butterknife_8_8_1.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_jakewharton_butterknife_annotations_8_8_1_jar.xml b/.idea/libraries/Gradle__com_jakewharton_butterknife_annotations_8_8_1_jar.xml new file mode 100644 index 000000000..0135f0cf0 --- /dev/null +++ b/.idea/libraries/Gradle__com_jakewharton_butterknife_annotations_8_8_1_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_mpatric_mp3agic_0_8_3_jar.xml b/.idea/libraries/Gradle__com_mpatric_mp3agic_0_8_3_jar.xml new file mode 100644 index 000000000..9b5bf4b0c --- /dev/null +++ b/.idea/libraries/Gradle__com_mpatric_mp3agic_0_8_3_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_r0adkll_slidableactivity_2_0_6.xml b/.idea/libraries/Gradle__com_r0adkll_slidableactivity_2_0_6.xml new file mode 100644 index 000000000..7e0804855 --- /dev/null +++ b/.idea/libraries/Gradle__com_r0adkll_slidableactivity_2_0_6.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_sothree_slidinguppanel_library_3_4_0.xml b/.idea/libraries/Gradle__com_sothree_slidinguppanel_library_3_4_0.xml new file mode 100644 index 000000000..a7a2364ab --- /dev/null +++ b/.idea/libraries/Gradle__com_sothree_slidinguppanel_library_3_4_0.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_3_10_0_jar.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_3_10_0_jar.xml new file mode 100644 index 000000000..70c927818 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_3_10_0_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_10_0_jar.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_10_0_jar.xml new file mode 100644 index 000000000..3bb1ed9db --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_3_10_0_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml b/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml new file mode 100644 index 000000000..9c3a836e2 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okio_okio_1_14_0_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_3_0_jar.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_3_0_jar.xml new file mode 100644 index 000000000..e2eeb072c --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_3_0_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_3_0_jar.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_3_0_jar.xml new file mode 100644 index 000000000..23dc45fea --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_3_0_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_3_0_jar.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_3_0_jar.xml new file mode 100644 index 000000000..0afdbc04a --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_3_0_jar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_0_2.xml b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_0_2.xml new file mode 100644 index 000000000..57868138a --- /dev/null +++ b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_0_2.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_1_9_jar.xml b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_1_9_jar.xml new file mode 100644 index 000000000..e23e22ea1 --- /dev/null +++ b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_1_9_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__jp_wasabeef_glide_transformations_2_0_2.xml b/.idea/libraries/Gradle__jp_wasabeef_glide_transformations_2_0_2.xml new file mode 100644 index 000000000..240155885 --- /dev/null +++ b/.idea/libraries/Gradle__jp_wasabeef_glide_transformations_2_0_2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__me_zhanghai_android_materialprogressbar_library_1_4_2.xml b/.idea/libraries/Gradle__me_zhanghai_android_materialprogressbar_library_1_4_2.xml new file mode 100644 index 000000000..16a7aabd7 --- /dev/null +++ b/.idea/libraries/Gradle__me_zhanghai_android_materialprogressbar_library_1_4_2.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_6_jar.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_6_jar.xml new file mode 100644 index 000000000..7bd7785f6 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_runtime_1_0_6_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_6_jar.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_6_jar.xml new file mode 100644 index 000000000..07f6fbd30 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_0_6_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_2_jar.xml b/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_2_jar.xml new file mode 100644 index 000000000..761660632 --- /dev/null +++ b/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_2_jar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__uk_co_chrisjenx_calligraphy_2_3_0.xml b/.idea/libraries/Gradle__uk_co_chrisjenx_calligraphy_2_3_0.xml new file mode 100644 index 000000000..5cbc12561 --- /dev/null +++ b/.idea/libraries/Gradle__uk_co_chrisjenx_calligraphy_2_3_0.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..26dc4f515 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 2876f8fb2..bef72af79 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,8 @@ + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 000000000..7f68460d8 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1ddfb..830674470 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/app/app.iml b/app/app.iml index b23b9e1a5..d01c8bb46 100644 --- a/app/app.iml +++ b/app/app.iml @@ -70,13 +70,6 @@ - - - - - - - @@ -84,6 +77,13 @@ + + + + + + + @@ -112,13 +112,6 @@ - - - - - - - @@ -126,11 +119,17 @@ + + + + + + + - @@ -167,7 +166,6 @@ - @@ -182,7 +180,6 @@ - @@ -190,10 +187,11 @@ - + + @@ -210,11 +208,11 @@ - + diff --git a/app/build.gradle b/app/build.gradle index ed8fc97bb..2dac3fdde 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -141,5 +141,5 @@ dependencies { /*Backend all*/ implementation project(':appthemehelper') implementation 'com.sothree.slidinguppanel:library:3.4.0' - implementation 'org.nanohttpd:nanohttpd:2.3.1' + implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3' } diff --git a/app/libs/jaudiotagger-android-2.2.3.jar b/app/libs/jaudiotagger-android-2.2.3.jar deleted file mode 100644 index 11a46d34a..000000000 Binary files a/app/libs/jaudiotagger-android-2.2.3.jar and /dev/null differ diff --git a/app/libs/jsoup-1.11.2.jar b/app/libs/jsoup-1.11.2.jar deleted file mode 100644 index e4be2aed9..000000000 Binary files a/app/libs/jsoup-1.11.2.jar and /dev/null differ diff --git a/app/libs/juniversalchardet-1.0.3.jar b/app/libs/juniversalchardet-1.0.3.jar deleted file mode 100644 index 1af703fec..000000000 Binary files a/app/libs/juniversalchardet-1.0.3.jar and /dev/null differ diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.java b/app/src/main/java/code/name/monkey/retromusic/Constants.java index 2252315da..4e29e4a70 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.java +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.java @@ -34,7 +34,7 @@ public class Constants { public static final String PAYPAL_ME_URL = "https://www.paypal.me/h4h14"; public static final String GOOGLE_PLUS_COMMUNITY = "https://plus.google.com/communities/110811566242871492162"; public static final String TRANSLATE = "http://monkeycodeapp.oneskyapp.com/collaboration/project?id=238534"; - public static final String GITHUB_PROJECT = "https://github.com/h4h13/RetroMusicApp"; + public static final String GITHUB_PROJECT = "https://github.com/h4h13/RetroMusicPlayer"; public static final String BASE_API_URL_KUGOU = "http://lyrics.kugou.com/"; public static final String TELEGRAM_CHANGE_LOG = "https://t.me/retromusiclog"; public static final String USER_PROFILE = "profile.jpg"; diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/KogouLyricsFetcher.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/KogouLyricsFetcher.java deleted file mode 100644 index 02ded4324..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/KogouLyricsFetcher.java +++ /dev/null @@ -1,69 +0,0 @@ -package code.name.monkey.retromusic.lyrics; - -import android.os.Handler; -import code.name.monkey.retromusic.model.Song; -import code.name.monkey.retromusic.rest.KogouClient; -import code.name.monkey.retromusic.rest.model.KuGouSearchLyricResult; -import code.name.monkey.retromusic.util.LyricUtil; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import java.io.File; - -/** - * @author Hemanth S (h4h13). - */ - -public class KogouLyricsFetcher { - - private KogouClient mKogouClient; - private Song mSong; - private KogouLyricsCallback mCallback; - - public KogouLyricsFetcher(KogouLyricsCallback callback) { - mCallback = callback; - mKogouClient = new KogouClient(); - } - - public void loadLyrics(Song song, String duration) { - mSong = song; - mKogouClient.getApiService() - .searchLyric(mSong.title, duration) - .subscribe(this::parseKugouResult, - throwable -> mCallback.onNoLyrics()); - } - - private void parseKugouResult(KuGouSearchLyricResult kuGouSearchLyricResult) { - if (kuGouSearchLyricResult != null && kuGouSearchLyricResult.status == 200 & - kuGouSearchLyricResult.candidates != null && - kuGouSearchLyricResult.candidates.size() != 0) { - KuGouSearchLyricResult.Candidates candidates = kuGouSearchLyricResult.candidates.get(0); - loadLyricsFile(candidates); - } else { - mCallback.onNoLyrics(); - } - } - - private void loadLyricsFile(KuGouSearchLyricResult.Candidates candidates) { - mKogouClient.getApiService().getRawLyric(candidates.id, candidates.accesskey) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe(kuGouRawLyric -> { - if (kuGouRawLyric == null) { - mCallback.onNoLyrics(); - return; - } - String rawLyric = LyricUtil.decryptBASE64(kuGouRawLyric.content); - LyricUtil.writeLrcToLoc(mSong.title, mSong.artistName, rawLyric); - new Handler().postDelayed( - () -> mCallback.onLyrics(LyricUtil.getLocalLyricFile(mSong.title, mSong.artistName)), - 1); - }); - } - - public interface KogouLyricsCallback { - - void onNoLyrics(); - - void onLyrics(File file); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsEngine.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsEngine.java deleted file mode 100644 index 52884ce80..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsEngine.java +++ /dev/null @@ -1,6 +0,0 @@ -package code.name.monkey.retromusic.lyrics; - -public interface LyricsEngine { - String getLyrics(String artistName, String songTitle); - -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsWikiEngine.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsWikiEngine.java deleted file mode 100644 index fde1fa5b9..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LyricsWikiEngine.java +++ /dev/null @@ -1,143 +0,0 @@ -package code.name.monkey.retromusic.lyrics; - -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import org.json.JSONException; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.nodes.Node; -import org.jsoup.nodes.TextNode; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringWriter; -import java.net.URL; - -import javax.net.ssl.HttpsURLConnection; - -public class LyricsWikiEngine implements LyricsEngine { - - private static final String TAG = LyricsWikiEngine.class.getSimpleName(); - - // Reads an InputStream and converts it to a String. - private static String readIt(InputStream stream) throws IOException { - Reader reader = new InputStreamReader(stream, "UTF-8"); - StringWriter sw = new StringWriter(); - char[] buffer = new char[4096]; - int count; - while ((count = reader.read(buffer)) != -1) { - sw.write(buffer, 0, count); - } - - return sw.toString(); - } - - @Override - public String getLyrics(String artistName, String songTitle) { - try { - - String lyricsUrl = makeApiCall(artistName, songTitle); - if (lyricsUrl == null) { // no URL in API answer or no correct answer at all - return null; - } - - return parseFullLyricsPage(lyricsUrl); - - } catch (IOException e) { - Log.w(TAG, "Couldn't connect to lyrics wiki REST endpoints", e); - return null; - } catch (JSONException e) { - Log.w(TAG, "Couldn't transform API answer to JSON entity", e); - return null; - } - } - - /** - * First call - */ - private String makeApiCall(String artistName, String songTitle) throws IOException, JSONException { - HttpsURLConnection apiCall = null; - try { - // build query - // e.g. https://lyrics.wikia.com/api.php?func=getSong&artist=The%20Beatle&song=Girl&fmt=realjson - Uri link = new Uri.Builder() - .scheme("https") - .authority("lyrics.wikia.com") - .path("api.php") - .appendQueryParameter("func", "getSong") - .appendQueryParameter("fmt", "realjson") - .appendQueryParameter("artist", artistName) - .appendQueryParameter("song", songTitle) - .build(); - - // construct an http request - apiCall = (HttpsURLConnection) new URL(link.toString()).openConnection(); - apiCall.setReadTimeout(10_000); - apiCall.setConnectTimeout(15_000); - - // execute - apiCall.connect(); - int response = apiCall.getResponseCode(); - if (response != HttpsURLConnection.HTTP_OK) { - // redirects are handled internally, this is clearly an error - return null; - } - - InputStream is = apiCall.getInputStream(); - String reply = readIt(is); - JSONObject getSongAnswer = new JSONObject(reply); - - return getLyricsUrl(getSongAnswer); - } finally { - if (apiCall != null) { - apiCall.disconnect(); - } - } - } - - /** - * Second call - */ - private String parseFullLyricsPage(String lyricsUrl) throws IOException { - Document page = Jsoup.parse(new URL(lyricsUrl), 10_000); - Element lyricsBox = page.select("div.lyricbox").first(); - if (lyricsBox == null) { // no lyrics frame on page - return null; - } - - // remove unneeded elements - lyricsBox.select("div.rtMatcher").remove(); - lyricsBox.select("div.lyricsbreak").remove(); - lyricsBox.select("script").remove(); - - StringBuilder builder = new StringBuilder(); - for (Node curr : lyricsBox.childNodes()) { - if (curr instanceof TextNode) { - builder.append(((TextNode) curr).text()); - } else { - builder.append("\n"); - } - } - return builder.toString(); - } - - private String getLyricsUrl(JSONObject getSongAnswer) { - try { - String pageId = getSongAnswer.getString("page_id"); - if (TextUtils.isEmpty(pageId)) { - return null; // empty page_id means page wasn't created - } - return getSongAnswer.getString("url"); - } catch (JSONException e) { - Log.w(TAG, "Unknown format of getSong API call answer", e); - return null; - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/ParseLyrics.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/ParseLyrics.java deleted file mode 100644 index 17f88814c..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/ParseLyrics.java +++ /dev/null @@ -1,38 +0,0 @@ -package code.name.monkey.retromusic.lyrics; - -import android.os.AsyncTask; -import android.text.TextUtils; - -/** - * @author Hemanth S (h4h13). - */ - -public class ParseLyrics extends AsyncTask { - private LyricsCallback mLyricsCallback; - - public ParseLyrics(LyricsCallback lyricsCallback) { - mLyricsCallback = lyricsCallback; - } - - @Override - protected String doInBackground(String... strings) { - LyricsEngine lyricsEngine = new LyricsWikiEngine(); - return lyricsEngine.getLyrics(strings[1], strings[0]); - } - - @Override - protected void onPostExecute(String s) { - super.onPostExecute(s); - if (TextUtils.isEmpty(s)) { - mLyricsCallback.onError(); - return; - } - mLyricsCallback.onShowLyrics(s); - } - - public interface LyricsCallback { - void onShowLyrics(String lyrics); - - void onError(); - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/QueryResult.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/QueryResult.java deleted file mode 100644 index aa70f50c6..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/QueryResult.java +++ /dev/null @@ -1,23 +0,0 @@ -package code.name.monkey.retromusic.lyrics; - -public class QueryResult { - public static final String ITEM_LRC = "lrc"; - public static final String ATTRIBUTE_ID = "id"; - public static final String ATTRIBUTE_ARTIST = "artist"; - public static final String ATTRIBUTE_TITLE = "title"; - - public final int mId; - public final String mArtist; - public final String mTitle; - - QueryResult(int id, String artist, String title) { - mId = id; - mArtist = artist; - mTitle = title; - } - - @Override - public String toString() { - return mTitle + " - " + mArtist; - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.java index 3d388f857..1e0571440 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.java @@ -2,11 +2,9 @@ package code.name.monkey.retromusic.ui.activities; import android.annotation.SuppressLint; import android.content.res.ColorStateList; -import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; import android.text.InputType; import android.text.TextUtils; @@ -16,18 +14,6 @@ import android.view.WindowManager; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; - -import com.afollestad.materialdialogs.DialogAction; -import com.afollestad.materialdialogs.MaterialDialog; -import com.bumptech.glide.Glide; - -import org.jaudiotagger.tag.FieldKey; - -import java.io.File; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.Map; - import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -45,348 +31,300 @@ import code.name.monkey.retromusic.util.LyricUtil; import code.name.monkey.retromusic.util.MusicUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroUtil; -import code.name.monkey.retromusic.views.LyricView; +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.bumptech.glide.Glide; import io.reactivex.disposables.CompositeDisposable; +import java.io.File; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.Map; +import org.jaudiotagger.tag.FieldKey; -public class LyricsActivity extends AbsMusicServiceActivity implements MusicProgressViewUpdateHelper.Callback { +public class LyricsActivity extends AbsMusicServiceActivity implements + MusicProgressViewUpdateHelper.Callback { - @BindView(R.id.title) - TextView songTitle; - @BindView(R.id.text) - TextView songText; - @BindView(R.id.lyrics) - LyricView lyricView; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.offline_lyrics) - TextView offlineLyrics; - @BindView(R.id.actions) - RadioGroup actionsLayout; - @BindView(R.id.gradient_background) - View background; + @BindView(R.id.title) + TextView songTitle; + @BindView(R.id.text) + TextView songText; - private MusicProgressViewUpdateHelper updateHelper; - private AsyncTask updateLyricsAsyncTask; - private CompositeDisposable disposable; - private Song song; - private Lyrics lyrics; + @BindView(R.id.toolbar) + Toolbar toolbar; + @BindView(R.id.offline_lyrics) + TextView offlineLyrics; + @BindView(R.id.actions) + RadioGroup actionsLayout; + @BindView(R.id.gradient_background) + View background; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_lyrics); - ButterKnife.bind(this); + private MusicProgressViewUpdateHelper updateHelper; + private AsyncTask updateLyricsAsyncTask; + private CompositeDisposable disposable; + private Song song; + private Lyrics lyrics; - setStatusbarColorAuto(); - setNavigationbarColorAuto(); - setTaskDescriptionColorAuto(); - setLightNavigationBar(true); + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_lyrics); + ButterKnife.bind(this); - updateHelper = new MusicProgressViewUpdateHelper(this, 500, 1000); + setStatusbarColorAuto(); + setNavigationbarColorAuto(); + setTaskDescriptionColorAuto(); + setLightNavigationBar(true); - setupToolbar(); - setupLyricsView(); - setupWakelock(); + updateHelper = new MusicProgressViewUpdateHelper(this, 500, 1000); - actionsLayout.setOnCheckedChangeListener((group, checkedId) -> selectLyricsTye(checkedId)); + setupToolbar(); + setupLyricsView(); + setupWakelock(); + + actionsLayout.setOnCheckedChangeListener((group, checkedId) -> selectLyricsTye(checkedId)); + } + + private void selectLyricsTye(int group) { + + RadioButton radioButton = actionsLayout.findViewById(group); + radioButton.setBackgroundTintList(ColorStateList.valueOf(ThemeStore.accentColor(this))); + radioButton.setTextColor(ThemeStore.textColorPrimary(this)); + + offlineLyrics.setVisibility(View.GONE); + + switch (group) { + case R.id.synced_lyrics: + loadLRCLyrics(); + + break; + default: + case R.id.normal_lyrics: + loadSongLyrics(); + offlineLyrics.setVisibility(View.VISIBLE); + break; } + } - private void selectLyricsTye(int group) { - - RadioButton radioButton = actionsLayout.findViewById(group); - radioButton.setBackgroundTintList(ColorStateList.valueOf(ThemeStore.accentColor(this))); - radioButton.setTextColor(ThemeStore.textColorPrimary(this)); - - offlineLyrics.setVisibility(View.GONE); - lyricView.setVisibility(View.GONE); - switch (group) { - case R.id.synced_lyrics: - loadLRCLyrics(); - lyricView.setVisibility(View.VISIBLE); - break; - default: - case R.id.normal_lyrics: - loadSongLyrics(); - offlineLyrics.setVisibility(View.VISIBLE); - break; - } + private void loadLRCLyrics() { + if (LyricUtil.isLrcFileExist(song.title, song.artistName)) { + showLyricsLocal(LyricUtil.getLocalLyricFile(song.title, song.artistName)); } + } - private void loadLRCLyrics() { - if (LyricUtil.isLrcFileExist(song.title, song.artistName)) { - showLyricsLocal(LyricUtil.getLocalLyricFile(song.title, song.artistName)); - } + private void setupWakelock() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + } + + private void setupLyricsView() { + disposable = new CompositeDisposable(); + } + + private void setupToolbar() { + toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); + toolbar.setTitle(""); + toolbar.setNavigationOnClickListener(v -> onBackPressed()); + setSupportActionBar(toolbar); + } + + @Override + public void onPlayingMetaChanged() { + super.onPlayingMetaChanged(); + loadLrcFile(); + } + + @Override + protected void onResume() { + super.onResume(); + updateHelper.start(); + } + + @Override + protected void onPause() { + super.onPause(); + updateHelper.stop(); + } + + @Override + public void onServiceConnected() { + super.onServiceConnected(); + loadLrcFile(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + disposable.clear(); + + if (updateLyricsAsyncTask != null && !updateLyricsAsyncTask.isCancelled()) { + updateLyricsAsyncTask.cancel(true); } + } - private void setupWakelock() { - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); } + return super.onOptionsItemSelected(item); + } - private void setupLyricsView() { - disposable = new CompositeDisposable(); - //lyricView.setLineSpace(15.0f); - //lyricView.setTextSize(17.0f); - //lyricView.setPlayable(true); - //lyricView.setTranslationY(DensityUtil.getScreenWidth(this) + DensityUtil.dip2px(this, 120)); - lyricView.setOnPlayerClickListener((progress, content) -> MusicPlayerRemote.seekTo((int) progress)); + @Override + public void onUpdateProgressViews(int progress, int total) { - //lyricView.setHighLightTextColor(ThemeStore.accentColor(this)); - lyricView.setDefaultColor(ContextCompat.getColor(this, R.color.md_grey_400)); - //lyricView.setTouchable(false); - lyricView.setHintColor(Color.WHITE); + } - - } - - private void setupToolbar() { - toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); - toolbar.setTitle(""); - toolbar.setNavigationOnClickListener(v -> onBackPressed()); - setSupportActionBar(toolbar); - } - - @Override - public void onPlayingMetaChanged() { - super.onPlayingMetaChanged(); - loadLrcFile(); - } - - @Override - protected void onResume() { - super.onResume(); - updateHelper.start(); - } - - @Override - protected void onPause() { - super.onPause(); - updateHelper.stop(); - } - - @Override - public void onServiceConnected() { - super.onServiceConnected(); - loadLrcFile(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - disposable.clear(); - lyricView.setOnPlayerClickListener(null); - - if (updateLyricsAsyncTask != null && !updateLyricsAsyncTask.isCancelled()) { - updateLyricsAsyncTask.cancel(true); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onUpdateProgressViews(int progress, int total) { - lyricView.setCurrentTimeMillis(progress); - } - - private void loadLrcFile() { - song = MusicPlayerRemote.getCurrentSong(); - songTitle.setText(song.title); - songText.setText(song.artistName); - SongGlideRequest.Builder.from(Glide.with(this), song) - .checkIgnoreMediaStore(this) - .generatePalette(this) - .build() - .into(new RetroMusicColoredTarget(findViewById(R.id.image)) { - @Override - public void onColorReady(int color) { - if (PreferenceUtil.getInstance(LyricsActivity.this).getAdaptiveColor()) { - background.setBackgroundColor(color); - } - } - }); - selectLyricsTye(actionsLayout.getCheckedRadioButtonId()); - } - - private void showLyricsLocal(File file) { - if (file == null) { - lyricView.reset(); - lyricView.setVisibility(View.GONE); - } else { - lyricView.setVisibility(View.VISIBLE); - lyricView.setLyricFile(file, "UTF-8"); - } - } - - @OnClick({R.id.edit_lyrics}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.edit_lyrics: - switch (actionsLayout.getCheckedRadioButtonId()) { - case R.id.synced_lyrics: - showSyncedLyrics(); - break; - case R.id.normal_lyrics: - showLyricsSaveDialog(); - break; - } - break; - } - } - - @SuppressLint("StaticFieldLeak") - private void loadSongLyrics() { - if (updateLyricsAsyncTask != null) updateLyricsAsyncTask.cancel(false); - final Song song = MusicPlayerRemote.getCurrentSong(); - updateLyricsAsyncTask = new AsyncTask() { - @Override - protected Lyrics doInBackground(Void... params) { - String data = MusicUtil.getLyrics(song); - if (TextUtils.isEmpty(data)) { - return null; - } - return Lyrics.parse(song, data); + private void loadLrcFile() { + song = MusicPlayerRemote.getCurrentSong(); + songTitle.setText(song.title); + songText.setText(song.artistName); + SongGlideRequest.Builder.from(Glide.with(this), song) + .checkIgnoreMediaStore(this) + .generatePalette(this) + .build() + .into(new RetroMusicColoredTarget(findViewById(R.id.image)) { + @Override + public void onColorReady(int color) { + if (PreferenceUtil.getInstance(LyricsActivity.this).getAdaptiveColor()) { + background.setBackgroundColor(color); } + } + }); + selectLyricsTye(actionsLayout.getCheckedRadioButtonId()); + } - @Override - protected void onPreExecute() { - super.onPreExecute(); - lyrics = null; - } + private void showLyricsLocal(File file) { - @Override - protected void onPostExecute(Lyrics l) { - lyrics = l; - offlineLyrics.setVisibility(View.VISIBLE); - if (l == null) { - offlineLyrics.setText(R.string.no_lyrics_found); - return; - } - offlineLyrics.setText(l.data); - } + } - @Override - protected void onCancelled(Lyrics s) { - onPostExecute(null); - } - }.execute(); - } - - private void showSyncedLyrics() { - String content = ""; - try { - content = LyricUtil.getStringFromFile(song.title, song.artistName); - } catch (Exception e) { - e.printStackTrace(); + @OnClick({R.id.edit_lyrics}) + public void onViewClicked(View view) { + switch (view.getId()) { + case R.id.edit_lyrics: + switch (actionsLayout.getCheckedRadioButtonId()) { + case R.id.synced_lyrics: + showSyncedLyrics(); + break; + case R.id.normal_lyrics: + showLyricsSaveDialog(); + break; } - new MaterialDialog.Builder(this) - .title("Add lyrics") - .neutralText("Search") - .content("Add time frame lyrics") - .negativeText("Delete") - .onNegative((dialog, which) -> { - LyricUtil.deleteLrcFile(song.title, song.artistName); - loadLrcFile(); - }) - .onNeutral((dialog, which) -> RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchLrcUrl())) - .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE) - .input("Paste lyrics here", content, (dialog, input) -> { - LyricUtil.writeLrcToLoc(song.title, song.artistName, input.toString()); - loadLrcFile(); - }).show(); + break; } + } - private String getGoogleSearchLrcUrl() { - String baseUrl = "http://www.google.com/search?"; - String query = song.title + "+" + song.artistName; - query = "q=" + query.replace(" ", "+") + " .lrc"; - baseUrl += query; - return baseUrl; + @SuppressLint("StaticFieldLeak") + private void loadSongLyrics() { + if (updateLyricsAsyncTask != null) { + updateLyricsAsyncTask.cancel(false); } - - private void showLyricsSaveDialog() { - String content = ""; - if (lyrics == null) { - content = ""; - } else { - content = lyrics.data; + final Song song = MusicPlayerRemote.getCurrentSong(); + updateLyricsAsyncTask = new AsyncTask() { + @Override + protected Lyrics doInBackground(Void... params) { + String data = MusicUtil.getLyrics(song); + if (TextUtils.isEmpty(data)) { + return null; } - new MaterialDialog.Builder(this) - .title("Add lyrics") - .neutralText("Search") - .onNeutral(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchUrl(song.title, song.artistName)); - } - }) - .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE) - .input("Paste lyrics here", content, (dialog, input) -> { - Map fieldKeyValueMap = new EnumMap<>(FieldKey.class); - fieldKeyValueMap.put(FieldKey.LYRICS, input.toString()); + return Lyrics.parse(song, data); + } - new WriteTagsAsyncTask(LyricsActivity.this) - .execute(new WriteTagsAsyncTask.LoadingInfo(getSongPaths(song), fieldKeyValueMap, null)); - loadLrcFile(); - }) - .show(); - } + @Override + protected void onPreExecute() { + super.onPreExecute(); + lyrics = null; + } - private ArrayList getSongPaths(Song song) { - ArrayList paths = new ArrayList<>(1); - paths.add(song.data); - return paths; - } - - private String getGoogleSearchUrl(String title, String text) { - String baseUrl = "http://www.google.com/search?"; - String query = title + "+" + text; - query = "q=" + query.replace(" ", "+") + " lyrics"; - baseUrl += query; - return baseUrl; - } - - /* - private void loadLyricsWIki(String title, String artist) { - offlineLyrics.setVisibility(View.GONE); - if (lyricsWikiTask != null) { - lyricsWikiTask.cancel(false); + @Override + protected void onPostExecute(Lyrics l) { + lyrics = l; + offlineLyrics.setVisibility(View.VISIBLE); + if (l == null) { + offlineLyrics.setText(R.string.no_lyrics_found); + return; } - lyricsWikiTask = new ParseLyrics(new ParseLyrics.LyricsCallback() { - @Override - public void onShowLyrics(String lyrics) { - offlineLyrics.setVisibility(View.VISIBLE); - offlineLyrics.setText(lyrics); - } + offlineLyrics.setText(l.data); + } - @Override - public void onError() { - loadSongLyrics(); - } - }).execute(title, artist); - } + @Override + protected void onCancelled(Lyrics s) { + onPostExecute(null); + } + }.execute(); + } - private void callAgain(final String title, final String artist) { - disposable.clear(); - disposable.add(loadLyrics.downloadLrcFile(title, artist, MusicPlayerRemote.getSongDurationMillis()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .doOnSubscribe(disposable -> { - refresh.startAnimation(rotateAnimation); - }) - .subscribe(this::showLyricsLocal, throwable -> { - refresh.clearAnimation(); - showLyricsLocal(null); - //loadLyricsWIki(songTitle, artist); - toggleSyncLyrics(View.GONE); - }, () -> { - refresh.clearAnimation(); - Toast.makeText(this, "Lyrics downloaded", Toast.LENGTH_SHORT).show(); - })); + private void showSyncedLyrics() { + String content = ""; + try { + content = LyricUtil.getStringFromFile(song.title, song.artistName); + } catch (Exception e) { + e.printStackTrace(); } -*/ + new MaterialDialog.Builder(this) + .title("Add lyrics") + .neutralText("Search") + .content("Add time frame lyrics") + .negativeText("Delete") + .onNegative((dialog, which) -> { + LyricUtil.deleteLrcFile(song.title, song.artistName); + loadLrcFile(); + }) + .onNeutral( + (dialog, which) -> RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchLrcUrl())) + .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE) + .input("Paste lyrics here", content, (dialog, input) -> { + LyricUtil.writeLrcToLoc(song.title, song.artistName, input.toString()); + loadLrcFile(); + }).show(); + } + + private String getGoogleSearchLrcUrl() { + String baseUrl = "http://www.google.com/search?"; + String query = song.title + "+" + song.artistName; + query = "q=" + query.replace(" ", "+") + " .lrc"; + baseUrl += query; + return baseUrl; + } + + private void showLyricsSaveDialog() { + String content = ""; + if (lyrics == null) { + content = ""; + } else { + content = lyrics.data; + } + new MaterialDialog.Builder(this) + .title("Add lyrics") + .neutralText("Search") + .onNeutral(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + RetroUtil.openUrl(LyricsActivity.this, getGoogleSearchUrl(song.title, song.artistName)); + } + }) + .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE) + .input("Paste lyrics here", content, (dialog, input) -> { + Map fieldKeyValueMap = new EnumMap<>(FieldKey.class); + fieldKeyValueMap.put(FieldKey.LYRICS, input.toString()); + + new WriteTagsAsyncTask(LyricsActivity.this) + .execute( + new WriteTagsAsyncTask.LoadingInfo(getSongPaths(song), fieldKeyValueMap, null)); + loadLrcFile(); + }) + .show(); + } + + private ArrayList getSongPaths(Song song) { + ArrayList paths = new ArrayList<>(1); + paths.add(song.data); + return paths; + } + + private String getGoogleSearchUrl(String title, String text) { + String baseUrl = "http://www.google.com/search?"; + String query = title + "+" + text; + query = "q=" + query.replace(" ", "+") + " lyrics"; + baseUrl += query; + return baseUrl; + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/views/LyricView.java b/app/src/main/java/code/name/monkey/retromusic/views/LyricView.java deleted file mode 100644 index 0f9660d34..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/views/LyricView.java +++ /dev/null @@ -1,876 +0,0 @@ -package code.name.monkey.retromusic.views; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.Rect; -import android.graphics.Typeface; -import android.os.Looper; -import android.support.annotation.IntDef; -import android.text.Layout; -import android.text.StaticLayout; -import android.text.TextPaint; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.LinearInterpolator; - -import org.mozilla.universalchardet.UniversalDetector; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import code.name.monkey.retromusic.R; - -/** - * Created by zhengken.me on 2016/11/27. - * ClassName : LyricView - * Description : - */ -public class LyricView extends View { - - public static final int LEFT = 0; - public static final int CENTER = 1; - public static final int RIGHT = 2; - private static final String TAG = "LyricView"; - private static final float SLIDE_COEFFICIENT = 0.2f; - - private static final int UNITS_SECOND = 1000; - private static final int UNITS_MILLISECOND = 1; - - private static final int FLING_ANIMATOR_DURATION = 500 * UNITS_MILLISECOND; - - private static final int THRESHOLD_Y_VELOCITY = 1600; - - private static final int INDICATOR_ICON_PLAY_MARGIN_LEFT = 7;//dp - private static final int INDICATOR_ICON_PLAY_WIDTH = 15;//sp - private static final int INDICATOR_LINE_MARGIN = 10;//dp - private static final int INDICATOR_TIME_TEXT_SIZE = 10;//sp - private static final int INDICATOR_TIME_MARGIN_RIGHT = 7;//dp - - private static final int DEFAULT_TEXT_SIZE = 16;//sp - private static final int DEFAULT_MAX_LENGTH = 300;//dp - private static final int DEFAULT_LINE_SPACE = 25;//dp - - private int mHintColor; - private int mDefaultColor; - private int mHighLightColor; - private int mTextAlign; - - - private int mLineCount; - private int mTextSize; - private float mLineHeight; - private LyricInfo mLyricInfo; - private String mDefaultHint; - private int mMaxLength; - - private TextPaint mTextPaint; - private Paint mBtnPlayPaint; - private Paint mLinePaint; - private Paint mTimerPaint; - - private boolean mFling = false; - private ValueAnimator mFlingAnimator; - private float mScrollY = 0; - private float mLineSpace = 0; - private boolean mIsShade; - private float mShaderWidth = 0; - private int mCurrentPlayLine = 0; - private boolean mShowIndicator; - - private VelocityTracker mVelocityTracker; - private float mVelocity = 0; - private float mDownX; - private float mDownY; - private float mLastScrollY; - private boolean mUserTouch = false; - Runnable hideIndicator = () -> { - setUserTouch(false); - invalidateView(); - }; - private int maxVelocity; - private int mLineNumberUnderIndicator = 0; - private Rect mBtnPlayRect = new Rect(); - private Rect mTimerRect; - private String mDefaultTime = "00:00"; - private int mLineColor = Color.parseColor("#EFEFEF"); - private int mBtnColor = Color.parseColor("#EFEFEF"); - private List mLineFeedRecord = new ArrayList<>(); - private boolean mEnableLineFeed = false; - private int mExtraHeight = 0; - private int mTextHeight; - private String mCurrentLyricFilePath = null; - private OnPlayerClickListener mClickListener; - - public LyricView(Context context) { - super(context); - initMyView(context); - } - - public LyricView(Context context, AttributeSet attributeSet) { - super(context, attributeSet); - getAttrs(context, attributeSet); - initMyView(context); - - } - - public LyricView(Context context, AttributeSet attributeSet, int i) { - super(context, attributeSet, i); - getAttrs(context, attributeSet); - initMyView(context); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - return super.dispatchTouchEvent(event); - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - - if (mVelocityTracker == null) { - mVelocityTracker = VelocityTracker.obtain(); - } - mVelocityTracker.addMovement(event); - switch (event.getAction()) { - case MotionEvent.ACTION_CANCEL: - actionCancel(event); - break; - case MotionEvent.ACTION_DOWN: - actionDown(event); - break; - case MotionEvent.ACTION_MOVE: - actionMove(event); - break; - case MotionEvent.ACTION_UP: - actionUp(event); - break; - default: - break; - } - invalidateView(); - return true; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - mBtnPlayRect.set((int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_ICON_PLAY_MARGIN_LEFT), - (int) (getHeight() * 0.5f - getRawSize(TypedValue.COMPLEX_UNIT_SP, INDICATOR_ICON_PLAY_WIDTH) * 0.5f), - (int) (getRawSize(TypedValue.COMPLEX_UNIT_SP, INDICATOR_ICON_PLAY_WIDTH) + getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_ICON_PLAY_MARGIN_LEFT)), - (int) (getHeight() * 0.5f + getRawSize(TypedValue.COMPLEX_UNIT_SP, INDICATOR_ICON_PLAY_WIDTH) * 0.5f)); - mShaderWidth = getWidth() * 0.4f; - } - - @Override - protected void onDraw(Canvas canvas) { - if (scrollable()) { - if (mShowIndicator) { - drawIndicator(canvas); - } - - for (int i = 0; i < mLineCount; i++) { - float x = 0; - switch (mTextAlign) { - case LEFT: - x = INDICATOR_ICON_PLAY_MARGIN_LEFT + INDICATOR_LINE_MARGIN + mBtnPlayRect.width(); - break; - case CENTER: - x = getWidth() * 0.5f; - break; - case RIGHT: - x = getWidth() - INDICATOR_LINE_MARGIN * 2 - mTimerRect.width() - INDICATOR_ICON_PLAY_MARGIN_LEFT; - break; - } - - float y; - if (mEnableLineFeed && i > 0) { - y = getMeasuredHeight() * 0.5f + i * mLineHeight - mScrollY + mLineFeedRecord.get(i - 1); - } else { - y = getMeasuredHeight() * 0.5f + i * mLineHeight - mScrollY; - } - -// float y = getHeight() * 0.5f + i * mLineHeight - mScrollY; - if (y < 0) { - continue; - } - if (y > getHeight()) { - break; - } - if (i == mCurrentPlayLine - 1) { - mTextPaint.setColor(mHighLightColor); - } else if (i == mLineNumberUnderIndicator && mShowIndicator) { - mTextPaint.setColor(Color.LTGRAY); - } else { - mTextPaint.setColor(mDefaultColor); - } - if (mIsShade && (y > getHeight() - mShaderWidth || y < mShaderWidth)) { - if (y < mShaderWidth) { - mTextPaint.setAlpha(26 + (int) (23000.0f * y / mShaderWidth * 0.01f)); - } else { - mTextPaint.setAlpha(26 + (int) (23000.0f * (getHeight() - y) / mShaderWidth * 0.01f)); - } - } else { - mTextPaint.setAlpha(255); - } - - if (mEnableLineFeed) { - StaticLayout staticLayout = new StaticLayout(mLyricInfo.songLines.get(i).content, mTextPaint, - mMaxLength, - Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - canvas.save(); - canvas.translate(x, y); - staticLayout.draw(canvas); - canvas.restore(); - } else { - canvas.drawText(mLyricInfo.songLines.get(i).content, x, y, mTextPaint); - } - } - } else { - mTextPaint.setColor(mHintColor); - canvas.drawText(mDefaultHint, getMeasuredWidth() / 2, getMeasuredHeight() / 2, mTextPaint); - } - } - - private void getAttrs(Context context, AttributeSet attrs) { - TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LyricView); - mIsShade = ta.getBoolean(R.styleable.LyricView_fadeInFadeOut, false); - mDefaultHint = ta.getString(R.styleable.LyricView_hint) != null - ? ta.getString(R.styleable.LyricView_hint) - : getResources().getString(R.string.default_hint); - mHintColor = ta.getColor(R.styleable.LyricView_hintColor, Color.parseColor("#FFFFFF")); - mDefaultColor = ta.getColor(R.styleable.LyricView_textColor, Color.parseColor("#8D8D8D")); - mHighLightColor = ta.getColor(R.styleable.LyricView_highlightColor, Color.parseColor("#FFFFFF")); - mTextSize = ta.getDimensionPixelSize(R.styleable.LyricView_textSize, (int) getRawSize(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXT_SIZE)); - mTextAlign = ta.getInt(R.styleable.LyricView_textAlign, CENTER); - mMaxLength = ta.getDimensionPixelSize(R.styleable.LyricView_maxLength, (int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_MAX_LENGTH)); - mLineSpace = ta.getDimensionPixelSize(R.styleable.LyricView_lineSpace, (int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_LINE_SPACE)); - ta.recycle(); - } - - public void setShade(boolean shade) { - mIsShade = shade; - invalidateView(); - } - - public void setHintColor(int hintColor) { - mHintColor = hintColor; - invalidateView(); - } - - public void setDefaultColor(int defaultColor) { - mDefaultColor = defaultColor; - invalidateView(); - } - - public void setHighLightColor(int highLightColor) { - mHighLightColor = highLightColor; - invalidateView(); - } - - public void setTextAlign(int textAlign) { - mTextAlign = textAlign; - invalidateView(); - } - - public void setLineCount(int lineCount) { - mLineCount = lineCount; - invalidateView(); - } - - public void setTextSize(int textSize) { - mTextSize = textSize; - invalidateView(); - } - - public void setDefaultHint(String defaultHint) { - mDefaultHint = defaultHint; - invalidateView(); - } - - public void setMaxLength(int maxLength) { - mMaxLength = maxLength; - invalidateView(); - } - - public void setOnPlayerClickListener(OnPlayerClickListener mClickListener) { - this.mClickListener = mClickListener; - } - - public void setAlignment(@Alignment int alignment) { - mTextAlign = alignment; - } - - public void setCurrentTimeMillis(long current) { - scrollToCurrentTimeMillis(current); - } - - public void setLyricFile(File file) { - - if (file == null || !file.exists()) { - reset(); - mCurrentLyricFilePath = ""; - return; - } else if (file.getPath().equals(mCurrentLyricFilePath)) { - return; - } else { - mCurrentLyricFilePath = file.getPath(); - reset(); - } - try { - - FileInputStream fis = new FileInputStream(file); - byte[] buf = new byte[1024]; - UniversalDetector detector = new UniversalDetector(null); - int nread; - while ((nread = fis.read(buf)) > 0 && !detector.isDone()) { - detector.handleData(buf, 0, nread); - } - - detector.dataEnd(); - String encoding = detector.getDetectedCharset(); - if (encoding != null) { - setLyricFile(file, encoding); - } else { - setLyricFile(file, "UTF-8"); - } - detector.reset(); - fis.close(); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - public void setLyricFile(File file, String charsetName) { - if (file != null && file.exists()) { - try { - setupLyricResource(new FileInputStream(file), charsetName); - - for (int i = 0; i < mLyricInfo.songLines.size(); i++) { - - StaticLayout staticLayout = new StaticLayout(mLyricInfo.songLines.get(i).content, mTextPaint, - (int) getRawSize(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_MAX_LENGTH), - Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - - if (staticLayout.getLineCount() > 1) { - mEnableLineFeed = true; - mExtraHeight = mExtraHeight + (staticLayout.getLineCount() - 1) * mTextHeight; - } - - mLineFeedRecord.add(i, mExtraHeight); - - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } else { - invalidateView(); - } - } - - private void setLineSpace(float lineSpace) { - if (mLineSpace != lineSpace) { - mLineSpace = getRawSize(TypedValue.COMPLEX_UNIT_DIP, lineSpace); - measureLineHeight(); - mScrollY = measureCurrentScrollY(mCurrentPlayLine); - invalidateView(); - } - } - - public void reset() { - resetView(); - } - - private void actionCancel(MotionEvent event) { - releaseVelocityTracker(); - } - - private void actionDown(MotionEvent event) { - removeCallbacks(hideIndicator); - mLastScrollY = mScrollY; - mDownX = event.getX(); - mDownY = event.getY(); - if (mFlingAnimator != null) { - mFlingAnimator.cancel(); - mFlingAnimator = null; - } - setUserTouch(true); - } - - private boolean overScrolled() { - - return scrollable() && (mScrollY > mLineHeight * (mLineCount - 1) + mLineFeedRecord.get(mLineCount - 1) + (mEnableLineFeed ? mTextHeight : 0) || mScrollY < 0); - } - - private void actionMove(MotionEvent event) { - if (scrollable()) { - final VelocityTracker tracker = mVelocityTracker; - tracker.computeCurrentVelocity(UNITS_SECOND, maxVelocity); - mScrollY = mLastScrollY + mDownY - event.getY(); - mVelocity = tracker.getYVelocity(); - measureCurrentLine(); - } - } - - private void actionUp(MotionEvent event) { - - postDelayed(hideIndicator, 3 * UNITS_SECOND); - - releaseVelocityTracker(); - - if (scrollable()) { - if (overScrolled() && mScrollY < 0) { - smoothScrollTo(0); - return; - } - if (overScrolled() && mScrollY > mLineHeight * (mLineCount - 1) + mLineFeedRecord.get(mLineCount - 1) + (mEnableLineFeed ? mTextHeight : 0)) { - smoothScrollTo(mLineHeight * (mLineCount - 1) + mLineFeedRecord.get(mLineCount - 1) + (mEnableLineFeed ? mTextHeight : 0)); - return; - } - if (Math.abs(mVelocity) > THRESHOLD_Y_VELOCITY) { - doFlingAnimator(mVelocity); - return; - } - if (mShowIndicator && clickPlayer(event)) { - if (mLineNumberUnderIndicator != mCurrentPlayLine) { - mShowIndicator = false; - if (mClickListener != null) { - setUserTouch(false); - mClickListener.onPlayerClicked(mLyricInfo.songLines.get(mLineNumberUnderIndicator).start, mLyricInfo.songLines.get(mLineNumberUnderIndicator).content); - } - } - } - } - } - - private String measureCurrentTime() { - DecimalFormat format = new DecimalFormat("00"); - if (mLyricInfo != null && mLineCount > 0 && mLineNumberUnderIndicator - 1 < mLineCount && mLineNumberUnderIndicator > 0) { - return format.format(mLyricInfo.songLines.get(mLineNumberUnderIndicator - 1).start / 1000 / 60) + ":" + format.format(mLyricInfo.songLines.get(mLineNumberUnderIndicator - 1).start / 1000 % 60); - } - if (mLyricInfo != null && mLineCount > 0 && (mLineNumberUnderIndicator - 1) >= mLineCount) { - return format.format(mLyricInfo.songLines.get(mLineCount - 1).start / 1000 / 60) + ":" + format.format(mLyricInfo.songLines.get(mLineCount - 1).start / 1000 % 60); - } - if (mLyricInfo != null && mLineCount > 0 && mLineNumberUnderIndicator - 1 <= 0) { - return format.format(mLyricInfo.songLines.get(0).start / 1000 / 60) + ":" + format.format(mLyricInfo.songLines.get(0).start / 1000 % 60); - } - return mDefaultTime; - } - - private void drawIndicator(Canvas canvas) { - - //绘制 播放 按钮 - Path pathPlay = new Path(); - float yCoordinate = mBtnPlayRect.left + (float) Math.sqrt(Math.pow(mBtnPlayRect.width(), 2) - Math.pow(mBtnPlayRect.width() * 0.5f, 2)); - float remainWidth = mBtnPlayRect.right - yCoordinate; - - pathPlay.moveTo(mBtnPlayRect.centerX() - mBtnPlayRect.width() * 0.5f, mBtnPlayRect.centerY() - mBtnPlayRect.height() * 0.5f); - pathPlay.lineTo(mBtnPlayRect.centerX() - mBtnPlayRect.width() * 0.5f, mBtnPlayRect.centerY() + mBtnPlayRect.height() * 0.5f); - pathPlay.lineTo(yCoordinate, mBtnPlayRect.centerY()); - pathPlay.lineTo(mBtnPlayRect.centerX() - mBtnPlayRect.width() * 0.5f, mBtnPlayRect.centerY() - mBtnPlayRect.height() * 0.5f); - - canvas.drawPath(pathPlay, mBtnPlayPaint); - - //绘制 分割线 - Path pathLine = new Path(); - pathLine.moveTo(mBtnPlayRect.right + getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_LINE_MARGIN) - remainWidth, getMeasuredHeight() * 0.5f); - pathLine.lineTo(getWidth() - mTimerRect.width() - getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_TIME_MARGIN_RIGHT) - getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_LINE_MARGIN), getHeight() * 0.5f); - canvas.drawPath(pathLine, mLinePaint); - - //绘制 时间 - canvas.drawText(measureCurrentTime(), getWidth() - getRawSize(TypedValue.COMPLEX_UNIT_DIP, INDICATOR_TIME_MARGIN_RIGHT), (getHeight() + mTimerRect.height()) * 0.5f, mTimerPaint); - } - - private boolean clickPlayer(MotionEvent event) { - if (mBtnPlayRect != null && mDownX > (mBtnPlayRect.left - INDICATOR_ICON_PLAY_MARGIN_LEFT) && mDownX < (mBtnPlayRect.right + INDICATOR_ICON_PLAY_MARGIN_LEFT) && mDownY > (mBtnPlayRect.top - INDICATOR_ICON_PLAY_MARGIN_LEFT) && mDownY < (mBtnPlayRect.bottom + INDICATOR_ICON_PLAY_MARGIN_LEFT)) { - float upX = event.getX(); - float upY = event.getY(); - return upX > (mBtnPlayRect.left - INDICATOR_ICON_PLAY_MARGIN_LEFT) && upX < (mBtnPlayRect.right + INDICATOR_ICON_PLAY_MARGIN_LEFT) && upY > (mBtnPlayRect.top - INDICATOR_ICON_PLAY_MARGIN_LEFT) && upY < (mBtnPlayRect.bottom + INDICATOR_ICON_PLAY_MARGIN_LEFT); - } - return false; - } - - private void doFlingAnimator(float velocity) { - - float distance = (velocity / Math.abs(velocity) * (Math.abs(velocity) * SLIDE_COEFFICIENT)); - float to = Math.min(Math.max(0, (mScrollY - distance)), (mLineCount - 1) * mLineHeight + mLineFeedRecord.get(mLineCount - 1) + (mEnableLineFeed ? mTextHeight : 0)); - - mFlingAnimator = ValueAnimator.ofFloat(mScrollY, to); - mFlingAnimator.addUpdateListener(animation -> { - mScrollY = (float) animation.getAnimatedValue(); - measureCurrentLine(); - invalidateView(); - }); - - mFlingAnimator.addListener(new AnimatorListenerAdapter() { - - @Override - public void onAnimationStart(Animator animation) { - super.onAnimationStart(animation); - mVelocity = 0; - mFling = true; - } - - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - mFling = false; - } - - @Override - public void onAnimationCancel(Animator animation) { - super.onAnimationCancel(animation); - } - }); - - mFlingAnimator.setDuration(FLING_ANIMATOR_DURATION); - mFlingAnimator.setInterpolator(new DecelerateInterpolator()); - mFlingAnimator.start(); - } - - private void setUserTouch(boolean isUserTouch) { - if (isUserTouch) { - mUserTouch = true; - mShowIndicator = true; - } else { - mUserTouch = false; - mShowIndicator = false; - } - } - - private void releaseVelocityTracker() { - if (mVelocityTracker != null) { - mVelocityTracker.clear(); - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - } - - private void initMyView(Context context) { - maxVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity(); - initPaint(); - initAllBounds(); - } - - private void initAllBounds() { - setRawTextSize(mTextSize); - - setLineSpace(mLineSpace); - measureLineHeight(); - - mTimerRect = new Rect(); - mTimerPaint.getTextBounds(mDefaultTime, 0, mDefaultTime.length(), mTimerRect); - - - } - - private void initPaint() { - mTextPaint = new TextPaint(); - mTextPaint.setDither(true); - mTextPaint.setAntiAlias(true); - Typeface typeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/circular_std_book.otf"); - mTextPaint.setTypeface(typeface); - - switch (mTextAlign) { - case LEFT: - mTextPaint.setTextAlign(Paint.Align.LEFT); - break; - case CENTER: - mTextPaint.setTextAlign(Paint.Align.CENTER); - break; - case RIGHT: - mTextPaint.setTextAlign(Paint.Align.RIGHT); - break; - } - - mBtnPlayPaint = new Paint(); - mBtnPlayPaint.setDither(true); - mBtnPlayPaint.setAntiAlias(true); - mBtnPlayPaint.setColor(mBtnColor); - mBtnPlayPaint.setStyle(Paint.Style.FILL_AND_STROKE); - mBtnPlayPaint.setAlpha(128); - - mLinePaint = new Paint(); - mLinePaint.setDither(true); - mLinePaint.setAntiAlias(true); - mLinePaint.setColor(mLineColor); - mLinePaint.setAlpha(64); - mLinePaint.setStrokeWidth(1.0f); - mLinePaint.setStyle(Paint.Style.STROKE); - - mTimerPaint = new Paint(); - mTimerPaint.setDither(true); - mTimerPaint.setAntiAlias(true); - mTimerPaint.setColor(Color.WHITE); - mTimerPaint.setTextAlign(Paint.Align.RIGHT); - mTimerPaint.setTextSize(getRawSize(TypedValue.COMPLEX_UNIT_SP, INDICATOR_TIME_TEXT_SIZE)); - - - } - - private float measureCurrentScrollY(int line) { - if (mEnableLineFeed && line > 1) { - return (line - 1) * mLineHeight + mLineFeedRecord.get(line - 1); - } - return (line - 1) * mLineHeight; - } - - private void invalidateView() { - if (Looper.getMainLooper() == Looper.myLooper()) { - // 当前线程是主UI线程,直接刷新。 - invalidate(); - } else { - // 当前线程是非UI线程,post刷新。 - postInvalidate(); - } - } - - private void measureLineHeight() { - Rect lineBound = new Rect(); - mTextPaint.getTextBounds(mDefaultHint, 0, mDefaultHint.length(), lineBound); - mTextHeight = lineBound.height(); - mLineHeight = mTextHeight + mLineSpace; - } - - /** - * To measure current showing line number based on the view's scroll Y - */ - private void measureCurrentLine() { - float baseScrollY = mScrollY + mLineHeight * 0.5f; - - if (mEnableLineFeed) { - for (int i = mLyricInfo.songLines.size(); i >= 0; i--) { - if (baseScrollY > measureCurrentScrollY(i) + mLineSpace * 0.2) { - mLineNumberUnderIndicator = i - 1; - break; - } - } - } else { - mLineNumberUnderIndicator = (int) (baseScrollY / mLineHeight); - } - - - } - - private void smoothScrollTo(float toY) { - final ValueAnimator animator = ValueAnimator.ofFloat(mScrollY, toY); - animator.addUpdateListener(valueAnimator -> { - mScrollY = (Float) valueAnimator.getAnimatedValue(); - invalidateView(); - }); - - animator.addListener(new Animator.AnimatorListener() { - @Override - public void onAnimationCancel(Animator animator) { - } - - @Override - public void onAnimationEnd(Animator animator) { - mFling = false; - measureCurrentLine(); - invalidateView(); - } - - @Override - public void onAnimationRepeat(Animator animator) { - } - - @Override - public void onAnimationStart(Animator animator) { - mFling = true; - } - }); - animator.setDuration(640); - animator.setInterpolator(new LinearInterpolator()); - - animator.start(); - } - - private boolean scrollable() { - return mLyricInfo != null && mLyricInfo.songLines != null && mLyricInfo.songLines.size() > 0; - } - - private void scrollToCurrentTimeMillis(long time) { - - int position = 0; - if (scrollable()) { - for (int i = 0, size = mLineCount; i < size; i++) { - LineInfo lineInfo = mLyricInfo.songLines.get(i); - if (lineInfo != null && lineInfo.start >= time) { - position = i; - break; - } - if (i == mLineCount - 1) { - position = mLineCount; - } - } - } - if (mCurrentPlayLine != position) { - mCurrentPlayLine = position; - if (!mFling && !mUserTouch) { - smoothScrollTo(measureCurrentScrollY(position)); - } - } - } - - private void setupLyricResource(InputStream inputStream, String charsetName) { - if (inputStream != null) { - try { - LyricInfo lyricInfo = new LyricInfo(); - lyricInfo.songLines = new ArrayList<>(); - InputStreamReader inputStreamReader = new InputStreamReader(inputStream, charsetName); - BufferedReader reader = new BufferedReader(inputStreamReader); - String line; - while ((line = reader.readLine()) != null) { - analyzeLyric(lyricInfo, line); - } - reader.close(); - inputStream.close(); - inputStreamReader.close(); - - mLyricInfo = lyricInfo; - mLineCount = mLyricInfo.songLines.size(); - invalidateView(); - } catch (IOException e) { - e.printStackTrace(); - } - } else { - invalidateView(); - } - } - - /** - * 逐行解析歌词内容 - */ - private void analyzeLyric(LyricInfo lyricInfo, String line) { - int index = line.lastIndexOf("]"); - if (line.startsWith("[offset:")) { - // time offset - lyricInfo.songOffset = Long.parseLong(line.substring(8, index).trim()); - return; - } - if (line.startsWith("[ti:")) { - // title - lyricInfo.songTitle = line.substring(4, index).trim(); - return; - } - if (line.startsWith("[ar:")) { - // artist - lyricInfo.songArtist = line.substring(4, index).trim(); - return; - } - if (line.startsWith("[al:")) { - // album - lyricInfo.songAlbum = line.substring(4, index).trim(); - return; - } - if (line.startsWith("[by:")) { - return; - } - if (index >= 9 && line.trim().length() > index + 1) { - // lyrics - LineInfo lineInfo = new LineInfo(); - lineInfo.content = line.substring(10, line.length()); - lineInfo.start = measureStartTimeMillis(line.substring(0, index)); - lyricInfo.songLines.add(lineInfo); - } - } - - /** - * 从字符串中获得时间值 - */ - private long measureStartTimeMillis(String str) { - long minute = Long.parseLong(str.substring(1, 3)); - long second = Long.parseLong(str.substring(4, 6)); - long millisecond = Long.parseLong(str.substring(7, 9)); - return millisecond + second * 1000 + minute * 60 * 1000; - } - - private void resetLyricInfo() { - if (mLyricInfo != null) { - if (mLyricInfo.songLines != null) { - mLyricInfo.songLines.clear(); - mLyricInfo.songLines = null; - } - mLyricInfo = null; - } - } - - private void resetView() { - mCurrentPlayLine = 0; - resetLyricInfo(); - invalidateView(); - mLineCount = 0; - mScrollY = 0; - mEnableLineFeed = false; - mLineFeedRecord.clear(); - mExtraHeight = 0; - } - - private float getRawSize(int unit, float size) { - Context context = getContext(); - Resources resources; - if (context == null) { - resources = Resources.getSystem(); - } else { - resources = context.getResources(); - } - return TypedValue.applyDimension(unit, size, resources.getDisplayMetrics()); - } - - private void setRawTextSize(float size) { - if (size != mTextPaint.getTextSize()) { - mTextPaint.setTextSize(size); - measureLineHeight(); - mScrollY = measureCurrentScrollY(mCurrentPlayLine); - invalidateView(); - } - } - - @IntDef({LEFT, CENTER, RIGHT}) - @Retention(RetentionPolicy.SOURCE) - public @interface Alignment { - } - - public interface OnPlayerClickListener { - void onPlayerClicked(long progress, String content); - } - - private class LyricInfo { - List songLines; - - String songArtist; - String songTitle; - String songAlbum; - - long songOffset; - } - - private class LineInfo { - String content; - long start; - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_lyrics.xml b/app/src/main/res/layout/activity_lyrics.xml index 379495837..fd456d26e 100644 --- a/app/src/main/res/layout/activity_lyrics.xml +++ b/app/src/main/res/layout/activity_lyrics.xml @@ -1,164 +1,151 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/root" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> - - - - - - - - - - - - - - - + + + + android:layout_weight="1" + android:orientation="horizontal"> - + - - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + android:padding="16dp"> - + + - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/values/lyric_view_attrs.xml b/app/src/main/res/values/lyric_view_attrs.xml deleted file mode 100644 index 012b18c72..000000000 --- a/app/src/main/res/values/lyric_view_attrs.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/appthemehelper/appthemehelper.iml b/appthemehelper/appthemehelper.iml index 3c26a9898..ad32e5241 100644 --- a/appthemehelper/appthemehelper.iml +++ b/appthemehelper/appthemehelper.iml @@ -50,13 +50,6 @@ - - - - - - - @@ -64,6 +57,13 @@ + + + + + + + @@ -87,13 +87,18 @@ + + + + +