diff --git a/.gradle/5.6.4/executionHistory/executionHistory.bin b/.gradle/5.6.4/executionHistory/executionHistory.bin new file mode 100644 index 0000000..7d86a59 Binary files /dev/null and b/.gradle/5.6.4/executionHistory/executionHistory.bin differ diff --git a/.gradle/5.6.4/executionHistory/executionHistory.lock b/.gradle/5.6.4/executionHistory/executionHistory.lock new file mode 100644 index 0000000..4b7b088 Binary files /dev/null and b/.gradle/5.6.4/executionHistory/executionHistory.lock differ diff --git a/.gradle/5.6.4/fileChanges/last-build.bin b/.gradle/5.6.4/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/.gradle/5.6.4/fileChanges/last-build.bin differ diff --git a/.gradle/5.6.4/fileContent/fileContent.lock b/.gradle/5.6.4/fileContent/fileContent.lock new file mode 100644 index 0000000..53c6799 Binary files /dev/null and b/.gradle/5.6.4/fileContent/fileContent.lock differ diff --git a/.gradle/5.6.4/fileHashes/fileHashes.bin b/.gradle/5.6.4/fileHashes/fileHashes.bin new file mode 100644 index 0000000..b5d18db Binary files /dev/null and b/.gradle/5.6.4/fileHashes/fileHashes.bin differ diff --git a/.gradle/5.6.4/fileHashes/fileHashes.lock b/.gradle/5.6.4/fileHashes/fileHashes.lock new file mode 100644 index 0000000..d28f9d8 Binary files /dev/null and b/.gradle/5.6.4/fileHashes/fileHashes.lock differ diff --git a/.gradle/5.6.4/fileHashes/resourceHashesCache.bin b/.gradle/5.6.4/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..46840d8 Binary files /dev/null and b/.gradle/5.6.4/fileHashes/resourceHashesCache.bin differ diff --git a/.gradle/5.6.4/gc.properties b/.gradle/5.6.4/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.gradle/5.6.4/javaCompile/classAnalysis.bin b/.gradle/5.6.4/javaCompile/classAnalysis.bin new file mode 100644 index 0000000..8b82671 Binary files /dev/null and b/.gradle/5.6.4/javaCompile/classAnalysis.bin differ diff --git a/.gradle/5.6.4/javaCompile/jarAnalysis.bin b/.gradle/5.6.4/javaCompile/jarAnalysis.bin new file mode 100644 index 0000000..2d596f8 Binary files /dev/null and b/.gradle/5.6.4/javaCompile/jarAnalysis.bin differ diff --git a/.gradle/5.6.4/javaCompile/javaCompile.lock b/.gradle/5.6.4/javaCompile/javaCompile.lock new file mode 100644 index 0000000..9a113bf Binary files /dev/null and b/.gradle/5.6.4/javaCompile/javaCompile.lock differ diff --git a/.gradle/5.6.4/javaCompile/taskHistory.bin b/.gradle/5.6.4/javaCompile/taskHistory.bin new file mode 100644 index 0000000..e71008f Binary files /dev/null and b/.gradle/5.6.4/javaCompile/taskHistory.bin differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..5db3246 Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..1686add --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Fri Oct 21 16:04:51 GMT+08:00 2022 +gradle.version=5.6.4 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..063ae6f Binary files /dev/null and b/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml new file mode 100644 index 0000000..2d010fa --- /dev/null +++ b/.idea/dbnavigator.xml @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ac0779d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..c996b87 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__D__A_TaxiApp_taxiApp26Debug_new_1_taxiapp_ktl__26_8debug__app_libs_xixun_card_settings_1_2_4_jar.xml b/.idea/libraries/Gradle__D__A_TaxiApp_taxiApp26Debug_new_1_taxiapp_ktl__26_8debug__app_libs_xixun_card_settings_1_2_4_jar.xml new file mode 100644 index 0000000..ce40adb --- /dev/null +++ b/.idea/libraries/Gradle__D__A_TaxiApp_taxiApp26Debug_new_1_taxiapp_ktl__26_8debug__app_libs_xixun_card_settings_1_2_4_jar.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml new file mode 100644 index 0000000..7c2ab08 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_activity_activity_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml b/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml new file mode 100644 index 0000000..87412e8 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_activity_activity_1_2_3_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml b/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml new file mode 100644 index 0000000..b2158ac --- /dev/null +++ b/.idea/libraries/Gradle__androidx_annotation_annotation_1_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml b/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml new file mode 100644 index 0000000..74437d7 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_annotation_annotation_1_2_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml new file mode 100644 index 0000000..25283a2 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_annotation_annotation_experimental_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml new file mode 100644 index 0000000..4488e12 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml new file mode 100644 index 0000000..06f4f71 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_1_3_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml new file mode 100644 index 0000000..3aa31e4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml new file mode 100644 index 0000000..a629c8e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_appcompat_appcompat_resources_1_3_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml b/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml new file mode 100644 index 0000000..2208415 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_arch_core_core_common_2_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml new file mode 100644 index 0000000..7ea0efb --- /dev/null +++ b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml new file mode 100644 index 0000000..a42f8cc --- /dev/null +++ b/.idea/libraries/Gradle__androidx_arch_core_core_runtime_2_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml new file mode 100644 index 0000000..d5ca524 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_cardview_cardview_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml b/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml new file mode 100644 index 0000000..eafc05e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_collection_collection_1_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_1_aar.xml b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_1_aar.xml new file mode 100644 index 0000000..7a2df36 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_2_0_1_aar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_1.xml b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_1.xml new file mode 100644 index 0000000..24d3804 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_constraintlayout_constraintlayout_solver_2_0_1.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml new file mode 100644 index 0000000..008eba3 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_coordinatorlayout_coordinatorlayout_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml b/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml new file mode 100644 index 0000000..817ac21 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_core_core_1_3_2_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml b/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml new file mode 100644 index 0000000..ec4d413 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_core_core_1_5_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml b/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml new file mode 100644 index 0000000..decddbe --- /dev/null +++ b/.idea/libraries/Gradle__androidx_core_core_ktx_1_3_2_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml new file mode 100644 index 0000000..e8dd337 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_cursoradapter_cursoradapter_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml new file mode 100644 index 0000000..abcc510 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_customview_customview_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml new file mode 100644 index 0000000..666fe5b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_documentfile_documentfile_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml new file mode 100644 index 0000000..ef3bd74 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_drawerlayout_drawerlayout_1_0_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml new file mode 100644 index 0000000..0a64342 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_dynamicanimation_dynamicanimation_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml new file mode 100644 index 0000000..3ddc352 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_fragment_fragment_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml b/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml new file mode 100644 index 0000000..3e8d164 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_fragment_fragment_1_3_4_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml new file mode 100644 index 0000000..97ebbe0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_interpolator_interpolator_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml new file mode 100644 index 0000000..cb73bb0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_legacy_legacy_support_core_utils_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml new file mode 100644 index 0000000..9354d44 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_1_0.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml new file mode 100644 index 0000000..a1e1912 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_common_2_3_1.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml new file mode 100644 index 0000000..f4b4806 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml new file mode 100644 index 0000000..9664f5b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml new file mode 100644 index 0000000..2ac0ee3 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml new file mode 100644 index 0000000..f0af239 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml new file mode 100644 index 0000000..db2b1d4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_core_ktx_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml new file mode 100644 index 0000000..f33d7ba --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_livedata_ktx_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_2_2_0_aar.xml new file mode 100644 index 0000000..25dbd71 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_ktx_2_2_0_aar.xml new file mode 100644 index 0000000..882c3fc --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_reactivestreams_ktx_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml new file mode 100644 index 0000000..5b3ff71 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml new file mode 100644 index 0000000..08b3a8d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml new file mode 100644 index 0000000..236000a --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_runtime_ktx_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml new file mode 100644 index 0000000..b6c983f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml new file mode 100644 index 0000000..f2e5155 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml new file mode 100644 index 0000000..8a865c5 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_ktx_2_2_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml new file mode 100644 index 0000000..8134aef --- /dev/null +++ b/.idea/libraries/Gradle__androidx_lifecycle_lifecycle_viewmodel_savedstate_2_3_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml new file mode 100644 index 0000000..6b79487 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_loader_loader_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml new file mode 100644 index 0000000..ece91b4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_localbroadcastmanager_localbroadcastmanager_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml new file mode 100644 index 0000000..3f6590c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_print_print_1_0_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml new file mode 100644 index 0000000..9d8d52e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_recyclerview_recyclerview_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_common_2_2_5.xml b/.idea/libraries/Gradle__androidx_room_room_common_2_2_5.xml new file mode 100644 index 0000000..a20b97e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_common_2_2_5.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_room_room_runtime_2_2_5_aar.xml b/.idea/libraries/Gradle__androidx_room_room_runtime_2_2_5_aar.xml new file mode 100644 index 0000000..6512739 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_room_room_runtime_2_2_5_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml new file mode 100644 index 0000000..cd46ce6 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml new file mode 100644 index 0000000..c825e2e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_savedstate_savedstate_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_0_1_aar.xml b/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_0_1_aar.xml new file mode 100644 index 0000000..4a9df9d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_sqlite_sqlite_2_0_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_0_1_aar.xml b/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_0_1_aar.xml new file mode 100644 index 0000000..e556688 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_sqlite_sqlite_framework_2_0_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml b/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml new file mode 100644 index 0000000..a6023b4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_core_1_2_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml new file mode 100644 index 0000000..2022e9a --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_core_1_4_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml new file mode 100644 index 0000000..aee91a4 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_2_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml new file mode 100644 index 0000000..2f244c0 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_core_3_4_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml new file mode 100644 index 0000000..e56a04d --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_2_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml new file mode 100644 index 0000000..eff1647 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_espresso_espresso_idling_resource_3_4_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml new file mode 100644 index 0000000..47efe3f --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_1_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml new file mode 100644 index 0000000..dafd0bd --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_ext_junit_1_1_3_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml b/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml new file mode 100644 index 0000000..b6f1703 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_monitor_1_2_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml new file mode 100644 index 0000000..1031de7 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_monitor_1_4_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml b/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml new file mode 100644 index 0000000..512d7e8 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_runner_1_2_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml new file mode 100644 index 0000000..c19e72c --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_runner_1_4_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml b/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml new file mode 100644 index 0000000..56b2bfd --- /dev/null +++ b/.idea/libraries/Gradle__androidx_test_services_storage_1_4_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml b/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml new file mode 100644 index 0000000..e12eb5a --- /dev/null +++ b/.idea/libraries/Gradle__androidx_transition_transition_1_2_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml new file mode 100644 index 0000000..dd02ec8 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml new file mode 100644 index 0000000..98d9ca1 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_vectordrawable_vectordrawable_animated_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml new file mode 100644 index 0000000..9cb307e --- /dev/null +++ b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml new file mode 100644 index 0000000..e99155b --- /dev/null +++ b/.idea/libraries/Gradle__androidx_versionedparcelable_versionedparcelable_1_1_1_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml new file mode 100644 index 0000000..c758de5 --- /dev/null +++ b/.idea/libraries/Gradle__androidx_viewpager2_viewpager2_1_0_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml new file mode 100644 index 0000000..d869eeb --- /dev/null +++ b/.idea/libraries/Gradle__androidx_viewpager_viewpager_1_0_0_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_alibaba_fastjson_1_2_46.xml b/.idea/libraries/Gradle__com_alibaba_fastjson_1_2_46.xml new file mode 100644 index 0000000..819a55f --- /dev/null +++ b/.idea/libraries/Gradle__com_alibaba_fastjson_1_2_46.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_1_0_6_aar.xml b/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_1_0_6_aar.xml new file mode 100644 index 0000000..6d9cc34 --- /dev/null +++ b/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_1_0_6_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_base_1_0_6_aar.xml b/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_base_1_0_6_aar.xml new file mode 100644 index 0000000..271ee11 --- /dev/null +++ b/.idea/libraries/Gradle__com_amitshekhar_android_debug_db_base_1_0_6_aar.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_facebook_stetho_stetho_1_5_1_aar.xml b/.idea/libraries/Gradle__com_facebook_stetho_stetho_1_5_1_aar.xml new file mode 100644 index 0000000..44ee6c2 --- /dev/null +++ b/.idea/libraries/Gradle__com_facebook_stetho_stetho_1_5_1_aar.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_10_0.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_10_0.xml new file mode 100644 index 0000000..af7cba6 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_annotations_4_10_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_10_0.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_10_0.xml new file mode 100644 index 0000000..80b664c --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_disklrucache_4_10_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_10_0_aar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_10_0_aar.xml new file mode 100644 index 0000000..89edd76 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_gifdecoder_4_10_0_aar.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_10_0_aar.xml b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_10_0_aar.xml new file mode 100644 index 0000000..027fb43 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_bumptech_glide_glide_4_10_0_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_joeyupdo_YJTools_v1_0_5_aar.xml b/.idea/libraries/Gradle__com_github_joeyupdo_YJTools_v1_0_5_aar.xml new file mode 100644 index 0000000..7e9ddb3 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_joeyupdo_YJTools_v1_0_5_aar.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_xy02_ARxLib_0_1_5_aar.xml b/.idea/libraries/Gradle__com_github_xy02_ARxLib_0_1_5_aar.xml new file mode 100644 index 0000000..bd240a0 --- /dev/null +++ b/.idea/libraries/Gradle__com_github_xy02_ARxLib_0_1_5_aar.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_yuweiguocn_GreenDaoUpgradeHelper_v2_2_1_aar.xml b/.idea/libraries/Gradle__com_github_yuweiguocn_GreenDaoUpgradeHelper_v2_2_1_aar.xml new file mode 100644 index 0000000..196039b --- /dev/null +++ b/.idea/libraries/Gradle__com_github_yuweiguocn_GreenDaoUpgradeHelper_v2_2_1_aar.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml b/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml new file mode 100644 index 0000000..eb53151 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_android_material_material_1_1_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml b/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml new file mode 100644 index 0000000..a425a34 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_android_material_material_1_4_0_aar.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml new file mode 100644 index 0000000..2b834ea --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_findbugs_jsr305_2_0_1.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_5.xml b/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_5.xml new file mode 100644 index 0000000..c679021 --- /dev/null +++ b/.idea/libraries/Gradle__com_google_code_gson_gson_2_8_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_liulishuo_filedownloader_library_1_7_5_aar.xml b/.idea/libraries/Gradle__com_liulishuo_filedownloader_library_1_7_5_aar.xml new file mode 100644 index 0000000..95adfe9 --- /dev/null +++ b/.idea/libraries/Gradle__com_liulishuo_filedownloader_library_1_7_5_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_orhanobut_logger_2_2_0_aar.xml b/.idea/libraries/Gradle__com_orhanobut_logger_2_2_0_aar.xml new file mode 100644 index 0000000..0f5222e --- /dev/null +++ b/.idea/libraries/Gradle__com_orhanobut_logger_2_2_0_aar.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_permissionx_guolindev_permissionx_1_1_1_aar.xml b/.idea/libraries/Gradle__com_permissionx_guolindev_permissionx_1_1_1_aar.xml new file mode 100644 index 0000000..75562d4 --- /dev/null +++ b/.idea/libraries/Gradle__com_permissionx_guolindev_permissionx_1_1_1_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml b/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml new file mode 100644 index 0000000..662b001 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_javawriter_2_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_3_1.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_3_1.xml new file mode 100644 index 0000000..75d6a1e --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_logging_interceptor_4_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_1_0.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_1_0.xml new file mode 100644 index 0000000..d792aab --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_3_1.xml b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_3_1.xml new file mode 100644 index 0000000..4c65c84 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okhttp3_okhttp_4_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okio_okio_2_3_0.xml b/.idea/libraries/Gradle__com_squareup_okio_okio_2_3_0.xml new file mode 100644 index 0000000..7ed4348 --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okio_okio_2_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_okio_okio_2_4_1.xml b/.idea/libraries/Gradle__com_squareup_okio_okio_2_4_1.xml new file mode 100644 index 0000000..f67c11b --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_okio_okio_2_4_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_7_1.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_7_1.xml new file mode 100644 index 0000000..16452ab --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_adapter_rxjava2_2_7_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_7_1.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_7_1.xml new file mode 100644 index 0000000..23b2faa --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_gson_2_7_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_converter_scalars_2_7_1.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_scalars_2_7_1.xml new file mode 100644 index 0000000..facdcbf --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_converter_scalars_2_7_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_7_1.xml b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_7_1.xml new file mode 100644 index 0000000..9d8b84f --- /dev/null +++ b/.idea/libraries/Gradle__com_squareup_retrofit2_retrofit_2_7_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_cli_commons_cli_1_2.xml b/.idea/libraries/Gradle__commons_cli_commons_cli_1_2.xml new file mode 100644 index 0000000..2e557f1 --- /dev/null +++ b/.idea/libraries/Gradle__commons_cli_commons_cli_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_1_1_aar.xml b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_1_1_aar.xml new file mode 100644 index 0000000..4f51d3f --- /dev/null +++ b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxandroid_2_1_1_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_2_17.xml b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_2_17.xml new file mode 100644 index 0000000..8c2c539 --- /dev/null +++ b/.idea/libraries/Gradle__io_reactivex_rxjava2_rxjava_2_2_17.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml new file mode 100644 index 0000000..62012ea --- /dev/null +++ b/.idea/libraries/Gradle__javax_inject_javax_inject_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_12.xml b/.idea/libraries/Gradle__junit_junit_4_12.xml new file mode 100644 index 0000000..f7d27c4 --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_12.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__junit_junit_4_13_2.xml b/.idea/libraries/Gradle__junit_junit_4_13_2.xml new file mode 100644 index 0000000..198592d --- /dev/null +++ b/.idea/libraries/Gradle__junit_junit_4_13_2.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml b/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml new file mode 100644 index 0000000..fbe9697 --- /dev/null +++ b/.idea/libraries/Gradle__net_sf_kxml_kxml2_2_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__net_zetetic_android_database_sqlcipher_3_5_7_aar.xml b/.idea/libraries/Gradle__net_zetetic_android_database_sqlcipher_3_5_7_aar.xml new file mode 100644 index 0000000..0cabf77 --- /dev/null +++ b/.idea/libraries/Gradle__net_zetetic_android_database_sqlcipher_3_5_7_aar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_greenrobot_greendao_3_3_0.xml b/.idea/libraries/Gradle__org_greenrobot_greendao_3_3_0.xml new file mode 100644 index 0000000..8b99426 --- /dev/null +++ b/.idea/libraries/Gradle__org_greenrobot_greendao_3_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_greenrobot_greendao_api_3_3_0.xml b/.idea/libraries/Gradle__org_greenrobot_greendao_api_3_3_0.xml new file mode 100644 index 0000000..0592949 --- /dev/null +++ b/.idea/libraries/Gradle__org_greenrobot_greendao_api_3_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..09cf23d --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml new file mode 100644 index 0000000..1a77dd8 --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_integration_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml new file mode 100644 index 0000000..3d45e8e --- /dev/null +++ b/.idea/libraries/Gradle__org_hamcrest_hamcrest_library_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml b/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml new file mode 100644 index 0000000..1fa0fa9 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_annotations_13_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_61.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_61.xml new file mode 100644 index 0000000..3462c6f --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_61.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_71.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_71.xml new file mode 100644 index 0000000..a9a8b5e --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_android_extensions_runtime_1_3_71.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_reflect_1_3_61.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_reflect_1_3_61.xml new file mode 100644 index 0000000..3e92ca6 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_reflect_1_3_61.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_41.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_41.xml new file mode 100644 index 0000000..20c3d80 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_41.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_71.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_71.xml new file mode 100644 index 0000000..d281ded --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_1_3_71.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_41.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_41.xml new file mode 100644 index 0000000..f00e404 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_41.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_71.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_71.xml new file mode 100644 index 0000000..56639f4 --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_71.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_61.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_61.xml new file mode 100644 index 0000000..711122d --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_61.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_71.xml b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_71.xml new file mode 100644 index 0000000..0f8c8cd --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlin_kotlin_stdlib_jdk7_1_3_71.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml new file mode 100644 index 0000000..d2fd50f --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_android_1_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_0.xml b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_0.xml new file mode 100644 index 0000000..b7c548b --- /dev/null +++ b/.idea/libraries/Gradle__org_jetbrains_kotlinx_kotlinx_coroutines_core_1_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_3.xml b/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_3.xml new file mode 100644 index 0000000..2e05a80 --- /dev/null +++ b/.idea/libraries/Gradle__org_reactivestreams_reactive_streams_1_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..fd39319 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6f2514f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/taxiapp-ktl_(26_8debug).app.androidTest.iml b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.androidTest.iml new file mode 100644 index 0000000..ee1b743 --- /dev/null +++ b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.androidTest.iml @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cd6ee3eb3fc50696fc57eaf7fa81506a/jetified-xixun_card_settings_1.2.4.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/bff8f75db4bfb23ea8ad0045cda2a5f3/jetified-junit-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e0259eda880fbc008bd939b513f4fae7/espresso-core-3.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dc2331c16e0efac6eaa7bfabaa59c4ef/runner-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/73288eb0c21a43b54cd0b7ad8c497738/jetified-junit-4.12.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7572de4f97202338cea7115a363451e7/jetified-hamcrest-integration-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cbacc0420eb54d22b11c3ebe49cbfb9d/jetified-hamcrest-library-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c2aff52a3446202851bad44fbb8fd9c7/jetified-core-1.2.0-api.jar + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_library_classes/debug/classes.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f04b6481913b1f5d71d584021e858f13/jetified-stetho-1.5.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/010edc493b1efc47cf355a3d68aa505b/jetified-logger-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f3dbd4cd9d84196433da10e47c8b9d3c/jetified-GreenDaoUpgradeHelper-v2.2.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec781f3119334c7509522ff1bb966868/jetified-lifecycle-runtime-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/92fe512df5d2ebc82ff9bd9832b874f2/monitor-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/120238fa6ed7c650c37bd723e55cb919/jetified-glide-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c605afe14240d86ffdda7e97a0948ae1/jetified-gifdecoder-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/52f608662a75fc89303d1701f5ec50e0/jetified-lifecycle-reactivestreams-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4ca13cf63f4054293515af97111c4863/lifecycle-reactivestreams-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/798edd96275281c937a1982cd81c07a3/jetified-lifecycle-viewmodel-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cefff415e1fe00ea21396c57c7341a42/jetified-lifecycle-livedata-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f7739b7d4512687dbb5587f5b8a75519/jetified-lifecycle-livedata-core-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/09aa48e4d1bb4690ed61b17b12e36887/lifecycle-livedata-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8b13fed7b1eac935e93ecb88a8d7eba2/jetified-kxml2-2.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e50a3d78a9f997aab4708f4813c3fab/espresso-idling-resource-3.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebb7400b0bde94d40cbe29396025409/jetified-javawriter-2.1.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a7b199dd647d3bc718d4c7a2a53806a3/jetified-javax.inject-1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/47aa66be67ebced1e389bced7a130b8c/jetified-jsr305-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/50c4f3f9cb89c12875b3d8a37bce3ea8/jetified-kotlin-android-extensions-runtime-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eef10497c076c3e0224eef478dfacc95/jetified-kotlin-stdlib-jdk7-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/2e05a7c119c523ef3da3eca735692616/jetified-kotlin-reflect-1.3.61.jar + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_library_classes/debug/classes.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4328063df2e6d63759b65a77f467cfa5/jetified-kotlinx-coroutines-android-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7ff1574ed7393fe1b60add9cdd6db67e/jetified-kotlinx-coroutines-core-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/771ed26861001e83547f29ca57ea5600/jetified-commons-cli-1.2.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/07fb80bba96aa33515b769741cf9f530/jetified-debug-db-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ac5d0c2b21600f7e7564db308a676a66/jetified-debug-db-base-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5e0d53d793dac656ea782f084dc65c7f/jetified-fastjson-1.2.46.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/da8beefcea58e938669984ec77975c37/jetified-disklrucache-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/77f7b691d7df0d3e300f1f0f4f7b62fa/jetified-annotations-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3c55ae322327a81558aad151cba07105/jetified-ARxLib-0.1.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/34a29451ab55ddc2e04b4e6c3c44dffd/jetified-greendao-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/db4cc42c0975ae365c0a0cfe3f95c132/jetified-greendao-api-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9822764d1b6050859a78a0b3ec51c6dc/jetified-permissionx-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/020b480d2bde92043942aeb85ef94e0f/jetified-YJTools-v1.0.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cb9e9189a7eabc085ddffe7ef81268f3/jetified-android-database-sqlcipher-3.5.7-api.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../app/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../app/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../app/build/intermediates/app_classes/debug/classes.jar + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/taxiapp-ktl_(26_8debug).app.iml b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.iml new file mode 100644 index 0000000..1f39019 --- /dev/null +++ b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.iml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/taxiapp-ktl_(26_8debug).app.main.iml b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.main.iml new file mode 100644 index 0000000..293d76b --- /dev/null +++ b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.main.iml @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + $MODULE_DIR$/../../../app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cd6ee3eb3fc50696fc57eaf7fa81506a/jetified-xixun_card_settings_1.2.4.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/50c4f3f9cb89c12875b3d8a37bce3ea8/jetified-kotlin-android-extensions-runtime-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eef10497c076c3e0224eef478dfacc95/jetified-kotlin-stdlib-jdk7-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/2e05a7c119c523ef3da3eca735692616/jetified-kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cefff415e1fe00ea21396c57c7341a42/jetified-lifecycle-livedata-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f7739b7d4512687dbb5587f5b8a75519/jetified-lifecycle-livedata-core-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/52f608662a75fc89303d1701f5ec50e0/jetified-lifecycle-reactivestreams-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec781f3119334c7509522ff1bb966868/jetified-lifecycle-runtime-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/798edd96275281c937a1982cd81c07a3/jetified-lifecycle-viewmodel-ktx-2.2.0-api.jar + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_library_classes/debug/classes.jar + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_library_classes/debug/classes.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4328063df2e6d63759b65a77f467cfa5/jetified-kotlinx-coroutines-android-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7ff1574ed7393fe1b60add9cdd6db67e/jetified-kotlinx-coroutines-core-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f04b6481913b1f5d71d584021e858f13/jetified-stetho-1.5.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/010edc493b1efc47cf355a3d68aa505b/jetified-logger-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f3dbd4cd9d84196433da10e47c8b9d3c/jetified-GreenDaoUpgradeHelper-v2.2.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/120238fa6ed7c650c37bd723e55cb919/jetified-glide-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c605afe14240d86ffdda7e97a0948ae1/jetified-gifdecoder-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4ca13cf63f4054293515af97111c4863/lifecycle-reactivestreams-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/09aa48e4d1bb4690ed61b17b12e36887/lifecycle-livedata-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/771ed26861001e83547f29ca57ea5600/jetified-commons-cli-1.2.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/47aa66be67ebced1e389bced7a130b8c/jetified-jsr305-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/07fb80bba96aa33515b769741cf9f530/jetified-debug-db-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ac5d0c2b21600f7e7564db308a676a66/jetified-debug-db-base-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5e0d53d793dac656ea782f084dc65c7f/jetified-fastjson-1.2.46.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/da8beefcea58e938669984ec77975c37/jetified-disklrucache-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/77f7b691d7df0d3e300f1f0f4f7b62fa/jetified-annotations-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3c55ae322327a81558aad151cba07105/jetified-ARxLib-0.1.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/34a29451ab55ddc2e04b4e6c3c44dffd/jetified-greendao-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/db4cc42c0975ae365c0a0cfe3f95c132/jetified-greendao-api-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9822764d1b6050859a78a0b3ec51c6dc/jetified-permissionx-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/020b480d2bde92043942aeb85ef94e0f/jetified-YJTools-v1.0.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cb9e9189a7eabc085ddffe7ef81268f3/jetified-android-database-sqlcipher-3.5.7-api.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/app/taxiapp-ktl_(26_8debug).app.unitTest.iml b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.unitTest.iml new file mode 100644 index 0000000..b94a029 --- /dev/null +++ b/.idea/modules/app/taxiapp-ktl_(26_8debug).app.unitTest.iml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + $MODULE_DIR$/../../../app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cd6ee3eb3fc50696fc57eaf7fa81506a/jetified-xixun_card_settings_1.2.4.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/50c4f3f9cb89c12875b3d8a37bce3ea8/jetified-kotlin-android-extensions-runtime-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eef10497c076c3e0224eef478dfacc95/jetified-kotlin-stdlib-jdk7-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/2e05a7c119c523ef3da3eca735692616/jetified-kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cefff415e1fe00ea21396c57c7341a42/jetified-lifecycle-livedata-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f7739b7d4512687dbb5587f5b8a75519/jetified-lifecycle-livedata-core-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/52f608662a75fc89303d1701f5ec50e0/jetified-lifecycle-reactivestreams-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec781f3119334c7509522ff1bb966868/jetified-lifecycle-runtime-ktx-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/798edd96275281c937a1982cd81c07a3/jetified-lifecycle-viewmodel-ktx-2.2.0-api.jar + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_library_classes/debug/classes.jar + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_library_classes/debug/classes.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4328063df2e6d63759b65a77f467cfa5/jetified-kotlinx-coroutines-android-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7ff1574ed7393fe1b60add9cdd6db67e/jetified-kotlinx-coroutines-core-1.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f04b6481913b1f5d71d584021e858f13/jetified-stetho-1.5.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/010edc493b1efc47cf355a3d68aa505b/jetified-logger-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f3dbd4cd9d84196433da10e47c8b9d3c/jetified-GreenDaoUpgradeHelper-v2.2.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/120238fa6ed7c650c37bd723e55cb919/jetified-glide-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c605afe14240d86ffdda7e97a0948ae1/jetified-gifdecoder-4.10.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4ca13cf63f4054293515af97111c4863/lifecycle-reactivestreams-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/09aa48e4d1bb4690ed61b17b12e36887/lifecycle-livedata-2.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/771ed26861001e83547f29ca57ea5600/jetified-commons-cli-1.2.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/47aa66be67ebced1e389bced7a130b8c/jetified-jsr305-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/07fb80bba96aa33515b769741cf9f530/jetified-debug-db-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ac5d0c2b21600f7e7564db308a676a66/jetified-debug-db-base-1.0.6-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5e0d53d793dac656ea782f084dc65c7f/jetified-fastjson-1.2.46.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/da8beefcea58e938669984ec77975c37/jetified-disklrucache-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/77f7b691d7df0d3e300f1f0f4f7b62fa/jetified-annotations-4.10.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3c55ae322327a81558aad151cba07105/jetified-ARxLib-0.1.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/34a29451ab55ddc2e04b4e6c3c44dffd/jetified-greendao-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/db4cc42c0975ae365c0a0cfe3f95c132/jetified-greendao-api-3.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9822764d1b6050859a78a0b3ec51c6dc/jetified-permissionx-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/020b480d2bde92043942aeb85ef94e0f/jetified-YJTools-v1.0.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cb9e9189a7eabc085ddffe7ef81268f3/jetified-android-database-sqlcipher-3.5.7-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/73288eb0c21a43b54cd0b7ad8c497738/jetified-junit-4.12.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $MODULE_DIR$/../../../app/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../app/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../app/build/tmp/kapt3/classes/debug + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../app/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../app/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar + $MODULE_DIR$/../../../app/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../app/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../app/build/tmp/kapt3/classes/debug + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.androidTest.iml b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.androidTest.iml new file mode 100644 index 0000000..4f38a92 --- /dev/null +++ b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.androidTest.iml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/04c2f15fd6406a6a4c04ca88c762801f/jetified-junit-1.1.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/74ddc0334705a7b2ee545fc24609d522/espresso-core-3.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ef7afd86d095279f8c0dd4391e5af5b/jetified-okhttp-4.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4e93e3fa3b80ee04b5b90cd9901cba5d/jetified-okio-jvm-2.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/279e8b321fb00fe273cb945f3ab3adb4/runner-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/73288eb0c21a43b54cd0b7ad8c497738/jetified-junit-4.12.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7572de4f97202338cea7115a363451e7/jetified-hamcrest-integration-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cbacc0420eb54d22b11c3ebe49cbfb9d/jetified-hamcrest-library-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/740bd8479136dd587653ff28b9f87d72/jetified-core-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e9898d831ef0e589591813acbb976c5f/jetified-storage-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c47a323fbeb0ebb5e3c6c91898fc2389/monitor-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f17425093e890f8ce6262ebf674a34e7/room-runtime-2.2.5-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.room/room-common/2.2.5/f5e3b73a0c2ab5e276e26868e4ce3542baede207/room-common-2.2.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3be1a38a61333e6328ca9b7bac3b98d2/sqlite-framework-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fc326b801d1ff977fa0c8fe21cd621b/sqlite-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/47aa66be67ebced1e389bced7a130b8c/jetified-jsr305-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/bc40fa23d51307a1b0ef1b0bba8f71f9/espresso-idling-resource-3.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebb7400b0bde94d40cbe29396025409/jetified-javawriter-2.1.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a7b199dd647d3bc718d4c7a2a53806a3/jetified-javax.inject-1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ebbb51aff728784c20eede62a79cb68a/jetified-kotlin-stdlib-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ae41db9d384a8894f0560bd49880d3ea/jetified-kotlin-stdlib-common-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_library_classes/debug/classes.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-32/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../kurolibrary/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurolibrary/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_library_classes/debug/classes.jar + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.iml b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.iml new file mode 100644 index 0000000..b6c8e38 --- /dev/null +++ b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.iml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.main.iml b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.main.iml new file mode 100644 index 0000000..3328bfd --- /dev/null +++ b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.main.iml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + $MODULE_DIR$/../../../kurolibrary/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/R.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ef7afd86d095279f8c0dd4391e5af5b/jetified-okhttp-4.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4e93e3fa3b80ee04b5b90cd9901cba5d/jetified-okio-jvm-2.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ebbb51aff728784c20eede62a79cb68a/jetified-kotlin-stdlib-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ae41db9d384a8894f0560bd49880d3ea/jetified-kotlin-stdlib-common-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f17425093e890f8ce6262ebf674a34e7/room-runtime-2.2.5-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.room/room-common/2.2.5/f5e3b73a0c2ab5e276e26868e4ce3542baede207/room-common-2.2.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3be1a38a61333e6328ca9b7bac3b98d2/sqlite-framework-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fc326b801d1ff977fa0c8fe21cd621b/sqlite-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-32/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.unitTest.iml b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.unitTest.iml new file mode 100644 index 0000000..99b3187 --- /dev/null +++ b/.idea/modules/kurolibrary/taxiapp-ktl_(26_8debug).kurolibrary.unitTest.iml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ef7afd86d095279f8c0dd4391e5af5b/jetified-okhttp-4.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4e93e3fa3b80ee04b5b90cd9901cba5d/jetified-okio-jvm-2.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ebbb51aff728784c20eede62a79cb68a/jetified-kotlin-stdlib-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ae41db9d384a8894f0560bd49880d3ea/jetified-kotlin-stdlib-common-1.3.41.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a33f8ce3216f44d0b34f8584fe1d4053/material-1.4.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/45ead938a935c9e6e195051654e8f67e/constraintlayout-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5811bc91d2614a9158a1ca655b9ded43/appcompat-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/31917e4a4b4c7ae99d19b34a8d9c594f/fragment-1.3.4-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d557a868048661df2b7966ab02f6804c/jetified-activity-1.2.3-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6ab1c90ecec2656fadad8d68fd0cfff7/jetified-appcompat-resources-1.3.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/808282e6ac34da0ae19078f2cf2ac8ed/dynamicanimation-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/882d9f4e2d6d060e3187aa0a5c20e298/legacy-support-core-utils-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4bec44afd385b2893c2d6d803f9d0ceb/core-1.5.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f902841a8ba7d4a4f0020bf5be9ff329/jetified-lifecycle-viewmodel-savedstate-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e11afed615cceed014f644ab037489e/jetified-savedstate-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/093710b7c906e9a05ba1b8bfcbb1d5ca/lifecycle-runtime-2.3.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/f17425093e890f8ce6262ebf674a34e7/room-runtime-2.2.5-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.room/room-common/2.2.5/f5e3b73a0c2ab5e276e26868e4ce3542baede207/room-common-2.2.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3be1a38a61333e6328ca9b7bac3b98d2/sqlite-framework-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fc326b801d1ff977fa0c8fe21cd621b/sqlite-2.0.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a00f37f27f3e8ad61572f1295513f4b4/core-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/078938ecc3ce2946a9de88a15ea5b456/versionedparcelable-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d82a56e435eb6ce9c3c849e72585ec84/lifecycle-viewmodel-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9a715ee52a8386c204a73cfe6d8d8716/lifecycle-livedata-core-2.3.1-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.3.1/fc466261d52f4433863642fb40d12441ae274a98/lifecycle-common-2.3.1.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/811ecf2702677263b189335dd11f9dcc/documentfile-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/651d9a17b4ee50dc0a479d7a5f57c387/localbroadcastmanager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3736860ed9cc9eb3dcccea1b82aa3d63/print-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.2.0/57136ff68ee784c6e19db34ed4a175338fadfde1/annotation-1.2.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0fac2df818d5003a70205e494249161d/jetified-annotation-experimental-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.constraintlayout/constraintlayout-solver/2.0.1/30988fe2d77f3fe3bf7551bb8a8b795fad7e7226/constraintlayout-solver-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6caef15cbfc6f35ac8669787bd9cfcab/jetified-junit-4.13.2.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $MODULE_DIR$/../../../kurolibrary/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurolibrary/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurolibrary/build/tmp/kapt3/classes/debug + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-32/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/28.0.3/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../kurolibrary/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurolibrary/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurolibrary/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurolibrary/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurolibrary/build/tmp/kapt3/classes/debug + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.androidTest.iml b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.androidTest.iml new file mode 100644 index 0000000..522001c --- /dev/null +++ b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.androidTest.iml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/bff8f75db4bfb23ea8ad0045cda2a5f3/jetified-junit-1.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e0259eda880fbc008bd939b513f4fae7/espresso-core-3.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/35392eb56c1d0580ad3dffc16f562cfd/material-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dc2331c16e0efac6eaa7bfabaa59c4ef/runner-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/73288eb0c21a43b54cd0b7ad8c497738/jetified-junit-4.12.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7572de4f97202338cea7115a363451e7/jetified-hamcrest-integration-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/cbacc0420eb54d22b11c3ebe49cbfb9d/jetified-hamcrest-library-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c2aff52a3446202851bad44fbb8fd9c7/jetified-core-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91e3e57adeee3b780afead2d7a7d5bb7/appcompat-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/92fe512df5d2ebc82ff9bd9832b874f2/monitor-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61eb2ecfc026b926fafa0f81127bec9a/fragment-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/49a0f3458b53a067438423ae7c0dfb8c/jetified-appcompat-resources-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/fba7b33d13e73231562cd340a2c71ea0/jetified-activity-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1e7b34f7ccbee70ccde03223f1fb10de/core-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4faf711e1dd216139604f777ce0f7113/lifecycle-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/99224bf02b30d8acccc5c114b4886228/versionedparcelable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fbe5d137b400302d60fd6a471d562b9/jetified-savedstate-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6226f2a8a8ae923e009e5b6d2ba06c10/lifecycle-livedata-core-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.1.0/c67e7807d9cd6c329b9d0218b2ec4e505dd340b7/lifecycle-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec7d0e65890bec7fddb26258f54bd840/lifecycle-viewmodel-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9d56fd68c56fa1414f1d9cacfc2c3236/core-runtime-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.1.0/e3a6fb2f40e3a3842e6b7472628ba4ce416ea4c8/annotation-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8b13fed7b1eac935e93ecb88a8d7eba2/jetified-kxml2-2.3.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e50a3d78a9f997aab4708f4813c3fab/espresso-idling-resource-3.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebb7400b0bde94d40cbe29396025409/jetified-javawriter-2.1.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a7b199dd647d3bc718d4c7a2a53806a3/jetified-javax.inject-1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/47aa66be67ebced1e389bced7a130b8c/jetified-jsr305-2.0.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3e23299ce283ec40921fac6b0c088acd/jetified-kotlin-android-extensions-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e0ed715837c2bdb1b753746850552ad/jetified-kotlin-stdlib-jdk7-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_library_classes/debug/classes.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../kurotool/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurotool/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_library_classes/debug/classes.jar + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.iml b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.iml new file mode 100644 index 0000000..b3ff05c --- /dev/null +++ b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.iml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.main.iml b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.main.iml new file mode 100644 index 0000000..b8606c5 --- /dev/null +++ b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.main.iml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + $MODULE_DIR$/../../../kurotool/build/intermediates/compile_only_not_namespaced_r_class_jar/debug/R.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/35392eb56c1d0580ad3dffc16f562cfd/material-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3e23299ce283ec40921fac6b0c088acd/jetified-kotlin-android-extensions-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e0ed715837c2bdb1b753746850552ad/jetified-kotlin-stdlib-jdk7-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91e3e57adeee3b780afead2d7a7d5bb7/appcompat-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61eb2ecfc026b926fafa0f81127bec9a/fragment-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/49a0f3458b53a067438423ae7c0dfb8c/jetified-appcompat-resources-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/fba7b33d13e73231562cd340a2c71ea0/jetified-activity-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1e7b34f7ccbee70ccde03223f1fb10de/core-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4faf711e1dd216139604f777ce0f7113/lifecycle-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/99224bf02b30d8acccc5c114b4886228/versionedparcelable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec7d0e65890bec7fddb26258f54bd840/lifecycle-viewmodel-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fbe5d137b400302d60fd6a471d562b9/jetified-savedstate-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6226f2a8a8ae923e009e5b6d2ba06c10/lifecycle-livedata-core-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.1.0/c67e7807d9cd6c329b9d0218b2ec4e505dd340b7/lifecycle-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9d56fd68c56fa1414f1d9cacfc2c3236/core-runtime-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.1.0/e3a6fb2f40e3a3842e6b7472628ba4ce416ea4c8/annotation-1.1.0.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.unitTest.iml b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.unitTest.iml new file mode 100644 index 0000000..81fa7b5 --- /dev/null +++ b/.idea/modules/kurotool/taxiapp-ktl_(26_8debug).kurotool.unitTest.iml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6176d58c87e449e2b2e5fc94fb6053c8/jetified-converter-scalars-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7680124ff9b7ea7fb176d7f0c284ad9/jetified-adapter-rxjava2-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4fbf1ce8d5ae2af5f523851cfbe8b485/jetified-converter-gson-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/d81251d5927161ec93d9dc99e7da18e3/jetified-retrofit-2.7.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a8c586e0ef51ed962cedce30250c8e00/jetified-logging-interceptor-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91ff60686c23d239d8bbc93a1dde6471/jetified-okhttp-4.3.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/736a4b5601cf6870163e216dd4531f5b/jetified-okio-jvm-2.4.1.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/eebbc1ca544777fc56e6e9ad0926d94e/jetified-rxandroid-2.1.1-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/01cd38edbffee093e59531fad741bed8/jetified-rxjava-2.2.17.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/35392eb56c1d0580ad3dffc16f562cfd/material-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/8ecb5eedc81564913e3183d7a159d11f/jetified-library-1.7.5-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/3e23299ce283ec40921fac6b0c088acd/jetified-kotlin-android-extensions-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7e0ed715837c2bdb1b753746850552ad/jetified-kotlin-stdlib-jdk7-1.3.61.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/5f267915a84ab14cfb46da4e2f5f17db/jetified-core-ktx-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6d29ee6216737436a08ee788c0e48cd2/jetified-kotlin-stdlib-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/dbc688a8a552fac18d0cea0e8fe8591e/jetified-kotlin-stdlib-common-1.3.71.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9f2b33d370b6af0362fe1e71cd0de502/jetified-annotations-13.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61969562c26d090cb354becbc427a8b5/jetified-reactive-streams-1.0.3.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/107e22d3375bddc7d1b0a774a0f08ed5/jetified-gson-2.8.5.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/91e3e57adeee3b780afead2d7a7d5bb7/appcompat-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/c7b0db8e2269dccc2170be0523f5a43c/cardview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1bd074f987ad0d9b15cd7d98e891e5c4/coordinatorlayout-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/62cfd10075143437c93737d4877bbfc2/jetified-viewpager2-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/61eb2ecfc026b926fafa0f81127bec9a/fragment-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/0267a9c4885d5bcded9db9017252a87c/recyclerview-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7522e76212700777f052119c7c2a0f80/transition-1.2.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/49a0f3458b53a067438423ae7c0dfb8c/jetified-appcompat-resources-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b7f0605ba2098665b84314071f98e068/vectordrawable-animated-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7f225ba7920a89a713efa5550243d545/vectordrawable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6cb6d84be61f3f332438b589c4429e53/drawerlayout-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/60c7cfc205102d00a295ef5398fc233c/viewpager-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b9322ce26c854b79e2e2a2f545caa9d8/customview-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/a9c0326c2b12aa7752e325493141c526/loader-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/fba7b33d13e73231562cd340a2c71ea0/jetified-activity-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1e7b34f7ccbee70ccde03223f1fb10de/core-1.3.2-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/4faf711e1dd216139604f777ce0f7113/lifecycle-runtime-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1ae97c24264c49b544e889e56cd06143/cursoradapter-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/99224bf02b30d8acccc5c114b4886228/versionedparcelable-1.1.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/ec7d0e65890bec7fddb26258f54bd840/lifecycle-viewmodel-2.1.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/7fbe5d137b400302d60fd6a471d562b9/jetified-savedstate-1.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/e41b1b2e1fe25407aa731a53b5a7bb92/lifecycle-livedata-2.0.0-api.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/6226f2a8a8ae923e009e5b6d2ba06c10/lifecycle-livedata-core-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.1.0/c67e7807d9cd6c329b9d0218b2ec4e505dd340b7/lifecycle-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/9d56fd68c56fa1414f1d9cacfc2c3236/core-runtime-2.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/b8406a0417971e7997dafe8b24d4441f/interpolator-1.0.0-api.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.1.0/e3a6fb2f40e3a3842e6b7472628ba4ce416ea4c8/annotation-1.1.0.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/73288eb0c21a43b54cd0b7ad8c497738/jetified-junit-4.12.jar + $USER_HOME$/.gradle/caches/transforms-2/files-2.1/1f21aa167e0a0fee8c0d09407d21d417/jetified-hamcrest-core-1.3.jar + $MODULE_DIR$/../../../kurotool/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurotool/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurotool/build/tmp/kapt3/classes/debug + $MODULE_DIR$/../../../../../../../../Android/sdk/platforms/android-29/android.jar + $MODULE_DIR$/../../../../../../../../Android/sdk/build-tools/29.0.2/core-lambda-stubs.jar + + + + + + + + + + + + $MODULE_DIR$/../../../kurotool/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurotool/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurotool/build/intermediates/javac/debug/classes + $MODULE_DIR$/../../../kurotool/build/tmp/kotlin-classes/debug + $MODULE_DIR$/../../../kurotool/build/tmp/kapt3/classes/debug + + + + + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.intellij.deps/trove4j/1.0.20181211/216c2e14b070f334479d800987affe4054cd563f/trove4j-1.0.20181211.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.3.61/54ca7c214a5cd73cd887a42002266e25440097f2/kotlin-android-extensions-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.3.61/c35c0833d5a1e3d229359758482c480306724618/kotlin-compiler-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-daemon-embeddable/1.3.61/4de83e41a92c8395d89ab2e81d26b788ba163824/kotlin-daemon-embeddable-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.3.61/2e07c9a84c9e118efb70eede7e579fd663932122/kotlin-reflect-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-script-runtime/1.3.61/e5feb39c8de63dcbdc1154b34ca4413874231605/kotlin-script-runtime-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.61/65abb71d5afb850b68be03987b08e2c864ca3110/kotlin-stdlib-common-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.61/4702105e97f7396ae41b113fdbdc180ec1eb1e36/kotlin-stdlib-1.3.61.jar + $USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar + + + + + plugin:org.jetbrains.kotlin.android:experimental=false + plugin:org.jetbrains.kotlin.android:enabled=true + plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/taxiapp-ktl_(26_8debug).iml b/.idea/modules/taxiapp-ktl_(26_8debug).iml new file mode 100644 index 0000000..5fb852b --- /dev/null +++ b/.idea/modules/taxiapp-ktl_(26_8debug).iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 59dd6dc..e495d69 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ android { applicationId "net.sysolution.taxiapp" minSdkVersion 21 targetSdkVersion 29 - versionCode 146 - versionName "3.3.3-beta23-release" + versionCode 173 + versionName "3.3.3-beta26-release" //alphaxx - 预览版本,不会对外发布,由测试人员测试,会有很多bug //Betaxx - 公开测试版本,会发给其他工作人员,会有较多版本 @@ -90,7 +90,7 @@ android { //每升级一次数据库加一 greendao { - schemaVersion 35 + schemaVersion 42 daoPackage 'cn.trans88.taxiappkotlin.logic.dao' targetGenDir 'src/main/java' } @@ -102,6 +102,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.2.0' implementation "androidx.core:core-ktx:$core_ktx" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation project(path: ':kurolibrary') testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' @@ -112,8 +113,8 @@ dependencies { implementation project(':kurotool') //kotlin协程 - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' +// implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' +// implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3' //stetho调试 implementation 'com.facebook.stetho:stetho:1.5.1' @@ -147,8 +148,8 @@ dependencies { //jetpack // implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0' //room - implementation 'androidx.room:room-runtime:2.2.5'//room - kapt "androidx.room:room-compiler:2.2.5" +// implementation 'androidx.room:room-runtime:2.2.5'//room +// kapt "androidx.room:room-compiler:2.2.5" //lifecycle协程 @@ -162,12 +163,12 @@ dependencies { implementation 'com.permissionx.guolindev:permissionx:1.1.1' //timber - implementation 'com.jakewharton.timber:timber:4.7.1' +// implementation 'com.jakewharton.timber:timber:4.7.1' //他人库 implementation 'com.github.joeyupdo:YJTools:v1.0.5' //jwt解析 - implementation 'io.jsonwebtoken:jjwt:0.9.1' +// implementation 'io.jsonwebtoken:jjwt:0.9.1' implementation 'net.zetetic:android-database-sqlcipher:3.5.7@aar' @@ -179,6 +180,9 @@ dependencies { // //exo // implementation 'com.google.android.exoplayer:exoplayer:2.8.1' +// implementation 'com.google.android.exoplayer:exoplayer:2.14.2' +// implementation 'com.google.android.exoplayer:exoplayer-core:2.14.2' +// implementation 'com.google.android.exoplayer:exoplayer-ui:2.14.2' - implementation 'com.github.Trans88:KuroLibrary:0.1.3' +// implementation 'com.github.Trans88:KuroLibrary:0.1.3' } diff --git a/app/debug/TaxiApp_v3.3.3-beta24-release{147}.apk b/app/debug/TaxiApp_v3.3.3-beta24-release{147}.apk new file mode 100644 index 0000000..3c55ac1 Binary files /dev/null and b/app/debug/TaxiApp_v3.3.3-beta24-release{147}.apk differ diff --git a/app/debug/TaxiApp_v3.3.3-beta24-release{147}.zip b/app/debug/TaxiApp_v3.3.3-beta24-release{147}.zip new file mode 100644 index 0000000..c2b1999 Binary files /dev/null and b/app/debug/TaxiApp_v3.3.3-beta24-release{147}.zip differ diff --git a/app/debug/debug/debug/TaxiApp_v3.3.3-26-8-3-debug{150}.zip b/app/debug/debug/debug/TaxiApp_v3.3.3-26-8-3-debug{150}.zip new file mode 100644 index 0000000..624d9cc Binary files /dev/null and b/app/debug/debug/debug/TaxiApp_v3.3.3-26-8-3-debug{150}.zip differ diff --git a/app/debug/debug/debug/output.json b/app/debug/debug/debug/output.json new file mode 100644 index 0000000..b0a73aa --- /dev/null +++ b/app/debug/debug/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":150,"versionName":"3.3.3-26-8-debug","enabled":true,"outputFile":"TaxiApp_v3.3.3-26-8-debug{150}.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"TaxiApp_v3.3.3-26-8-debug{150}.apk","properties":{}}] \ No newline at end of file diff --git a/app/debug/debug/output.json b/app/debug/debug/output.json new file mode 100644 index 0000000..b0a73aa --- /dev/null +++ b/app/debug/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":150,"versionName":"3.3.3-26-8-debug","enabled":true,"outputFile":"TaxiApp_v3.3.3-26-8-debug{150}.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"TaxiApp_v3.3.3-26-8-debug{150}.apk","properties":{}}] \ No newline at end of file diff --git a/app/debug/output.json b/app/debug/output.json new file mode 100644 index 0000000..b9b0d71 --- /dev/null +++ b/app/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":147,"versionName":"3.3.3-beta24-release","enabled":true,"outputFile":"TaxiApp_v3.3.3-beta24-release{147}.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"TaxiApp_v3.3.3-beta24-release{147}.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/Configurations.java b/app/src/main/java/cn/trans88/taxiappkotlin/Configurations.java index 9bb33d8..3582f19 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/Configurations.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/Configurations.java @@ -288,6 +288,30 @@ public class Configurations { context.getSharedPreferences("config", Context.MODE_PRIVATE).edit().putString("upload_debug_file_url", s).apply(); } + /** + * 当前TaxiApp播放的是否是定时广告 + * @return + */ + public Boolean isTimedAdvertise(){ + return context.getSharedPreferences("config", Context.MODE_PRIVATE).getBoolean("isTimedAdvertise", false); + } + + /** + * 当前TaxiApp播放的是否是定时广告 + * @param s + */ + public void isTimedAdvertiseSave(Boolean s){ + context.getSharedPreferences("config", Context.MODE_PRIVATE).edit().putBoolean("isTimedAdvertise", s).apply(); + } + + public String timedAdList(){ + return context.getSharedPreferences("config", Context.MODE_PRIVATE).getString("timedAdList", ""); + } + + public void timedAdListSave(String s){ + context.getSharedPreferences("config", Context.MODE_PRIVATE).edit().putString("timedAdList", s).apply(); + } + } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/TaxiApp.kt b/app/src/main/java/cn/trans88/taxiappkotlin/TaxiApp.kt index 6284dfd..8d47876 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/TaxiApp.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/TaxiApp.kt @@ -3,9 +3,14 @@ package cn.trans88.taxiappkotlin import android.app.Application import android.content.Intent import android.os.Build +import android.util.Log import cn.trans88.kurotool.util.LogLevel import cn.trans88.kurotool.util.LogUtil +import cn.trans88.taxiappkotlin.ext.logd +import cn.trans88.taxiappkotlin.ext.loge import cn.trans88.taxiappkotlin.logic.exception.CrashHandler +import cn.trans88.taxiappkotlin.logic.model.Advertise +import cn.trans88.taxiappkotlin.logic.model.Schedule import cn.trans88.taxiappkotlin.logic.network.JoeyDownloadManager import cn.trans88.taxiappkotlin.net.BizInterceptor import cn.trans88.taxiappkotlin.net.RetrofitCallFactory @@ -18,11 +23,27 @@ import com.trs88.kurolibrary.restful.KuroRestful import com.trs88.kurolibrary.restful.retrofit.KuroApiFactory import io.reactivex.plugins.RxJavaPlugins import java.io.File - +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap class TaxiApp:Application() { + + val timer = Timer() + //定时任务是否执行 + var isTimed:Boolean = false + //单个广告里的定时任务 + val timerTaskMap = HashMap>() + //存储定时广告的列表 + var timedAds:ArrayList = ArrayList() + var activity:PlayActivity? = null + + var testCount = 0 val TAG ="TaxiApp" val poolSize =Runtime.getRuntime().availableProcessors()*2+1 +// lateinit var listener:Player.Listener +// var player: SimpleExoPlayer? = null +// lateinit var factory: ProgressiveMediaSource.Factory companion object{ private var instance:Application? =null @@ -40,7 +61,7 @@ class TaxiApp:Application() { override fun onCreate() { super.onCreate() - instance =this + instance = this //add by yzd @20211130 用config替换原有的配置文件 Configurations.config(this).init(); @@ -102,8 +123,51 @@ class TaxiApp:Application() { YoungUtil.RecursionDeleteFile(file) }).start() + //配置exoPlayer的player +// initPlayer() } + /** + * 配置exoPlayer的player + */ +// fun initPlayer(){ +// val dataSourceFactory = DefaultDataSourceFactory(applicationContext) +// factory = ProgressiveMediaSource.Factory(dataSourceFactory) +// //edit by ljh 2023/1/5 +// //配置exoPlayer的player +// player = SimpleExoPlayer.Builder(this).build() +// //音量设置为0 +// player!!.volume = 0f +//// player!!.playWhenReady = true +// initListener() +// player!!.addListener(listener) +// } + + /** + * 初始化视频监听器 + */ +// private fun initListener(){ +// listener = object : Player.Listener{ +// override fun onPlaybackStateChanged(state: Int) { +// when(state){ +// Player.STATE_BUFFERING -> { +// "视频正在缓冲".logd("PlayView") +// } +// Player.STATE_READY -> { +// "视频准备就绪".logd("PlayView") +// } +// Player.STATE_ENDED -> { +// "播放完毕".loge("PlayView") +// } +// +// Player.STATE_IDLE -> { +// "闲置视频".loge("PlayView") +// } +// } +// } +// } +// } + private fun initKuroLog() { val file = File(filesDir, "/log") diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ext/LogExt.kt b/app/src/main/java/cn/trans88/taxiappkotlin/ext/LogExt.kt new file mode 100644 index 0000000..00046b2 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ext/LogExt.kt @@ -0,0 +1,44 @@ +package cn.trans88.taxiappkotlin.ext + +import android.util.Log + +/** + * + * @Author: LJH + * @Time: 2022/11/2 + * @description: + */ +const val TAG = "yzd_t" + +/** + * + * 是否需要开启打印日志,默认打开,1.1.7-1.1.8版本是默认关闭的(1.0.0-1.1.6没有这个字段,框架在远程依赖下,直接不打印log),但是默认关闭后很多人反馈都没有日志,好吧,我的我的 + * 根据true|false 控制网络请求日志和该框架产生的打印 + */ +var isLog = true + +private enum class LEVEL { + V, D, I, W, E +} + +fun String.logv(tag: String = TAG) = + log(LEVEL.V, tag, this) +fun String.logd(tag: String = TAG) = + log(LEVEL.D, tag, this) +fun String.logi(tag: String = TAG) = + log(LEVEL.I, tag, this) +fun String.logw(tag: String = TAG) = + log(LEVEL.W, tag, this) +fun String.loge(tag: String = TAG) = + log(LEVEL.E, tag, this) + +private fun log(level: LEVEL, tag: String, message: String) { + if (!isLog) return + when (level) { + LEVEL.V -> Log.v(tag, message) + LEVEL.D -> Log.d(tag, message) + LEVEL.I -> Log.i(tag, message) + LEVEL.W -> Log.w(tag, message) + LEVEL.E -> Log.e(tag, message) + } +} \ No newline at end of file diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/Repository.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/Repository.kt index e14fd3a..88938b3 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/Repository.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/Repository.kt @@ -1,5 +1,6 @@ package cn.trans88.taxiappkotlin.logic +import android.annotation.SuppressLint import android.os.Handler import android.os.Looper import androidx.lifecycle.liveData @@ -8,11 +9,14 @@ import cn.trans88.taxiappkotlin.Configurations import cn.trans88.taxiappkotlin.TaxiApp import cn.trans88.taxiappkotlin.ext.fromJson import cn.trans88.taxiappkotlin.ext.isMainThread +import cn.trans88.taxiappkotlin.ext.loge import cn.trans88.taxiappkotlin.logic.dao.AdvertiseDao import cn.trans88.taxiappkotlin.logic.dao.DaoUtil +import cn.trans88.taxiappkotlin.logic.dao.ScheduleDao import cn.trans88.taxiappkotlin.logic.model.Advertise import cn.trans88.taxiappkotlin.logic.model.AdvertiseOrder import cn.trans88.taxiappkotlin.logic.model.Order +import cn.trans88.taxiappkotlin.logic.network.ProcessingCommands import cn.trans88.taxiappkotlin.logic.task.BlockQueueTask import cn.trans88.taxiappkotlin.logic.task.SyncTimerTask import cn.trans88.taxiappkotlin.play.ChangeStatus @@ -27,8 +31,10 @@ import cn.trans88.taxiappkotlin.util.LastThreadListener import cn.trans88.taxiappkotlin.util.SyncUtil.getSyncSingleTime import cn.trans88.taxiappkotlin.util.YoungUtil import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.trs88.kurolibrary.execute.KuroExecutor import kotlinx.coroutines.Dispatchers +import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.LinkedBlockingQueue import kotlin.collections.ArrayList @@ -36,10 +42,10 @@ import kotlin.collections.ArrayList /** * 仓库层:判断调用的数据是从本地获取还是网络获取的 */ +val myListMap = mutableMapOf>() object Repository { // private val circularListMap = mapOf(AdvertiseType.NORMAL.ordinal to CircularList(),AdvertiseType.AREA.ordinal to CircularList()) private val circularListMap = mutableMapOf>() - private val myListMap = mutableMapOf>() private val changeStatusQueue: LinkedBlockingQueue = LinkedBlockingQueue() //阻塞队列 private var refreshPlayerLists: BlockQueueTask? = null //利用LinkedBlockingDeque创建异步生产者-消费者任务 //todo 需要停止线程 @@ -53,6 +59,8 @@ object Repository { private var timer: Timer = Timer() private var kuroTimer: KuroTimer=KuroTimer() + val taxiApp:TaxiApp = TaxiApp.instance() as TaxiApp + var currentListOrder: Int = 0 var currentSyncTime: Long = 0 @@ -60,18 +68,18 @@ object Repository { /** * 将广告发送给观察者 */ - @Deprecated("已经废弃") - fun getAdvertise() = liveData(Dispatchers.IO) { -// fun getAdvertise() = liveData{ - YoungUtil.YoungLog("getAdvertise") - val advertise = getTestPlayAdvertise(myListMap[getTestPlayLevels()]) - val result = try { - Result.success(advertise) - } catch (e: Exception) { - Result.failure(e) - } - emit(result) - } +// @Deprecated("已经废弃") +// fun getAdvertise() = liveData(Dispatchers.IO) { +//// fun getAdvertise() = liveData{ +// YoungUtil.YoungLog("getAdvertise") +// val advertise = getTestPlayAdvertise(myListMap[getTestPlayLevels()]) +// val result = try { +// Result.success(advertise) +// } catch (e: Exception) { +// Result.failure(e) +// } +// emit(result) +// } fun setSyncTime(syncTime: Long) { currentSyncTime = syncTime @@ -79,17 +87,36 @@ object Repository { fun getAdvertiseTEST(): Advertise? { // return getPlayAdvertise(circularListMap[getPlayLevels()]) - val advertise = getTestPlayAdvertise(myListMap[getTestPlayLevels()]) + val list = myListMap[getTestPlayLevels()] + "广告数量:${list?.size}".loge() + + //#edit by ljh 2023/2/16 + var advertise:Advertise? = null + val isTimedAdvertise = Configurations.config(taxiApp.activity).isTimedAdvertise + advertise = if (isTimedAdvertise){ + getTestPlayAdvertise(taxiApp.timedAds) + } else { + getTestPlayAdvertise(myListMap[getTestPlayLevels()]) + } +// val advertise = getTestPlayAdvertise(myListMap[getTestPlayLevels()]) return advertise } - // fun getPlayCircularList(): CircularList? { // return circularListMap[getPlayLevels()] // } fun getTestPlayCircularList(): MutableList? { - return myListMap[getTestPlayLevels()] + //#edit by ljh @2023/2/23 + //如果正在播放的是多时段的定时广告,则返回定时广告的播放列表,否则返回不定时的播放列表 + val taxiApp:TaxiApp = TaxiApp.instance() as TaxiApp + val isTimedAdNow = Configurations.config(taxiApp.activity).isTimedAdvertise + val list = if (!isTimedAdNow){ + myListMap[getTestPlayLevels()] + } else { + taxiApp.timedAds + } + return list } /** @@ -120,6 +147,7 @@ object Repository { val currentTimeMillis = System.currentTimeMillis() list?.let { if (it.isEmpty()) { + "播放列表是空的".loge() return null } //防止如果需求定点广告切换成普通广告,但是要继续上次普通广告的播放,然后现在的广告列表数改变,下标越界的情况 @@ -171,10 +199,26 @@ object Repository { fun getTestPlayLevels(): Int { val levels = AdvertiseType.values() + val isTimedAdvertise = Configurations.config(taxiApp.activity).isTimedAdvertise for (index in AdvertiseType.values().size downTo 0) { - val list = myListMap[index] + //#edit by ljh 2023/2/27 + //先判断当前的播放列表是否是分时段播放列表,还是正常的播放列表 + val list = if (!isTimedAdvertise){ + myListMap[index] + } else { + "分时段播放列表".loge() + taxiApp.timedAds + return AdvertiseType.GROUP.ordinal + } if (list!!.size > 0) { - YoungUtil.YoungLog("当前播放广告的等级$index") + val level = when(index){ + AdvertiseType.AREA.ordinal -> "定点广告" + AdvertiseType.IDLE.ordinal -> "闲置广告" + AdvertiseType.GROUP.ordinal -> "分组广告" + AdvertiseType.COUNT.ordinal -> "计数广告" + else -> "其他广告" + } + YoungUtil.YoungLog("当前播放广告的等级:$level,播放列表不为空") return index } } @@ -184,6 +228,7 @@ object Repository { /** * 刷新循环列表 */ + @SuppressLint("SimpleDateFormat") @Synchronized fun refreshMyList() { val currentTimeMillis = System.currentTimeMillis() @@ -194,15 +239,30 @@ object Repository { myListMap[index] = ArrayList() } + //#edit by ljh 2023/2/23 + //如果当前播放的是定时播放列表重新排序 + val isTimedAdNow = Configurations.config(taxiApp.activity).isTimedAdvertise + "现在是否正在播定时广告:$isTimedAdNow".loge() + var tempList: ArrayList? = null + if (isTimedAdNow){ + val timedListJsonStr = Configurations.config(taxiApp.activity).timedAdList() + if (taxiApp.timedAds.isEmpty()){ + tempList = ProcessingCommands.gson.fromJson(timedListJsonStr,object :TypeToken>(){}.type) as ArrayList + taxiApp.timedAds.addAll(tempList) + } +// taxiApp.timedAds.clear() + } + "refreshMyList播放列表重新赋值刷新了".loge() + //清楚排序规则 DaoUtil.getOrderDao().deleteAll() val daoAdvertises = DaoUtil.getAdvertise().queryBuilder().orderDesc(AdvertiseDao.Properties.CreateAt).list() - + "存储的广告数量:${daoAdvertises.size}".loge() val advertises = mutableListOf() //定点广告list val area = DaoUtil.getAdvertise().queryBuilder().where(AdvertiseDao.Properties.BelongTo.eq(AdvertiseType.AREA.ordinal)).list() - + YoungUtil.YoungLog("定点广告数量:${area.size}") if (Configurations.config(TaxiApp.instance()).advertiseOrder() != "" && area.size == 0) { val orderList = Gson().fromJson(Configurations.config(TaxiApp.instance()).advertiseOrder()).advertise_order YoungUtil.YoungLog("当前的播放顺序策略:${orderList.toString()}") @@ -211,7 +271,6 @@ object Repository { daoAdvertises.forEach { daoAdvertis -> if (orderListAdid == daoAdvertis.ad_id) { YoungUtil.YoungLog("adid相同加入 播放数组 adid:$orderListAdid") - advertises.add(daoAdvertis) } } @@ -235,7 +294,6 @@ object Repository { if (orderList.isNullOrEmpty()) { advertises.addAll(daoAdvertises) } - } else { //Collections.reverse(daoAdvertises) daoAdvertises.reverse() @@ -243,7 +301,7 @@ object Repository { advertises.add(it) } } - + "advertises的广告数量:${advertises.size}".loge() for (index in 0 until advertises.size) { val order = Order() order.ad_id = advertises[index].ad_id @@ -254,7 +312,9 @@ object Repository { } for (index in 0 until advertises.size) { - YoungUtil.YoungLog("列表序号:${advertises[index].ad_id} 创建时间 ${advertises[index].createAt}") + val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + val dateStr = format.format(Date(advertises[index].createAt)) + YoungUtil.YoungLog("列表序号:${advertises[index].ad_id} 创建时间 $dateStr") // sb.append("\n广告id:${advertise.ad_id}") val advertise = advertises[index] @@ -266,9 +326,49 @@ object Repository { val newAdvertise = oldAdvertiseToNewAdvertise(advertise) + //#edit by ljh 2023/2/17 + //重启时如果是分时段广告,则重新开启它的分时段播放任务 + newAdvertise.isTimedAd?.let { + var tasks = taxiApp.timerTaskMap[newAdvertise.ad_id] + if (tasks.isNullOrEmpty()){ + val schedules = DaoUtil.getSchedule().queryBuilder() + .where(ScheduleDao.Properties.AdvertiseId.eq(newAdvertise.ad_id)).list() +// "schedules数量:${schedules.size}".loge() + if (!schedules.isNullOrEmpty()){ + newAdvertise.isTimedAd = true + val daoAdvertise = DaoUtil.getAdvertise() + .queryBuilder().where(AdvertiseDao.Properties.Ad_id.eq(newAdvertise.ad_id.toString())).unique() + daoAdvertise.isTimedAd = true + DaoUtil.getAdvertise().update(daoAdvertise) + schedules.forEach { + val list = kotlin.collections.ArrayList() + "重启了,重新开启分时段播放任务:${newAdvertise.ad_id},week_day:${it.weekDayString}".loge() + for (s in it.weekDayString.split(",")) { + list.add(s.toInt()) + } + it.week_day = list + } + newAdvertise.time_section = schedules + taxiApp.activity?.getViewModel()?.addTimer(newAdvertise) + } + } + } + if (newAdvertise.isAllowPlay()) { - YoungUtil.YoungLog("广告准备ok 加入Mylist 广告ad_id:${newAdvertise.ad_id},是否是最后一个广告:${newAdvertise.isLast},belongto: ${newAdvertise.belongTo}") - myListMap[newAdvertise.belongTo]?.add(newAdvertise) + //#edit by ljh @2023/2/23 myListMap集合只存放不定时的广告 + if (!newAdvertise.isTimedAd){ + "广告准备ok 加入Mylist 广告ad_id:${newAdvertise.ad_id},是否是最后一个广告:${newAdvertise.isLast},belongto: ${newAdvertise.belongTo}".loge("Repository") + myListMap[newAdvertise.belongTo]?.add(newAdvertise) + } else if(isTimedAdNow && newAdvertise.isTimedAd && newAdvertise.is_exclusive) { + taxiApp.timedAds.forEach { + if (it.ad_id == newAdvertise.ad_id){ + taxiApp.timedAds.remove(it) + taxiApp.timedAds.add(newAdvertise) + } + } + } +// "广告准备ok 加入Mylist 广告ad_id:${newAdvertise.ad_id},是否是最后一个广告:${newAdvertise.isLast},belongto: ${newAdvertise.belongTo}".loge("Repository") +// myListMap[newAdvertise.belongTo]?.add(newAdvertise) } else { YoungUtil.YoungLog("广告不满足不加入播放列表:${newAdvertise.ad_id}") } @@ -278,6 +378,23 @@ object Repository { //YoungUtil.YoungLog("刷新列表用时${last - currentTimeMillis}") } + + /** + * 如果是按次数播放,则每次播放次数减一 + * @param advertise Advertise? + */ +// @Synchronized +// fun playByCount(advertise: Advertise?){ +// advertise?.let { +// if (it.isCount){ +// advertise.play_numbers -- +// var count = advertise.play_numbers +// "广告[${advertise.ad_id}]剩余播放次数【${count}】".loge() +// DaoUtil.updatePlayNumbers(advertise) +// } +// } +// } + private fun oldAdvertiseToNewAdvertise(oldAdvertise: Advertise): Advertise { val advertise = Advertise() advertise.apply { @@ -296,10 +413,19 @@ object Repository { latitude = oldAdvertise.latitude isDownloaded =oldAdvertise.isDownloaded isDownloading =oldAdvertise.isDownloading + + //#edit by ljh 2023/2/6 + isCount = oldAdvertise.isCount + play_numbers = oldAdvertise.play_numbers + mxkl_url = oldAdvertise.mxkl_url + + isTimedAd = oldAdvertise.isTimedAd + is_exclusive = oldAdvertise.is_exclusive + + time_section = oldAdvertise.time_section // if (sanleAdvertise.createAt ==null){ // send("服务器日志 三乐广告 createAt :${sanleAdvertise.createAt}") // } - } return advertise } @@ -329,10 +455,8 @@ object Repository { // playViewModel?.refreshAdvertise(getAdvertiseTEST()) playViewModel?.refreshAdvertise() }) - } - /** * 初始化BlockQueueTask 并开启内部的线程 一旦RefreshPlayer生产数据就会执行execOnReceiveItem */ @@ -357,6 +481,7 @@ object Repository { //广告位置设置为0并刷新播放的列表 currentListOrder = 0 refreshMyList() + "sync:${Configurations.config(TaxiApp.instance()).sync()}".loge() if (Configurations.config(TaxiApp.instance()).sync() && getTestPlayLevels() == AdvertiseType.GROUP.ordinal) { //设置同步播放并且是分组广告 // if (Settings.sync) { diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/AdvertiseDao.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/AdvertiseDao.java index 822fb56..82c09b8 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/AdvertiseDao.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/AdvertiseDao.java @@ -38,6 +38,11 @@ public class AdvertiseDao extends AbstractDao { public final static Property Latitude = new Property(11, Double.class, "latitude", false, "LATITUDE"); public final static Property IsDownloaded = new Property(12, boolean.class, "isDownloaded", false, "IS_DOWNLOADED"); public final static Property IsDownloading = new Property(13, boolean.class, "isDownloading", false, "IS_DOWNLOADING"); + public final static Property Play_numbers = new Property(14, int.class, "play_numbers", false, "PLAY_NUMBERS"); + public final static Property IsCount = new Property(15, Boolean.class, "isCount", false, "IS_COUNT"); + public final static Property Mxkl_url = new Property(16, String.class, "mxkl_url", false, "MXKL_URL"); + public final static Property IsTimedAd = new Property(17, Boolean.class, "isTimedAd", false, "IS_TIMED_AD"); + public final static Property Is_exclusive = new Property(18, Boolean.class, "is_exclusive", false, "IS_EXCLUSIVE"); } @@ -66,7 +71,12 @@ public class AdvertiseDao extends AbstractDao { "\"LONGITUDE\" REAL," + // 10: longitude "\"LATITUDE\" REAL," + // 11: latitude "\"IS_DOWNLOADED\" INTEGER NOT NULL ," + // 12: isDownloaded - "\"IS_DOWNLOADING\" INTEGER NOT NULL );"); // 13: isDownloading + "\"IS_DOWNLOADING\" INTEGER NOT NULL ," + // 13: isDownloading + "\"PLAY_NUMBERS\" INTEGER NOT NULL ," + // 14: play_numbers + "\"IS_COUNT\" INTEGER," + // 15: isCount + "\"MXKL_URL\" TEXT," + // 16: mxkl_url + "\"IS_TIMED_AD\" INTEGER," + // 17: isTimedAd + "\"IS_EXCLUSIVE\" INTEGER);"); // 18: is_exclusive } /** Drops the underlying database table. */ @@ -132,6 +142,27 @@ public class AdvertiseDao extends AbstractDao { } stmt.bindLong(13, entity.getIsDownloaded() ? 1L: 0L); stmt.bindLong(14, entity.getIsDownloading() ? 1L: 0L); + stmt.bindLong(15, entity.getPlay_numbers()); + + Boolean isCount = entity.getIsCount(); + if (isCount != null) { + stmt.bindLong(16, isCount ? 1L: 0L); + } + + String mxkl_url = entity.getMxkl_url(); + if (mxkl_url != null) { + stmt.bindString(17, mxkl_url); + } + + Boolean isTimedAd = entity.getIsTimedAd(); + if (isTimedAd != null) { + stmt.bindLong(18, isTimedAd ? 1L: 0L); + } + + Boolean is_exclusive = entity.getIs_exclusive(); + if (is_exclusive != null) { + stmt.bindLong(19, is_exclusive ? 1L: 0L); + } } @Override @@ -191,6 +222,27 @@ public class AdvertiseDao extends AbstractDao { } stmt.bindLong(13, entity.getIsDownloaded() ? 1L: 0L); stmt.bindLong(14, entity.getIsDownloading() ? 1L: 0L); + stmt.bindLong(15, entity.getPlay_numbers()); + + Boolean isCount = entity.getIsCount(); + if (isCount != null) { + stmt.bindLong(16, isCount ? 1L: 0L); + } + + String mxkl_url = entity.getMxkl_url(); + if (mxkl_url != null) { + stmt.bindString(17, mxkl_url); + } + + Boolean isTimedAd = entity.getIsTimedAd(); + if (isTimedAd != null) { + stmt.bindLong(18, isTimedAd ? 1L: 0L); + } + + Boolean is_exclusive = entity.getIs_exclusive(); + if (is_exclusive != null) { + stmt.bindLong(19, is_exclusive ? 1L: 0L); + } } @Override @@ -214,7 +266,12 @@ public class AdvertiseDao extends AbstractDao { cursor.isNull(offset + 10) ? null : cursor.getDouble(offset + 10), // longitude cursor.isNull(offset + 11) ? null : cursor.getDouble(offset + 11), // latitude cursor.getShort(offset + 12) != 0, // isDownloaded - cursor.getShort(offset + 13) != 0 // isDownloading + cursor.getShort(offset + 13) != 0, // isDownloading + cursor.getInt(offset + 14), // play_numbers + cursor.isNull(offset + 15) ? null : cursor.getShort(offset + 15) != 0, // isCount + cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16), // mxkl_url + cursor.isNull(offset + 17) ? null : cursor.getShort(offset + 17) != 0, // isTimedAd + cursor.isNull(offset + 18) ? null : cursor.getShort(offset + 18) != 0 // is_exclusive ); return entity; } @@ -235,6 +292,11 @@ public class AdvertiseDao extends AbstractDao { entity.setLatitude(cursor.isNull(offset + 11) ? null : cursor.getDouble(offset + 11)); entity.setIsDownloaded(cursor.getShort(offset + 12) != 0); entity.setIsDownloading(cursor.getShort(offset + 13) != 0); + entity.setPlay_numbers(cursor.getInt(offset + 14)); + entity.setIsCount(cursor.isNull(offset + 15) ? null : cursor.getShort(offset + 15) != 0); + entity.setMxkl_url(cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16)); + entity.setIsTimedAd(cursor.isNull(offset + 17) ? null : cursor.getShort(offset + 17) != 0); + entity.setIs_exclusive(cursor.isNull(offset + 18) ? null : cursor.getShort(offset + 18) != 0); } @Override diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoMaster.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoMaster.java index ac4946b..5ac1672 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoMaster.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoMaster.java @@ -14,10 +14,10 @@ import org.greenrobot.greendao.identityscope.IdentityScopeType; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. /** - * Master of DAO (schema version 35): knows all DAOs. + * Master of DAO (schema version 42): knows all DAOs. */ public class DaoMaster extends AbstractDaoMaster { - public static final int SCHEMA_VERSION = 35; + public static final int SCHEMA_VERSION = 42; /** Creates underlying database table using DAOs. */ public static void createAllTables(Database db, boolean ifNotExists) { @@ -30,6 +30,8 @@ public class DaoMaster extends AbstractDaoMaster { PositionAdvertiseDao.createTable(db, ifNotExists); RegionsDao.createTable(db, ifNotExists); SanleAdvertiseDao.createTable(db, ifNotExists); + ScheduleDao.createTable(db, ifNotExists); + SectionDao.createTable(db, ifNotExists); TextInfoDao.createTable(db, ifNotExists); TimeSpanDao.createTable(db, ifNotExists); } @@ -45,6 +47,8 @@ public class DaoMaster extends AbstractDaoMaster { PositionAdvertiseDao.dropTable(db, ifExists); RegionsDao.dropTable(db, ifExists); SanleAdvertiseDao.dropTable(db, ifExists); + ScheduleDao.dropTable(db, ifExists); + SectionDao.dropTable(db, ifExists); TextInfoDao.dropTable(db, ifExists); TimeSpanDao.dropTable(db, ifExists); } @@ -74,6 +78,8 @@ public class DaoMaster extends AbstractDaoMaster { registerDaoClass(PositionAdvertiseDao.class); registerDaoClass(RegionsDao.class); registerDaoClass(SanleAdvertiseDao.class); + registerDaoClass(ScheduleDao.class); + registerDaoClass(SectionDao.class); registerDaoClass(TextInfoDao.class); registerDaoClass(TimeSpanDao.class); } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoSession.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoSession.java index 3c2e34c..c77101d 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoSession.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoSession.java @@ -17,6 +17,8 @@ import cn.trans88.taxiappkotlin.logic.model.PlayLogger; import cn.trans88.taxiappkotlin.logic.model.PositionAdvertise; import cn.trans88.taxiappkotlin.logic.model.Regions; import cn.trans88.taxiappkotlin.logic.model.SanleAdvertise; +import cn.trans88.taxiappkotlin.logic.model.Schedule; +import cn.trans88.taxiappkotlin.logic.model.Section; import cn.trans88.taxiappkotlin.logic.model.TextInfo; import cn.trans88.taxiappkotlin.logic.model.TimeSpan; @@ -29,6 +31,8 @@ import cn.trans88.taxiappkotlin.logic.dao.PlayLoggerDao; import cn.trans88.taxiappkotlin.logic.dao.PositionAdvertiseDao; import cn.trans88.taxiappkotlin.logic.dao.RegionsDao; import cn.trans88.taxiappkotlin.logic.dao.SanleAdvertiseDao; +import cn.trans88.taxiappkotlin.logic.dao.ScheduleDao; +import cn.trans88.taxiappkotlin.logic.dao.SectionDao; import cn.trans88.taxiappkotlin.logic.dao.TextInfoDao; import cn.trans88.taxiappkotlin.logic.dao.TimeSpanDao; @@ -50,6 +54,8 @@ public class DaoSession extends AbstractDaoSession { private final DaoConfig positionAdvertiseDaoConfig; private final DaoConfig regionsDaoConfig; private final DaoConfig sanleAdvertiseDaoConfig; + private final DaoConfig scheduleDaoConfig; + private final DaoConfig sectionDaoConfig; private final DaoConfig textInfoDaoConfig; private final DaoConfig timeSpanDaoConfig; @@ -62,6 +68,8 @@ public class DaoSession extends AbstractDaoSession { private final PositionAdvertiseDao positionAdvertiseDao; private final RegionsDao regionsDao; private final SanleAdvertiseDao sanleAdvertiseDao; + private final ScheduleDao scheduleDao; + private final SectionDao sectionDao; private final TextInfoDao textInfoDao; private final TimeSpanDao timeSpanDao; @@ -96,6 +104,12 @@ public class DaoSession extends AbstractDaoSession { sanleAdvertiseDaoConfig = daoConfigMap.get(SanleAdvertiseDao.class).clone(); sanleAdvertiseDaoConfig.initIdentityScope(type); + scheduleDaoConfig = daoConfigMap.get(ScheduleDao.class).clone(); + scheduleDaoConfig.initIdentityScope(type); + + sectionDaoConfig = daoConfigMap.get(SectionDao.class).clone(); + sectionDaoConfig.initIdentityScope(type); + textInfoDaoConfig = daoConfigMap.get(TextInfoDao.class).clone(); textInfoDaoConfig.initIdentityScope(type); @@ -111,6 +125,8 @@ public class DaoSession extends AbstractDaoSession { positionAdvertiseDao = new PositionAdvertiseDao(positionAdvertiseDaoConfig, this); regionsDao = new RegionsDao(regionsDaoConfig, this); sanleAdvertiseDao = new SanleAdvertiseDao(sanleAdvertiseDaoConfig, this); + scheduleDao = new ScheduleDao(scheduleDaoConfig, this); + sectionDao = new SectionDao(sectionDaoConfig, this); textInfoDao = new TextInfoDao(textInfoDaoConfig, this); timeSpanDao = new TimeSpanDao(timeSpanDaoConfig, this); @@ -123,6 +139,8 @@ public class DaoSession extends AbstractDaoSession { registerDao(PositionAdvertise.class, positionAdvertiseDao); registerDao(Regions.class, regionsDao); registerDao(SanleAdvertise.class, sanleAdvertiseDao); + registerDao(Schedule.class, scheduleDao); + registerDao(Section.class, sectionDao); registerDao(TextInfo.class, textInfoDao); registerDao(TimeSpan.class, timeSpanDao); } @@ -137,6 +155,8 @@ public class DaoSession extends AbstractDaoSession { positionAdvertiseDaoConfig.clearIdentityScope(); regionsDaoConfig.clearIdentityScope(); sanleAdvertiseDaoConfig.clearIdentityScope(); + scheduleDaoConfig.clearIdentityScope(); + sectionDaoConfig.clearIdentityScope(); textInfoDaoConfig.clearIdentityScope(); timeSpanDaoConfig.clearIdentityScope(); } @@ -177,6 +197,14 @@ public class DaoSession extends AbstractDaoSession { return sanleAdvertiseDao; } + public ScheduleDao getScheduleDao() { + return scheduleDao; + } + + public SectionDao getSectionDao() { + return sectionDao; + } + public TextInfoDao getTextInfoDao() { return textInfoDao; } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoUtil.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoUtil.kt index e65ba73..aa8956c 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoUtil.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/DaoUtil.kt @@ -3,6 +3,7 @@ package cn.trans88.taxiappkotlin.logic.dao //import cn.trans88.taxiappkotlin.entity.Advertise import android.database.sqlite.SQLiteDatabase import cn.trans88.taxiappkotlin.TaxiApp +import cn.trans88.taxiappkotlin.ext.logd import cn.trans88.taxiappkotlin.logic.model.* import cn.trans88.taxiappkotlin.ui.advertise.AdvertiseType import org.greenrobot.greendao.database.Database @@ -77,6 +78,9 @@ object DaoUtil { @Synchronized fun getTimeSpan(): TimeSpanDao = daoMaster.newSession().timeSpanDao + @Synchronized + fun getSchedule(): ScheduleDao = daoMaster.newSession().scheduleDao + @Synchronized fun getPositionAdvertises(): List = daoMaster.newSession().positionAdvertiseDao.loadAll() @@ -151,4 +155,21 @@ object DaoUtil { } } } + + /** + * 更新广告数据 + * @param advertise Advertise + */ + @Synchronized + fun updatePlayNumbers(advertise: Advertise){ + "更新广告数据".logd("Repository") + val oldAdvertise: Advertise? = DaoUtil.getAdvertise().queryBuilder() + .where(AdvertiseDao.Properties.Ad_id.eq(advertise.ad_id)).build() + .unique() + if (oldAdvertise!=null){ + oldAdvertise.play_numbers = advertise.play_numbers + DaoUtil.getAdvertise().insertOrReplace(oldAdvertise) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SanleAdvertiseDao.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SanleAdvertiseDao.java index a86b94e..11fc4be 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SanleAdvertiseDao.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SanleAdvertiseDao.java @@ -33,6 +33,11 @@ public class SanleAdvertiseDao extends AbstractDao { public final static Property PathName = new Property(6, String.class, "pathName", false, "PATH_NAME"); public final static Property Duration = new Property(7, String.class, "duration", false, "DURATION"); public final static Property CreateAt = new Property(8, Long.class, "createAt", false, "CREATE_AT"); + public final static Property Play_numbers = new Property(9, int.class, "play_numbers", false, "PLAY_NUMBERS"); + public final static Property IsCount = new Property(10, Boolean.class, "isCount", false, "IS_COUNT"); + public final static Property Mxkl_url = new Property(11, String.class, "mxkl_url", false, "MXKL_URL"); + public final static Property IsTimedAd = new Property(12, Boolean.class, "isTimedAd", false, "IS_TIMED_AD"); + public final static Property Is_exclusive = new Property(13, Boolean.class, "is_exclusive", false, "IS_EXCLUSIVE"); } @@ -56,7 +61,12 @@ public class SanleAdvertiseDao extends AbstractDao { "\"MEDIA_URL\" TEXT," + // 5: media_url "\"PATH_NAME\" TEXT," + // 6: pathName "\"DURATION\" TEXT," + // 7: duration - "\"CREATE_AT\" INTEGER);"); // 8: createAt + "\"CREATE_AT\" INTEGER," + // 8: createAt + "\"PLAY_NUMBERS\" INTEGER NOT NULL ," + // 9: play_numbers + "\"IS_COUNT\" INTEGER," + // 10: isCount + "\"MXKL_URL\" TEXT," + // 11: mxkl_url + "\"IS_TIMED_AD\" INTEGER," + // 12: isTimedAd + "\"IS_EXCLUSIVE\" INTEGER);"); // 13: is_exclusive } /** Drops the underlying database table. */ @@ -105,6 +115,27 @@ public class SanleAdvertiseDao extends AbstractDao { if (createAt != null) { stmt.bindLong(9, createAt); } + stmt.bindLong(10, entity.getPlay_numbers()); + + Boolean isCount = entity.getIsCount(); + if (isCount != null) { + stmt.bindLong(11, isCount ? 1L: 0L); + } + + String mxkl_url = entity.getMxkl_url(); + if (mxkl_url != null) { + stmt.bindString(12, mxkl_url); + } + + Boolean isTimedAd = entity.getIsTimedAd(); + if (isTimedAd != null) { + stmt.bindLong(13, isTimedAd ? 1L: 0L); + } + + Boolean is_exclusive = entity.getIs_exclusive(); + if (is_exclusive != null) { + stmt.bindLong(14, is_exclusive ? 1L: 0L); + } } @Override @@ -147,6 +178,27 @@ public class SanleAdvertiseDao extends AbstractDao { if (createAt != null) { stmt.bindLong(9, createAt); } + stmt.bindLong(10, entity.getPlay_numbers()); + + Boolean isCount = entity.getIsCount(); + if (isCount != null) { + stmt.bindLong(11, isCount ? 1L: 0L); + } + + String mxkl_url = entity.getMxkl_url(); + if (mxkl_url != null) { + stmt.bindString(12, mxkl_url); + } + + Boolean isTimedAd = entity.getIsTimedAd(); + if (isTimedAd != null) { + stmt.bindLong(13, isTimedAd ? 1L: 0L); + } + + Boolean is_exclusive = entity.getIs_exclusive(); + if (is_exclusive != null) { + stmt.bindLong(14, is_exclusive ? 1L: 0L); + } } @Override @@ -165,7 +217,12 @@ public class SanleAdvertiseDao extends AbstractDao { cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5), // media_url cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6), // pathName cursor.isNull(offset + 7) ? null : cursor.getString(offset + 7), // duration - cursor.isNull(offset + 8) ? null : cursor.getLong(offset + 8) // createAt + cursor.isNull(offset + 8) ? null : cursor.getLong(offset + 8), // createAt + cursor.getInt(offset + 9), // play_numbers + cursor.isNull(offset + 10) ? null : cursor.getShort(offset + 10) != 0, // isCount + cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11), // mxkl_url + cursor.isNull(offset + 12) ? null : cursor.getShort(offset + 12) != 0, // isTimedAd + cursor.isNull(offset + 13) ? null : cursor.getShort(offset + 13) != 0 // is_exclusive ); return entity; } @@ -181,6 +238,11 @@ public class SanleAdvertiseDao extends AbstractDao { entity.setPathName(cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6)); entity.setDuration(cursor.isNull(offset + 7) ? null : cursor.getString(offset + 7)); entity.setCreateAt(cursor.isNull(offset + 8) ? null : cursor.getLong(offset + 8)); + entity.setPlay_numbers(cursor.getInt(offset + 9)); + entity.setIsCount(cursor.isNull(offset + 10) ? null : cursor.getShort(offset + 10) != 0); + entity.setMxkl_url(cursor.isNull(offset + 11) ? null : cursor.getString(offset + 11)); + entity.setIsTimedAd(cursor.isNull(offset + 12) ? null : cursor.getShort(offset + 12) != 0); + entity.setIs_exclusive(cursor.isNull(offset + 13) ? null : cursor.getShort(offset + 13) != 0); } @Override diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/ScheduleDao.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/ScheduleDao.java new file mode 100644 index 0000000..a48a312 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/ScheduleDao.java @@ -0,0 +1,171 @@ +package cn.trans88.taxiappkotlin.logic.dao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.internal.DaoConfig; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; + +import cn.trans88.taxiappkotlin.logic.model.Schedule; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SCHEDULE". +*/ +public class ScheduleDao extends AbstractDao { + + public static final String TABLENAME = "SCHEDULE"; + + /** + * Properties of entity Schedule.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property AdvertiseId = new Property(1, String.class, "advertiseId", false, "ADVERTISE_ID"); + public final static Property Start_time = new Property(2, Long.class, "start_time", false, "START_TIME"); + public final static Property End_time = new Property(3, Long.class, "end_time", false, "END_TIME"); + public final static Property WeekDayString = new Property(4, String.class, "weekDayString", false, "WEEK_DAY_STRING"); + } + + + public ScheduleDao(DaoConfig config) { + super(config); + } + + public ScheduleDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SCHEDULE\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"ADVERTISE_ID\" TEXT," + // 1: advertiseId + "\"START_TIME\" INTEGER," + // 2: start_time + "\"END_TIME\" INTEGER," + // 3: end_time + "\"WEEK_DAY_STRING\" TEXT);"); // 4: weekDayString + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SCHEDULE\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, Schedule entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String advertiseId = entity.getAdvertiseId(); + if (advertiseId != null) { + stmt.bindString(2, advertiseId); + } + + Long start_time = entity.getStart_time(); + if (start_time != null) { + stmt.bindLong(3, start_time); + } + + Long end_time = entity.getEnd_time(); + if (end_time != null) { + stmt.bindLong(4, end_time); + } + + String weekDayString = entity.getWeekDayString(); + if (weekDayString != null) { + stmt.bindString(5, weekDayString); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, Schedule entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String advertiseId = entity.getAdvertiseId(); + if (advertiseId != null) { + stmt.bindString(2, advertiseId); + } + + Long start_time = entity.getStart_time(); + if (start_time != null) { + stmt.bindLong(3, start_time); + } + + Long end_time = entity.getEnd_time(); + if (end_time != null) { + stmt.bindLong(4, end_time); + } + + String weekDayString = entity.getWeekDayString(); + if (weekDayString != null) { + stmt.bindString(5, weekDayString); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public Schedule readEntity(Cursor cursor, int offset) { + Schedule entity = new Schedule( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // advertiseId + cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2), // start_time + cursor.isNull(offset + 3) ? null : cursor.getLong(offset + 3), // end_time + cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4) // weekDayString + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, Schedule entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setAdvertiseId(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setStart_time(cursor.isNull(offset + 2) ? null : cursor.getLong(offset + 2)); + entity.setEnd_time(cursor.isNull(offset + 3) ? null : cursor.getLong(offset + 3)); + entity.setWeekDayString(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4)); + } + + @Override + protected final Long updateKeyAfterInsert(Schedule entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(Schedule entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(Schedule entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SectionDao.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SectionDao.java new file mode 100644 index 0000000..d50d312 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/dao/SectionDao.java @@ -0,0 +1,143 @@ +package cn.trans88.taxiappkotlin.logic.dao; + +import android.database.Cursor; +import android.database.sqlite.SQLiteStatement; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.Property; +import org.greenrobot.greendao.internal.DaoConfig; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.database.DatabaseStatement; + +import cn.trans88.taxiappkotlin.logic.model.Section; + +// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. +/** + * DAO for table "SECTION". +*/ +public class SectionDao extends AbstractDao { + + public static final String TABLENAME = "SECTION"; + + /** + * Properties of entity Section.
+ * Can be used for QueryBuilder and for referencing column names. + */ + public static class Properties { + public final static Property Id = new Property(0, Long.class, "id", true, "_id"); + public final static Property AdvertiseId = new Property(1, String.class, "advertiseId", false, "ADVERTISE_ID"); + public final static Property WeekDay = new Property(2, Integer.class, "weekDay", false, "WEEK_DAY"); + } + + + public SectionDao(DaoConfig config) { + super(config); + } + + public SectionDao(DaoConfig config, DaoSession daoSession) { + super(config, daoSession); + } + + /** Creates the underlying database table. */ + public static void createTable(Database db, boolean ifNotExists) { + String constraint = ifNotExists? "IF NOT EXISTS ": ""; + db.execSQL("CREATE TABLE " + constraint + "\"SECTION\" (" + // + "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT ," + // 0: id + "\"ADVERTISE_ID\" TEXT," + // 1: advertiseId + "\"WEEK_DAY\" INTEGER);"); // 2: weekDay + } + + /** Drops the underlying database table. */ + public static void dropTable(Database db, boolean ifExists) { + String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"SECTION\""; + db.execSQL(sql); + } + + @Override + protected final void bindValues(DatabaseStatement stmt, Section entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String advertiseId = entity.getAdvertiseId(); + if (advertiseId != null) { + stmt.bindString(2, advertiseId); + } + + Integer weekDay = entity.getWeekDay(); + if (weekDay != null) { + stmt.bindLong(3, weekDay); + } + } + + @Override + protected final void bindValues(SQLiteStatement stmt, Section entity) { + stmt.clearBindings(); + + Long id = entity.getId(); + if (id != null) { + stmt.bindLong(1, id); + } + + String advertiseId = entity.getAdvertiseId(); + if (advertiseId != null) { + stmt.bindString(2, advertiseId); + } + + Integer weekDay = entity.getWeekDay(); + if (weekDay != null) { + stmt.bindLong(3, weekDay); + } + } + + @Override + public Long readKey(Cursor cursor, int offset) { + return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0); + } + + @Override + public Section readEntity(Cursor cursor, int offset) { + Section entity = new Section( // + cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id + cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // advertiseId + cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2) // weekDay + ); + return entity; + } + + @Override + public void readEntity(Cursor cursor, Section entity, int offset) { + entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0)); + entity.setAdvertiseId(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1)); + entity.setWeekDay(cursor.isNull(offset + 2) ? null : cursor.getInt(offset + 2)); + } + + @Override + protected final Long updateKeyAfterInsert(Section entity, long rowId) { + entity.setId(rowId); + return rowId; + } + + @Override + public Long getKey(Section entity) { + if(entity != null) { + return entity.getId(); + } else { + return null; + } + } + + @Override + public boolean hasKey(Section entity) { + return entity.getId() != null; + } + + @Override + protected final boolean isEntityUpdateable() { + return true; + } + +} diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/gps/GpsReceiver.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/gps/GpsReceiver.kt index 9767494..7f3a256 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/gps/GpsReceiver.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/gps/GpsReceiver.kt @@ -3,9 +3,11 @@ package cn.trans88.taxiappkotlin.logic.gps import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import cn.trans88.taxiappkotlin.ext.loge import cn.trans88.taxiappkotlin.util.YoungUtil class GpsReceiver : BroadcastReceiver() { + companion object{ private var gpsListener:GpsInformationListener? =null @@ -16,8 +18,11 @@ class GpsReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action =="com.xixun.joey.gpsinfo"){ + //经度 val lat = intent.getDoubleExtra("latitude", 0.0); + //纬度 val lng = intent.getDoubleExtra("longitude", 0.0); + "收到gps坐标广播信息:经度:$lat,纬度:$lng".loge() val satelliteNumber = intent.getIntExtra("satelliteNumber", 0); val speed = intent.getFloatExtra("speed", 0f) //YoungUtil.YoungLog("广播接收坐标信息:lat:$lat,lng:$lng,satell:$satelliteNumber,speed:$speed") diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Advertise.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Advertise.java index 9848aa9..a7e9473 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Advertise.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Advertise.java @@ -27,9 +27,58 @@ public class Advertise implements Serializable { private Double longitude=0.0; private Double latitude=0.0; + private boolean isDownloaded=false; private boolean isDownloading=false; + //新加字段,代表播放次数 + private int play_numbers; + //是否计次 + private Boolean isCount = false; + //新的下载地址 + private String mxkl_url; + + //是否是分时段广告 + private Boolean isTimedAd = false; + //如果false,代表轮播,如果true,就是独享 + private Boolean is_exclusive = false; + + public Boolean getIs_exclusive() { + return is_exclusive; + } + + public void setIs_exclusive(Boolean is_exclusive) { + this.is_exclusive = is_exclusive; + } + + //分时段播放的json + @Transient + private List time_section; + + public List getTime_section() { + return time_section; + } + + public void setTime_section(List time_section) { + this.time_section = time_section; + } + + public int getPlay_numbers() { + return play_numbers; + } + + public void setPlay_numbers(int play_numbers) { + this.play_numbers = play_numbers; + } + + public String getMxkl_url() { + return mxkl_url; + } + + public void setMxkl_url(String mxkl_url) { + this.mxkl_url = mxkl_url; + } + @Transient private List regions; @@ -39,12 +88,13 @@ public class Advertise implements Serializable { @Transient private boolean isLast=false; - //更新数据库时,带Generated标签的方法要删除重新创建 - @Generated(hash = 1676323656) + @Generated(hash = 2002231375) public Advertise(Long autoId, String id, int belongTo, int media_type, String media_url, String ad_id, String region_id, String pathName, String duration, Long createAt, Double longitude, Double latitude, - boolean isDownloaded, boolean isDownloading) { + boolean isDownloaded, boolean isDownloading, int play_numbers, + Boolean isCount, String mxkl_url, Boolean isTimedAd, + Boolean is_exclusive) { this.autoId = autoId; this.id = id; this.belongTo = belongTo; @@ -59,13 +109,17 @@ public class Advertise implements Serializable { this.latitude = latitude; this.isDownloaded = isDownloaded; this.isDownloading = isDownloading; + this.play_numbers = play_numbers; + this.isCount = isCount; + this.mxkl_url = mxkl_url; + this.isTimedAd = isTimedAd; + this.is_exclusive = is_exclusive; } @Generated(hash = 1516411721) public Advertise() { } - public List getTime_Span() { return time_span; } @@ -207,8 +261,7 @@ public class Advertise implements Serializable { @Override public String toString() { return "Advertise{" + - "autoId=" + autoId + - ", id='" + id + '\'' + + "id='" + id + '\'' + ", belongTo=" + belongTo + ", media_type=" + media_type + ", media_url='" + media_url + '\'' + @@ -220,8 +273,13 @@ public class Advertise implements Serializable { ", longitude=" + longitude + ", latitude=" + latitude + ", isDownloaded=" + isDownloaded + + ", isDownloading=" + isDownloading + + ", play_numbers=" + play_numbers + + ", isCount=" + isCount + + ", mxkl_url='" + mxkl_url + '\'' + + ", isTimedAd=" + isTimedAd + + ", TimeSection=" + time_section + ", regions=" + regions + - ", time_span=" + time_span + ", isLast=" + isLast + '}'; } @@ -233,4 +291,20 @@ public class Advertise implements Serializable { public void setIsDownloading(boolean isDownloading) { this.isDownloading = isDownloading; } + + public boolean getIsCount() { + return this.isCount; + } + + public void setIsCount(Boolean isCount) { + this.isCount = isCount; + } + + public Boolean getIsTimedAd() { + return this.isTimedAd; + } + + public void setIsTimedAd(Boolean isTimedAd) { + this.isTimedAd = isTimedAd; + } } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/PositionAdvertise.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/PositionAdvertise.java index 23f8682..b41c16b 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/PositionAdvertise.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/PositionAdvertise.java @@ -8,17 +8,27 @@ import org.greenrobot.greendao.annotation.Transient; import java.io.Serializable; import java.util.List; +/** + * 定点广告 + */ @Entity public class PositionAdvertise implements Serializable { private static final long serialVersionUID = 1L; @Id(autoincrement = true) private Long autoId; + //广告id private String id; + //广告类型(比如定点,分组,计数...) private int belongTo;//0 -idle 、1-Normal 2、。。。 + //媒体类型(图片,gif图,视频) private int media_type; + //广告的下载地址 private String media_url; + //任务id private String task_id; + //广告保存路径 private String pathName; + //广告每次播放的持续时间 private String duration; @Transient diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/SanleAdvertise.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/SanleAdvertise.java index 2be8af4..bb34223 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/SanleAdvertise.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/SanleAdvertise.java @@ -20,14 +20,71 @@ public class SanleAdvertise { private String duration; private Long createAt; + //新加字段,代表播放次数 + private int play_numbers; + //是否计次 + private Boolean isCount = false; + + //新的下载地址 + private String mxkl_url; + + //是否是分时段广告 + private Boolean isTimedAd = false; + //如果false,代表轮播,如果true,就是独享 + private Boolean is_exclusive = false; + + public Boolean getIs_exclusive() { + return is_exclusive; + } + + public void setIs_exclusive(Boolean is_exclusive) { + this.is_exclusive = is_exclusive; + } + + //分时段播放的json + @Transient + private List time_section; + + public Boolean getTimedAd() { + return isTimedAd; + } + + public void setTimedAd(Boolean timedAd) { + isTimedAd = timedAd; + } + + public List getTime_section() { + return time_section; + } + + public void setTime_section(List time_section) { + this.time_section = time_section; + } + + public int getPlay_numbers() { + return play_numbers; + } + + public void setPlay_numbers(int play_numbers) { + this.play_numbers = play_numbers; + } + + public String getMxkl_url() { + return mxkl_url; + } + + public void setMxkl_url(String mxkl_url) { + this.mxkl_url = mxkl_url; + } @Transient private List time_span; - @Generated(hash = 1955420225) + @Generated(hash = 376068790) public SanleAdvertise(Long AutoId, String id, String task_id, int belongTo, int media_type, String media_url, String pathName, String duration, - Long createAt) { + Long createAt, int play_numbers, Boolean isCount, String mxkl_url, + Boolean isTimedAd, Boolean is_exclusive) { this.AutoId = AutoId; this.id = id; this.task_id = task_id; @@ -37,12 +94,19 @@ public class SanleAdvertise { this.pathName = pathName; this.duration = duration; this.createAt = createAt; + this.play_numbers = play_numbers; + this.isCount = isCount; + this.mxkl_url = mxkl_url; + this.isTimedAd = isTimedAd; + this.is_exclusive = is_exclusive; } @Generated(hash = 440435512) public SanleAdvertise() { } + + public List getTime_span() { return time_span; } @@ -123,7 +187,6 @@ public class SanleAdvertise { this.createAt = createAt; } - @Override public String toString() { return "SanleAdvertise{" + @@ -136,7 +199,28 @@ public class SanleAdvertise { ", pathName='" + pathName + '\'' + ", duration='" + duration + '\'' + ", createAt=" + createAt + + ", play_numbers=" + play_numbers + + ", isCount=" + isCount + + ", mxkl_url='" + mxkl_url + '\'' + + ", isTimedAd=" + isTimedAd + + ", TimeSection=" + time_section + ", time_span=" + time_span + '}'; } + + public boolean getIsCount() { + return this.isCount; + } + + public void setIsCount(Boolean isCount) { + this.isCount = isCount; + } + + public Boolean getIsTimedAd() { + return this.isTimedAd; + } + + public void setIsTimedAd(Boolean isTimedAd) { + this.isTimedAd = isTimedAd; + } } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Schedule.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Schedule.java new file mode 100644 index 0000000..ddb0195 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Schedule.java @@ -0,0 +1,101 @@ +package cn.trans88.taxiappkotlin.logic.model; + +import android.util.Log; + +import com.google.gson.Gson; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Transient; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import org.greenrobot.greendao.annotation.Generated; + +/** + * @Author: LJH + * @Time: 2023/2/15 + * @description: + */ +@Entity +public class Schedule implements Serializable{ + + private static final long serialVersionUID = 6L; + + @Id(autoincrement = true) + private Long id; + private String advertiseId; + //星期几 1-7 + private Long start_time; + private Long end_time; + + private String weekDayString; + @Transient + private List week_day; + + + @Generated(hash = 65323922) + public Schedule(Long id, String advertiseId, Long start_time, Long end_time, + String weekDayString) { + this.id = id; + this.advertiseId = advertiseId; + this.start_time = start_time; + this.end_time = end_time; + this.weekDayString = weekDayString; + } + + @Generated(hash = 729319394) + public Schedule() { + } + + + public String getWeekDayString() { + return weekDayString; + } + + public void setWeekDayString(String weekDayString) { + this.weekDayString = weekDayString; + } + + public List getWeek_day() { + return week_day; + } + + public void setWeek_day(List week_day) { + this.week_day = week_day; + } + + public String getAdvertiseId() { + return advertiseId; + } + + public void setAdvertiseId(String advertiseId) { + this.advertiseId = advertiseId; + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getStart_time() { + return this.start_time; + } + + public void setStart_time(Long start_time) { + this.start_time = start_time; + } + + public Long getEnd_time() { + return this.end_time; + } + + public void setEnd_time(Long end_time) { + this.end_time = end_time; + } +} diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Section.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Section.java new file mode 100644 index 0000000..b4fc776 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/model/Section.java @@ -0,0 +1,69 @@ +package cn.trans88.taxiappkotlin.logic.model; + +import androidx.annotation.Nullable; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Id; + +import java.io.Serializable; +import java.util.Objects; + +import org.greenrobot.greendao.annotation.Generated; + +/** + * @Author: LJH + * @Time: 2023/2/15 + * @description:时间段 + */ +@Entity +public class Section { + @Id(autoincrement = true) + private Long id; + private String advertiseId; + private Integer weekDay; + + @Generated(hash = 1952141832) + public Section(Long id, String advertiseId, Integer weekDay) { + this.id = id; + this.advertiseId = advertiseId; + this.weekDay = weekDay; + } + + @Generated(hash = 111791983) + public Section() { + } + + public String getAdvertiseId() { + return advertiseId; + } + + public void setAdvertiseId(String advertiseId) { + this.advertiseId = advertiseId; + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getWeekDay() { + return this.weekDay; + } + + public void setWeekDay(Integer weekDay) { + this.weekDay = weekDay; + } + + @Override + public boolean equals(@Nullable Object obj) { + return Objects.equals(this.weekDay, ((Section) obj).getWeekDay()); + } + + @Override + public int hashCode() { + return this.getWeekDay(); + } +} diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ConnManger.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ConnManger.kt index 6b5ef46..b2319fa 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ConnManger.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ConnManger.kt @@ -1,5 +1,6 @@ package cn.trans88.taxiappkotlin.logic.network +import android.annotation.SuppressLint import android.os.Looper import android.os.RemoteException import cn.trans88.kurotool.net.rx.BaseObserver @@ -7,16 +8,25 @@ import cn.trans88.kurotool.net.rx.RxRestClient import cn.trans88.kurotool.util.ThreadUtil import cn.trans88.taxiappkotlin.Configurations import cn.trans88.taxiappkotlin.TaxiApp +import cn.trans88.taxiappkotlin.ext.fromJson +import cn.trans88.taxiappkotlin.ext.logd +import cn.trans88.taxiappkotlin.ext.loge +import cn.trans88.taxiappkotlin.logic.Repository +import cn.trans88.taxiappkotlin.logic.Repository.taxiApp import cn.trans88.taxiappkotlin.logic.dao.DaoUtil import cn.trans88.taxiappkotlin.logic.model.* import cn.trans88.taxiappkotlin.play.RefreshPlayer +import cn.trans88.taxiappkotlin.ui.play.PlayActivity import cn.trans88.taxiappkotlin.util.KuroTimer import cn.trans88.taxiappkotlin.util.KuroTimerTask import cn.trans88.taxiappkotlin.util.YoungUtil import cn.trans88.taxiappkotlin.util.checkAppToken import cn.trans88.taxiappkotlin.xixunUtil.Xixun +import com.alibaba.fastjson.JSON import com.amused.joey.DelayTimer import com.google.gson.Gson +import com.google.gson.JsonObject +import com.google.gson.JsonParser import com.trs88.kurolibrary.execute.KuroExecutor import com.trs88.kurolibrary.file.KuroFileUtil import com.trs88.kurolibrary.file.PostFileCallBack @@ -27,6 +37,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.asRequestBody import java.io.File import java.io.IOException +import java.util.concurrent.ThreadPoolExecutor /** * @author TRS @@ -34,6 +45,7 @@ import java.io.IOException */ object ConnManger { // private val handler =Handler() + var testToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiNWY5ZmE0ZTI1NzIzMDkzZGM5MGMwYTA0IiwiZ3JvdXBfaWQiOiI2MmNmZGUzMzU3MjMwOTQ1NDM3MGFjNjIiLCJ1c2VyX2lkIjoiNjMyN2Q5NmI1NzIzMDkxYmJhZTM2MTkyIn0.6fQ1PsV3FM_C-I7yVd_7VpQIwLLMofF-8bKerpXmq_M" @Volatile var isRegisterSuccess = false @@ -46,6 +58,7 @@ object ConnManger { * 注册App */ fun registerApp() { + KuroExecutor.execute(Runnable { YoungUtil.YoungLog("registerApp") var baseUrl = "" @@ -89,9 +102,11 @@ object ConnManger { client.setURL("register") // .setBaseUrl("${Settings.taxiBaseUrl}v1/cms/taxi/") +// .setBaseUrl("${baseUrl}v1/cms/taxi/") .setBaseUrl("${baseUrl}v1/cms/taxi/") .setBody(body) .setHeader("Authorization", "Bearer ${Configurations.config(TaxiApp.instance()).registerToken()}") +// .setHeader("Authorization", "Bearer $testToken") // .setHeader("IsFirstRegister",TaxiApp.isFirstRegister.toString()) .setHeader("IsFirstRegister", Configurations.config(TaxiApp.instance()).isFirstRegister().toString()) //todo 如果解析的对象的属性有为空的赋值比如之前的upload_debug_file_url暂时还没有数据,会抛出解析错误异常 @@ -106,6 +121,8 @@ object ConnManger { Configurations.config(TaxiApp.instance()).isFirstRegisterSave(false); YoungUtil.YoungLog("注册请求成功${registerResponse}") + YoungUtil.YoungLog("baseUrl:${baseUrl}") + YoungUtil.YoungLog("taxi_service_url:${registerResponse.taxi_service_url}") //Settings.appToken = registerResponse.token Configurations.config(TaxiApp.instance()).appTokenSave(registerResponse.token) //Settings.taxiServiceUrl = registerResponse.taxi_service_url @@ -138,6 +155,7 @@ object ConnManger { override fun onFailed(msg: String?) { YoungUtil.YoungLog("注册失败,重新开始注册:$msg") + YoungUtil.YoungLog("baseUrl:$baseUrl") isRegisterSuccess = false // val timer = Timer() DelayTimer.timer({ registerApp() }, 4000) @@ -267,6 +285,120 @@ object ConnManger { }) } + /** + * 播放次数到了,发送终止广告指令 + */ + fun sendOfflineAd(ad_id:String) { + val serverUrl = Configurations.config(TaxiApp.instance()).taxiServiceUrl() + val baseUrl = if (serverUrl.contains("taxihub.cn")){ +// "https://taxihub.cn:2346" + "http://taxihub.cn:2346" + } else { + "https://ledaips.com:2341" + } + KuroExecutor.execute(Runnable { + YoungUtil.YoungLog("sendOfflineAd in MainThread is ${Looper.getMainLooper().thread === Thread.currentThread()}") + val deleteAdvertiseBean = DeleteAdvertiseBean() + deleteAdvertiseBean.ad_id = ad_id + val task = ProcessingCommands.gson.toJson(deleteAdvertiseBean) + val baseTask = BaseTask() + baseTask.type = "offline_group_ad" + baseTask.task = JsonParser().parse(task).asJsonObject + val requestJson: String = ProcessingCommands.gson.toJson(baseTask) +// requestJson.loge() + + val parse = ("application/json;charset=UTF-8").toMediaTypeOrNull() + val body = RequestBody.create(parse, requestJson) + + val okHttpClient = OkHttpClient() + YoungUtil.YoungLog("准备终止到达次数的广告") + val request: Request = Request.Builder() +// .url("http://192.168.1.127:2346/v1/cms/groupAd/${ad_id}/offline") //要访问的链接 +// .url("http://avhipxml.beesnat.com/v1/cms/groupAd/${ad_id}/offline") //要访问的链接 + .url("${baseUrl}/v1/cms/groupAd/${ad_id}/offline") //要访问的链接 +// .url("https://taxihub.cn:2346/v1/cms/groupAd/${ad_id}/offline") //要访问的链接 +// .url("${Configurations.config(TaxiApp.instance()).taxiBaseUrl()}v1/cms/groupAd/${ad_id}/offline") //要访问的链接 +// .addHeader("Authorization", "Bearer ${Configurations.config(TaxiApp.instance()).appToken()}") + .addHeader("Authorization", "Bearer ${Configurations.config(TaxiApp.instance()).registerToken()}") +// .addHeader("Authorization", "Bearer ${testToken}") + .put(body) + .build() + val call = okHttpClient.newCall(request) + call.enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + YoungUtil.YoungLog("终止失败:${e.message}") + } + + override fun onResponse(call: Call, response: Response) { + response.toString().loge() +// "taxiServiceUrl:${Configurations.config(TaxiApp.instance()).taxiServiceUrl()}".loge() + "token对比:${Configurations.config(TaxiApp.instance()).registerToken().equals(testToken)}".loge() + YoungUtil.YoungLog("终止成功:${response.message},response is Sussceful ${response.isSuccessful}${response.code}") + } + }) + + }) + } + + /** + * 获取播放的总次数 + */ + fun getAdCount(advertise: Advertise){ + val serverUrl = Configurations.config(TaxiApp.instance()).taxiServiceUrl() + val baseUrl = if (serverUrl.contains("taxihub.cn")){ +// "https://taxihub.cn:2346" + "http://taxihub.cn:2346" + } else { + "https://ledaips.com:2341" + } + //edit by yzd @20211201 + //if (Settings.loggerSwitch) { + if (Configurations.config(TaxiApp.instance()).loggerSwitch()) { + ThreadUtil.executeBySingleThread(Runnable { + val okHttpClient = OkHttpClient() + YoungUtil.YoungLog("准备获取播放的总次数") + val request: Request = Request.Builder() +// .url("http://avhipxml.beesnat.com/v1/cms/groupAd/${advertise.ad_id}/AdCount") //要访问的链接 + .url("${baseUrl}/v1/cms/groupAd/${advertise.ad_id}/AdCount") //要访问的链接 + .addHeader("Authorization", "Bearer ${Configurations.config(TaxiApp.instance()).registerToken()}") + .build() + val call = okHttpClient.newCall(request) + call.enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + YoungUtil.YoungLog("访问AdCount失败:${e.message}") + } + + override fun onResponse(call: Call, response: Response) { + YoungUtil.YoungLog("访问AdCount成功:${response.message},response isSuccessful ${response.isSuccessful}${response.code}") +// "taxiServiceUrl:${Configurations.config(TaxiApp.instance()).taxiServiceUrl()}".loge() +// "logServiceUrl:${Configurations.config(TaxiApp.instance()).logServiceUrl()}".loge() + val countStr = response.body?.string() + if (response.code == 200){ + val realCount = countStr?.toInt() + "responseBody.string:${realCount.toString()}".loge() + if (advertise.play_numbers < realCount!!){ + if (advertise.play_numbers != -1 ){ + advertise.play_numbers = -1 + DaoUtil.updatePlayNumbers(advertise) + } + try { + RefreshPlayer.refresh() + } catch (e: InterruptedException) { + e.printStackTrace() + } + + } + "广告[${advertise.ad_id}]已请求次数【${realCount}】,总播放次数:${advertise.play_numbers}".loge() + if(advertise.play_numbers != -1){ + val activity = taxiApp.activity as PlayActivity + activity.getViewModel().saveCountAdLog(advertise) + } + } + } + }) + }) + } + } /** * 发送播放日志 @@ -275,7 +407,7 @@ object ConnManger { //edit by yzd @20211201 //if (Settings.loggerSwitch) { if (Configurations.config(TaxiApp.instance()).loggerSwitch()) { - ThreadUtil.executeByPool(Runnable { + ThreadUtil.executeBySingleThread2(Runnable { YoungUtil.YoungLog("sendLogger in Thread is ${Looper.getMainLooper().thread === Thread.currentThread()}") val playLoggers = DaoUtil.getPlayLoggers() // for (playLogger in playLoggers) { @@ -296,7 +428,7 @@ object ConnManger { YoungUtil.YoungLog("准备上传日志") val parse = ("application/json;charset=UTF-8").toMediaTypeOrNull() val body = RequestBody.create(parse, requestJson) - YoungUtil.YoungLog("sendLogger:${requestJson}") + YoungUtil.YoungLog("sendLogger:${requestJson}") val request: Request = Request.Builder() .url(Configurations.config(TaxiApp.instance()).logServiceUrl() + "postPlayerLog") //要访问的链接 .addHeader("Authorization", "Bearer ${Configurations.config(TaxiApp.instance()).appToken()}") @@ -305,21 +437,30 @@ object ConnManger { .build() val call = okHttpClient.newCall(request) call.enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { YoungUtil.YoungLog("上传日志失败:${e.message}") } override fun onResponse(call: Call, response: Response) { YoungUtil.YoungLog("上传日志成功:${response.message},response isSuccessful ${response.isSuccessful}${response.code}") +// if (response.code == 200) { +// if (playLoggers.size < 20) { +// DaoUtil.getPlayLogger().deleteAll() +// } else { +//// for (index in 0..19) { +//// DaoUtil.getPlayLogger().delete(playLoggers[index]) +//// } +// +// } +// } if (response.code == 200) { - if (playLoggers.size < 20) { - DaoUtil.getPlayLogger().deleteAll() - } else { - for (index in 0..19) { - DaoUtil.getPlayLogger().delete(playLoggers[index]) - } + //#edit by ljh @2023/2/21 + playLoggers.forEach{ + DaoUtil.getPlayLogger().delete(it) } } + "删除已上传的日志".logd() } }) } @@ -402,6 +543,7 @@ object ConnManger { /** * 绑定账号 */ + @SuppressLint("SuspiciousIndentation") @Synchronized fun bindAccount(bindModel: BindModel, listener: ITaxiListener) { try { diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/JoeyDownloadManager.java b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/JoeyDownloadManager.java index aba2f93..3dbba04 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/JoeyDownloadManager.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/JoeyDownloadManager.java @@ -12,6 +12,7 @@ import java.util.List; import cn.trans88.kurotool.util.LogUtil; import cn.trans88.taxiappkotlin.Configurations; +import cn.trans88.taxiappkotlin.TaxiApp; import cn.trans88.taxiappkotlin.logic.dao.AdvertiseDao; import cn.trans88.taxiappkotlin.logic.dao.DaoUtil; import cn.trans88.taxiappkotlin.logic.model.Advertise; @@ -19,6 +20,8 @@ import cn.trans88.taxiappkotlin.logic.model.AdvertiseProcess; import cn.trans88.taxiappkotlin.play.RefreshPlayer; import cn.trans88.taxiappkotlin.ui.broadcaskReceiver.BusCallback; import cn.trans88.taxiappkotlin.ui.play.IPlay; +import cn.trans88.taxiappkotlin.ui.play.PlayActivity; +import cn.trans88.taxiappkotlin.util.VideoUtil; import cn.trans88.taxiappkotlin.util.YoungUtil; @@ -28,13 +31,15 @@ import cn.trans88.taxiappkotlin.util.YoungUtil; public class JoeyDownloadManager { private static final JoeyDownloadManager instance = new JoeyDownloadManager(); - private static final int RETRY_TIMES = 10; +// private static final int RETRY_TIMES = 10; private int holdSpace; private static JoeyDownloadListener downloadListener; private static JoeyDownloadListener haoshengDownloadListener; private static JoeyDownloadListener MDRDownloadListener; private static BusCallback busCallback; private static IPlay iPlay; + //edit by ljh 2022/11/29 + private static final int RETRY_TIMES = 120; private static int downloadCount =100;//重试的次数 private static Application app; @@ -150,6 +155,36 @@ public class JoeyDownloadManager { downloader.start(); } } + + /** + * 新地址不用拼接,#add by ljh 2023/2/7 + * @param url + * @param pathName + * @param adId + */ + public synchronized void downloadSingleSx(String url, String pathName, String adId) { + YoungUtil.YoungLog("downloadSingle url: " + url + ", pathName: " + pathName); + BaseDownloadTask downloader = FileDownloader.getImpl() +// .create(SaveSimpleData.getDownloadUrl()+url) + .create(url) +// .create("http://www.ledok.cn:2345/file/download?id=5eb4ce3da5140824346adb45") + .setPath(pathName, false) + .setCallbackProgressTimes(300) + .setMinIntervalUpdateSpeed(300) + .setTag(adId) + .setAutoRetryTimes(6);//防止由于传的url是无效链接,只给6次机会 + if (null != getDownloadListener()) { + downloader.setListener(getDownloadListener()); + } + if ((holdSpace > 0) && (DiskUtil.getDataFree() < holdSpace)) { + if (null != getDownloadListener()) { + getDownloadListener().onSpaceLack(); + } + } else { + downloader.start(); + } + } + private static JoeyDownloadListener getDownloadListener() { synchronized (JoeyDownloadListener.class) { if (null == downloadListener) { @@ -169,14 +204,26 @@ public class JoeyDownloadManager { if (advertise!=null){ advertise.setIsDownloading(false); advertise.setIsDownloaded(true); + //#edit by ljh 2023/2/7 + //如果是从mxkl_url下载的广告,则该广告的duration设置为此视频的总时长 + String mxklUrl = advertise.getMxkl_url(); + if (mxklUrl != null && !mxklUrl.isEmpty()){ + //获取视频的总时长/秒 + int videoDuration = VideoUtil.getLocalVideoDuration(task.getPath()); + YoungUtil.YoungLog("从mxkl_url下载的视频广告,该广告时长为:"+videoDuration+"毫秒"); + advertise.setDuration(String.valueOf(videoDuration)); + } DaoUtil.INSTANCE.getAdvertise().update(advertise); + } + + AdvertiseProcess advertiseProcess =new AdvertiseProcess(); advertiseProcess.setAd_id(task.getTag().toString()); advertiseProcess.setProgress(String.valueOf(100)); String progressJson = new Gson().toJson(advertiseProcess); - YoungUtil.YoungLog("广告:"+task.getTag().toString()+",下载完成进度100"); + YoungUtil.YoungLog("广告:"+task.getTag()+",下载完成进度100"); WsManager.INSTANCE.send(progressJson); try { @@ -202,15 +249,24 @@ public class JoeyDownloadManager { Advertise advertise = DaoUtil.INSTANCE.getAdvertise().queryBuilder().where(AdvertiseDao.Properties.Ad_id.eq(task.getTag().toString())).unique(); if (advertise!=null){ - BaseDownloadTask downloader = FileDownloader.getImpl() - .create(task.getUrl()) - .setPath(task.getPath(), false) - .setCallbackProgressTimes(400) - .setMinIntervalUpdateSpeed(300) - .setTag(task.getTag()) - .setAutoRetryTimes(RETRY_TIMES); - - + BaseDownloadTask downloader; + if (advertise.getMxkl_url()!=null && !advertise.getMxkl_url().isEmpty()){ + downloader = FileDownloader.getImpl() + .create(task.getUrl()) + .setPath(task.getPath(), false) + .setCallbackProgressTimes(400) + .setMinIntervalUpdateSpeed(300) + .setTag(task.getTag()) + .setAutoRetryTimes(task.getAutoRetryTimes());//防止由于传的mxkl_url是无效链接,只给6次机会 + } else { + downloader = FileDownloader.getImpl() + .create(task.getUrl()) + .setPath(task.getPath(), false) + .setCallbackProgressTimes(400) + .setMinIntervalUpdateSpeed(300) + .setTag(task.getTag()) + .setAutoRetryTimes(RETRY_TIMES); + } if (null != getDownloadListener()) { downloader.setListener(getDownloadListener()); @@ -219,8 +275,6 @@ public class JoeyDownloadManager { downloader.start(); } - - // if (downloadCount>0){ // downloadCount-=1; // diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ProcessingCommands.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ProcessingCommands.kt index 0575df8..b69fe08 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ProcessingCommands.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/ProcessingCommands.kt @@ -8,7 +8,10 @@ import cn.trans88.taxiappkotlin.TaxiApp.Companion.HAOSHENG import cn.trans88.taxiappkotlin.TaxiApp.Companion.MAIDIER import cn.trans88.taxiappkotlin.TaxiApp.Companion.XIXUN import cn.trans88.taxiappkotlin.ext.fromJson +import cn.trans88.taxiappkotlin.ext.logd +import cn.trans88.taxiappkotlin.ext.loge import cn.trans88.taxiappkotlin.logic.Repository +import cn.trans88.taxiappkotlin.logic.Repository.taxiApp import cn.trans88.taxiappkotlin.logic.dao.* import cn.trans88.taxiappkotlin.logic.model.* import cn.trans88.taxiappkotlin.logic.network.ConnManger.reconnect @@ -29,7 +32,6 @@ object ProcessingCommands { /** * 三乐平台的命令 */ - fun executeBySanle(command: String) { YoungUtil.YoungLog("executeBySanle") try { @@ -80,8 +82,6 @@ object ProcessingCommands { } } - - private fun gpsSwitch(task: String, type: String) { val baseResponse = gson.fromJson(task) val gpsSwitch = gson.fromJson(task) @@ -107,7 +107,6 @@ object ProcessingCommands { send(response) } - /** * 熙讯平台的命令 */ @@ -221,6 +220,10 @@ object ProcessingCommands { val baseResponse = gson.fromJson(task) val advertises = DaoUtil.getSanleAdvertise().loadAll() + //edit by ljh @2022/12/13 播放列表按创建日期排序 + advertises.sortBy { + it.createAt + } val allAdIds = mutableListOf() advertises.forEach { allAdIds.add(it.task_id) @@ -238,7 +241,6 @@ object ProcessingCommands { currentPlayList.add(it.ad_id) } - val playAdvertiseModel = PlayAdvertiseModel() playAdvertiseModel.task_id = baseResponse.task_id playAdvertiseModel.id = baseResponse.id @@ -251,19 +253,6 @@ object ProcessingCommands { val response = gson.toJson(playAdvertiseModel) send(response) -// KuroApiFactory.create(TaxiApi::class.java) -//// ApiFactory.create(TaxiApi::class.java) -// .registerApp(Xixun.getCardId(),Settings.isFirstRegister) -// .enqueue(object : KuroCallback { -// override fun onSuccess(response: KuroResponse) { -// val data = response.data -// YoungUtil.YoungLog("ApiFactory 请求成功:code:${response.code} ,msg:${response.msg} ,data:${response.data}") -// } -// -// override fun onFailed(throwable: Throwable) { -// -// } -// }) } /** @@ -300,7 +289,6 @@ object ProcessingCommands { send(response) } - /** * 设置车辆信息 */ @@ -359,13 +347,12 @@ object ProcessingCommands { if (copyfile.exists()){ ConnManger.sendLogToService(copyfile,sendLogModel.task_id) - }else{ + } else { YoungUtil.YoungLog("log文件不存在") } }) } - /** * 车辆信息下载 */ @@ -381,16 +368,6 @@ object ProcessingCommands { downloadByCompany(url, dest.absolutePath, companyName) -// when(companyName){ -// CompanyType.MAIDIER.name-> downloadByCompany(url,dest.absolutePath,companyName) -// CompanyType.HAOSHENG.name -> downloadByCompany(url) -// } - -// if (companyName ==CompanyType.MAIDIER.name){ -// -// } - -// downloadHaosheng(url,dest.absolutePath) } @@ -466,7 +443,6 @@ object ProcessingCommands { break } } - sendResponseToServer(deletePositionAdvertiseBean.task_id,deletePositionAdvertiseBean.id,type) } @@ -507,6 +483,7 @@ object ProcessingCommands { if (positionAdvertise.task_id == item.task_id) { //已经存在更新定点 insert = false + YoungUtil.YoungLog("更新一条定点广告") updatePositionAdvertise(item, positionAdvertise) downloadFile(positionAdvertise.media_url, positionAdvertise.pathName, item.task_id) break @@ -515,6 +492,7 @@ object ProcessingCommands { if (insert) { DaoUtil.getPositionAdvertise().insert(positionAdvertise) + YoungUtil.YoungLog("添加一条定点广告") positionAdvertise.time_span.forEach { it.advertiseId = positionAdvertise.task_id DaoUtil.getTimeSpan().insert(it) @@ -540,7 +518,6 @@ object ProcessingCommands { /** * 给服务器回复 */ - private fun sendResponseToServer(taskId:String, id:String, type:String){ val sanleResponse = SanleResponse() sanleResponse.task_id = taskId @@ -553,7 +530,7 @@ object ProcessingCommands { /** * 删除普通广告 */ - private fun deleteNormalAdvertise(task: String) { + public fun deleteNormalAdvertise(task: String) { val advertises = DaoUtil.getAdvertises() val deleteAdvertiseBean = gson.fromJson(task, DeleteAdvertiseBean::class.java) for (advertise in advertises) { @@ -565,7 +542,6 @@ object ProcessingCommands { } } - /** * 删除定点广告数据 */ @@ -645,28 +621,56 @@ object ProcessingCommands { */ //if(!advertise.isDownloading&&!advertise.isDownloaded){ if(!advertise.isDownloaded){ - downloadFile(advertise.media_url, advertise.pathName,advertise.ad_id) - }else{ + //edit by ljh @2023/2/7 + if (advertise.mxkl_url != null && advertise.mxkl_url.isNotEmpty()){ + downloadFileSx(advertise.mxkl_url, advertise.pathName,advertise.ad_id) + }else{ + downloadFile(advertise.media_url, advertise.pathName,advertise.ad_id) + } + } else { YoungUtil.YoungLog("adid:${advertise.ad_id},正在下载或者已经下载完成,不再添加下载任务") } break } } - - if (insert) { DaoUtil.getAdvertise().insert(advertise) advertise.time_Span.forEach { it.advertiseId = advertise.ad_id DaoUtil.getTimeSpan().insert(it) } - downloadFile(advertise.media_url, advertise.pathName, advertise.ad_id) + //eidt by ljh @2023/2/17 + //封装定时广告信息 + if (advertise.isTimedAd){ + advertise.time_section.forEach { + it.advertiseId = advertise.ad_id + val stringBuilder = java.lang.StringBuilder() + it.week_day.forEach { weekDay -> + if (it.week_day.last() != weekDay){ + stringBuilder.append("$weekDay,") + } else { + stringBuilder.append("$weekDay") + } + } + "week_day:${stringBuilder.toString()}".loge() + it.weekDayString = stringBuilder.toString() + //存储Schedule信息 + DaoUtil.getSchedule().insert(it) + } + + } + + //edit by ljh @2023/2/7 + if (advertise.mxkl_url != null && advertise.mxkl_url.isNotEmpty()){ + downloadFileSx(advertise.mxkl_url, advertise.pathName,advertise.ad_id) + }else{ + downloadFile(advertise.media_url, advertise.pathName,advertise.ad_id) + } } } - /** * 添加三乐广告 */ @@ -680,6 +684,19 @@ object ProcessingCommands { val dest = File(program, this.task_id) belongTo = AdvertiseType.GROUP.ordinal pathName = dest.path + //#edit by ljh 2023/2/6 +// isCount = false + if(play_numbers > 0){ + isCount = true + "${task_id}计次播放,该广告播放次数为${sanleAdvertise.play_numbers}".logd() + } + + if (time_section != null && time_section.size>0){ + isTimedAd = true + "${task_id}是分时段播放广告".loge() + } + + "mxkl_url:$mxkl_url".loge() } var insert = true @@ -724,14 +741,30 @@ object ProcessingCommands { duration = sanleAdvertise.duration createAt = sanleAdvertise.createAt + //#edit by ljh 2023/2/6 + play_numbers = sanleAdvertise.play_numbers + isCount = sanleAdvertise.isCount + mxkl_url = sanleAdvertise.mxkl_url + + isTimedAd = sanleAdvertise.isTimedAd + is_exclusive = sanleAdvertise.is_exclusive // if (sanleAdvertise.createAt ==null){ // send("服务器日志 三乐广告 createAt :${sanleAdvertise.createAt}") // } - } advertise.time_Span = sanleAdvertise.time_span + advertise.time_section = sanleAdvertise.time_section addAdvertise(advertise) + //#edit by ljh 2023/2/17 + if(advertise.isTimedAd){ + val taxiApp:TaxiApp = TaxiApp.instance() as TaxiApp + "activity为空吗:${taxiApp.activity == null}".loge() + taxiApp.activity?.let { + it.getViewModel().addTimer(advertise) + } + } + // DaoUtil.getAdvertise().insert(advertise) // RefreshPlayer.refresh() } @@ -751,7 +784,6 @@ object ProcessingCommands { //查找对应需要删除的广告 val deleteAdvertise = DaoUtil.getSanleAdvertise().queryBuilder().where(SanleAdvertiseDao.Properties.Task_id.eq(deleteBean.task_id)).build().unique() - //删除保留的三乐的广告 if (deleteAdvertise != null) { val oldFile = File(deleteAdvertise.pathName) @@ -759,15 +791,42 @@ object ProcessingCommands { oldFile.delete() YoungUtil.YoungLog("删除三乐素材成功") } + //#edit by ljh @2023/2 + //如果是分时段广告,取消该广告对应的定时任务 + //移除广告的定时任务 + val tasks = taxiApp.timerTaskMap.get(deleteAdvertise.task_id) + tasks?.let { + if (tasks.isNotEmpty()){ + tasks.forEach { timeTask -> + timeTask.cancel() + } + tasks.clear() + taxiApp.timerTaskMap.remove(deleteAdvertise.task_id) + } + //从定时广告列表种移除该广告 + if (taxiApp.timedAds.isNotEmpty()) { + taxiApp.timedAds.forEach { + if (it.ad_id.equals(deleteAdvertise.task_id)){ + taxiApp.timedAds.remove(it) + } + } + } + //删除对应广告分时段Schedule + DaoUtil.getSchedule().queryBuilder().where(ScheduleDao.Properties.AdvertiseId.eq(deleteBean.task_id)).buildDelete().executeDeleteWithoutDetachingEntities() + if (taxiApp.timedAds.size == 0){ + Configurations.config(taxiApp.activity).isTimedAdvertiseSave(false) + } + } DaoUtil.getSanleAdvertise().delete(deleteAdvertise) - }else{ + } else { YoungUtil.YoungLog("已经不存在广告:${deleteBean.task_id},不再下坎") } //删除对应广告的timespan DaoUtil.getTimeSpan().queryBuilder().where(TimeSpanDao.Properties.AdvertiseId.eq(deleteBean.task_id)).buildDelete().executeDeleteWithoutDetachingEntities() + try { RefreshPlayer.refresh() } catch (e: InterruptedException) { @@ -781,7 +840,6 @@ object ProcessingCommands { val response = gson.toJson(sanleResponse) send(response) - YoungUtil.YoungLog("下架三乐广告") } @@ -838,7 +896,29 @@ object ProcessingCommands { JoeyDownloadManager.getInstance() .setHoldSpace(50 * 1024 * 1024) .downloadSingle(url, pathName,adId) + } + } + /** + * 新url,不用拼接 #add by ljh 2023/2/7 + * @param url String + * @param pathName String + * @param adId String + */ + fun downloadFileSx(url: String, pathName: String, adId: String) { + YoungUtil.YoungLog("测试文件是否存在:$pathName ,是否存在 ${File(pathName).exists()}") + val file = File(pathName) + if (file.exists()) { + YoungUtil.YoungLog("本地存在,停止下载") + //todo 如果taskid相同 + RefreshPlayer.refresh() + } else { + YoungUtil.YoungLog("本地不存在,开始下载") +// val sanleDownloadFactory = SanleDownloadFactory(Settings.downloadUrl + url, pathName, pathName) +// KuroDownManager.addDownloadTask(sanleDownloadFactory.getDownloadTask()).addDownloadListener(sanleDownloadFactory) + JoeyDownloadManager.getInstance() + .setHoldSpace(50 * 1024 * 1024) + .downloadSingleSx(url, pathName,adId) } } @@ -865,6 +945,12 @@ object ProcessingCommands { if (oldFile.exists()) { oldFile.delete() } + } else if(advertise.mxkl_url != null && newAdvertiseWeb.mxkl_url.isNotEmpty() && newAdvertiseWeb.mxkl_url != oldAdvertiseWeb.mxkl_url){ + YoungUtil.YoungLog("素材更新,url变化,删除旧文件") + val oldFile = File(advertise.pathName) + if (oldFile.exists()) { + oldFile.delete() + } } else { YoungUtil.YoungLog("素材更新,url不变,不删除旧文件") } @@ -879,9 +965,52 @@ object ProcessingCommands { DaoUtil.getTimeSpan().insert(it) } + //#edit by ljh 2023/2/7 + val tasks = taxiApp.timerTaskMap.get(advertise.ad_id) + tasks?.let { + if (tasks.isNotEmpty()){ + tasks.forEach { timeTask -> + timeTask.cancel() + } + tasks.clear() + taxiApp.timerTaskMap.remove(advertise.ad_id) + } + //从定时广告列表种移除该广告 + if (taxiApp.timedAds.isNotEmpty()) { + taxiApp.timedAds.forEach { + if (it.ad_id.equals(advertise.ad_id)){ + taxiApp.timedAds.remove(it) + } + } + } + //删除对应广告分时段Schedule + DaoUtil.getSchedule().queryBuilder().where(ScheduleDao.Properties.AdvertiseId.eq(advertise.ad_id)).buildDelete().executeDeleteWithoutDetachingEntities() + if (taxiApp.timedAds.size == 0){ + Configurations.config(taxiApp.activity).isTimedAdvertiseSave(false) + } + } + + if (advertise.isTimedAd){ + //添加新的Schedule + val stringBuilder = java.lang.StringBuilder() + newAdvertiseWeb.time_section.forEach { + it.advertiseId = newAdvertiseWeb.ad_id + it.week_day.forEach { weekDay -> + if (it.week_day.last() != weekDay){ + stringBuilder.append("$weekDay,") + } else { + stringBuilder.append("$weekDay") + } + } + it.weekDayString = stringBuilder.toString() + DaoUtil.getSchedule().insert(it) + } + } + advertise.media_url = newAdvertiseWeb.media_url advertise.pathName = newAdvertiseWeb.pathName advertise.media_type = newAdvertiseWeb.media_type + advertise.is_exclusive = newAdvertiseWeb.is_exclusive DaoUtil.getAdvertise().insertOrReplace(advertise) // DaoUtil.getAdvertise().delete(oldAdvertiseWeb) // DaoUtil.getAdvertise().insert(newAdvertiseWeb) diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/WsManager.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/WsManager.kt index 4487b23..d6bac76 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/WsManager.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/network/WsManager.kt @@ -42,6 +42,8 @@ object WsManager { } fun initWebSocket() { + val testToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoiNWY5ZmE0ZTI1NzIzMDkzZGM5MGMwYTA0IiwiZGV2aWNlX2lkIjoieTZjLTMyMi00MDc5NiJ9.j8N1hRwYRq0bKScNe-xB8utsPUAuWEGUJMwCfLcv6D8" + // stopConnect() okHttpClient = Builder() .retryOnConnectionFailure(true) //如果没配置,okhttp默认就是true @@ -50,22 +52,24 @@ object WsManager { YoungUtil.YoungLog("长连接进行连接的token:${Configurations.config(TaxiApp.instance()).appToken()}") mRequest = Request.Builder() .url("${Configurations.config(TaxiApp.instance()).taxiServiceUrl()}?auth_token=${Configurations.config(TaxiApp.instance()).appToken()}") +// .url("http://rudbcblk.beesnat.com/?auth_token=${Configurations.config(TaxiApp.instance()).appToken()}") +// .url("http://192.168.1.127:2347/?auth_token=${Configurations.config(TaxiApp.instance()).appToken()}") +// .url("http://192.168.1.127:2347/?auth_token=${testToken}") +// .url("http://192.168.1.110:2347/?auth_token=${testToken}") +// .url("http://taxihub.cn:2347/?auth_token=${testToken}") .build() - okHttpClient!!.newWebSocket(mRequest!!, object : WebSocketListener() { override fun onClosed(webSocket: WebSocket, code: Int, reason: String) { YoungUtil.YoungLog("onClosed connection closed : $reason") super.onClosed(webSocket, code, reason) - if (beatTimer!=null){ + if (beatTimer != null){ beatTimer!!.cancel() beatTimer!!.purge() - beatTimer =null + beatTimer = null } - stopAllTimer() - } override fun onClosing(webSocket: WebSocket, code: Int, reason: String) { diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/logic/task/SyncTimerTask.kt b/app/src/main/java/cn/trans88/taxiappkotlin/logic/task/SyncTimerTask.kt index c4258d4..12824a5 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/logic/task/SyncTimerTask.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/logic/task/SyncTimerTask.kt @@ -15,7 +15,7 @@ class SyncTimerTask(private val playViewModel: PlayViewModel, val advertise:Adve YoungUtil.YoungLog("同步任务开始") TaxiApp.startSyncMode = true //更新列表 - Repository.currentListOrder =currentPosition + Repository.currentListOrder = currentPosition //刷新播放广告 playViewModel.refreshAdvertise() diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/custom/JTextView.java b/app/src/main/java/cn/trans88/taxiappkotlin/ui/custom/JTextView.java index d2c8af4..c0e0985 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/custom/JTextView.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/custom/JTextView.java @@ -117,14 +117,14 @@ public class JTextView extends AppCompatTextView { public int onMeasureR(int attr, int oldMeasure) { int newSize = 0; - int mode = View.MeasureSpec.getMode(oldMeasure); - int oldSize = View.MeasureSpec.getSize(oldMeasure); + int mode = MeasureSpec.getMode(oldMeasure); + int oldSize = MeasureSpec.getSize(oldMeasure); switch (mode) { - case View.MeasureSpec.EXACTLY: + case MeasureSpec.EXACTLY: newSize = oldSize; break; - case View.MeasureSpec.AT_MOST: - case View.MeasureSpec.UNSPECIFIED: + case MeasureSpec.AT_MOST: + case MeasureSpec.UNSPECIFIED: float value; if (attr == 0) { value = bound.width(); @@ -152,7 +152,7 @@ public class JTextView extends AppCompatTextView { finalText.setSpan(new ScaleXSpan((spacing + 1) / 10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } - super.setText(finalText, TextView.BufferType.SPANNABLE); + super.setText(finalText, BufferType.SPANNABLE); } private void checkIsScroll(float textWidth, float layoutWidth) { diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayActivity.kt b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayActivity.kt index 3a43372..b58c25c 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayActivity.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayActivity.kt @@ -12,6 +12,7 @@ import android.view.WindowManager import android.widget.ImageView.ScaleType.FIT_XY import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import cn.trans88.taxiappkotlin.BootBroadcast import cn.trans88.taxiappkotlin.Configurations @@ -81,14 +82,19 @@ class PlayActivity : AppCompatActivity(), NetworkCallback, BusCallback, OnScreen if (VERSION.SDK_INT >= VERSION_CODES.P) { setFlagHide() } - + setContentView(R.layout.activity_main) - //读取保留的配置文件 // readConfiguration() //清楚过期的播放日志 // clearOverdueLogger() + //如果播放器player等于空,那重新配置一下播放器player + val taxiApp = TaxiApp.instance() as TaxiApp +// if (taxiApp.player == null){ +// taxiApp.initPlayer() +// } + taxiApp.activity = this JoeyDownloadManager.getInstance().setCallBack(this) @@ -143,7 +149,10 @@ class PlayActivity : AppCompatActivity(), NetworkCallback, BusCallback, OnScreen //powerOnAdvertise(playViewModel) } - + //#edit by ljh 2023/2/16 + fun getViewModel():PlayViewModel{ + return playViewModel + } private fun bindConnService() { val intent = Intent() @@ -309,8 +318,8 @@ class PlayActivity : AppCompatActivity(), NetworkCallback, BusCallback, OnScreen busLayoutParams.height = Configurations.config(TaxiApp.instance()).screenSizeY() val imgOtherScreen = img_other_screen.layoutParams - imgOtherScreen.width = 64 - imgOtherScreen.height = 32 + imgOtherScreen.width = 128 + imgOtherScreen.height = 64 val program = File(TaxiApp.instance().filesDir, TaxiApp.instance().getString(string.dir_program)) val dest = File(program, "no_service") @@ -460,6 +469,10 @@ class PlayActivity : AppCompatActivity(), NetworkCallback, BusCallback, OnScreen // playViewModel.advertiseLiveData.removeObservers(this) playViewModel.playLiveData.removeObservers(this) // job.cancel() + //activity销毁时释放播放器 +// (TaxiApp.instance() as TaxiApp).player!!.release() + + (TaxiApp.instance() as TaxiApp).timer.cancel() super.onDestroy() } @@ -603,8 +616,8 @@ class PlayActivity : AppCompatActivity(), NetworkCallback, BusCallback, OnScreen busLayoutParams.height = Configurations.config(TaxiApp.instance()).screenSizeY() val imgOtherScreen = img_other_screen.layoutParams - imgOtherScreen.width = 64 - imgOtherScreen.height = 32 + imgOtherScreen.width = 128 + imgOtherScreen.height = 64 // img_other_screen.layoutParams =imgOtherScreen diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayView.kt b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayView.kt index 41a0afd..a9c02df 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayView.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayView.kt @@ -8,6 +8,9 @@ import android.graphics.Matrix import android.net.Uri import android.os.Build import android.os.Looper +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout @@ -18,6 +21,8 @@ import cn.trans88.taxiappkotlin.R import cn.trans88.taxiappkotlin.R.string import cn.trans88.taxiappkotlin.TaxiApp import cn.trans88.taxiappkotlin.TaxiApp.Companion.HAOSHENG +import cn.trans88.taxiappkotlin.ext.logd +import cn.trans88.taxiappkotlin.ext.loge import cn.trans88.taxiappkotlin.logic.model.Advertise import cn.trans88.taxiappkotlin.logic.model.TextInfo import cn.trans88.taxiappkotlin.ui.advertise.MaterialType @@ -27,6 +32,7 @@ import cn.trans88.taxiappkotlin.util.YoungUtil import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.RequestOptions + import kotlinx.android.synthetic.main.activity_main.view.* import java.io.File import kotlin.math.roundToInt @@ -34,7 +40,6 @@ import kotlin.math.roundToInt private val glideOptions: RequestOptions = RequestOptions() .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) - @Synchronized fun View.createView(context: Context, advertise: Advertise, seek: Int): View? { val view = when (advertise.media_type) { @@ -82,6 +87,51 @@ fun View.createView(context: Context, advertise: Advertise, seek: Int): View? { val video: View YoungUtil.YoungLog("素材是视频:${Configurations.config(TaxiApp.instance()).downloadUrl()}${advertise.media_url}") +//exoPlayer +// if (Build.VERSION.SDK_INT != 23){ +// val taxiApp = TaxiApp.instance() as TaxiApp +// taxiApp.player!!.clearMediaItems() +// //清除当前设置在播放器上的任何Surface, SurfaceHolder, SurfaceView或TextureView。 +//// taxiApp.player!!.clearVideoSurface() +// +// video = LayoutInflater.from(context).inflate(R.layout.simple_exo_player_view,null,false) as PlayerView +//// video = PlayerView(context) +// //全屏显示(填满父容器) +// video.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL +// //player重置时需不需要保留最后一帧 +// video.setKeepContentOnPlayerReset(false) +// +// //不显示控制栏 +// video.useController = false +// video.player = taxiApp.player +// +// val mediaItem = MediaItem.fromUri(Uri.parse(advertise.pathName)) +// val mediaSource:MediaSource = taxiApp.factory.createMediaSource(mediaItem) +// taxiApp.player!!.setMediaSource(mediaSource) +// taxiApp.player!!.prepare() +// handler.postDelayed({ +// taxiApp.player!!.play() +// },300) +// } else { +// val currentTimeMillis = System.currentTimeMillis() +// val jVideoView = JVideoView(context) +// +// jVideoView.videoPath = advertise.pathName +// +// jVideoView.setOnPreparedListener { mediaPlayer -> +// mediaPlayer.isLooping = false +// YoungUtil.YoungLog("视频准备完成,当前线程${Looper.getMainLooper().thread === Thread.currentThread()}") +// YoungUtil.YoungLog("视频的播放时长${jVideoView.duration}") +// mediaPlayer.start() +// } +// +// jVideoView.setOnErrorListener { _, _, _ -> true } +// YoungUtil.YoungLog("初始化视频控件耗时:${currentTimeMillis - System.currentTimeMillis()}") +// video = jVideoView +// } + +//MediaPlayer +// YoungUtil.YoungLog("素材是视频:${Configurations.config(TaxiApp.instance()).downloadUrl()}${advertise.media_url}") val currentTimeMillis = System.currentTimeMillis() val jVideoView = JVideoView(context) @@ -97,7 +147,9 @@ fun View.createView(context: Context, advertise: Advertise, seek: Int): View? { jVideoView.setOnErrorListener { _, _, _ -> true } YoungUtil.YoungLog("初始化视频控件耗时:${currentTimeMillis - System.currentTimeMillis()}") - video =jVideoView + video = jVideoView + +//其他 // if (Build.VERSION.SDK_INT >= 26) { // val ljkVideo = LjkVideoPlayer(context) // ljkVideo.setVideoPath(advertise.pathName) diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayViewModel.kt b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayViewModel.kt index 563a9af..43942ea 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayViewModel.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayViewModel.kt @@ -1,5 +1,7 @@ package cn.trans88.taxiappkotlin.ui.play +//import cn.trans88.taxiappkotlin.logic.Settings +//import cn.trans88.taxiappkotlin.logic.enumType.CompanyType import android.animation.LayoutTransition import android.animation.LayoutTransition.TransitionListener import android.animation.ObjectAnimator @@ -22,38 +24,38 @@ import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import cn.trans88.kurotool.util.DistanceUtil -import cn.trans88.kurotool.util.LogUtil import cn.trans88.kurotool.util.ThreadUtil import cn.trans88.taxiappkotlin.Configurations -import cn.trans88.taxiappkotlin.R import cn.trans88.taxiappkotlin.TaxiApp import cn.trans88.taxiappkotlin.TaxiApp.Companion.HAOSHENG import cn.trans88.taxiappkotlin.TaxiApp.Companion.MAIDIER import cn.trans88.taxiappkotlin.TaxiApp.Companion.SANLE import cn.trans88.taxiappkotlin.TaxiApp.Companion.XIXUN +import cn.trans88.taxiappkotlin.ext.loge +import cn.trans88.taxiappkotlin.ext.logi import cn.trans88.taxiappkotlin.logic.Repository import cn.trans88.taxiappkotlin.logic.Repository.updatePlayerUI -//import cn.trans88.taxiappkotlin.logic.Settings import cn.trans88.taxiappkotlin.logic.dao.AdvertiseDao import cn.trans88.taxiappkotlin.logic.dao.AdvertiseDao.Properties import cn.trans88.taxiappkotlin.logic.dao.DaoUtil import cn.trans88.taxiappkotlin.logic.dao.DaoUtil.getAdvertise import cn.trans88.taxiappkotlin.logic.dao.PositionAdvertiseDao -//import cn.trans88.taxiappkotlin.logic.enumType.CompanyType import cn.trans88.taxiappkotlin.logic.gps.GpsInformationListener import cn.trans88.taxiappkotlin.logic.gps.GpsReceiver import cn.trans88.taxiappkotlin.logic.model.* +import cn.trans88.taxiappkotlin.logic.myListMap +import cn.trans88.taxiappkotlin.logic.network.ConnManger import cn.trans88.taxiappkotlin.logic.network.JoeyDownloadManager +import cn.trans88.taxiappkotlin.logic.network.ProcessingCommands import cn.trans88.taxiappkotlin.play.PlayerStatus import cn.trans88.taxiappkotlin.play.RefreshPlayer import cn.trans88.taxiappkotlin.ui.advertise.AdvertiseType import cn.trans88.taxiappkotlin.ui.advertise.AdvertiseType.AREA import cn.trans88.taxiappkotlin.ui.advertise.MaterialType +import cn.trans88.taxiappkotlin.util.DateUtil import cn.trans88.taxiappkotlin.util.YoungUtil import java.io.ByteArrayOutputStream import java.util.* -import kotlin.collections.ArrayList -import kotlin.reflect.KParameter /** @@ -71,7 +73,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, val TAG: String = "PlayViewModel" //可变的liveData -// val playLiveData = MutableLiveData() +// val playLiveData = MutableLiveData() val playLiveData = MutableLiveData() private var curLogger: PlayLogger? = null @@ -130,7 +132,6 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } } - private val handler: Handler = Handler() // private val refreshLiveData = MutableLiveData() @@ -146,17 +147,261 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, // val circularListLiveData =Transformations.switchMap(refreshLiveData){ // Repository.refreshCircularList(); // } + val taxiApp:TaxiApp = TaxiApp.instance() as TaxiApp + /** + * 添加多时段播放任务 + * @param advertise Advertise + */ + fun addTimer(advertise: Advertise){ + "addTimer调用了".loge() + taxiApp.isTimed = true + val list = advertise.time_section + + val tasks = kotlin.collections.ArrayList() + //获取广告的时间段集合 + for (schedule in list) { + val startTime = schedule.start_time + val endTime = schedule.end_time + val weekDays = schedule.week_day + for (weekDay in weekDays) { + //SUNDAY(周天) = 1,Calendar.MONDAY(周一) == 2,依此类推SATURDAY == 7(周六) + val wDay = when(weekDay){ + 1 -> 2 + 2 -> 3 + 3 -> 4 + 4 -> 5 + 5 -> 6 + 6 -> 7 + else -> 1 + } + if (startTime != endTime){ + val startCalendar:Calendar = DateUtil.getStartOrEndCalendar(wDay,startTime) + val endCalendar:Calendar = DateUtil.getStartOrEndCalendar(wDay,endTime) + endCalendar.set(Calendar.MONTH,startCalendar.get(Calendar.MONTH)) + endCalendar.set(Calendar.DAY_OF_MONTH,startCalendar.get(Calendar.DAY_OF_MONTH)) + //获取第一次开始执行定时任务的日期 + val startDate:Date = startCalendar.time + "获取第一次开始执行定时任务的日期:${DateUtil.dateTimeFormat.format(startDate)}".loge() + //获取任务轮询时间 + val startTimeDiff = DateUtil.getTimeDiff(startCalendar, wDay, startTime) + "获取任务轮询时间:${startTimeDiff.toString()}".loge() + + //获取第一次结束执行定时任务的日期 + val endDate:Date = endCalendar.time + "获取第一次结束执行定时任务的日期:${DateUtil.dateTimeFormat.format(endDate)}".loge() + //获取任务轮询时间 + val endTimeDiff = DateUtil.getTimeDiff(endCalendar, wDay, endTime) + "获取任务轮询时间:${endTimeDiff.toString()}".loge() + // 判断当前时间是否在时间段之间 + val currentTime = Date() + val startCalender = Calendar.getInstance() + startCalender.time = startDate + startCalender.add(Calendar.DAY_OF_MONTH,-7) + val tempStartDate = startCalender.time + val endCalender = Calendar.getInstance() + endCalender.time = endDate + endCalender.add(Calendar.DAY_OF_MONTH,-7) + val tempEndDate = endCalender.time + "tempStartDate:${DateUtil.dateTimeFormat.format(tempStartDate)}".loge() + "tempEndDate:${DateUtil.dateTimeFormat.format(tempEndDate)}".loge() + if (currentTime.after(tempStartDate) && currentTime.before(tempEndDate)) { + "当前时间在时间段之间".logi("SectionAdvertise") + addTimedAdvertise(advertise) + val endTask = object : TimerTask(){ + var executeTime = 0L + override fun run() { + executeTime = System.currentTimeMillis() + "分时段播放结束,${DateUtil.dateTimeFormat.format(Date())}".loge() + endTimedAd(advertise) + "taxiApp.isTimedAdvertise:${Configurations.config(taxiApp.activity).isTimedAdvertise}".loge() + } + } + taxiApp.timer.schedule(endTask,tempEndDate) + } else { + "当前时间不在时间段之间".logi("SectionAdvertise") + } + "---".logi("SectionAdvertise") + //按照指定日期开始执行任务,对指定的任务按周期重复执行 + val startTask = object : TimerTask(){ + var executeTime = 0L + override fun run() { + executeTime = System.currentTimeMillis() + "分时段播放开始,${DateUtil.dateTimeFormat.format(Date())}".loge() + addTimedAdvertise(advertise) + "taxiApp.isTimedAdvertise:${Configurations.config(taxiApp.activity).isTimedAdvertise}".loge() + } + } + taxiApp.timer.schedule(startTask,startDate,startTimeDiff) + tasks.add(startTask) + + val endTask = object : TimerTask(){ + var executeTime = 0L + override fun run() { + executeTime = System.currentTimeMillis() + "分时段播放结束,${DateUtil.dateTimeFormat.format(Date())}".loge() + endTimedAd(advertise) + "taxiApp.isTimedAdvertise:${Configurations.config(taxiApp.activity).isTimedAdvertise}".loge() + } + } + taxiApp.timer.schedule(endTask,endDate,endTimeDiff) + tasks.add(endTask) + } + } + } + taxiApp.timerTaskMap[advertise.ad_id] = tasks + } + + /** + * 添加定时广告 + * @param advertise Advertise + */ + private fun addTimedAdvertise(advertise: Advertise){ + if (advertise.is_exclusive){ //定时插播 + if (!taxiApp.timedAds.contains(advertise)){ + taxiApp.timedAds.add(0,advertise) + "分时段播放的广告数量:${taxiApp.timedAds.size}".loge() + Configurations.config(taxiApp.activity).isTimedAdvertiseSave(true) + val timedAdJsonStr = ProcessingCommands.gson.toJson(taxiApp.timedAds) + Configurations.config(taxiApp.activity).timedAdListSave(timedAdJsonStr) + //只有一个广告时才会立刻刷新画面,否则添加后正常轮播不刷新 + if (taxiApp.timedAds.size == 1){ + refreshAdvertise() + } + } + } else {//定时轮播 + "${advertise.ad_id}定时轮播".loge() + val daoAdvertise = getAdvertise().queryBuilder().where(Properties.Ad_id.eq(advertise.ad_id.toString())).unique() + daoAdvertise.isTimedAd = false + getAdvertise().update(daoAdvertise) + try { + RefreshPlayer.refresh() + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + + /** + * 分时段播放结束 + * @param advertise Advertise + */ + private fun endTimedAd(advertise: Advertise){ + if (advertise.is_exclusive){ + if (taxiApp.timedAds.contains(advertise)){ + taxiApp.timedAds.remove(advertise) + "${advertise.ad_id}定时广告移除".loge() + val timedAdJsonStr = ProcessingCommands.gson.toJson(taxiApp.timedAds) + Configurations.config(taxiApp.activity).timedAdListSave(timedAdJsonStr) + if (taxiApp.timedAds.size == 0){ + Configurations.config(taxiApp.activity).isTimedAdvertiseSave(false) +// refreshAdvertise() + } + try { + RefreshPlayer.refresh() + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } else { + val daoAdvertise = getAdvertise().queryBuilder().where(Properties.Ad_id.eq(advertise.ad_id.toString())).unique() + daoAdvertise.isTimedAd = true + getAdvertise().update(daoAdvertise) + try { + RefreshPlayer.refresh() + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } /** * 调这个方法就会从仓库中拿advertise播放 */ + @Synchronized fun refreshAdvertise() { YoungUtil.YoungLog("刷新播放界面,开始播放 ") - val advertise = Repository.getAdvertiseTEST() + var advertise = Repository.getAdvertiseTEST() + //#edit by ljh 2023/2/6 + if (advertise != null && advertise.isCount){ + if(advertise.play_numbers != -1){ + ConnManger.getAdCount(advertise) + } +// Repository.playByCount(advertise) + if (advertise.play_numbers < 0){ + "删除次数已到达的广告".loge() + //删除次数已到达的广告 + DaoUtil.deleteAdvertise(advertise) + //如果是分时段广告 + if (advertise.isTimedAd){ + //移除广告的定时任务 + val tasks = taxiApp.timerTaskMap[advertise.ad_id] + tasks?.let { + if (tasks.isNotEmpty()){ + tasks.forEach { timeTask -> + timeTask.cancel() + } + } + } + } + ConnManger.sendOfflineAd(advertise.ad_id) + Repository.currentListOrder += 1 + refreshAdvertise() + return + } +// saveCountAdLog(advertise) + "当前播放的广告:${Repository.getTestPlayCircularList().toString()}".loge() + } +// "当前播放的广告:${Repository.getTestPlayCircularList().toString()}".loge() playLiveData.postValue(advertise) } + /** + * 存储计次播放广告日志 + * @param advertise Advertise + */ + @Synchronized + fun saveCountAdLog(advertise: Advertise){ + if (Configurations.config(TaxiApp.instance()).loggerSwitch()) { + var container: Container? = null + val list = DaoUtil.getContainerDao().loadAll() + if (list.isNotEmpty()) { + container = list[0] + } + val countAdLog = PlayLogger() + countAdLog.apply { + ad_id = advertise.ad_id + ad_type = advertise.belongTo + begin_play_ts = System.currentTimeMillis() + created_at = System.currentTimeMillis() + media_url = advertise.media_url + YoungUtil.YoungLog("advertise.belongTo ${advertise.belongTo}") + if (advertise.belongTo == AdvertiseType.AREA.ordinal) { + YoungUtil.YoungLog("当前日志是定点日志${advertise.region_id}") + region_id = advertise.region_id + } + ad_container_id = container?.ad_container_id +// longitude =advertise.longitude +// latitude =advertise.latitude + longitude = curLongitude + latitude = curlatitude + // YoungUtil.YoungLog("advertise adid :${advertise.ad_id}, 经纬度 ${longitude},${latitude}") + end_play_ts = System.currentTimeMillis() + val roundingDuration = Math.ceil((advertise.duration.toDouble() / 1000)) * 1000 + duration = roundingDuration.toLong() + } + DaoUtil.getPlayLoggerDao().insert(countAdLog) + "存储计次广告日志:${countAdLog.media_url}".loge() +// thread { +// DaoUtil.getPlayLoggerDao().insert(countAdLog) +// "存储计次广告日志:${countAdLog.media_url}".loge() +// val playLoggers = DaoUtil.getPlayLoggers() +// val logJson = ProcessingCommands.gson.toJson(playLoggers) +// "当前存的播放日志:${logJson}".loge() +// } + } + } + /** * 如果记录当前广告的curLogger不等于null,就延时走nextCheck的run方法 * 如果等于Null,停止播放任务 @@ -164,11 +409,11 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, fun setCurAdvertise(advertise: Advertise) { YoungUtil.YoungLog("设置curAdvertise") curAdvertise = advertise - //edit by yzd @20211201 -// //if (Settings.loggerSwitch) { +// if (Settings.loggerSwitch) { if (Configurations.config(TaxiApp.instance()).loggerSwitch()) { putLogger() + //初始化当前播放广告的日志 initPlayLogger(advertise) } } @@ -187,7 +432,13 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, YoungUtil.YoungLog( "playAdvertise here .") synchronized(fl_play) { if (advertise != null) { + +// if (advertise.isCount) { +// ConnManger.getAdCount(advertise) +// } + YoungUtil.YoungLog( "Advertise id:" + advertise.ad_id + " " + advertise.pathName) + //记录上一个广告日志的duration if (curLogger != null && Configurations.config(TaxiApp.instance()).loggerSwitch()) { var duration: Long = System.currentTimeMillis() - curLogger!!.created_at @@ -196,7 +447,10 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, duration = curAdvertise!!.duration.toLong() } } - curLogger!!.duration = duration + if (!advertise.isCount){ + curLogger!!.duration = duration + } + "日志durarion:${curLogger!!.duration}".loge() } val createView = fl_play.createView(fl_play.context, advertise, 0) @@ -212,8 +466,9 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, YoungUtil.YoungLog("添加新的广告region_id:${advertise.region_id}") - setCurAdvertise(advertise) - + if(!advertise.isCount){ + setCurAdvertise(advertise) + } //edit by yzd @2022-09-09 //如果是同步并且不是定点广告字节刷新否则走checkIsStartTimer的逻辑 @@ -247,7 +502,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, MAIDIER -> checkIsStartTimerBySanle() } } - }else{ + } else { YoungUtil.YoungLog("非同步的逻辑") when (Configurations.config(TaxiApp.instance()).company()) { XIXUN -> checkIsStartTimerByXixun() @@ -265,7 +520,6 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } - private fun addChildView(view: View?, advertise: Advertise) { // ThreadUtil.executeByPool(object :Runnable{ // override fun run() { @@ -421,6 +675,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, private fun stopPlay() { fl_play.apply { + val logoView = this.findViewWithTag("logo") if (logoView == null) { @@ -433,7 +688,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } handler.removeCallbacks(nextCheck) curAdvertise = null - curLogger = null +// curLogger = null // nextAdvertise =null YoungUtil.YoungLog("停止播放") } @@ -452,9 +707,8 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } else { status = PlayerStatus.START YoungUtil.YoungLog("checkIsStartTimer ThreadId: ${Thread.currentThread().id} ,curAdvertise:${curAdvertise.toString()}}") - handler.postDelayed(nextCheck, curAdvertise!!.duration.toLong()) + handler.postDelayed(nextCheck,curAdvertise!!.duration.toLong()) } - } /** @@ -502,20 +756,21 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, YoungUtil.YoungLog("是最后一个素材 ad_id =${curAdvertise!!.ad_id},重新校时过列表") RefreshPlayer.refresh() } - } - /** * 将curLogger设置为播放完成后存储到LoggerContainer中,并将curLogger清空 */ + @Synchronized private fun putLogger() { if (curLogger != null) { YoungUtil.YoungLog("TID: " + Thread.currentThread().id + ", insert normal play logger") curLogger!!.end_play_ts = System.currentTimeMillis() val roundingDuration = Math.ceil((curLogger!!.duration.toDouble() / 1000)) * 1000 curLogger!!.duration = roundingDuration.toLong() + DaoUtil.getPlayLoggerDao().insert(curLogger) + "存储日志:${curLogger?.media_url}".loge() } curLogger = null } @@ -524,7 +779,9 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, * 记录当前播放的广告信息 * @param advertise Advertise */ + @Synchronized private fun initPlayLogger(advertise: Advertise) { + // curLongitude =12.4444 // curlatitude =12.33333333 if (null == curLogger) { @@ -551,6 +808,10 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, longitude = curLongitude latitude = curlatitude // YoungUtil.YoungLog("advertise adid :${advertise.ad_id}, 经纬度 ${longitude},${latitude}") + //#edit by ljh + if (advertise.isCount){ + duration = advertise.duration.toLong() + } } YoungUtil.YoungLog("初始化curLogger") } else { @@ -581,6 +842,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } else { //YoungUtil.YoungLog("当前坐标 latitude:$latitude,longitude: $longitude , 速度 :$speed") //保存坐标地址 + YoungUtil.YoungLog("保存坐标") curLongitude = longitude curlatitude = latitude @@ -613,8 +875,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, val advertise = setAdvertiseByPosition(positionAdvertise, region.id, longitude, latitude) DaoUtil.getAdvertise().insert(advertise) RefreshPlayer.refresh() - } - else{ + }else{ YoungUtil.YoungLog("positionAdvertise is null"); } } else { @@ -646,7 +907,6 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, YoungUtil.YoungLog("长时间没新的坐标,恢复普通广告") clearAreaAdvertise() } - },3*1000) } @@ -757,7 +1017,6 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, } } - /** * 将PositionAdvertise转化成Advertise */ @@ -767,7 +1026,6 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, longitude: Double, latitude: Double ): Advertise { - val advertise = Advertise() advertise.apply { id = positionAdvertise.id @@ -781,9 +1039,7 @@ class PlayViewModel(val lifecycle: Lifecycle, private val fl_play: FrameLayout, this.longitude = longitude this.latitude = latitude } - YoungUtil.YoungLog("setAdvertiseByPosition adid:${advertise.ad_id}") - return advertise } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayerRule.kt b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayerRule.kt index c2c08fb..dd2df4e 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayerRule.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/PlayerRule.kt @@ -17,6 +17,7 @@ fun Advertise.isReady(): Boolean { var ready = true MaterialType.values().forEach { if (it.ordinal == media_type) { + if (this.media_url == null) { YoungUtil.YoungLog("media_url is null ready返回false") ready = false @@ -25,6 +26,15 @@ fun Advertise.isReady(): Boolean { YoungUtil.YoungLog("pathName is null ready返回false") ready = false } + + //edit by ljh @2023/2/9 +// if (this.play_numbers == -1){ +// val file = File(this.pathName) +// if(file.length() > 0){ +// return false +// } +// } + if(media_type !=MaterialType.Text.ordinal){ /* 这里exist判断不准,文件存在被判定为不存在 略作改动 if (!File(this.pathName).exists()) { @@ -35,19 +45,31 @@ fun Advertise.isReady(): Boolean { */ //edit by yzd @20211222 val file = File(this.pathName) + val advertise = getAdvertise().queryBuilder().where(Properties.Ad_id.eq(this.ad_id)).unique() if(file.length() > 0){ //YoungUtil.YoungLog("${this.pathName}广告文件已存在") + // edit @2022/11/29 + if(!advertise.isDownloaded){ + file.delete() + advertise.setIsDownloading(false) + advertise.setIsDownloaded(false) + getAdvertise().update(advertise) + downloadFile() + ready = false + } }else{ //YoungUtil.YoungLog("${this.pathName}的广告本地不存在,重新下载 ready返回false") file.delete() val advertise = getAdvertise().queryBuilder().where(Properties.Ad_id.eq(this.ad_id)).unique() - advertise.setIsDownloading(false) - advertise.setIsDownloaded(false) - getAdvertise().update(advertise) - downloadFile() + if (advertise != null){ + advertise.setIsDownloading(false) + advertise.setIsDownloaded(false) + getAdvertise().update(advertise) + downloadFile() + } ready = false } - }else{ + } else { YoungUtil.YoungLog("广告是文字,无需下载") } @@ -94,23 +116,30 @@ fun Advertise.downloadFile(){ */ //if(!isDownloading&&!isDownloaded){ if(!isDownloaded){ - JoeyDownloadManager.getInstance() - .setHoldSpace(50 * 1024 * 1024) - .downloadSingle(this.media_url, this.pathName, this.ad_id) + //edit by ljh @2023-02-07 + if (mxkl_url !=null && mxkl_url.isNotEmpty()){ + JoeyDownloadManager.getInstance() + .setHoldSpace(50 * 1024 * 1024) + .downloadSingleSx(this.mxkl_url, this.pathName, this.ad_id) + } else { + JoeyDownloadManager.getInstance() + .setHoldSpace(50 * 1024 * 1024) + .downloadSingle(this.media_url, this.pathName, this.ad_id) + } +// JoeyDownloadManager.getInstance() +// .setHoldSpace(50 * 1024 * 1024) +// .downloadSingle(this.media_url, this.pathName, this.ad_id) }else{ //YoungUtil.YoungLog("adid:$ad_id,正在下载或者已经下载完成,不再添加下载任务") } } - - fun Advertise.isPlayNow(): Boolean { - var isPlay =false - var timeList:List? =null + var isPlay = false + var timeList:List? = null timeList = DaoUtil.getTimeSpan().queryBuilder().where(TimeSpanDao.Properties.AdvertiseId.eq(this.ad_id)).list() - timeList?.forEach { val curTime = System.currentTimeMillis() val startDayTime: Long = it.date_start @@ -154,17 +183,16 @@ fun Advertise.isPlayNow(): Boolean { ) { // YoungUtil.YoungLog("当前广告时间满足 ${this.ad_id} 广告的开始时间为$startTime," + // "结束时间为$endTime,开始的小时:$startHour,开始的分钟:$startMinute,开始的秒:$startSecond,结束的小时:$endHour,分钟:$endMinute,秒:$endSecond") - isPlay =true + isPlay = true } } else { // YoungUtil.YoungLog("当前广告时间不满足 ${this.ad_id} 广告的开始时间为$startTime," + // "结束时间为$endTime,开始的小时:$startHour,开始的分钟:$startMinute,开始的秒:$startSecond,结束的小时:$endHour,分钟:$endMinute,秒:$endSecond") // send("服务器日志 ${Xixun.getCardId()} 当前广告时间不满足: ${this.ad_id}") - isPlay =false + isPlay = false } } - return isPlay } diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/LjkVideoPlayer.java b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/LjkVideoPlayer.java index af4a7f8..596bd50 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/LjkVideoPlayer.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/LjkVideoPlayer.java @@ -1,4 +1,4 @@ -//package cn.trans88.taxiappkotlin.ui.play.ljk; +package cn.trans88.taxiappkotlin.ui.play.ljk;//package cn.trans88.taxiappkotlin.ui.play.ljk; // //import android.content.Context; //import android.os.Build; diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/VideoPlayerListener.java b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/VideoPlayerListener.java index a7ff429..a5f05ba 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/VideoPlayerListener.java +++ b/app/src/main/java/cn/trans88/taxiappkotlin/ui/play/ljk/VideoPlayerListener.java @@ -1,4 +1,4 @@ -//package cn.trans88.taxiappkotlin.ui.play.ljk; +package cn.trans88.taxiappkotlin.ui.play.ljk;//package cn.trans88.taxiappkotlin.ui.play.ljk; // //import tv.danmaku.ijk.media.player.IMediaPlayer; // diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/util/DateUtil.java b/app/src/main/java/cn/trans88/taxiappkotlin/util/DateUtil.java new file mode 100644 index 0000000..bb400d3 --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/util/DateUtil.java @@ -0,0 +1,89 @@ +package cn.trans88.taxiappkotlin.util; + +import android.util.Log; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @Author: LJH + * @Time: 2023/2/15 + * @description: + */ +public class DateUtil { + + public static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + /** + * 获取任务第一次执行的开始或者结束日期 + * @param weekDay + * @param startOrEndTime + * @return + */ + public static Calendar getStartOrEndCalendar(Integer weekDay,Long startOrEndTime){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(startOrEndTime)); + int hourTime = calendar.get(Calendar.HOUR_OF_DAY); + int minuteTime = calendar.get(Calendar.MINUTE); + int secondTime = calendar.get(Calendar.SECOND); + // 获取当前时间 + Calendar cal = Calendar.getInstance(); + + // 计算距离下一个周一的天数,SUNDAY = 1,Calendar.MONDAY == 2,依此类推SATURDAY == 7 + int day = weekDay - cal.get(Calendar.DAY_OF_WEEK); + if (day <= 0) { + day += 7; + } + if (!(cal.get(Calendar.DAY_OF_WEEK) == weekDay && + (cal.get(Calendar.HOUR_OF_DAY) < hourTime || (cal.get(Calendar.HOUR_OF_DAY) == hourTime && + cal.get(Calendar.MINUTE) < minuteTime) || (cal.get(Calendar.HOUR_OF_DAY) == hourTime && + cal.get(Calendar.MINUTE) == minuteTime && cal.get(Calendar.SECOND) < secondTime))) + ){ + // 设置日期为下一个weekDay + cal.add(Calendar.DAY_OF_MONTH, day); + } + + // 设置时间 + cal.set(Calendar.HOUR_OF_DAY, hourTime); + cal.set(Calendar.MINUTE, minuteTime); + cal.set(Calendar.SECOND, secondTime); + + // 获取日期 + Date date = cal.getTime(); + return cal; + } + + /** + * 获取第一次执行任务的开始或者结束日期至下一次开始或结束日期的时间差 + * @param weekDay + * @param startOrEndTime + * @return + */ + public static long getTimeDiff(Calendar calendar,Integer weekDay,Long startOrEndTime){ + + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date(startOrEndTime)); + int hourTime = cal.get(Calendar.HOUR_OF_DAY); + int minuteTime = cal.get(Calendar.MINUTE); + int secondTime = cal.get(Calendar.SECOND); + + Date firstDate = calendar.getTime(); +// System.out.println("firstDate:"+dateTimeFormat.format(firstDate)); + // 计算距离下一个weekDay的天数,SUNDAY = 1,Calendar.MONDAY == 2,依此类推SATURDAY == 7 + int day = weekDay - calendar.get(Calendar.DAY_OF_WEEK); + if (day <= 0) { + day += 7; + } + //设置日期为下一个weekDay + calendar.add(Calendar.DAY_OF_MONTH,day); + // 设置时间为10点 + calendar.set(Calendar.HOUR_OF_DAY, hourTime); + calendar.set(Calendar.MINUTE, minuteTime); + calendar.set(Calendar.SECOND, secondTime); + //获取下一个周一的日期 + Date secondDate = calendar.getTime(); +// System.out.println("secondDate:"+dateTimeFormat.format(secondDate)); + return secondDate.getTime() - firstDate.getTime(); + } +} diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/util/SyncUtil.kt b/app/src/main/java/cn/trans88/taxiappkotlin/util/SyncUtil.kt index c844e58..2fc60be 100644 --- a/app/src/main/java/cn/trans88/taxiappkotlin/util/SyncUtil.kt +++ b/app/src/main/java/cn/trans88/taxiappkotlin/util/SyncUtil.kt @@ -54,7 +54,7 @@ object SyncUtil { val target = mutableListOf() for (index in 0 until list.size) { - YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") +// YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") val advertise = list[index] all += advertise.duration.toInt() target.add(advertise.duration.toInt()) @@ -94,7 +94,7 @@ object SyncUtil { val syncTimeModel = SyncTimeModel() for (index in 0 until list.size) { - YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") +// YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") val advertise = list[index] all += advertise.duration.toInt() } @@ -110,9 +110,8 @@ object SyncUtil { var delay:Long = 0 - for (index in 0 until list.size) { - YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") +// YoungUtil.YoungLog("getSyncTime index :$index TID: ${Thread.currentThread().id}") val advertise = list[index] sum += advertise.duration.toInt() diff --git a/app/src/main/java/cn/trans88/taxiappkotlin/util/VideoUtil.java b/app/src/main/java/cn/trans88/taxiappkotlin/util/VideoUtil.java new file mode 100644 index 0000000..41344dd --- /dev/null +++ b/app/src/main/java/cn/trans88/taxiappkotlin/util/VideoUtil.java @@ -0,0 +1,41 @@ +package cn.trans88.taxiappkotlin.util; + +import android.media.MediaMetadataRetriever; + +/** + * @Author: LJH + * @Time: 2023/2/7 + * @description: + */ +public class VideoUtil { + + /** + * 获取视频时长/毫秒 + * @param filePath + * @return + */ + public static int getLocalVideoDuration(String filePath) { + int duration = 0; + try { + MediaMetadataRetriever mmr = new MediaMetadataRetriever(); + mmr.setDataSource(filePath); +// duration = Integer.parseInt(mmr.extractMetadata +// (MediaMetadataRetriever.METADATA_KEY_DURATION))/1000;//除以 1000 返回是秒 + duration = Integer.parseInt(mmr.extractMetadata + (MediaMetadataRetriever.METADATA_KEY_DURATION));//毫秒 + //时长(毫秒) +// String duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION); +// //宽 +// String width = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); +// //高 +// String height = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + + } catch (Exception e) { + e.printStackTrace(); + return duration; + } + + return duration; + } + +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2e4f69c..b4df384 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -55,8 +55,8 @@ diff --git a/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml b/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml new file mode 100644 index 0000000..2b099a4 --- /dev/null +++ b/build/intermediates/lint-cache/sdk-registry.xml/sdk-registry.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/debug/TaxiApp_v3.3.3-26-5.7-debug{161}.apk b/debug/TaxiApp_v3.3.3-26-5.7-debug{161}.apk new file mode 100644 index 0000000..17a6ef3 Binary files /dev/null and b/debug/TaxiApp_v3.3.3-26-5.7-debug{161}.apk differ diff --git a/debug/TaxiApp_v3.3.3-26-5.8-debug{162}.apk b/debug/TaxiApp_v3.3.3-26-5.8-debug{162}.apk new file mode 100644 index 0000000..2a0bdec Binary files /dev/null and b/debug/TaxiApp_v3.3.3-26-5.8-debug{162}.apk differ diff --git a/debug/TaxiApp_v3.3.3-26-5.9-debug{163}.apk b/debug/TaxiApp_v3.3.3-26-5.9-debug{163}.apk new file mode 100644 index 0000000..eccbec4 Binary files /dev/null and b/debug/TaxiApp_v3.3.3-26-5.9-debug{163}.apk differ diff --git a/debug/TaxiApp_v3.3.3-26debug{150}.apk b/debug/TaxiApp_v3.3.3-26debug{150}.apk new file mode 100644 index 0000000..71659e8 Binary files /dev/null and b/debug/TaxiApp_v3.3.3-26debug{150}.apk differ diff --git a/debug/TaxiApp_v3.3.3-26debug{173}.apk b/debug/TaxiApp_v3.3.3-26debug{173}.apk new file mode 100644 index 0000000..59e660e Binary files /dev/null and b/debug/TaxiApp_v3.3.3-26debug{173}.apk differ diff --git a/debug/debug/output.json b/debug/debug/output.json new file mode 100644 index 0000000..df74581 --- /dev/null +++ b/debug/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":154,"versionName":"26-4.1-debug","enabled":true,"outputFile":"TaxiApp_v26-4.1-debug{154}.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"TaxiApp_v26-4.1-debug{154}.apk","properties":{}}] \ No newline at end of file diff --git a/debug/output.json b/debug/output.json new file mode 100644 index 0000000..ad2c80c --- /dev/null +++ b/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":173,"versionName":"3.3.3-26debug","enabled":true,"outputFile":"TaxiApp_v3.3.3-26debug{173}.apk","fullName":"debug","baseName":"debug","dirName":""},"path":"TaxiApp_v3.3.3-26debug{173}.apk","properties":{}}] \ No newline at end of file diff --git a/kurolibrary/.gitignore b/kurolibrary/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/kurolibrary/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/kurolibrary/build.gradle b/kurolibrary/build.gradle new file mode 100644 index 0000000..e34bac9 --- /dev/null +++ b/kurolibrary/build.gradle @@ -0,0 +1,53 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' + id 'kotlin-kapt' +} + +android { + compileSdkVersion 32 + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 32 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar','*.aar']) + implementation 'androidx.appcompat:appcompat:1.3.0' + implementation 'com.google.android.material:material:1.4.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + //room + implementation 'androidx.room:room-runtime:2.2.5' + kapt "androidx.room:room-compiler:2.2.5" + + //json解析 + api 'com.squareup.retrofit2:converter-gson:2.7.1' + + //网络请求框架 + api 'com.squareup.okio:okio:2.3.0' + api 'com.squareup.okhttp3:okhttp:4.1.0' + api 'com.squareup.retrofit2:retrofit:2.7.1' + api 'com.squareup.retrofit2:converter-scalars:2.7.1' +} \ No newline at end of file diff --git a/kurolibrary/consumer-rules.pro b/kurolibrary/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/kurolibrary/proguard-rules.pro b/kurolibrary/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/kurolibrary/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/kurolibrary/src/androidTest/java/com/trs88/kurolibrary/ExampleInstrumentedTest.kt b/kurolibrary/src/androidTest/java/com/trs88/kurolibrary/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..9384118 --- /dev/null +++ b/kurolibrary/src/androidTest/java/com/trs88/kurolibrary/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.trs88.kurolibrary + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.trs88.kurolibrary.test", appContext.packageName) + } +} diff --git a/kurolibrary/src/main/AndroidManifest.xml b/kurolibrary/src/main/AndroidManifest.xml new file mode 100644 index 0000000..37d034a --- /dev/null +++ b/kurolibrary/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/ActivityManager.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/ActivityManager.kt new file mode 100644 index 0000000..ba1a30c --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/ActivityManager.kt @@ -0,0 +1,101 @@ +package com.trs88.kurolibrary.activity + +import android.app.Activity +import android.app.Application +import android.os.Bundle +import java.lang.ref.WeakReference + +/** + * 获取栈顶Activity和对于前后台切换的通知管理 + */ +class ActivityManager private constructor() { + + private val activityRefs = ArrayList>() + private val frontBackCallback = ArrayList() //前后台切换监听存储 + private var activityStartCount = 0 + private var front = true//标志位,判断activity是否在前台 + + fun init(application: Application) { + application.registerActivityLifecycleCallbacks(InnerActivityLifecycleCallbacks()) + } + + inner class InnerActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks { + override fun onActivityPaused(activity: Activity) { + } + + override fun onActivityStarted(activity: Activity) { + activityStartCount++ + //activityStartCount >0说明应用处在可见状态,也就是前台 + //!front 判断之前是不是在后台 + if (!front && activityStartCount > 0) { + //之前在后台,发送了切前台的动作 + front = true + onFrontBackChanged(front) + } + } + + override fun onActivityDestroyed(activity: Activity) { + for (activityRef in activityRefs) { + if (activityRef != null && activityRef.get() == activity) { + activityRefs.remove(activityRef) + break + } + } + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { + } + + override fun onActivityStopped(activity: Activity) { + activityStartCount-- + if (activityStartCount <= 0 && front) { + front = false; + onFrontBackChanged(front) + } + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + activityRefs.add(WeakReference(activity)) + } + + override fun onActivityResumed(activity: Activity) { + } + + } + + /** + * 应用发生了前后台的变化 + */ + private fun onFrontBackChanged(front: Boolean) { + for (callback in frontBackCallback) { + callback.onChange(front) + } + } + + val topActivity: Activity? + get() { + return if (activityRefs.size <= 0) { + null + } else { + activityRefs[activityRefs.size-1].get() + } + } + + fun addFrontBackCallback(callback: FrontBackCallback) { + frontBackCallback.add(callback) + } + + fun removeFrontBackCallback(callback: FrontBackCallback) { + frontBackCallback.remove(callback) + } + + interface FrontBackCallback { + fun onChange(front: Boolean) + } + + companion object { + val instance: ActivityManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + ActivityManager() + } + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/AppGlobals.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/AppGlobals.kt new file mode 100644 index 0000000..1af8b95 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/activity/AppGlobals.kt @@ -0,0 +1,24 @@ +package com.trs88.kurolibrary.activity + +import android.app.Application + +/** + * 对于组件化项目,不可能把项目实际使用的Application下沉到Base,而且各个module也不需要Application真实名字 + * 这样一次反射能获取全局的Application对象的方式相比于在Application onCreate中保存一份感觉更加的通用 + */ +object AppGlobals { + private var application:Application?=null + fun get():Application?{ + if (application ==null){ + try { + application=Class.forName("android.app.ActivityThread") + .getMethod("currentApplication") + .invoke(null) as Application + }catch(ex:Exception) { + ex.printStackTrace() + } + } + + return application + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/Cache.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/Cache.kt new file mode 100644 index 0000000..3a4a8ba --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/Cache.kt @@ -0,0 +1,13 @@ +package com.trs88.kurolibrary.cache + +import androidx.annotation.NonNull +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "cache") +class Cache { + @PrimaryKey(autoGenerate = false) + @NonNull + var cacheKey: String = "" + var data: ByteArray? = null +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDao.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDao.kt new file mode 100644 index 0000000..ec5aedc --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDao.kt @@ -0,0 +1,15 @@ +package com.trs88.kurolibrary.cache + +import androidx.room.* + +@Dao +interface CacheDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun saveCache(cache: Cache) + + @Query("select * from cache where cacheKey=:key") + fun getCache(key:String):Cache? + + @Delete() + fun deleteCache(cache:Cache) +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDatabase.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDatabase.kt new file mode 100644 index 0000000..13a28c7 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/CacheDatabase.kt @@ -0,0 +1,22 @@ +package com.trs88.kurolibrary.cache + +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.trs88.kurolibrary.activity.AppGlobals + +@Database(entities = [Cache::class],version = 1) +abstract class CacheDatabase :RoomDatabase() { + companion object{ + private var database:CacheDatabase + fun get():CacheDatabase{ + return database + } + init { + val context = AppGlobals.get()!!.applicationContext + database=Room.databaseBuilder(context,CacheDatabase::class.java,"kuro_cache").build() + } + } + + abstract val cacheDao:CacheDao +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/KuroStorage.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/KuroStorage.kt new file mode 100644 index 0000000..20a2bfd --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/cache/KuroStorage.kt @@ -0,0 +1,80 @@ +package com.trs88.kurolibrary.cache + +import com.trs88.kurolibrary.log.KuroLog +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.ObjectInputStream +import java.io.ObjectOutputStream + +object KuroStorage { + fun saveCache(key: String, body: T) { + val cache = Cache() + cache.cacheKey = key + cache.data = toByteArray(body) +// KuroLog.d("saveCache: body: $body,cache.data:${cache.data}") + CacheDatabase.get().cacheDao.saveCache(cache) + } + + fun getCache(key: String):T?{ + val cache=CacheDatabase.get().cacheDao.getCache(key) +// if (cache==null){ +// KuroLog.d("getCache cache is null") +// } +// if (cache?.data ==null){ +// KuroLog.d("getCache data is null") +// } + return (if (cache?.data!=null){ + KuroLog.d("getCache data:${cache.data}") + toObject(cache.data) + }else{ + null + }) as? T + + } + + fun deleteCache(key: String){ + val cache=Cache() + cache.cacheKey=key + CacheDatabase.get().cacheDao.deleteCache(cache) + } + + + + + private fun toByteArray(body: T): ByteArray? { + var baos: ByteArrayOutputStream? = null + var oos: ObjectOutputStream? = null + try { + baos = ByteArrayOutputStream() + oos = ObjectOutputStream(baos) + oos.writeObject(body) + oos.flush() + return baos.toByteArray() + } catch (e: Exception) { + e.printStackTrace() + } finally { + baos?.close() + oos?.close() + } + + return ByteArray(0) + } + + private fun toObject(data: ByteArray?): Any? { + var bais: ByteArrayInputStream? = null + var ois: ObjectInputStream? = null + try { + bais = ByteArrayInputStream(data) + ois = ObjectInputStream(bais) + + return ois.readObject() + } catch (e: Exception) { + e.printStackTrace() + } finally { + bais?.close() + ois?.close() + } + + return null + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroExecutor.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroExecutor.kt new file mode 100644 index 0000000..86d1332 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroExecutor.kt @@ -0,0 +1,143 @@ +package com.trs88.kurolibrary.execute + +import android.os.Handler +import android.os.Looper +import androidx.annotation.IntRange +import com.trs88.kurolibrary.log.KuroLog +import java.util.concurrent.* +import java.util.concurrent.atomic.AtomicLong +import java.util.concurrent.locks.Condition +import java.util.concurrent.locks.ReentrantLock + +/** + * 支持按任务的优先级去执行, + * 支持线程池暂停,恢复(比如批量文件下载,上传), + * 支持异步结果主动回调主线程 + * todo 线程池能力监控,耗时任务检测,定时,延迟 + */ +object KuroExecutor { + private val TAG: String = "KuroExecutor" + private var isPaused: Boolean = false + private var kuroExecutor: ThreadPoolExecutor + private var lock: ReentrantLock = ReentrantLock() + private var pauseCondition: Condition + private val mainHandler = Handler(Looper.getMainLooper()) + + init { + pauseCondition = lock.newCondition() + + val cpuCount = Runtime.getRuntime().availableProcessors() + val corePoolSize = cpuCount + 1 + val maxPoolSize = cpuCount * 2 + 1 + val blockingQueue: PriorityBlockingQueue = PriorityBlockingQueue() + val keepAliveTime = 30L + val unit = TimeUnit.SECONDS + + val seq = AtomicLong()//使用原子类作为序号 + + val threadFactory = ThreadFactory { + val thread = Thread(it) + //设置线程名称 + thread.name = "kuro-executor-" + seq.getAndIncrement() + return@ThreadFactory thread + } + + //创建线程池 + kuroExecutor = object : ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, blockingQueue as PriorityBlockingQueue, threadFactory) { + override fun beforeExecute(t: Thread?, r: Runnable?) { + if (isPaused) { + lock.lock() + try { + pauseCondition.await() + } finally { + lock.unlock() + } + } + } + + override fun afterExecute(r: Runnable?, t: Throwable?) { + //监控线程池耗时任务,线程创建数量,正在运行的数量 + } + } + } + + @JvmOverloads + fun execute(runnable: Runnable,@IntRange(from = 0, to = 10) priority: Int = 0 ) { + kuroExecutor.execute(PriorityRunnable(priority, runnable)) + } + + @JvmOverloads + fun execute(runnable: Callable<*>,@IntRange(from = 0, to = 10) priority: Int = 0 ) { + kuroExecutor.execute(PriorityRunnable(priority, runnable)) + } + + abstract class Callable : Runnable { + override fun run() { + mainHandler.post { onPrepare() } + + val t = onBackground() + + //移除所有消息,防止需要执行onComplete了,onPrepare还没有被执行,那就不需要执行了 + mainHandler.removeCallbacksAndMessages(null) + + mainHandler.post { onComplete(t) } + + } + + //任务执行前 + open fun onPrepare() { + + } + + //任务执行中 + abstract fun onBackground(): T + + //任务执行完 + abstract fun onComplete(t: T) + } + + class PriorityRunnable(val priority: Int, val runnable: Runnable) : Runnable, Comparable { + override fun run() { + runnable.run() + } + + override fun compareTo(other: PriorityRunnable): Int { + return if (this.priority < other.priority) 1 else if (this.priority > other.priority) -1 else 0 + } + + } + + @Synchronized + fun pause() { + isPaused = true + KuroLog.et(TAG, "KuroExecutor is paused") + } + + @Synchronized + fun resume() { + isPaused = false + lock.lock() + try { + //唤醒所有阻塞的线程 + pauseCondition.signalAll() + } finally { + lock.unlock() + } + KuroLog.et(TAG, "KuroExecutor is resumed") + } + +// @Synchronized +// fun cancel(){ +// isPaused =true +// val queue = kuroExecutor.queue +// val runnableList = mutableListOf() +// queue.drainTo(runnableList) +// for (runnable in runnableList) { +// runnable +// } +// val poll = queue.poll() +// +// +// } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroScheduledExecutor.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroScheduledExecutor.kt new file mode 100644 index 0000000..844bff3 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/execute/KuroScheduledExecutor.kt @@ -0,0 +1,64 @@ +package com.trs88.kurolibrary.execute + +import android.app.job.JobScheduler +import com.trs88.kurolibrary.log.KuroLog +import java.lang.IllegalArgumentException +import java.util.concurrent.* +import java.util.concurrent.atomic.AtomicLong + +object KuroScheduledExecutor { + private val cpuCount = Runtime.getRuntime().availableProcessors() + private val corePoolSize = cpuCount + 1 + + private val seq = AtomicLong()//使用原子类作为序号 + + private val threadFactory = ThreadFactory { + val thread = Thread(it) + //设置线程名称 + thread.name = "kuro-executor-time-" + seq.getAndIncrement() + return@ThreadFactory thread + } + +// private val mScheduledExecutorService : ScheduledExecutorService =Executors.newScheduledThreadPool(corePoolSize, threadFactory) + private var mScheduledExecutorService : ScheduledExecutorService? =null + + fun execute(task:AbstractScheduledTask){ + if (mScheduledExecutorService==null){ + mScheduledExecutorService=Executors.newScheduledThreadPool(corePoolSize, threadFactory) + } + + val scheduledFuture:ScheduledFuture<*> = mScheduledExecutorService?.scheduleAtFixedRate( + task, + task.delay, + task.period, + task.timeUnit + ) ?: throw IllegalArgumentException("mScheduledExecutorService is null") + scheduledFuture.cancel(true) + + //todo 用map存放这个future 用来停止任务 + + } + + fun cancel(){ + mScheduledExecutorService?.shutdown() + mScheduledExecutorService =null + } + + abstract class AbstractScheduledTask(val delay:Long,val period:Long,val timeUnit:TimeUnit) :Runnable{ +// //执行延迟 +// abstract var delay:Long +// abstract var period:Long +// abstract var timeUnit:TimeUnit + + abstract fun task() + + override fun run() { + try { + task() + }catch (e:Exception){ + KuroLog.e("run AbstractScheduledTask is error message :${e.message}") + } + + } + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/ext/PreferencesExt.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/ext/PreferencesExt.kt new file mode 100644 index 0000000..5981324 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/ext/PreferencesExt.kt @@ -0,0 +1,48 @@ +package com.trs88.asproj.alotservice.ext + +import android.content.Context +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class Preference(private val context: Context,private val name:String,private val default:T,private val prefName:String ="default"):ReadWriteProperty{ + private val prefs by lazy { + context.getSharedPreferences(prefName,Context.MODE_PRIVATE) + } + + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + return findPreference(findProperName(property)) + } + + private fun findProperName(property: KProperty<*>) = if(name.isEmpty()) property.name else name + + private fun findPreference(key: String):T{ + with(prefs){ + return when(default){ + is Long ->getLong(key,default) + is Int ->getInt(key,default) + is Boolean ->getBoolean(key,default) + is String ->getString(key,default) + is Float ->getFloat(key,default) + else ->throw IllegalArgumentException("Unsupported type.") + }as T + } + } + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + putPreference(findProperName(property),value) + } + + private fun putPreference(key:String,value: T){ + with(prefs.edit()){ + when(value){ + is Long ->putLong(key,value) + is Int ->putInt(key,value) + is Boolean ->putBoolean(key,value) + is String ->putString(key,value) + is Float ->putFloat(key,value) + else ->throw IllegalArgumentException("Unsupported type.") + }.apply() + } + } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/file/KuroFileUtil.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/KuroFileUtil.kt new file mode 100644 index 0000000..b539e5f --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/KuroFileUtil.kt @@ -0,0 +1,102 @@ +package com.trs88.kurolibrary.file + +import com.trs88.kurolibrary.execute.KuroExecutor +import com.trs88.kurolibrary.log.KuroLog +import okhttp3.* +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.asRequestBody +import java.io.* + +object KuroFileUtil { + /** + * 通过表单上传文件到指定的Url + */ + fun postFileToUrl(file:File,url:String,headers:Map,callback: PostFileCallBack){ + KuroExecutor.execute(Runnable { + val okHttpClient = OkHttpClient() + val parse = ("application/json;charset=UTF-8").toMediaTypeOrNull() + val requestBody = file.asRequestBody(parse) + + val body =ProgressBody(requestBody,object:ProgressListener{ + override fun onProgress(cur: Long, total: Long,progress:Int) { + callback.onProgress(cur,total,progress) + } + }) + + val builder = MultipartBody.Builder().setType(MultipartBody.FORM) + builder.addFormDataPart("file", file.name, body) + + val requestBuilder = Request.Builder() + .url(url) //要访问的链接 + .post(builder.build()) + + for (header in headers) { + requestBuilder.addHeader(header.key,header.value) + } + + + + val request = requestBuilder.build() + + val call = okHttpClient.newCall(request) + call.enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + callback.onFailure(call,e) + } + + override fun onResponse(call: Call, response: Response) { + callback.onResponse(call,response) + } + }) + }) + } + + /** + * 复制旧文件到新的地址 + */ + fun copyFile(src: File, des: File): Boolean { + if (!src.exists()) { + KuroLog.e("copyFile not exist:" + src.absolutePath) + return false + } + if (!des.parentFile.isDirectory && !des.parentFile.mkdirs()) { + KuroLog.e("copyFile mkdir failed:" + des.parent) + return false + } + KuroLog.i("开始复制文件") + var bis: BufferedInputStream? = null + var bos: BufferedOutputStream? = null + try { + bis = BufferedInputStream(FileInputStream(src)) + bos = BufferedOutputStream(FileOutputStream(des)) + val buffer = ByteArray(4 * 1024) + var count: Int + while (bis.read(buffer, 0, buffer.size).also { count = it } != -1) { + if (count > 0) { + bos.write(buffer, 0, count) + } + } + bos.flush() + return true + } catch (e: Exception) { + KuroLog.e("copyFile exception:", e) + } finally { + if (bis != null) { + try { + bis.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + if (bos != null) { + try { + bos.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + } + return false + } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/file/PostFileCallBack.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/PostFileCallBack.kt new file mode 100644 index 0000000..6624a47 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/PostFileCallBack.kt @@ -0,0 +1,11 @@ +package com.trs88.kurolibrary.file + +import okhttp3.Call +import okhttp3.Response +import java.io.IOException + +interface PostFileCallBack { + fun onFailure(call: Call, e: IOException) + fun onResponse(call: Call, response: Response) + fun onProgress(cur:Long,total:Long,progress:Int) +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressBody.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressBody.kt new file mode 100644 index 0000000..6a08772 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressBody.kt @@ -0,0 +1,68 @@ +package com.trs88.kurolibrary.file + +import okhttp3.MediaType +import okhttp3.RequestBody +import okio.* + + +class ProgressBody( + val requestBody: RequestBody, + val progressListener: ProgressListener +) : RequestBody() { + override fun contentLength(): Long { + return requestBody.contentLength() + } + + override fun contentType(): MediaType? { + return requestBody.contentType() + } + + + override fun writeTo(sink: BufferedSink) { + //包装完成的BufferedSink + if (sink is Buffer + || sink.toString().contains( + "com.android.tools.profiler.support.network.HttpTracker\$OutputStreamTracker" + ) + ) { + requestBody.writeTo(sink) + } else { + val bufferedSink = progressSink(sink).buffer() + requestBody.writeTo(bufferedSink) + bufferedSink.flush() + } + } + + /** + * 写入,回调进度接口 + * @param sink Sink + * @return Sink + */ + private fun progressSink(sink: Sink): Sink { + return object : ForwardingSink(sink) { + //当前写入字节数 + var bytesWritten = 0L + //总字节长度,避免多次调用contentLength()方法 + var contentLength = 0L + //最后的进度 + var lastProgress =0 + + override fun write(source: Buffer, byteCount: Long) { + super.write(source, byteCount) + if (contentLength == 0L) { + contentLength = contentLength() + } + + bytesWritten += byteCount + + val currentProgress = ((bytesWritten.toDouble() / contentLength.toDouble())*100).toInt() + + if (currentProgress>lastProgress){ + lastProgress =currentProgress + progressListener.onProgress(bytesWritten, contentLength,currentProgress) + } + + } + } + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressListener.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressListener.kt new file mode 100644 index 0000000..46f3069 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/file/ProgressListener.kt @@ -0,0 +1,5 @@ +package com.trs88.kurolibrary.file + +interface ProgressListener { + fun onProgress(cur :Long,total:Long,progress:Int) +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroConsolePrinter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroConsolePrinter.java new file mode 100644 index 0000000..8c9f8bb --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroConsolePrinter.java @@ -0,0 +1,33 @@ +package com.trs88.kurolibrary.log; + +import android.util.Log; + +import androidx.annotation.NonNull; + +import static com.trs88.kurolibrary.log.KuroLogConfig.MAX_LEN; + +/** + * 控制台打印器 + */ +public class KuroConsolePrinter implements KuroLogPrinter { + @Override + public void print(@NonNull KuroLogConfig config, int level, String tag, @NonNull String printString) { + int len =printString.length(); + int countOfSub =len/MAX_LEN; + + if (countOfSub>0){ + int index =0; + for (int i =0;iretentionTime){ + file.delete(); + } + } + } + + + + @Override + public void print(@NonNull KuroLogConfig config, int level, String tag, @NonNull String printString) { + long timeMillis=System.currentTimeMillis(); + if (!worker.isRunning()){ + worker.start(); + } + worker.put(new KuroLogModel(timeMillis,level,tag,printString)); + } + + private class PrintWorker implements Runnable{ + private BlockingQueue logs =new LinkedBlockingQueue<>(); + private volatile boolean running; + + /** + * 将log放入打印队列 + * + * @param log 要被打印的log + */ + void put(KuroLogModel log){ + try { + logs.put(log); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * 判断工作线程是否还在运行中 + * + * @return true 在运行 + */ + boolean isRunning(){ + synchronized (this){ + return running; + } + } + + /** + * 启动工作线程 + */ + void start(){ + synchronized (this){ + EXECUTOR.execute(this); + running =true; + } + } + + @Override + public void run() { + KuroLogModel log; + while (true){ + try { + log =logs.take(); + doPrint(log); + } catch (InterruptedException e) { + e.printStackTrace(); + synchronized (this){ + running =false; + } + } + } + } + } + + + /** + * 基于BufferedWriter将log写入文件 + */ + private class LogWriter{ + private String preFileName; + private File logFile; + private BufferedWriter bufferedWriter; + + boolean isReady(){ + return bufferedWriter !=null; + } + + String getPreFileName(){ + return preFileName; + } + + /** + * log写入前的准备操作 + * + * @param newFileName 要保存log的文件名 + * @return true 表示准备就绪 + */ + boolean ready(String newFileName){ + preFileName =newFileName; + logFile =new File(logPath,newFileName); + + // 当log文件不存在时创建log文件 + if(!logFile.exists()){ + try { + File parent = logFile.getParentFile(); + if (!parent.exists()){ + parent.mkdir(); + } + logFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + preFileName =null; + logFile =null; + return false; + } + } + + try { + if (bufferedWriter ==null){ + bufferedWriter =new BufferedWriter(new FileWriter(logFile,true)); + } + } catch (IOException e) { + e.printStackTrace(); + preFileName =null; + logFile =null; + return false; + } + + return true; + } + + /** + * 关闭bufferedWriter + */ + void close(){ + if (bufferedWriter!=null){ + try { + bufferedWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + bufferedWriter = null; + preFileName = null; + logFile = null; + } + } + } + + /** + * 将log写入文件 + * + * @param flattenedLog 格式化后的log + */ + void append(String flattenedLog){ + try { + bufferedWriter.write(flattenedLog); + bufferedWriter.newLine(); + bufferedWriter.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLog.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLog.java new file mode 100644 index 0000000..bd03d7a --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLog.java @@ -0,0 +1,129 @@ +package com.trs88.kurolibrary.log; + +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.Arrays; +import java.util.List; + +/** + * 1、打印堆栈信息 + * 2、File输出 + * 3、模拟控制台 + */ +public class KuroLog { + private static final String KURO_LOG_PACKAGE; + + static { + String className =KuroLog.class.getName(); + KURO_LOG_PACKAGE =className.substring(0,className.lastIndexOf('.')+1); + } + + public static void v(Object...contents){ + log(KuroLogType.V,contents); + } + + public static void vt(String tag,Object...contents){ + log(KuroLogType.V,tag,contents); + } + + public static void d(Object...contents){ + log(KuroLogType.D,contents); + } + + public static void dt(String tag,Object...contents){ + log(KuroLogType.D,tag,contents); + } + + public static void i(Object...contents){ + log(KuroLogType.I,contents); + } + + public static void it(String tag,Object...contents){ + log(KuroLogType.I,tag,contents); + } + + public static void w(Object...contents){ + log(KuroLogType.W,contents); + } + + public static void wt(String tag,Object...contents){ + log(KuroLogType.W,tag,contents); + } + + public static void e(Object...contents){ + log(KuroLogType.E,contents); + } + + public static void et(String tag,Object...contents){ + log(KuroLogType.E,tag,contents); + } + + public static void a(Object...contents){ + log(KuroLogType.A,contents); + } + + public static void at(String tag,Object...contents){ + log(KuroLogType.A,tag,contents); + } + + public static void log(@KuroLogType.TYPE int type,Object...contents ){ + log(type,KuroLogManager.getInstance().getConfig().getGlobalTag(),contents); + } + + public static void log(@KuroLogType.TYPE int type,@Nullable String tag, Object...contents ){ + log(KuroLogManager.getInstance().getConfig(),type,tag,contents); + } + + public static void log(@NonNull KuroLogConfig config, @KuroLogType.TYPE int type, @Nullable String tag, Object...contents ){ + if (!config.enable()){ + return; + } + + //如果配置输出的log等级大于当前的log等级 就不打印 + if (config.printLogLevel()>type){ + return; + } + + StringBuilder sb =new StringBuilder(); + if (config.includeTread()){ + String threadInfo = KuroLogConfig.KURO_THREAD_FORMATTER.format(Thread.currentThread()) ; + sb.append(threadInfo).append("\n"); + } + + if (config.stackTraceDepth()>0){ + String stackTrace =KuroLogConfig.KURO_STACKTRACE_FORMATTER.format(KuroStackTraceUtil.getCroppedRealStackTrack(new Throwable().getStackTrace(),KURO_LOG_PACKAGE,config.stackTraceDepth())); + sb.append(stackTrace).append("\n"); + } + + String body = parseBody(contents,config); + sb.append(body); + //如果config有打印器直接获取config的打印器,如果没有从manager里面获取 + List printers =config.printers()!=null? Arrays.asList(config.printers()):KuroLogManager.getInstance().getPrinters(); + + if (printers==null){ + return; + } + //打印log + for (KuroLogPrinter printer : printers) { + printer.print(config,type,tag,sb.toString()); + } + } + + private static String parseBody(@NonNull Object[] contents,@NonNull KuroLogConfig config){ + if (config.injectJsonParser()!=null){ + return config.injectJsonParser().toJson(contents); + } + StringBuilder sb =new StringBuilder(); + for (Object o:contents){ + sb.append(o.toString()).append(";"); + } + if (sb.length()>0){ + sb.deleteCharAt(sb.length()-1); + } + + return sb.toString(); + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogConfig.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogConfig.java new file mode 100644 index 0000000..07a5024 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogConfig.java @@ -0,0 +1,63 @@ +package com.trs88.kurolibrary.log; + +/** + * 对KuroLog进行配置 + */ +public abstract class KuroLogConfig { + static int MAX_LEN =512;//日志格式化时每一行最大的长度 + + static KuroStackTraceFormatter KURO_STACKTRACE_FORMATTER =new KuroStackTraceFormatter(); + static KuroThreadFormatter KURO_THREAD_FORMATTER =new KuroThreadFormatter(); + + /** + * 设置输出日志的等级 + * @return level + */ + public int printLogLevel(){ + return KuroLogType.V; + } + + public JsonParser injectJsonParser(){ + return null; + } + + public String getGlobalTag(){ + return "KuroLog"; + } + + public boolean enable(){ + return true; + } + + /** + * 是否包含线程信息 + * @return 默认不包含 + */ + public boolean includeTread(){ + return false; + } + + /** + * 打印堆栈信息的深度 + * @return 深度 + */ + public int stackTraceDepth(){ + return 5; + } + + /** + * 让用户注册打印器 + * @return null + */ + public KuroLogPrinter[] printers(){ + return null; + } + + /** + * 这里因为想打印任何对象,但是又不想耦合序列号工具比如Gson,所以提供一个接口让使用者自己序列化 + */ + public interface JsonParser{ + String toJson(Object src); + } + +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogFormatter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogFormatter.java new file mode 100644 index 0000000..cec4c9c --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogFormatter.java @@ -0,0 +1,5 @@ +package com.trs88.kurolibrary.log; + +public interface KuroLogFormatter { + String format(T data); +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogManager.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogManager.java new file mode 100644 index 0000000..a06bbc9 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogManager.java @@ -0,0 +1,79 @@ +package com.trs88.kurolibrary.log; + +import androidx.annotation.NonNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class KuroLogManager { + private KuroLogConfig config; + private static KuroLogManager instance; + private List printers =new ArrayList<>();//保存打印器 + + private KuroLogManager(KuroLogConfig config,KuroLogPrinter[] printers) { + this.config = config; + this.printers.addAll(Arrays.asList(printers)); + } + + public static KuroLogManager getInstance() { + if (instance ==null){ + createDefaultKuroLogManager(); + } + return instance; + } + + /** + * 创建默认的KuroLogManager配置,防止未初始化直接调用Kurolog报错 + */ + private static void createDefaultKuroLogManager() { + init(new KuroLogConfig() { + @Override + public int printLogLevel() { + return KuroLogType.V; + } + + @Override + public String getGlobalTag() { + return "KuroLog"; + } + + @Override + public boolean enable() { + return true; + } + + @Override + public boolean includeTread() { + return true; + } + + @Override + public int stackTraceDepth() { + return 0; + } + },new KuroConsolePrinter()); + } + + public static void init(@NonNull KuroLogConfig config,KuroLogPrinter... printers){ + instance =new KuroLogManager(config,printers); + } + + public KuroLogConfig getConfig(){ + return config; + } + + public void addPrinter(KuroLogPrinter printer){ + printers.add(printer); + } + + public void removePrinter(KuroLogPrinter printer){ + if (printers !=null){ + printers.remove(printer); + } + } + + public List getPrinters(){ + return printers; + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogModel.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogModel.java new file mode 100644 index 0000000..9d5d811 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogModel.java @@ -0,0 +1,31 @@ +package com.trs88.kurolibrary.log; + +import java.text.SimpleDateFormat; +import java.util.Locale; + +public class KuroLogModel { + private static SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss", Locale.CHINA); + public long timeMillis; + public int level; + public String tag; + public String log; + + public KuroLogModel(long timeMillis, int level, String tag, String log) { + this.timeMillis = timeMillis; + this.level = level; + this.tag = tag; + this.log = log; + } + + public String flattenedLog(){ + return getFlattened()+"\n"+log; + } + + public String getFlattened() { + return format(timeMillis) + " | " + level + " | " + tag + " | "; + } + + private String format(long timeMillis) { + return sdf.format(timeMillis); + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogPrinter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogPrinter.java new file mode 100644 index 0000000..d118188 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogPrinter.java @@ -0,0 +1,7 @@ +package com.trs88.kurolibrary.log; + +import androidx.annotation.NonNull; + +public interface KuroLogPrinter { + void print(@NonNull KuroLogConfig config,int level,String tag,@NonNull String printString); +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogType.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogType.java new file mode 100644 index 0000000..3ddad33 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroLogType.java @@ -0,0 +1,21 @@ +package com.trs88.kurolibrary.log; + +import android.util.Log; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +public class KuroLogType { + @IntDef({V,D,I,W,E,A}) + //注解的保留时期在源码级别 + @Retention(RetentionPolicy.SOURCE) + public @interface TYPE{} + public final static int V = Log.VERBOSE; + public final static int D = Log.DEBUG; + public final static int I = Log.INFO; + public final static int W = Log.WARN; + public final static int E = Log.ERROR; + public final static int A = Log.ASSERT; +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceFormatter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceFormatter.java new file mode 100644 index 0000000..99798fe --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceFormatter.java @@ -0,0 +1,31 @@ +package com.trs88.kurolibrary.log; + +/** + * 堆栈打印格式化 + */ +public class KuroStackTraceFormatter implements KuroLogFormatter { + @Override + public String format(StackTraceElement[] data) { + StringBuilder sb =new StringBuilder(128); + if (data ==null ||data.length ==0){ + return null; + }else if (data.length ==1){ + return "\t─ " +data[0].toString(); + }else { + for (int i = 0, len =data.length; i < len; i++) { + if (i ==0){ + sb.append("stackTrace: \n"); + } + if (i !=len-1){ + sb.append("\t ├ "); + sb.append(data[i].toString()); + sb.append("\n"); + }else { + sb.append("\t└"); + sb.append(data[i].toString()); + } + } + return sb.toString(); + } + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceUtil.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceUtil.java new file mode 100644 index 0000000..1ca1022 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroStackTraceUtil.java @@ -0,0 +1,49 @@ +package com.trs88.kurolibrary.log; + +public class KuroStackTraceUtil { + + public static StackTraceElement[] getCroppedRealStackTrack(StackTraceElement[] stackTrace,String ignorePackage,int maxDepth){ + return cropStackTrace(getRealStackTrack(stackTrace,ignorePackage),maxDepth); + } + + /** + * 获取除忽略包之外的堆栈信息 + * @param stackTrace + * @param ignorePackage + * @return 忽略后的堆栈 + */ + private static StackTraceElement[] getRealStackTrack(StackTraceElement[] stackTrace,String ignorePackage){ + int ignoreDepth =0;//默认忽略的长度 + int allDepth =stackTrace.length;//堆栈信息的长度 + String className; + //遍历堆栈 + for (int i = allDepth-1; i >=0 ; i--) { + className =stackTrace[i].getClassName(); + if (ignorePackage!=null&&className.startsWith(ignorePackage)){ + ignoreDepth =i+1; + break; + } + } + + int realDepth =allDepth -ignoreDepth; + StackTraceElement[] realStack =new StackTraceElement[realDepth]; + System.arraycopy(stackTrace,ignoreDepth,realStack,0,realDepth); + return realStack; + } + + /** + * 裁剪堆栈信息 + * @param callStack + * @param maxDepth + * @return 裁剪后的堆栈信息 + */ + private static StackTraceElement[] cropStackTrace(StackTraceElement[] callStack,int maxDepth){ + int realDepth =callStack.length; + if (maxDepth >0){ + realDepth =Math.min(maxDepth,realDepth); + } + StackTraceElement[] realStack =new StackTraceElement[realDepth]; + System.arraycopy(callStack,0,realStack,0,realDepth); + return realStack; + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroThreadFormatter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroThreadFormatter.java new file mode 100644 index 0000000..319376f --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroThreadFormatter.java @@ -0,0 +1,11 @@ +package com.trs88.kurolibrary.log; + +/** + * 线程日志格式化 + */ +public class KuroThreadFormatter implements KuroLogFormatter { + @Override + public String format(Thread data) { + return "Thread:"+data.getName(); + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinter.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinter.java new file mode 100644 index 0000000..7e0c3df --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinter.java @@ -0,0 +1,131 @@ +package com.trs88.kurolibrary.log; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.trs88.kurolibrary.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * 可视化log打印器 + */ +public class KuroViewPrinter implements KuroLogPrinter { + private RecyclerView recyclerView; + private LogAdapter adapter; + private KuroViewPrinterProvider viewProvider; + + public KuroViewPrinter(Activity activity) { + FrameLayout rootView = activity.findViewById(android.R.id.content); + recyclerView =new RecyclerView(activity); + adapter =new LogAdapter(LayoutInflater.from(recyclerView.getContext())); + LinearLayoutManager layoutManager = new LinearLayoutManager(recyclerView.getContext()); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(adapter); + + viewProvider =new KuroViewPrinterProvider(rootView,recyclerView); + } + + /** + * 获取ViewProvider,通过ViewProvider可以控制log视图的展示和隐藏 + * @return viewProvider + */ + @NonNull + public KuroViewPrinterProvider getViewProvider(){ + return viewProvider; + } + + @Override + public void print(@NonNull KuroLogConfig config, int level, String tag, @NonNull String printString) { + //将log展示添加到recycleView + adapter.addItem(new KuroLogModel(System.currentTimeMillis(),level,tag,printString)); + //滚动到对应位置 + recyclerView.smoothScrollToPosition(adapter.getItemCount()-1); + } + + private static class LogAdapter extends RecyclerView.Adapter{ + private LayoutInflater inflater; + private List logs =new ArrayList<>(); + public LogAdapter(LayoutInflater inflater){ + this.inflater =inflater; + } + + void addItem(KuroLogModel kuroLogModel){ + logs.add(kuroLogModel); + notifyItemInserted(logs.size()-1); + } + + @NonNull + @Override + public LogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = inflater.inflate(R.layout.kurolog_item, parent, false); + return new LogViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull LogViewHolder holder, int position) { + KuroLogModel logItem =logs.get(position); + int color =getHighLightColor(logItem.level); + holder.tagView.setTextColor(color); + holder.messageView.setTextColor(color); + + holder.tagView.setText(logItem.getFlattened()); + holder.messageView.setText(logItem.log); + } + + @Override + public int getItemCount() { + return logs.size(); + } + + /** + * 根据log级别获取不同的高亮颜色 + * @param logLevel log 级别 + * @return 颜色 + */ + private int getHighLightColor(int logLevel){ + int highLight ; + switch (logLevel){ + case KuroLogType.V: + highLight =0xffbbbbbb; + break; + case KuroLogType.D: + highLight =0xffffffff; + break; + case KuroLogType.I: + highLight =0xff6a8759; + break; + case KuroLogType.W: + highLight =0xffbbb529; + break; + case KuroLogType.E: + highLight =0xffff6b68; + break; + default: + highLight =0xffffff00; + break; + + } + return highLight; + } + } + + private static class LogViewHolder extends RecyclerView.ViewHolder{ + TextView tagView; + TextView messageView; + public LogViewHolder(@NonNull View itemView){ + super(itemView); + tagView =itemView.findViewById(R.id.tag); + messageView =itemView.findViewById(R.id.message); + } + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinterProvider.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinterProvider.java new file mode 100644 index 0000000..6c16f28 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/log/KuroViewPrinterProvider.java @@ -0,0 +1,130 @@ +package com.trs88.kurolibrary.log; + +import android.graphics.Color; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.trs88.kurolibrary.util.KuroDisplayUtil; + +public class KuroViewPrinterProvider { + private FrameLayout rootView; + private View floatingView; + private boolean isOpen; + private FrameLayout logView; + private RecyclerView recyclerView; + + private static final String TAG_FLOATING_VIEW ="TAG_FLOATING_VIEW"; + private static final String TAG_LOG_VIEW ="TAG_LOG_VIEW"; + + public KuroViewPrinterProvider(FrameLayout rootView, RecyclerView recyclerView) { + this.rootView = rootView; + this.recyclerView = recyclerView; + } + + /** + * 展示Log 悬浮按钮 + */ + public void showFloatingView(){ + if (rootView.findViewWithTag(TAG_FLOATING_VIEW)!=null){ + return; + } + + FrameLayout.LayoutParams params =new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); + params.gravity = Gravity.BOTTOM|Gravity.END; + View floatingView =genFloatingView(); + floatingView.setTag(TAG_FLOATING_VIEW); + floatingView.setBackgroundColor(Color.BLACK); + floatingView.setAlpha(0.8f); + params.bottomMargin =KuroDisplayUtil.dp2px(100,recyclerView.getResources()); + rootView.addView(genFloatingView(),params); + } + /** + * 关闭Log 悬浮按钮 + */ + public void closeFloatingView(){ + rootView.removeView(genFloatingView()); + } + + private View genFloatingView() { + if (floatingView !=null){ + return floatingView; + } + + TextView textView =new TextView(rootView.getContext()); + textView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!isOpen){ + showLogView(); + } + } + }); + textView.setText("KuroLog"); + return floatingView =textView; + } + + private void showLogView() { + if (rootView.findViewWithTag(TAG_LOG_VIEW)!=null){ + return; + } + + FrameLayout.LayoutParams params =new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, KuroDisplayUtil.dp2px(160,rootView.getResources())); + params.gravity = Gravity.BOTTOM; + + View logView =genLogView(); + logView.setTag(TAG_LOG_VIEW); + rootView.addView(genLogView(),params); + isOpen =true; + } + + private View genLogView() { + if (logView!=null){ + return logView; + } + + FrameLayout logView =new FrameLayout(rootView.getContext()); + logView.setBackgroundColor(Color.BLACK); + logView.addView(recyclerView); + FrameLayout.LayoutParams params =new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); + params.gravity=Gravity.END; + TextView closeView =new TextView(rootView.getContext()); + closeView.setText("close"); + closeView.setTextColor(Color.WHITE); + closeView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + closeLogView(); + } + }); + logView.addView(closeView,params); + + FrameLayout.LayoutParams clearParams =new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); + clearParams.gravity=Gravity.START; + TextView clearView =new TextView(rootView.getContext()); + clearView.setText("clear"); + clearView.setTextColor(Color.WHITE); + clearView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clearLog(); + } + }); + logView.addView(clearView,clearParams); + + return this.logView =logView; + } + + private void clearLog() { +// View logView = rootView.findViewWithTag(TAG_LOG_VIEW); + } + + private void closeLogView() { + isOpen =false; + rootView.removeView(genLogView()); + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCall.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCall.kt new file mode 100644 index 0000000..42b82be --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCall.kt @@ -0,0 +1,14 @@ +package com.trs88.kurolibrary.restful + +import java.io.IOException + +interface KuroCall { + @Throws(IOException::class) + fun execute():KuroResponse + + fun enqueue(callback:KuroCallback) + + interface Factory{ + fun newCall (request:KuroRequest):KuroCall<*> + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCallback.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCallback.kt new file mode 100644 index 0000000..f2ad038 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroCallback.kt @@ -0,0 +1,9 @@ +package com.trs88.kurolibrary.restful + +/** + * callback 回调 + */ +interface KuroCallback { + fun onSuccess(response:KuroResponse) + fun onFailed(throwable: Throwable) +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroConvert.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroConvert.kt new file mode 100644 index 0000000..557887b --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroConvert.kt @@ -0,0 +1,8 @@ +package com.trs88.kurolibrary.restful + +import androidx.lifecycle.LiveData +import java.lang.reflect.Type + +interface KuroConvert { + fun convert(rawData: String, dataType: Type): KuroResponse +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroInterceptor.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroInterceptor.kt new file mode 100644 index 0000000..60969d3 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroInterceptor.kt @@ -0,0 +1,19 @@ +package com.trs88.kurolibrary.restful + +interface KuroInterceptor { + fun intercept(chain: Chain): Boolean + + /** + * Chain 对象会在派发拦截器时候创建 + */ + interface Chain { + val isRequestPeriod:Boolean get() = false + + fun request(): KuroRequest + + /** + * 这个response对象在网络发起之前,是为空的 + */ + fun response(): KuroResponse<*>? + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRequest.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRequest.kt new file mode 100644 index 0000000..231fe07 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRequest.kt @@ -0,0 +1,91 @@ +package com.trs88.kurolibrary.restful + +import android.text.TextUtils +import androidx.annotation.IntDef +import com.trs88.kurolibrary.restful.annotation.CacheStrategy +import com.trs88.kurolibrary.restful.annotation.POST +import java.io.File +import java.lang.IllegalStateException +import java.lang.StringBuilder +import java.lang.reflect.Type +import java.net.URLEncoder + +open class KuroRequest { + private var cacheStrategyKey: String="" + + @METHOD + var httpMethod: Int = 0 + var headers: MutableMap? = null + var parameters: MutableMap? = null + var files: MutableMap? = null + var domainUrl: String? = null//请求域名 + var relativeUrl: String? = null//相对路径 + var returnType: Type? = null + var formPost: Boolean =true//是否是表单提交 + var isFile:Boolean = false//是否是文件 + var cacheStrategy: Int=CacheStrategy.NET_ONLY + + @IntDef(value = [METHOD.GET,METHOD.POST]) + annotation class METHOD{ + companion object{ + const val GET =0 + const val POST =1 + } + } + + //返回请求的完整Url + fun endPointUrl(): String { + if (relativeUrl==null){ + throw IllegalStateException("relative url must bot be null") + } + + if (!relativeUrl!!.startsWith("/")){ + return domainUrl+relativeUrl + } + + val indexOf = domainUrl!!.indexOf("/") + return domainUrl!!.substring(0,indexOf)+relativeUrl + } + + fun addHeader(name: String, value: String) { + if (headers==null){ + headers = mutableMapOf() + } + + headers!![name] =value + + } + + fun getCacheKey(): String { + if (!TextUtils.isEmpty(cacheStrategyKey)){ + return cacheStrategyKey + } + + val builder =StringBuilder() + val endUrl =endPointUrl() + builder.append(endUrl) + if (endUrl.indexOf("?")>0||endUrl.indexOf("&")>0){ + builder.append("&") + }else{ + builder.append("?") + } + + if (parameters!=null){ + for ((key,value)in parameters!!){ + try { + val encodeValue =URLEncoder.encode(value,"UTF-8") + builder.append(key).append("=").append(encodeValue).append("&") + }catch (e:Exception){ + e.printStackTrace() + } + } + + builder.deleteCharAt(builder.length-1) + cacheStrategyKey =builder.toString() + }else{ + cacheStrategyKey =endUrl + } + + return cacheStrategyKey + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroResponse.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroResponse.kt new file mode 100644 index 0000000..74b64e6 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroResponse.kt @@ -0,0 +1,18 @@ +package com.trs88.kurolibrary.restful + +/** + * 响应报文 + */ +open class KuroResponse { + companion object{ + const val SUCCESS:Int =0 + const val CACHE_SUCCESS:Int =304 //请求缓存成功 + } + + var rawData:String? =null//原始数据 + var code =0//业务状态码 0成功 非0失败 + var data:T? =null //业务数据 + var errorData:Map? =null//错误状态下的数据 + + var msg :String ? =null//错误信息 +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRestful.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRestful.kt new file mode 100644 index 0000000..646826b --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/KuroRestful.kt @@ -0,0 +1,40 @@ +package com.trs88.kurolibrary.restful + +import java.lang.reflect.Method +import java.lang.reflect.Proxy +import java.util.concurrent.ConcurrentHashMap + +open class KuroRestful(val baseUrl: String, val callFactory: KuroCall.Factory) { + private var interceptors: MutableList = mutableListOf() + private var methodService: ConcurrentHashMap = + ConcurrentHashMap()//使用ConcurrentHashMap防止并发的情况发生 + private var scheduler: Scheduler + + init { + scheduler = Scheduler(callFactory, interceptors) + } + + + fun addInterceptor(interceptor: KuroInterceptor) { + interceptors.add(interceptor) + } + + + fun create(service: Class): T { + return Proxy.newProxyInstance( + service.classLoader, + arrayOf>(service) + ) { _, method, args -> + var methodParser = methodService[method] + if (methodParser == null) { + methodParser = MethodParser.parse(baseUrl, method, args) + methodService[method] = methodParser + } + val parse = MethodParser.parse(baseUrl, method, args) + + val request = methodParser.newRequest() + + scheduler.newCall(request) + } as T + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/MethodParser.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/MethodParser.kt new file mode 100644 index 0000000..a7df07c --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/MethodParser.kt @@ -0,0 +1,198 @@ +package com.trs88.kurolibrary.restful + +import android.util.Log +import com.trs88.kurolibrary.log.KuroLog +import com.trs88.kurolibrary.restful.annotation.* +import java.io.File +import java.lang.IllegalStateException +import java.lang.reflect.Method +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type + +class MethodParser( + val baseUrl: String, + method: Method, + args: Array +) { + private var domainUrl: String?=null + private var formPost: Boolean=true + private var httpMethod: Int=0 + private var relativeUrl: String?=null + private var returnType: Type? =null + private var headers:MutableMap = mutableMapOf() + private var parameters:MutableMap = mutableMapOf() + private var cacheStrategy:Int =CacheStrategy.NET_ONLY + private var files: MutableMap = mutableMapOf() + private var isFile : Boolean =false + + init { + //parse method annotations such get headers,post,baseUrl + parseMethodAnnotations(method) + + //parse method parameters such as path,filed + parseMethodParameters(method,args) + + //parse method genric return type + parseMethodReturnType(method) + } + + companion object{ + fun parse(baseUrl:String,method:Method,args:Array):MethodParser{ + return MethodParser(baseUrl,method,args) + } + } + + private fun parseMethodReturnType(method: Method) { + if (method.returnType!=KuroCall::class.java){ + throw IllegalStateException(String.format("method %s must be type of KuroCall.class",method.name)) + } + val genericReturnType = method.genericReturnType + if (genericReturnType is ParameterizedType){ + val actualTypeArguments = genericReturnType.actualTypeArguments + require(actualTypeArguments.size==1){ + String.format("method %s can only has one generic return type",method.name) + } + returnType =actualTypeArguments[0] + }else{ + throw IllegalStateException(String.format("method %s must has one gerneric return type",method.name)) + } + } + + private fun parseMethodParameters(method: Method, args: Array) { + val parameterAnnotations = method.parameterAnnotations + val equals = parameterAnnotations.size == args.size + require(equals){ + String.format("arguments annotations count %s dont match expect count %s",parameterAnnotations.size,args.size) + } + + for (index in args.indices) { + val annotations = parameterAnnotations[index] + require(annotations.size<=1){ + "filed can only has one annotation:index =$index" + } + + val arg =args[index] + + require(isPrimitive(arg)){ + "Only supported 8 basic types、String or File for now ,index=$index" + } + + val annotation =annotations[0] + if (annotation is Filed){ + val key = annotation.value + val value = args[index] + if (annotation.isFile){ + isFile = true + if (value is File){ + files[key] =value + }else{ + throw IllegalArgumentException("annotation isFile is true but this value not File,please check it") + } + + }else{ + parameters[key] =value.toString() + } + }else if (annotation is Path){ + val replaceName = annotation.value + val replacement = arg.toString() + if (replaceName!=null && replacement!=null){ + val newRelativeUrl = relativeUrl?.replace("{$replaceName}", replacement) + relativeUrl =newRelativeUrl + } + }else if (annotation is CacheStrategy){ + cacheStrategy = arg as Int + }else if(annotation is Header){ + val name = annotation.value + headers[name] =arg.toString() + }else if (annotation is BaseUrl){ + domainUrl = arg.toString() +// KuroLog.i("domainUrl :$domainUrl") + }else{ + throw IllegalStateException("cannot handle parameter annotation:${annotation.javaClass.toString()}") + } + } + } + + /** + * 判断是否是基础数据类型和String类型 + */ + private fun isPrimitive(value: Any) :Boolean{ + if (value.javaClass ==String::class.java){ + return true + } + + if (value.javaClass == File::class.java){ + return true + } + + try { + val field = value.javaClass.getField("TYPE") + val clazz = field[null] as Class<*> + if (clazz.isPrimitive){ + return true + } + }catch (e:IllegalAccessException){ + e.printStackTrace() + }catch (e:NoSuchFieldException){ + e.printStackTrace() + } + return false + + } + + private fun parseMethodAnnotations(method: Method) { + val annotations =method.annotations + for (annotation in annotations) { + if (annotation is GET){ + relativeUrl =annotation.value + httpMethod =KuroRequest.METHOD.GET + }else if (annotation is POST){ + relativeUrl =annotation.value + httpMethod =KuroRequest.METHOD.POST + formPost = annotation.formPost + }else if (annotation is Headers){ + val headersArray = annotation.value + for (header in headersArray) { + val colon = header.indexOf(":") + check(!(colon==0||colon ==-1)){ + String.format("@headers value must be in the form [name:value],but found [%s]",header) + } + + val name = header.substring(0,colon) + val value =header.substring(colon+1).trim() + headers[name] =value + } + }else if (annotation is BaseUrl){ + domainUrl = annotation.value + }else if (annotation is CacheStrategy){ + cacheStrategy =annotation.value + }else{ + throw IllegalStateException("cannot handle method annotation:"+annotation.javaClass.toString()) + } + } + + require((httpMethod == KuroRequest.METHOD.GET) || (httpMethod == KuroRequest.METHOD.POST)){ + String.format("method %s must has one of GET,POST",method.name) + } + + + if (domainUrl ==null){ + domainUrl =baseUrl + } + } + + fun newRequest():KuroRequest { + val request=KuroRequest() + request.domainUrl =domainUrl + request.returnType =returnType + request.headers =headers + request.httpMethod =httpMethod + request.parameters =parameters + request.relativeUrl =relativeUrl + request.formPost =formPost + request.isFile =isFile + request.files =files + request.cacheStrategy =cacheStrategy + return request + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/Scheduler.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/Scheduler.kt new file mode 100644 index 0000000..a402658 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/Scheduler.kt @@ -0,0 +1,138 @@ +package com.trs88.kurolibrary.restful + +import com.trs88.kurolibrary.cache.KuroStorage +import com.trs88.kurolibrary.execute.KuroExecutor +import com.trs88.kurolibrary.log.KuroLog +import com.trs88.kurolibrary.restful.annotation.CacheStrategy +import com.trs88.kurolibrary.util.MainHandler + +/** + * 代理CallFactory创建出来的call对象,从而实现拦截器的派发动作 + */ +class Scheduler( + private val callFactory: KuroCall.Factory, + private val interceptors: MutableList +) { + fun newCall(request: KuroRequest): KuroCall<*> { + val newCall = callFactory.newCall(request) + return ProxyCall(newCall, request) + } + + internal inner class ProxyCall( + private val delegate: KuroCall, + private val request: KuroRequest + ) : KuroCall { + override fun execute(): KuroResponse { + dispatchInterceptor(request, null) + + if (request.cacheStrategy ==CacheStrategy.CACHE_FIRST){ + val cacheResponse =readCache(request) + if (cacheResponse.data!=null){ + //抛到主线程中 + return cacheResponse + } + } + + val response = delegate.execute() + + saveCacheIfNeed(response) + + dispatchInterceptor(request, response) + + return response + } + + override fun enqueue(callback: KuroCallback) { + dispatchInterceptor(request, null) + if (request.cacheStrategy ==CacheStrategy.CACHE_FIRST){ + KuroExecutor.execute(runnable = Runnable { + val cacheResponse =readCache(request) + if (cacheResponse.data!=null){ +// KuroLog.d("enqueue,cache data:${cacheResponse.data}") + //抛到主线程中 + MainHandler.sendAtFrontOfQueue(runnable = Runnable { + callback.onSuccess(cacheResponse) + }) + KuroLog.d("enqueue,cache:${request.getCacheKey()}") + } + }) + } + val response = delegate.enqueue(object : KuroCallback { + override fun onSuccess(response: KuroResponse) { + dispatchInterceptor(request, response) + saveCacheIfNeed(response) + callback.onSuccess(response) + } + + override fun onFailed(throwable: Throwable) { + callback.onFailed(throwable) + } + + }) + + return response + } + + private fun saveCacheIfNeed(response: KuroResponse) { + if (request.cacheStrategy ==CacheStrategy.CACHE_FIRST||request.cacheStrategy ==CacheStrategy.NET_CACHE){ + if (response.data!=null){ + KuroExecutor.execute(runnable = Runnable { + KuroStorage.saveCache(request.getCacheKey(),response.data) + }) + } + } + } + + private fun readCache(request: KuroRequest): KuroResponse { + //kurostorage 查询缓存 需要提供cache key + val cacheKey =request.getCacheKey() + val cache=KuroStorage.getCache(cacheKey) + val cacheResponse =KuroResponse() + KuroLog.d("readCache:$cacheKey,data:$cache") + cacheResponse.data =cache + cacheResponse.code =KuroResponse.CACHE_SUCCESS + cacheResponse.msg ="缓存获取成功" + return cacheResponse + } + + private fun dispatchInterceptor(request: KuroRequest, response: KuroResponse?) { + InterceptorChain(request, response).dispatch() + } + + + internal inner class InterceptorChain( + private val request: KuroRequest, + private val response: KuroResponse? + ) : KuroInterceptor.Chain { + //分发的第几个拦截器 + var callIndex: Int = 0 + + override val isRequestPeriod: Boolean + get() = response == null + + override fun request(): KuroRequest { + return request + } + + override fun response(): KuroResponse<*>? { + return response + } + + fun dispatch() { + if(interceptors.isEmpty()){ + return + } + + val interceptor = interceptors[callIndex] + val intercept = interceptor.intercept(this) + callIndex++ + if (!intercept && callIndex < interceptors.size) { + dispatch() + } + } + + } + + } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/BaseUrl.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/BaseUrl.kt new file mode 100644 index 0000000..2526a60 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/BaseUrl.kt @@ -0,0 +1,11 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @BaseUrl("https://xxxx/xxxx") + */ +@Target(AnnotationTarget.FUNCTION,AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class BaseUrl (val value:String="") + diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/CacheStrategy.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/CacheStrategy.kt new file mode 100644 index 0000000..96c3df0 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/CacheStrategy.kt @@ -0,0 +1,13 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +@Target(AnnotationTarget.FUNCTION,AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class CacheStrategy (val value:Int=NET_ONLY){ + companion object{ + const val CACHE_FIRST =0//请求接口时候先读取本地缓存,再读取接口,接口成功后更新缓存(一般页面初始化数据) + const val NET_ONLY =1//仅仅请求接口(一般是分页和独立非列表页) + const val NET_CACHE =2//先接口,接口成功后更新缓存(一般是下拉刷新) + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Filed.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Filed.kt new file mode 100644 index 0000000..d2adcdd --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Filed.kt @@ -0,0 +1,10 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @Filed("xxxxx") + */ +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class Filed (val value:String,val isFile:Boolean =false) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/GET.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/GET.kt new file mode 100644 index 0000000..eff655b --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/GET.kt @@ -0,0 +1,10 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @GET("/xxxxx/xxx") + */ +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class GET (val value:String) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Header.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Header.kt new file mode 100644 index 0000000..5902892 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Header.kt @@ -0,0 +1,10 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @Headers({"connection"}) + */ +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class Header (val value:String) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Headers.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Headers.kt new file mode 100644 index 0000000..7757bc0 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Headers.kt @@ -0,0 +1,10 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @Headers({"connection:keep-alive","auth-token:token"}) + */ +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class Headers (vararg val value:String) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/POST.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/POST.kt new file mode 100644 index 0000000..aa41d67 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/POST.kt @@ -0,0 +1,10 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @POST("/xxxx/xxxx") + */ +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class POST (val value:String,val formPost:Boolean =true) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Path.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Path.kt new file mode 100644 index 0000000..709131d --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/annotation/Path.kt @@ -0,0 +1,11 @@ +package com.trs88.kurolibrary.restful.annotation + +import java.lang.annotation.RetentionPolicy + +/** + * @GET("/xxx/{province}") + * fun test(@Path("province") int provinceId) + */ +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class Path (val value:String) \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/GsonConvert.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/GsonConvert.kt new file mode 100644 index 0000000..9258a21 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/GsonConvert.kt @@ -0,0 +1,42 @@ +package cn.trans88.taxiappkotlin.net + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.trs88.kurolibrary.log.KuroLog +import com.trs88.kurolibrary.restful.KuroConvert +import com.trs88.kurolibrary.restful.KuroResponse +import org.json.JSONException +import org.json.JSONObject +import java.lang.reflect.Type + +class GsonConvert :KuroConvert{ + private var gson:Gson = Gson() + + override fun convert(rawData: String, dataType: Type): KuroResponse { + val response:KuroResponse =KuroResponse() + try { + KuroLog.d("rawData:$rawData") + val jsonObject=JSONObject(rawData) + response.code =jsonObject.optInt("code") + response.msg =jsonObject.optString("msg") + val data = jsonObject.optString("data") + + if (response.code ==KuroResponse.SUCCESS){ + KuroLog.dt("convert","data:$data,dataType:$dataType") + response.data =gson.fromJson(rawData,dataType) + }else{ + response.errorData=gson.fromJson>(data,object :TypeToken>(){ + + }.type) + } + }catch (e:JSONException) { + e.printStackTrace() + response.code=-1 + response.msg=e.message + } + + response.rawData =rawData + return response + } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/KuroApiFactory.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/KuroApiFactory.kt new file mode 100644 index 0000000..bf94f17 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/KuroApiFactory.kt @@ -0,0 +1,27 @@ +package com.trs88.kurolibrary.restful.retrofit + +import cn.trans88.taxiappkotlin.net.RetrofitCallFactory +import com.trs88.kurolibrary.restful.KuroInterceptor +import com.trs88.kurolibrary.restful.KuroRestful + +object KuroApiFactory{ + private var kuroRestful:KuroRestful ? = null + + fun init(kuroRestful: KuroRestful){ + this.kuroRestful =kuroRestful + } + + fun initRetrofit(baseUrl:String):KuroApiFactory{ + this.kuroRestful= KuroRestful(baseUrl,RetrofitCallFactory(baseUrl)) + return this + } + + fun setInterceptor(interceptor: KuroInterceptor):KuroApiFactory{ + kuroRestful?.addInterceptor(interceptor)?:throw IllegalArgumentException("setInterceptor error KuroRestful is null,please first init KuroApiFactory") + return this + } + + fun create(service:Class):T{ + return kuroRestful?.create(service)?:throw IllegalArgumentException("create KuroApiFactory error KuroRestful is null,please first init KuroApiFactory") + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/RetrofitCallFactory.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/RetrofitCallFactory.kt new file mode 100644 index 0000000..f195223 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/restful/retrofit/RetrofitCallFactory.kt @@ -0,0 +1,161 @@ +package cn.trans88.taxiappkotlin.net + +import android.util.Log +import com.trs88.kurolibrary.log.KuroLog +import com.trs88.kurolibrary.restful.* +import okhttp3.* +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.http.* +import java.io.File +import java.io.UnsupportedEncodingException +import java.net.URLDecoder +import java.util.concurrent.TimeUnit.SECONDS + +class RetrofitCallFactory(val baseUrl:String):KuroCall.Factory { + private var kuroConvert: KuroConvert + private var apiService:ApiService + init { + val retrofit = Retrofit.Builder() + .client(OkHttpHolder().okHttpClient) + .baseUrl(baseUrl) + .build() + apiService = retrofit.create(ApiService::class.java) + kuroConvert = GsonConvert() + } + + override fun newCall(request: KuroRequest): KuroCall { + return RetrofitCall(request) + } + + internal inner class RetrofitCall(val request: KuroRequest) :KuroCall{ + override fun execute(): KuroResponse { + val realCall = createRealCall(request) + val response = realCall.execute() + return parseResponse(response) + } + + override fun enqueue(callback: KuroCallback) { + val realCall = createRealCall(request) + realCall.enqueue(object :Callback{ + override fun onFailure(call: Call, t: Throwable) { + callback.onFailed(throwable = t) + } + + override fun onResponse(call: Call, response: Response) { + val response = parseResponse(response) + callback.onSuccess(response) + } + + }) + } + + private fun parseResponse(response: Response): KuroResponse { + var rawData:String?= null + if (response.isSuccessful){ + val body = response.body() + if (body!=null){ + rawData =body.string() + } + }else{ + val body = response.errorBody() + if (body!=null){ + rawData =body.string() + } + } + + return kuroConvert.convert(rawData!!,request.returnType!!) + + } + + private fun createRealCall(request: KuroRequest):Call { + when (request.httpMethod) { + KuroRequest.METHOD.GET -> { + return apiService.get(request.headers,request.endPointUrl(),request.parameters) + } + KuroRequest.METHOD.POST -> { + val parameters = request.parameters + val files = request.files + val jsonObject =JSONObject() + var requestBody:RequestBody?=null + + if (request.isFile){ + KuroLog.i("request is file") + val builder =MultipartBody.Builder().setType(MultipartBody.FORM) + if (!files.isNullOrEmpty()){ + for ((key:String,file:File) in files){ + val parse = ("application/json;charset=UTF-8").toMediaTypeOrNull() + val body = file.asRequestBody(parse) + KuroLog.i("request file name is ${file.name}") + builder.addFormDataPart(key,file.name,body) + } + } + for ((key:String,value:String) in parameters!!){ + if (request.formPost){ + builder.addFormDataPart(key,value) + }else{ + jsonObject.put(key,value) + } + } + + if (request.formPost){ + requestBody =builder.build() + }else{ + requestBody =jsonObject.toString().toRequestBody("application/json;utf-8".toMediaTypeOrNull()) + } + + + }else{ + val builder = FormBody.Builder() + +// val jsonObject =JSONObject() + for ((key:String,value:String) in parameters!!){ + if (request.formPost){ + builder.add(key,value) + }else{ + jsonObject.put(key,value) + } + } + + if (request.formPost){ + requestBody =builder.build() + }else{ + requestBody =jsonObject.toString().toRequestBody("application/json;utf-8".toMediaTypeOrNull()) + } + } + + + return apiService.post(request.headers,request.endPointUrl(),requestBody) + } + else -> { + throw IllegalStateException("KuroRestful only support GET or POST") + } + } + + } + } + + inner class OkHttpHolder{ + private val TIME_OUT =60L + private var builder=OkHttpClient.Builder() + val okHttpClient:OkHttpClient + + init { + okHttpClient =builder.connectTimeout(TIME_OUT,SECONDS).build() + } + } + + interface ApiService{ + @GET + fun get(@HeaderMap headers:MutableMap?,@Url url:String,@QueryMap(encoded = true) params:MutableMap?):Call + + @POST + fun post(@HeaderMap headers:MutableMap?,@Url url:String,@Body body:RequestBody?):Call + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimer.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimer.java new file mode 100644 index 0000000..da8e0c5 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimer.java @@ -0,0 +1,322 @@ +package com.trs88.kurolibrary.timer; + +import android.os.SystemClock; + +import java.util.Arrays; +import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 仿Timer 将定时换成SystemClock.uptimeMillis() + */ +public class KuroTimer { + private final TaskQueue queue = new TaskQueue(); + + private final TimerThread thread = new TimerThread(queue); + + private final Object threadReaper = new Object() { + protected void finalize() throws Throwable { + synchronized(queue) { + thread.newTasksMayBeScheduled = false; + queue.notify(); // In case queue is empty. + } + } + }; + + private final static AtomicInteger nextSerialNumber = new AtomicInteger(0); + private static int serialNumber() { + return nextSerialNumber.getAndIncrement(); + } + + public KuroTimer() { + this("Timer-" + serialNumber()); + } + + + public KuroTimer(boolean isDaemon) { + this("Timer-" + serialNumber(), isDaemon); + } + + public KuroTimer(String name) { + thread.setName(name); + thread.start(); + } + + + public KuroTimer(String name, boolean isDaemon) { + thread.setName(name); + thread.setDaemon(isDaemon); + thread.start(); + } + + + public void schedule(KuroTimerTask task, long delay) { + if (delay < 0) + throw new IllegalArgumentException("Negative delay."); + sched(task, SystemClock.uptimeMillis()+delay, 0); + } + + + public void schedule(KuroTimerTask task, Date time) { + task.setIsDate(true); + sched(task, time.getTime(), 0); + } + + + public void schedule(KuroTimerTask task, long delay, long period) { + if (delay < 0) + throw new IllegalArgumentException("Negative delay."); + if (period <= 0) + throw new IllegalArgumentException("Non-positive period."); + sched(task, SystemClock.uptimeMillis()+delay, -period); + } + + public void schedule(KuroTimerTask task, Date firstTime, long period) { + if (period <= 0) + throw new IllegalArgumentException("Non-positive period."); + task.setIsDate(true); + sched(task, firstTime.getTime(), -period); + } + + + public void scheduleAtFixedRate(KuroTimerTask task, long delay, long period) { + if (delay < 0) + throw new IllegalArgumentException("Negative delay."); + if (period <= 0) + throw new IllegalArgumentException("Non-positive period."); + sched(task, SystemClock.uptimeMillis()+delay, period); + } + + + public void scheduleAtFixedRate(KuroTimerTask task, Date firstTime, + long period) { + if (period <= 0) + throw new IllegalArgumentException("Non-positive period."); + task.setIsDate(true); + sched(task, firstTime.getTime(), period); + } + + private void sched(KuroTimerTask task, long time, long period) { + if (time < 0) + throw new IllegalArgumentException("Illegal execution time."); + + // Constrain value of period sufficiently to prevent numeric + // overflow while still being effectively infinitely large. + if (Math.abs(period) > (Long.MAX_VALUE >> 1)) + period >>= 1; + + synchronized(queue) { + if (!thread.newTasksMayBeScheduled) + throw new IllegalStateException("Timer already cancelled."); + + synchronized(task.lock) { + if (task.state != KuroTimerTask.VIRGIN) + throw new IllegalStateException( + "Task already scheduled or cancelled"); + task.nextExecutionTime = time; + task.period = period; + task.state = KuroTimerTask.SCHEDULED; + } + + queue.add(task); + if (queue.getMin() == task) + queue.notify(); + } + } + + public void cancel() { + synchronized(queue) { + thread.newTasksMayBeScheduled = false; + queue.clear(); + queue.notify(); // In case queue was already empty. + } + } + + + public int purge() { + int result = 0; + + synchronized(queue) { + for (int i = queue.size(); i > 0; i--) { + if (queue.get(i).state == KuroTimerTask.CANCELLED) { + queue.quickRemove(i); + result++; + } + } + + if (result != 0) + queue.heapify(); + } + + return result; + } +} + +class TimerThread extends Thread { + + boolean newTasksMayBeScheduled = true; + + + private TaskQueue queue; + + TimerThread(TaskQueue queue) { + this.queue = queue; + } + + public void run() { + try { + mainLoop(); + } finally { + // Someone killed this Thread, behave as if Timer cancelled + synchronized(queue) { + newTasksMayBeScheduled = false; + queue.clear(); // Eliminate obsolete references + } + } + } + + + private void mainLoop() { + while (true) { + try { + KuroTimerTask task; + boolean taskFired; + synchronized(queue) { + // Wait for queue to become non-empty + while (queue.isEmpty() && newTasksMayBeScheduled) + queue.wait(); + if (queue.isEmpty()) + break; // Queue is empty and will forever remain; die + + // Queue nonempty; look at first evt and do the right thing + long currentTime, executionTime; + task = queue.getMin(); + synchronized(task.lock) { + if (task.state == KuroTimerTask.CANCELLED) { + queue.removeMin(); + continue; // No action required, poll queue again + } + + if (task.getIsDate()){ + currentTime = System.currentTimeMillis(); + }else { + currentTime = SystemClock.uptimeMillis(); + } + + executionTime = task.nextExecutionTime; + if (taskFired = (executionTime<=currentTime)) { + if (task.period == 0) { // Non-repeating, remove + queue.removeMin(); + task.state = KuroTimerTask.EXECUTED; + } else { // Repeating task, reschedule + queue.rescheduleMin( + task.period<0 ? currentTime - task.period + : executionTime + task.period); + } + } + } + if (!taskFired) // Task hasn't yet fired; wait + queue.wait(executionTime - currentTime); + } + if (taskFired) // Task fired; run it, holding no locks + task.run(); + } catch(InterruptedException e) { + } + } + } +} + +class TaskQueue { + + private KuroTimerTask[] queue = new KuroTimerTask[128]; + + + private int size = 0; + + + int size() { + return size; + } + + + void add(KuroTimerTask task) { + // Grow backing store if necessary + if (size + 1 == queue.length) + queue = Arrays.copyOf(queue, 2*queue.length); + + queue[++size] = task; + fixUp(size); + } + + KuroTimerTask getMin() { + return queue[1]; + } + + + KuroTimerTask get(int i) { + return queue[i]; + } + + + void removeMin() { + queue[1] = queue[size]; + queue[size--] = null; // Drop extra reference to prevent memory leak + fixDown(1); + } + + + void quickRemove(int i) { + assert i <= size; + + queue[i] = queue[size]; + queue[size--] = null; // Drop extra ref to prevent memory leak + } + + + void rescheduleMin(long newTime) { + queue[1].nextExecutionTime = newTime; + fixDown(1); + } + + boolean isEmpty() { + return size==0; + } + + void clear() { + // Null out task references to prevent memory leak + for (int i=1; i<=size; i++) + queue[i] = null; + + size = 0; + } + + + private void fixUp(int k) { + while (k > 1) { + int j = k >> 1; + if (queue[j].nextExecutionTime <= queue[k].nextExecutionTime) + break; + KuroTimerTask tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp; + k = j; + } + } + + + private void fixDown(int k) { + int j; + while ((j = k << 1) <= size && j > 0) { + if (j < size && + queue[j].nextExecutionTime > queue[j+1].nextExecutionTime) + j++; // j indexes smallest kid + if (queue[k].nextExecutionTime <= queue[j].nextExecutionTime) + break; + KuroTimerTask tmp = queue[j]; queue[j] = queue[k]; queue[k] = tmp; + k = j; + } + } + + void heapify() { + for (int i = size/2; i >= 1; i--) + fixDown(i); + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimerTask.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimerTask.java new file mode 100644 index 0000000..983a835 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/timer/KuroTimerTask.java @@ -0,0 +1,171 @@ +package com.trs88.kurolibrary.timer; + +/* + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code 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 + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.Date; +import java.util.Timer; + +/** + * A task that can be scheduled for one-time or repeated execution by a Timer. + * + * @author Josh Bloch + * @see Timer + * @since 1.3 + */ + +public abstract class KuroTimerTask implements Runnable { + private boolean isDate = false; + /** + * This object is used to control access to the TimerTask internals. + */ + final Object lock = new Object(); + + /** + * The state of this task, chosen from the constants below. + */ + int state = VIRGIN; + + /** + * This task has not yet been scheduled. + */ + static final int VIRGIN = 0; + + /** + * This task is scheduled for execution. If it is a non-repeating task, + * it has not yet been executed. + */ + static final int SCHEDULED = 1; + + /** + * This non-repeating task has already executed (or is currently + * executing) and has not been cancelled. + */ + static final int EXECUTED = 2; + + /** + * This task has been cancelled (with a call to TimerTask.cancel). + */ + static final int CANCELLED = 3; + + /** + * Next execution time for this task in the format returned by + * System.currentTimeMillis, assuming this task is scheduled for execution. + * For repeating tasks, this field is updated prior to each task execution. + */ + long nextExecutionTime; + + /** + * Period in milliseconds for repeating tasks. A positive value indicates + * fixed-rate execution. A negative value indicates fixed-delay execution. + * A value of 0 indicates a non-repeating task. + */ + long period = 0; + + /** + * Creates a new timer task. + */ + protected KuroTimerTask() { + } + + /** + * The action to be performed by this timer task. + */ + public abstract void run(); + + /** + * Cancels this timer task. If the task has been scheduled for one-time + * execution and has not yet run, or has not yet been scheduled, it will + * never run. If the task has been scheduled for repeated execution, it + * will never run again. (If the task is running when this call occurs, + * the task will run to completion, but will never run again.) + * + *

Note that calling this method from within the run method of + * a repeating timer task absolutely guarantees that the timer task will + * not run again. + * + *

This method may be called repeatedly; the second and subsequent + * calls have no effect. + * + * @return true if this task is scheduled for one-time execution and has + * not yet run, or this task is scheduled for repeated execution. + * Returns false if the task was scheduled for one-time execution + * and has already run, or if the task was never scheduled, or if + * the task was already cancelled. (Loosely speaking, this method + * returns true if it prevents one or more scheduled + * executions from taking place.) + */ + public boolean cancel() { + synchronized(lock) { + boolean result = (state == SCHEDULED); + state = CANCELLED; + return result; + } + } + + /** + * Returns the scheduled execution time of the most recent + * actual execution of this task. (If this method is invoked + * while task execution is in progress, the return value is the scheduled + * execution time of the ongoing task execution.) + * + *

This method is typically invoked from within a task's run method, to + * determine whether the current execution of the task is sufficiently + * timely to warrant performing the scheduled activity: + *

{@code
+     *   public void run() {
+     *       if (System.currentTimeMillis() - scheduledExecutionTime() >=
+     *           MAX_TARDINESS)
+     *               return;  // Too late; skip this execution.
+     *       // Perform the task
+     *   }
+     * }
+ * This method is typically not used in conjunction with + * fixed-delay execution repeating tasks, as their scheduled + * execution times are allowed to drift over time, and so are not terribly + * significant. + * + * @return the time at which the most recent execution of this task was + * scheduled to occur, in the format returned by Date.getTime(). + * The return value is undefined if the task has yet to commence + * its first execution. + * @see Date#getTime() + */ + public long scheduledExecutionTime() { + synchronized(lock) { + return (period < 0 ? nextExecutionTime + period + : nextExecutionTime - period); + } + } + + public void setIsDate(boolean isDate){ + this.isDate =isDate; + } + + public boolean getIsDate(){ + return isDate; + } +} + diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/DistanceUtil.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/DistanceUtil.java new file mode 100644 index 0000000..ac8424e --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/DistanceUtil.java @@ -0,0 +1,56 @@ +package com.trs88.kurolibrary.util; + +import com.trs88.kurolibrary.log.KuroLog; + +/** + * 定位距离的工具类 + */ +public class DistanceUtil { + private final static double EARTH_RADIUS =6378.137; + + + private static double rad(double d) { + return d * Math.PI / 180.0; + } + /** + * 计算两个经纬度之间的距离,单位米 + * @param lat1 + * @param lng1 + * @param lat2 + * @param lng2 + * @return + */ + public static double getDistance(double lat1, double lng1, double lat2, double lng2) { + double radLat1 = rad(lat1); + double radLat2 = rad(lat2); + double a = radLat1 - radLat2; + double b = rad(lng1) - rad(lng2); + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + s = s * EARTH_RADIUS; + s = Math.round(s * 10000d) / 10000d; + s = s * 1000; + KuroLog.v("getDistance 两点间距离: "+s); +// Toast.makeText(App.getInstance(),"curLatitude :"+lat2+" ,curLongitude: "+lng2+ " ,getDistance 两点间距离: "+s ,Toast.LENGTH_SHORT).show(); + return s; + } + + + /** + * 判断是否在范围内 + * @param fenceLatitude + * @param fenceLongitude + * @param curLatitude + * @param curLongitude + * @param radius + * @return + */ + public static boolean inRadius(double fenceLatitude, double fenceLongitude, double curLatitude, double curLongitude, int radius){ + if (getDistance(fenceLatitude,fenceLongitude,curLatitude,curLongitude)>=radius){ + return false; + }else { + return true; + } + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDataBus.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDataBus.kt new file mode 100644 index 0000000..ee3edc9 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDataBus.kt @@ -0,0 +1,87 @@ +package com.trs88.kurolibrary.util + +import androidx.lifecycle.* +import java.util.concurrent.ConcurrentHashMap + + +object KuroDataBus { + private val eventMap =ConcurrentHashMap>() + + fun with(eventName:String):StickyLiveData{ + //基于事件名称 订阅、分发消息,由于一个livedata 只能发送一种数据类型 + //所以 不同的event事件,需要使用不同的livedata实例去分发 + var liveData = eventMap[eventName] + + + if(liveData ==null){ + liveData = StickyLiveData(eventName) + eventMap[eventName] =liveData + } + + return liveData as StickyLiveData + } + + class StickyLiveData (private val eventName:String):LiveData(){ + private var mStickyData:T?= null + private var mVersion =0 + + fun setStickyData(stickyData:T){ + mStickyData =stickyData + setValue(stickyData) + } + + fun postStickyData(stickyData:T){ + mStickyData =stickyData + postValue(stickyData) + } + + override fun setValue(value: T) { + mVersion++ + super.setValue(value) + } + + override fun postValue(value: T) { + mVersion++ + super.postValue(value) + } + + override fun observe(owner: LifecycleOwner, observer: Observer) { + observerSticky(owner,false,observer) + } + + fun observerSticky(owner: LifecycleOwner,sticky:Boolean,observer: Observer){ + //允许指定注册的观察者,是否需要接受粘性事件 + owner.lifecycle.addObserver(LifecycleEventObserver{source, event -> + //监听宿主发送销毁事件主动把livedata移除掉 + if (event==Lifecycle.Event.ON_DESTROY){ + eventMap.remove(eventName) + } + }) + + super.observe(owner,StickyObserver(this,sticky,observer)) + } + + class StickyObserver( + private val stickyLiveData: StickyLiveData, + private val sticky: Boolean, + val observer: Observer + ) : Observer { + //lastVersion和mVersion对齐的原因,就是控制粘性事件的分发 + private var lastVersion =stickyLiveData.mVersion + override fun onChanged(t: T) { + if (lastVersion >=stickyLiveData.mVersion){ + //就说明stickyLiveData 没有更新的数据需要发送 + if (sticky&&stickyLiveData.mStickyData!=null){ + observer.onChanged(stickyLiveData.mStickyData) + } + return + } + lastVersion =stickyLiveData.mVersion + observer.onChanged(t) + } + + } + + } + +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDisplayUtil.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDisplayUtil.java new file mode 100644 index 0000000..0ea27f3 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroDisplayUtil.java @@ -0,0 +1,41 @@ +package com.trs88.kurolibrary.util; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Point; +import android.util.TypedValue; +import android.view.Display; +import android.view.WindowManager; + +import androidx.annotation.NonNull; + +/** + * 显示内容的工具类 包括dp2px 获取屏幕的宽高 + */ +public class KuroDisplayUtil { + public static int dp2px(float dp, Resources resources){ + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,resources.getDisplayMetrics()); + } + + public static int getDisplayWidthInPx(@NonNull Context context){ + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (wm!=null){ + Display display =wm.getDefaultDisplay(); + Point size =new Point(); + display.getSize(size); + return size.x; + } + return 0; + } + + public static int getDisplayHeightInPx(@NonNull Context context){ + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (wm!=null){ + Display display =wm.getDefaultDisplay(); + Point size =new Point(); + display.getSize(size); + return size.y; + } + return 0; + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroScrollUtil.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroScrollUtil.java new file mode 100644 index 0000000..bae60d1 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroScrollUtil.java @@ -0,0 +1,67 @@ +package com.trs88.kurolibrary.util; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.ViewUtils; +import androidx.recyclerview.widget.RecyclerView; + +import com.trs88.kurolibrary.log.KuroLog; + +/** + * 查找可以滚动的child + */ +public class KuroScrollUtil { + /** + * 判断child是否发生了滚动 + * + * @param child + * @return true 发生了滚动 + */ + public static boolean childScrolled(@NonNull View child) { + if (child instanceof AdapterView) { + AdapterView adapterView = (AdapterView) child; + if (adapterView.getFirstVisiblePosition() != 0 + || adapterView.getFirstVisiblePosition() == 0 && adapterView.getChildAt(0) != null + && adapterView.getChildAt(0).getTop() < 0) { + return true; + } + } else if (child.getScrollY() > 0) { + return true; + } + + if (child instanceof RecyclerView) { + RecyclerView recyclerView = (RecyclerView) child; + View view = recyclerView.getChildAt(0); + int firstPosition = recyclerView.getChildAdapterPosition(view); +// KuroLog.d("----:top", view.getTop() + ""); + return firstPosition != 0 || view.getTop() != 0; + } + + return false; + } + + /** + * 查找可以滚动的child + * + * @param viewGroup + * @return 可以滚动的child + */ + public static View findScrollableChild(@NonNull ViewGroup viewGroup) { + View child = viewGroup.getChildAt(1); + if (child instanceof RecyclerView || child instanceof AdapterView) { + return child; + } + + if (child instanceof ViewGroup) { + //往下多找一层 + View tempChild = ((ViewGroup) child).getChildAt(0); + if (tempChild instanceof RecyclerView || tempChild instanceof AdapterView) { + child = tempChild; + } + } + return child; + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroViewUtil.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroViewUtil.java new file mode 100644 index 0000000..2c6d03d --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/KuroViewUtil.java @@ -0,0 +1,40 @@ +package com.trs88.kurolibrary.util; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; + +import java.util.ArrayDeque; +import java.util.Deque; + +public class KuroViewUtil { + /** + * 获取指定类型的子View + * + * @param group ViewGroup + * @param cls 如:RecyclerView.class + * @param + * @return 指定类型的View + */ + public static T findTypeView(@Nullable ViewGroup group,Class cls){ + if (group ==null){ + return null; + } + + Deque deque =new ArrayDeque<>(); + deque.add(group); + while (!deque.isEmpty()){ + View node =deque.removeFirst(); + if (cls.isInstance(node)){ + return cls.cast(node); + }else if (node instanceof ViewGroup){ + ViewGroup container = (ViewGroup) node; + for (int i = 0,count =container.getChildCount(); i < count; i++) { + deque.add(container.getChildAt(i)); + } + } + } + return null; + } +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThread.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThread.java new file mode 100644 index 0000000..742e677 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThread.java @@ -0,0 +1,127 @@ +package com.trs88.kurolibrary.util; + +public class LastThread { + + private long sleep;// 需要睡眠多久 + + private LastThreadListener listenr;// 回调 + + private Object value;// 携带对象 + + private int count = 0;// 线程标识 + + private Thread curr;// 当前正在执行的线程 + + public static final int END = -1;// 回调标记 + + public static final int START = 1; // 回调标记为开始 + + public LastThread(LastThreadListener listenr) { + this.listenr = listenr; + } + + /** + * 调用此方法会启动一个新线程,如果在新线程之前还有旧线程没睡醒,那么旧线程的call方法就不会调用 + *

+ * 假设: 9点20调用call生成一个线程T1,T1会睡眠2分钟 9点21再次调用call生成一个线程A2 由于T1没有睡醒,call方法就被再次调用,所以T1的{@link LastThreadListener} + * 中的call不会执行,只执行了T2的 {@link LastThreadListener}中的call 最后结果:{@link LastThread}中的call 调用了两次,但是 {@link LastThreadListener}中的call只执行了一次 + * + * @param obj 允许携带的参数,@link {@link LastThreadListener} + */ + public void call(Object obj) { + start(obj); + } + + /** + * 在call 之前调用,线程睡醒后才会执行{@link LastThreadListener }中方法的call + * + * @param sleep 毫秒 + */ + public void setSleep(long sleep) { + this.sleep = sleep; + } + + /** + * 携带参数 + * + * @param value + */ + public void setValue(Object value) { + this.value = value; + } + + /** + * 停止所有没睡醒的线程 + */ + public void cancel() { + allowExcuteVersion(); + stop(); + } + + // 真正处理逻辑 + private void start(final Object obj) { + allowExcuteVersion(); + stop(); + + curr = new Thread(new Runnable() { + + public void run() { + if (sleep > 0) { + try { + Thread.sleep(sleep); + } catch (InterruptedException e) { + e.printStackTrace(); + return; + } + } + Thread currentThread = Thread.currentThread(); + + boolean return1 = isReturn(currentThread); + if (return1) { + if (listenr != null) { + listenr.call(END, value); + } + return; + } + + if (listenr != null) { + listenr.call(START, obj); + } + + } + }); + curr.setName(count + ""); + curr.start(); + } + + // 最新线程的标记 + private void allowExcuteVersion() { + count++; + } + + // 停止当前的线程 + private void stop() { + if (curr != null) { + try { + curr.stop(); + } catch (Exception e) { + } + } + } + + /** + * 是否调用线程的{@link LastThreadListener}中call + * + * @param thread + * @return + */ + private boolean isReturn(Thread thread) { + String name = thread.getName(); + int curr = Integer.valueOf(name); + if (curr < count) { + return true; + } + return false; + } + +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThreadListener.java b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThreadListener.java new file mode 100644 index 0000000..fa6b957 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/LastThreadListener.java @@ -0,0 +1,5 @@ +package com.trs88.kurolibrary.util; + +public interface LastThreadListener { + public Object call(int flag, Object obj); +} diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/MainHandler.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/MainHandler.kt new file mode 100644 index 0000000..1a57944 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/MainHandler.kt @@ -0,0 +1,21 @@ +package com.trs88.kurolibrary.util + +import android.os.Handler +import android.os.Looper +import android.os.Message + +object MainHandler { + private val handler = Handler(Looper.getMainLooper()) + fun post(runnable: Runnable){ + handler.post { runnable } + } + + fun postDelay(delayMills:Long,runnable: Runnable){ + handler.postDelayed(runnable,delayMills) + } + + fun sendAtFrontOfQueue(runnable: Runnable){ + val msg = Message.obtain(handler,runnable) + handler.sendMessageAtFrontOfQueue(msg) + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/java/com/trs88/kurolibrary/util/SPUtil.kt b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/SPUtil.kt new file mode 100644 index 0000000..110c696 --- /dev/null +++ b/kurolibrary/src/main/java/com/trs88/kurolibrary/util/SPUtil.kt @@ -0,0 +1,59 @@ +package com.trs88.kurolibrary.util + +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context +import android.content.SharedPreferences +import com.trs88.kurolibrary.activity.AppGlobals + +@SuppressLint("ApplySharedPref") +object SPUtil { + private const val CACHE_FILE = "Kuro_sp" + fun putString(key: String, value: String) { + val shared = getShared() + shared?.edit()?.putString(key, value)?.commit() + } + + fun getString(key: String): String? { + val shared = getShared() + if (shared != null) { + return shared.getString(key, null) + } + return null + } + + fun putBoolean(key: String, value: Boolean) { + val shared = getShared() + shared?.edit()?.putBoolean(key, value)?.commit() + } + + fun getBoolean(key: String): Boolean { + val shared = getShared() + if (shared != null) { + return shared.getBoolean(key, false) + } + return false + } + + fun putInt(key: String, value: Int) { + val shared = getShared() + shared?.edit()?.putInt(key, value)?.commit() + } + + fun getInt(key: String): Int { + val shared = getShared() + if (shared != null) { + return shared.getInt(key, 0) + } + return 0 + } + + + private fun getShared(): SharedPreferences? { + val application: Application? = AppGlobals.get() + if (application != null) { + return application.getSharedPreferences(CACHE_FILE, Context.MODE_PRIVATE) + } + return null + } +} \ No newline at end of file diff --git a/kurolibrary/src/main/res/layout/kurolog_item.xml b/kurolibrary/src/main/res/layout/kurolog_item.xml new file mode 100644 index 0000000..96bb6d4 --- /dev/null +++ b/kurolibrary/src/main/res/layout/kurolog_item.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/kurolibrary/src/test/java/com/trs88/kurolibrary/ExampleUnitTest.kt b/kurolibrary/src/test/java/com/trs88/kurolibrary/ExampleUnitTest.kt new file mode 100644 index 0000000..2a3fe8b --- /dev/null +++ b/kurolibrary/src/test/java/com/trs88/kurolibrary/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.trs88.kurolibrary + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/kurotool/src/main/java/cn/trans88/kurotool/util/ThreadUtil.kt b/kurotool/src/main/java/cn/trans88/kurotool/util/ThreadUtil.kt index 2dcc08c..15432a2 100644 --- a/kurotool/src/main/java/cn/trans88/kurotool/util/ThreadUtil.kt +++ b/kurotool/src/main/java/cn/trans88/kurotool/util/ThreadUtil.kt @@ -1,12 +1,18 @@ package cn.trans88.kurotool.util +import java.util.concurrent.Executor +import java.util.concurrent.Executors import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit object ThreadUtil { - private val poolSize =Runtime.getRuntime().availableProcessors()*2+1 + + private val singleThread = Executors.newSingleThreadExecutor() + private val singleThread2 = Executors.newSingleThreadExecutor() + + private val poolSize = Runtime.getRuntime().availableProcessors()*2+1 private val threadpool = ThreadPoolExecutor( poolSize, poolSize,10, TimeUnit.SECONDS, LinkedBlockingQueue()) @@ -14,4 +20,12 @@ object ThreadUtil { fun executeByPool(runnable: Runnable){ threadpool.execute(runnable) } + + fun executeBySingleThread(runnable: Runnable){ + singleThread.execute(runnable) + } + + fun executeBySingleThread2(runnable: Runnable){ + singleThread2.execute(runnable) + } } \ No newline at end of file diff --git a/local.properties b/local.properties new file mode 100644 index 0000000..d3c4d32 --- /dev/null +++ b/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Fri Oct 21 16:04:48 GMT+08:00 2022 +sdk.dir=D\:\\Android\\sdk diff --git a/release/TaxiApp_v3.3.3-beta26-release{173}.apk b/release/TaxiApp_v3.3.3-beta26-release{173}.apk new file mode 100644 index 0000000..3d3c32e Binary files /dev/null and b/release/TaxiApp_v3.3.3-beta26-release{173}.apk differ diff --git a/release/output.json b/release/output.json new file mode 100644 index 0000000..7c42a94 --- /dev/null +++ b/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":173,"versionName":"3.3.3-beta26-release","enabled":true,"outputFile":"TaxiApp_v3.3.3-beta26-release{173}.apk","fullName":"release","baseName":"release","dirName":""},"path":"TaxiApp_v3.3.3-beta26-release{173}.apk","properties":{}}] \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b9b223d..b2eb197 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,3 @@ //rootProject.name='TaxiAppKotlin' include ':app', ':kurotool' +include ':kurolibrary'