diff --git a/.gitignore b/.gitignore index cd531cf..ebdd23d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,54 +1,14 @@ -# ---> C -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf - +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..686003e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Container \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..245a82c --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5e80d59 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..c83a369 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9c83340 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..3378229 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..43ed7fb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..3543521 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..44062f4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,140 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + buildFeatures { + dataBinding = true + } + + defaultConfig { + applicationId "qianmu.container" + minSdkVersion 22 + targetSdkVersion 24 + versionCode 6 + versionName "V2.0.7.26" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles 'consumer-rules.pro' + + ndk { abiFilters "armeabi-v7a" } + + javaCompileOptions { + annotationProcessorOptions { + arguments = [AROUTER_MODULE_NAME: project.getName()] + } + } + + lintOptions { + checkReleaseBuilds false + abortOnError false + } + + signingConfigs { + android_studio_app { + keyAlias 'key0' + keyPassword '123456' + storeFile file('keystore.jks') + storePassword '123456' +// v2SigningEnabled false + + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.android_studio_app +// signingConfig signingConfigs.release + } + debug { + signingConfig signingConfigs.android_studio_app + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + } + + packagingOptions { + exclude 'AndroidManifest.xml' + } + + sourceSets.main { + jni.srcDirs = [] + jniLibs.srcDir "libs" + } + + repositories { + flatDir { + dirs 'libs' + } + + } + +} + +configurations.all { + resolutionStrategy { + force 'com.android.support:support-v4:27.1.1' + } +} + + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(include: ['*.aar'], dir: 'libs') + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation files('libs\\ymeeting.jar')//亿晟 + implementation project(path: ':playerview') + implementation files('libs\\Msc.jar') + implementation files('libs\\zckjAPI-2.2.jar')//卓策 + implementation files('libs\\jna-min.jar') + implementation files('libs\\toolbox_kit.jar')//灰度主板 罗湖寻车机 + implementation files('libs\\shockman.jar')//指路机 + implementation files('libs/signway.jar')//欣威视通 + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'com.squareup.retrofit2:retrofit:2.5.0' + implementation 'com.squareup.retrofit2:converter-gson:2.5.0' + implementation 'com.squareup.okhttp3:okhttp:4.1.0' + implementation 'com.lzy.net:okgo:3.0.4' + implementation 'org.greenrobot:eventbus:3.1.1' + implementation 'com.alibaba:arouter-api:1.5.0' + implementation 'com.github.bumptech.glide:glide:4.9.0' + implementation 'jp.wasabeef:glide-transformations:3.0.1' + annotationProcessor 'com.alibaba:arouter-compiler:1.2.2' + implementation 'org.java-websocket:Java-WebSocket:1.5.1' + implementation 'com.google.android.exoplayer:exoplayer:2.11.4' + + implementation 'com.yanzhenjie.andserver:api:2.0.4' + annotationProcessor 'com.yanzhenjie.andserver:processor:2.0.4' + implementation files('libs/java-unrar-1.7.0-8.jar') // rar解压 + implementation files('libs/commons-compress-1.19.jar') + implementation 'com.loopj.android:android-async-http:1.4.11' + + implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' + implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' + implementation 'org.bouncycastle:bcpkix-jdk15on:1.59' + implementation 'com.android.support:support-v4:30.4.1' + //加载json动图 + implementation 'com.airbnb.android:lottie:4.2.2' + + implementation 'com.jakewharton:process-phoenix:2.1.2'//软件重启 + + implementation 'cn.hutool:hutool-all:5.8.26' + + //清除页面缓存 + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3' + + //检测内存泄漏 +// debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12' + +} diff --git a/app/keystore.jks b/app/keystore.jks new file mode 100644 index 0000000..2616050 Binary files /dev/null and b/app/keystore.jks differ diff --git a/app/libs/Msc.jar b/app/libs/Msc.jar new file mode 100644 index 0000000..e4ed582 Binary files /dev/null and b/app/libs/Msc.jar differ diff --git a/app/libs/QtAndroid.jar b/app/libs/QtAndroid.jar new file mode 100644 index 0000000..c59e111 Binary files /dev/null and b/app/libs/QtAndroid.jar differ diff --git a/app/libs/QtAndroidBearer.jar b/app/libs/QtAndroidBearer.jar new file mode 100644 index 0000000..76ef673 Binary files /dev/null and b/app/libs/QtAndroidBearer.jar differ diff --git a/app/libs/SdkApiJar_V1.250217.0851.aar b/app/libs/SdkApiJar_V1.250217.0851.aar new file mode 100644 index 0000000..3498f8d Binary files /dev/null and b/app/libs/SdkApiJar_V1.250217.0851.aar differ diff --git a/app/libs/armeabi-v7a/gdbserver b/app/libs/armeabi-v7a/gdbserver new file mode 100644 index 0000000..4309247 Binary files /dev/null and b/app/libs/armeabi-v7a/gdbserver differ diff --git a/app/libs/armeabi-v7a/libQt5Concurrent.so b/app/libs/armeabi-v7a/libQt5Concurrent.so new file mode 100644 index 0000000..bc64110 Binary files /dev/null and b/app/libs/armeabi-v7a/libQt5Concurrent.so differ diff --git a/app/libs/armeabi-v7a/libQt5Core.so b/app/libs/armeabi-v7a/libQt5Core.so new file mode 100644 index 0000000..0110c34 Binary files /dev/null and b/app/libs/armeabi-v7a/libQt5Core.so differ diff --git a/app/libs/armeabi-v7a/libQt5Gui.so b/app/libs/armeabi-v7a/libQt5Gui.so new file mode 100644 index 0000000..1ceda10 Binary files /dev/null and b/app/libs/armeabi-v7a/libQt5Gui.so differ diff --git a/app/libs/armeabi-v7a/libQt5Network.so b/app/libs/armeabi-v7a/libQt5Network.so new file mode 100644 index 0000000..d26d278 Binary files /dev/null and b/app/libs/armeabi-v7a/libQt5Network.so differ diff --git a/app/libs/armeabi-v7a/libc++_shared.so b/app/libs/armeabi-v7a/libc++_shared.so new file mode 100644 index 0000000..574c3bd Binary files /dev/null and b/app/libs/armeabi-v7a/libc++_shared.so differ diff --git a/app/libs/armeabi-v7a/libcrashhandler.so b/app/libs/armeabi-v7a/libcrashhandler.so new file mode 100644 index 0000000..94bb4b4 Binary files /dev/null and b/app/libs/armeabi-v7a/libcrashhandler.so differ diff --git a/app/libs/armeabi-v7a/libgdbserver.so b/app/libs/armeabi-v7a/libgdbserver.so new file mode 100644 index 0000000..e6756d6 Binary files /dev/null and b/app/libs/armeabi-v7a/libgdbserver.so differ diff --git a/app/libs/armeabi-v7a/libjnidispatch.so b/app/libs/armeabi-v7a/libjnidispatch.so new file mode 100644 index 0000000..0683481 Binary files /dev/null and b/app/libs/armeabi-v7a/libjnidispatch.so differ diff --git a/app/libs/armeabi-v7a/libmsc.so b/app/libs/armeabi-v7a/libmsc.so new file mode 100644 index 0000000..3cb79b5 Binary files /dev/null and b/app/libs/armeabi-v7a/libmsc.so differ diff --git a/app/libs/armeabi-v7a/libnvcommon.so b/app/libs/armeabi-v7a/libnvcommon.so new file mode 100644 index 0000000..3cee9b4 Binary files /dev/null and b/app/libs/armeabi-v7a/libnvcommon.so differ diff --git a/app/libs/armeabi-v7a/libplugins_bearer_libqandroidbearer.so b/app/libs/armeabi-v7a/libplugins_bearer_libqandroidbearer.so new file mode 100644 index 0000000..7983346 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_bearer_libqandroidbearer.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqgif.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqgif.so new file mode 100644 index 0000000..22280e4 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqgif.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqicns.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqicns.so new file mode 100644 index 0000000..1f506fe Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqicns.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqico.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqico.so new file mode 100644 index 0000000..00e3d46 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqico.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqjpeg.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqjpeg.so new file mode 100644 index 0000000..a11d44c Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqjpeg.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqtga.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqtga.so new file mode 100644 index 0000000..383eb0f Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqtga.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqtiff.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqtiff.so new file mode 100644 index 0000000..4bf8436 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqtiff.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqwbmp.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqwbmp.so new file mode 100644 index 0000000..886d3d2 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqwbmp.so differ diff --git a/app/libs/armeabi-v7a/libplugins_imageformats_libqwebp.so b/app/libs/armeabi-v7a/libplugins_imageformats_libqwebp.so new file mode 100644 index 0000000..e7d2753 Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_imageformats_libqwebp.so differ diff --git a/app/libs/armeabi-v7a/libplugins_platforms_android_libqtforandroid.so b/app/libs/armeabi-v7a/libplugins_platforms_android_libqtforandroid.so new file mode 100644 index 0000000..c5c4f8f Binary files /dev/null and b/app/libs/armeabi-v7a/libplugins_platforms_android_libqtforandroid.so differ diff --git a/app/libs/armeabi-v7a/libsqlite.so b/app/libs/armeabi-v7a/libsqlite.so new file mode 100644 index 0000000..b1d3ea0 Binary files /dev/null and b/app/libs/armeabi-v7a/libsqlite.so differ diff --git a/app/libs/armeabi-v7a/libviplexcommon.so b/app/libs/armeabi-v7a/libviplexcommon.so new file mode 100644 index 0000000..9d66038 Binary files /dev/null and b/app/libs/armeabi-v7a/libviplexcommon.so differ diff --git a/app/libs/armeabi-v7a/libviplexcore.so b/app/libs/armeabi-v7a/libviplexcore.so new file mode 100644 index 0000000..c70e4fb Binary files /dev/null and b/app/libs/armeabi-v7a/libviplexcore.so differ diff --git a/app/libs/commons-compress-1.19.jar b/app/libs/commons-compress-1.19.jar new file mode 100644 index 0000000..5c9f52a Binary files /dev/null and b/app/libs/commons-compress-1.19.jar differ diff --git a/app/libs/java-unrar-1.7.0-8.jar b/app/libs/java-unrar-1.7.0-8.jar new file mode 100644 index 0000000..04b6a41 Binary files /dev/null and b/app/libs/java-unrar-1.7.0-8.jar differ diff --git a/app/libs/jna-min.jar b/app/libs/jna-min.jar new file mode 100644 index 0000000..5a76c47 Binary files /dev/null and b/app/libs/jna-min.jar differ diff --git a/app/libs/jna-platform.jar b/app/libs/jna-platform.jar new file mode 100644 index 0000000..c7451a2 Binary files /dev/null and b/app/libs/jna-platform.jar differ diff --git a/app/libs/shockman.jar b/app/libs/shockman.jar new file mode 100644 index 0000000..c854370 Binary files /dev/null and b/app/libs/shockman.jar differ diff --git a/app/libs/signway.jar b/app/libs/signway.jar new file mode 100644 index 0000000..f9af7f5 Binary files /dev/null and b/app/libs/signway.jar differ diff --git a/app/libs/toolbox_kit.jar b/app/libs/toolbox_kit.jar new file mode 100644 index 0000000..69639a9 Binary files /dev/null and b/app/libs/toolbox_kit.jar differ diff --git a/app/libs/ymeeting.jar b/app/libs/ymeeting.jar new file mode 100644 index 0000000..b818c0a Binary files /dev/null and b/app/libs/ymeeting.jar differ diff --git a/app/libs/zckjAPI-2.2.jar b/app/libs/zckjAPI-2.2.jar new file mode 100644 index 0000000..07dac54 Binary files /dev/null and b/app/libs/zckjAPI-2.2.jar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..6e7ffa9 --- /dev/null +++ b/app/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 diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.13.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.13.apk new file mode 100644 index 0000000..85aaa30 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.13.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.16.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.16.apk new file mode 100644 index 0000000..59eaf84 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.5.16.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.1.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.1.apk new file mode 100644 index 0000000..1d6c0b6 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.1.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.10.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.10.apk new file mode 100644 index 0000000..4437c49 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.10.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.11.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.11.apk new file mode 100644 index 0000000..b856d84 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.11.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.12.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.12.apk new file mode 100644 index 0000000..43fa558 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.12.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.16.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.16.apk new file mode 100644 index 0000000..76bbafd Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.16.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.19.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.19.apk new file mode 100644 index 0000000..0edc520 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.19.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.2.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.2.apk new file mode 100644 index 0000000..2d26f54 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.2.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.21.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.21.apk new file mode 100644 index 0000000..01211a4 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.21.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.22.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.22.apk new file mode 100644 index 0000000..ba37cd5 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.22.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.23.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.23.apk new file mode 100644 index 0000000..d5dd0e7 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.23.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.24.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.24.apk new file mode 100644 index 0000000..3af9cc6 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.24.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.26.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.26.apk new file mode 100644 index 0000000..4d4cd2a Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.26.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.4.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.4.apk new file mode 100644 index 0000000..8af54c8 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.4.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.5.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.5.apk new file mode 100644 index 0000000..6f76313 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.5.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.6.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.6.apk new file mode 100644 index 0000000..77e1490 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.6.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.8.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.8.apk new file mode 100644 index 0000000..d03438b Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.8.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.9.apk b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.9.apk new file mode 100644 index 0000000..17fcac0 Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器_V2.0.7.9.apk differ diff --git a/app/release/app_andorid_V2_亿晟iot分屏容器(mqtt密码改)_V2.0.7.25.apk b/app/release/app_andorid_V2_亿晟iot分屏容器(mqtt密码改)_V2.0.7.25.apk new file mode 100644 index 0000000..f05a60b Binary files /dev/null and b/app/release/app_andorid_V2_亿晟iot分屏容器(mqtt密码改)_V2.0.7.25.apk differ diff --git a/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.5.15.apk b/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.5.15.apk new file mode 100644 index 0000000..ea67bb4 Binary files /dev/null and b/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.5.15.apk differ diff --git a/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.7.12.apk b/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.7.12.apk new file mode 100644 index 0000000..294cfbd Binary files /dev/null and b/app/release/app_andorid_V2_卓策iot分屏容器_V2.0.7.12.apk differ diff --git a/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.1.apk b/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.1.apk new file mode 100644 index 0000000..322d6b8 Binary files /dev/null and b/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.1.apk differ diff --git a/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.12.apk b/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.12.apk new file mode 100644 index 0000000..b06b443 Binary files /dev/null and b/app/release/app_andorid_V2_无固定iot分屏容器_V2.0.7.12.apk differ diff --git a/app/release/app_andorid_V2_无固定iot分屏容器(网口ip)_V2.0.7.13.apk b/app/release/app_andorid_V2_无固定iot分屏容器(网口ip)_V2.0.7.13.apk new file mode 100644 index 0000000..2ff6e46 Binary files /dev/null and b/app/release/app_andorid_V2_无固定iot分屏容器(网口ip)_V2.0.7.13.apk differ diff --git a/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.13.apk b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.13.apk new file mode 100644 index 0000000..3bbc6d2 Binary files /dev/null and b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.13.apk differ diff --git a/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.16.apk b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.16.apk new file mode 100644 index 0000000..1f845f7 Binary files /dev/null and b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.5.16.apk differ diff --git a/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.22.apk b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.22.apk new file mode 100644 index 0000000..2935291 Binary files /dev/null and b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.22.apk differ diff --git a/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.25.apk b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.25.apk new file mode 100644 index 0000000..ed8ca88 Binary files /dev/null and b/app/release/app_andorid_V2_欣威视通3399iot分屏容器_V2.0.7.25.apk differ diff --git a/app/release/app_andorid_V2_欣威视通3399iot分屏容器武汉恒隆固定_V2.0.7.25.apk b/app/release/app_andorid_V2_欣威视通3399iot分屏容器武汉恒隆固定_V2.0.7.25.apk new file mode 100644 index 0000000..ed5d3f5 Binary files /dev/null and b/app/release/app_andorid_V2_欣威视通3399iot分屏容器武汉恒隆固定_V2.0.7.25.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.5.16.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.5.16.apk new file mode 100644 index 0000000..c5cda72 Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.5.16.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.16.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.16.apk new file mode 100644 index 0000000..705d074 Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.16.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.17.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.17.apk new file mode 100644 index 0000000..af81c05 Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.17.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.18.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.18.apk new file mode 100644 index 0000000..fd9b71f Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.18.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.20.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.20.apk new file mode 100644 index 0000000..697f56c Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.20.apk differ diff --git a/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.21.apk b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.21.apk new file mode 100644 index 0000000..77d88dd Binary files /dev/null and b/app/release/app_andorid_V2_灰度双面屏iot分屏容器_V2.0.7.21.apk differ diff --git a/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.12.apk b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.12.apk new file mode 100644 index 0000000..b02c763 Binary files /dev/null and b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.12.apk differ diff --git a/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.14.apk b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.14.apk new file mode 100644 index 0000000..c662870 Binary files /dev/null and b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.14.apk differ diff --git a/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.15.apk b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.15.apk new file mode 100644 index 0000000..d2307d2 Binary files /dev/null and b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.15.apk differ diff --git a/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.16.apk b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.16.apk new file mode 100644 index 0000000..769ce5b Binary files /dev/null and b/app/release/app_andorid_V2_诺瓦设备iot分屏容器_V2.0.7.16.apk differ diff --git a/app/release/app_andorid_V2_颐堤港定制touch亿晟iot容器(新导视语音版)_V2.0.3.37.apk b/app/release/app_andorid_V2_颐堤港定制touch亿晟iot容器(新导视语音版)_V2.0.3.37.apk new file mode 100644 index 0000000..42e5868 Binary files /dev/null and b/app/release/app_andorid_V2_颐堤港定制touch亿晟iot容器(新导视语音版)_V2.0.3.37.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..da50a03 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "qianmu.container", + "variantName": "processReleaseResources", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "versionCode": 6, + "versionName": "V2.0.7.26", + "outputFile": "app-release.apk" + } + ] +} \ No newline at end of file diff --git a/app/release/更新说明.txt b/app/release/更新说明.txt new file mode 100644 index 0000000..7419358 --- /dev/null +++ b/app/release/更新说明.txt @@ -0,0 +1,16 @@ +V2.0.3.26 +1、增加注册获取楼层楼栋接口加解密 + +V2.0.5.8 +1.深业上城要求加密。多接口及导视接口 + +V2.0.7.1 +1.双面屏 +2、上报固件版本,硬件信号 +3、无网与有网状态切换,超60分钟后,重新联网10秒后拉取节目列表。 + +V2.0.7.12 +1、增加摇臂机屏保页面轮播。 + +V.2.0.7.19 +1、增加下发节目通知导视重置倒计时 \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..aa159c7 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/touch01.json b/app/src/main/assets/touch01.json new file mode 100644 index 0000000..74f08b2 --- /dev/null +++ b/app/src/main/assets/touch01.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":24,"ip":0,"op":120,"w":400,"h":600,"nm":"画板","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"t2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.684,501.8,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[98,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":90,"s":[98,98,100]},{"t":120,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-89.684,-7.68],[-82.264,-7.68],[-82.264,11.2],[-78.104,11.2],[-78.104,-7.68],[-70.673,-7.68],[-70.673,-11.2],[-89.684,-11.2]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.84,-1],[-2.28,0],[-1.83,0.98],[-1.05,1.75],[0,2.2],[1.05,1.75],[1.83,0.99],[2.29,0],[1.83,-1],[1.04,-1.77],[0,-2.18],[-1.05,-1.77]],"o":[[1.83,0.98],[2.29,0],[1.83,-1],[1.05,-1.75],[0,-2.2],[-1.05,-1.75],[-1.83,-1],[-2.28,0],[-1.84,0.99],[-1.05,1.75],[0,2.18],[1.04,1.75]],"v":[[-63.576,10.05],[-57.406,11.52],[-51.225,10.05],[-46.906,5.92],[-45.335,0],[-46.906,-5.92],[-51.225,-10.02],[-57.406,-11.52],[-63.576,-10.02],[-67.895,-5.89],[-69.465,0],[-67.895,5.92]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.2,-0.68],[1.5,0],[1.19,0.66],[0.69,1.19],[0,1.5],[-0.68,1.2],[-1.19,0.67],[-1.49,0],[-1.19,-0.68],[-0.68,-1.22],[0,-1.49],[0.68,-1.22]],"o":[[-1.19,0.66],[-1.49,0],[-1.19,-0.68],[-0.68,-1.22],[0,-1.49],[0.69,-1.22],[1.19,-0.68],[1.5,0],[1.2,0.67],[0.68,1.2],[0,1.5],[-0.68,1.19]],"v":[[-53.374,6.878],[-57.404,7.868],[-61.434,6.878],[-64.253,4.068],[-65.273,-0.002],[-64.253,-4.032],[-61.434,-6.852],[-57.404,-7.872],[-53.374,-6.852],[-50.553,-4.032],[-49.533,-0.002],[-50.553,4.068]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[-1.73,-1.75],[-3.09,0],[-1.7,1.73],[0,3.24],[0,0],[0,0],[0,0],[3.77,0],[0,4.39],[0,0],[0,0],[0,0]],"o":[[1.73,1.73],[3.1,0],[1.73,-1.75],[0,0],[0,0],[0,0],[0,4.39],[-3.8,0],[0,0],[0,0],[0,0],[0,3.24]],"v":[[-38.531,8.93],[-31.301,11.52],[-24.1,8.93],[-21.501,1.44],[-21.501,-11.2],[-25.6,-11.2],[-25.6,1.28],[-31.26,7.87],[-36.96,1.28],[-36.96,-11.2],[-41.12,-11.2],[-41.12,1.44]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-1.81,-1],[-2.26,0],[-1.51,0.64],[-1.04,1.21],[0,0],[2.37,0],[1.22,0.66],[0.68,1.2],[0,1.52],[-0.69,1.19],[-1.21,0.66],[-1.53,0],[-1.62,-1.75],[0,0],[1.52,0.64],[1.84,0],[1.83,-1],[1.04,-1.75],[0,-2.2],[-1.03,-1.75]],"o":[[1.84,0.98],[1.83,0],[1.54,-0.64],[0,0],[-1.62,1.77],[-1.53,0],[-1.21,-0.68],[-0.69,-1.19],[0,-1.51],[0.68,-1.2],[1.22,-0.68],[2.37,0],[0,0],[-1.04,-1.21],[-1.51,-0.64],[-2.26,0],[-1.82,0.99],[-1.05,1.75],[0,2.2],[1.04,1.75]],"v":[[-11.458,10.05],[-5.309,11.52],[-0.288,10.56],[3.581,7.78],[0.902,5.22],[-5.089,7.87],[-9.219,6.88],[-12.059,4.06],[-13.089,0],[-12.059,-4.06],[-9.219,-6.85],[-5.089,-7.87],[0.902,-5.25],[3.581,-7.78],[-0.258,-10.56],[-5.279,-11.52],[-11.419,-10.02],[-15.708,-5.92],[-17.279,0],[-15.738,5.92]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[23.311,11.2],[27.471,11.2],[27.471,-11.2],[23.311,-11.2],[23.311,-1.95],[11.732,-1.95],[11.732,-11.2],[7.572,-11.2],[7.572,11.2],[11.732,11.2],[11.732,1.6],[23.311,1.6]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.861,-3.65],[62.902,11.2],[66.831,11.2],[66.801,-11.2],[63.382,-11.2],[54.641,3.65],[45.742,-11.2],[42.322,-11.2],[42.322,11.2],[46.292,11.2],[46.292,-3.46],[53.652,8.64],[55.501,8.64]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[89.684,11.2],[89.684,7.71],[77.044,7.71],[77.044,1.54],[87.863,1.54],[87.863,-1.89],[77.044,-1.89],[77.044,-7.71],[89.234,-7.71],[89.234,-11.2],[72.883,-11.2],[72.883,11.2]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"t2","np":10,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"t1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199.728,448.76,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[108,108,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":90,"s":[108,108,100]},{"t":120,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-69.526,-8.306],[-55.516,-8.306],[-55.516,8.354],[-88.776,8.354],[-88.776,-8.306],[-75.336,-8.306],[-75.336,-22.416],[-69.526,-22.416],[-69.526,-18.196],[-52.346,-18.196],[-52.346,-12.866],[-69.526,-12.866]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-83.352,3.076],[-61.322,3.076],[-61.322,-3.024],[-83.352,-3.024]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[2.54,-2.54],[0,0],[-1.34,3.46]],"o":[[-1.39,3.84],[0,0],[2.35,-2.11],[0,0]],"v":[[-83.208,11.66],[-89.448,22.22],[-94.728,19.68],[-88.728,10.32]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0.03,0.55],[0,0],[0.01,0.16],[0,0],[0.01,0.16],[0,0],[0.01,0.16],[0,0],[0.04,0.33],[0,0],[0.08,0.45],[0,0],[-0.19,-1.19],[0,0],[-0.03,-0.17],[0,0],[-0.02,-0.16],[0,0],[-0.01,-0.15],[0,0],[-0.02,-0.36]],"o":[[0,-0.46],[0,0],[-0.01,-0.15],[0,0],[-0.01,-0.16],[0,0],[-0.02,-0.16],[0,0],[-0.04,-0.33],[0,0],[-0.07,-0.48],[0,0],[0.24,1.09],[0,0],[0.02,0.17],[0,0],[0.02,0.16],[0,0],[0.01,0.15],[0,0],[0.03,0.41],[0,0]],"v":[[-79.896,22.082],[-79.936,20.562],[-79.976,19.702],[-80.006,19.242],[-80.076,18.312],[-80.116,17.832],[-80.206,16.852],[-80.256,16.362],[-80.366,15.362],[-80.496,14.372],[-80.636,13.402],[-80.856,12.002],[-75.436,11.472],[-74.786,14.932],[-74.626,15.952],[-74.556,16.452],[-74.426,17.452],[-74.376,17.932],[-74.266,18.882],[-74.226,19.332],[-74.156,20.202],[-74.086,21.362]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0.46,1.39],[0,0],[0.7,1.59],[0,0],[-0.4,-0.92],[0,0],[-0.37,-1.58]],"o":[[-0.22,-1.02],[0,0],[-0.6,-1.74],[0,0],[0.41,0.82],[0,0],[0.9,2.16],[0,0]],"v":[[-67.704,21.836],[-68.744,18.136],[-69.064,17.196],[-71.064,12.046],[-65.834,10.896],[-64.614,13.536],[-64.224,14.456],[-62.184,20.396]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[1.45,2.35],[0,0],[0.65,0.9],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.94,-2.21]],"o":[[-0.64,-1.75],[0,0],[-0.65,-1.02],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.89,2.67],[0,0]],"v":[[-55.42,22.076],[-58.81,15.556],[-59.36,14.676],[-61.32,11.756],[-56.18,9.936],[-55.88,10.336],[-55.88,10.336],[-55.26,11.176],[-55.26,11.176],[-54.63,12.046],[-49.9,19.966]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[-1.86,0.6],[0,0],[2.79,-0.58],[0,0],[0,0],[0.05,4.36],[0,0],[-0.38,-4.23],[0,0],[0,0],[0,0],[-0.53,-2.44],[-1.25,2.3],[0,0],[3.12,-3.12],[-1.44,0],[-0.29,0.96],[0,0],[0,0],[0,0],[-0.01,0.06],[0,0],[-0.01,0.07],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.54,-0.63],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.01,-0.1],[0,0],[0.02,-0.1],[0,0],[0.05,-0.17],[0,0],[3.14,0],[2.07,4.7],[3.08,-1.58],[1.39,1.3],[-3.32,2.73],[0.57,4.71],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.41,0.07],[0,0],[0,0],[0,0],[1.92,-0.91],[3.21,-0.02],[0,0],[0.16,0],[0.81,1.58],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.77],[0,0],[0,0],[0,0],[0,0],[0.21,-0.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.24,0.05],[0,0],[0,0],[0,0],[0,0],[0,0],[2.45,-0.29],[0.63,1.3],[-1.19,0.19],[0,0],[-2.02,0.44],[0,0]],"o":[[0,0],[-2.4,0.72],[0,0],[0,0],[-0.38,-4.32],[0,0],[-0.09,4.46],[0,0],[0,0],[0,0],[0.38,2.88],[1.73,-2.06],[0,0],[-2.16,3.88],[1.3,3.69],[0.44,0],[0,0],[0,0],[0,0],[0.01,-0.06],[0,0],[0.01,-0.07],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.25,1.35],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.02,0.11],[0,0],[-0.02,0.1],[0,0],[-0.05,0.18],[0,0],[-1.1,3.73],[-3.5,0],[-2.78,2.3],[-0.81,-1.34],[3.7,-1.68],[-1.06,-3.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0.41,-0.07],[0,0],[0,0],[0,0],[0,3.12],[-1.65,0.81],[0,0],[-0.15,0],[-0.24,-1.59],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.87,0],[0,0],[0,0],[0,0],[0,0],[-0.22,0.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.24,-0.04],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.59,0.43],[-0.24,-1.39],[1.16,-0.16],[0,0],[2.13,-0.37],[0,0],[2.41,-0.56]],"v":[[-26.854,-22.08],[-23.014,-17.23],[-30.844,-15.31],[-30.844,-8.83],[-21.624,-8.83],[-22.204,-21.98],[-16.204,-21.98],[-15.724,-8.83],[-2.664,-8.83],[-2.664,-3.41],[-15.144,-3.41],[-13.754,4.7],[-9.194,-1.82],[-4.154,0.34],[-12.124,10.85],[-7.894,16.75],[-6.814,15.36],[-6.734,15.06],[-6.734,15.06],[-6.654,14.72],[-6.624,14.54],[-6.544,14.16],[-6.514,13.95],[-6.444,13.52],[-6.444,13.52],[-6.384,13.05],[-6.384,13.05],[-6.334,12.55],[-6.334,12.55],[-6.274,12.01],[-6.274,12.01],[-6.224,11.44],[-6.224,11.44],[-6.184,10.83],[-6.184,10.83],[-6.144,10.19],[-6.144,10.19],[-6.104,9.5],[-6.104,9.5],[-6.074,8.78],[-6.074,8.78],[-1.364,12.05],[-1.454,12.82],[-1.454,12.82],[-1.554,13.55],[-1.554,13.55],[-1.644,14.25],[-1.644,14.25],[-1.754,14.91],[-1.804,15.23],[-1.924,15.84],[-1.984,16.14],[-2.104,16.7],[-2.244,17.23],[-2.384,17.74],[-8.424,22.56],[-16.684,14.98],[-25.564,20.83],[-29.354,16.22],[-18.644,9.46],[-21.094,-3.41],[-30.844,-3.41],[-30.844,2.06],[-29.614,1.84],[-29.614,1.84],[-24.674,0.94],[-23.444,0.72],[-23.014,5.9],[-30.844,7.49],[-30.844,15.7],[-33.434,21.26],[-40.714,22.37],[-41.614,22.37],[-42.074,22.37],[-44.084,16.61],[-43.154,16.65],[-43.154,16.65],[-42.544,16.67],[-42.544,16.67],[-41.934,16.69],[-41.934,16.69],[-40.774,16.7],[-40.774,16.7],[-39.724,16.7],[-39.724,16.7],[-38.824,16.69],[-38.824,16.69],[-38.124,16.67],[-38.124,16.67],[-37.754,16.66],[-37.754,16.66],[-36.604,15.65],[-36.604,8.69],[-42.564,9.9],[-42.564,9.9],[-44.554,10.3],[-45.194,10.42],[-46.584,4.66],[-41.524,3.86],[-41.524,3.86],[-39.474,3.52],[-39.474,3.52],[-37.334,3.15],[-36.604,3.02],[-36.604,-3.41],[-45.674,-3.41],[-45.674,-8.83],[-36.604,-8.83],[-36.604,-14.3],[-44.284,-13.25],[-45.914,-18.05],[-42.384,-18.57],[-40.964,-18.81],[-34.684,-20.03],[-33.344,-20.33]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[-1.39,-2.25],[0,0],[2.59,2.3]],"o":[[2.54,2.21],[0,0],[-1.25,-2.21],[0,0]],"v":[[-10.152,-21.072],[-3.052,-13.442],[-7.652,-10.222],[-14.472,-18.142]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[-1.68,-0.24],[4.04,-0.45],[0,0],[0,0],[0,0],[0,0],[0,0],[0.1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,4.28],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.75,-0.23],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.08,0.01],[0,0],[-0.07,0.01],[0,0],[-0.36,1.55],[0,0],[-0.01,0.06]],"o":[[-0.65,3.87],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.22,-0.56],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.05,1.16],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.08,0],[0,0],[0.07,-0.01],[0,0],[1.8,-0.19],[0,0],[0.01,-0.06],[1.39,0.77]],"v":[[44.516,-6.388],[38.356,-0.588],[37.826,-0.538],[37.826,-0.538],[37.266,-0.498],[37.266,-0.498],[36.676,-0.468],[36.376,-0.458],[35.736,-0.438],[35.736,-0.438],[35.076,-0.428],[35.076,-0.428],[17.526,-0.428],[17.526,-0.428],[16.756,-0.438],[16.756,-0.438],[16.016,-0.458],[16.016,-0.458],[15.296,-0.478],[15.296,-0.478],[14.616,-0.508],[14.616,-0.508],[13.966,-0.548],[13.966,-0.548],[13.346,-0.598],[13.346,-0.598],[12.746,-0.648],[5.736,-7.248],[5.736,-21.168],[39.436,-21.168],[39.436,-8.208],[11.736,-8.208],[11.736,-7.348],[11.746,-7.108],[14.036,-5.188],[14.396,-5.148],[14.396,-5.148],[14.786,-5.118],[14.786,-5.118],[15.206,-5.088],[15.206,-5.088],[15.666,-5.068],[15.666,-5.068],[16.426,-5.048],[16.426,-5.048],[17.266,-5.038],[17.266,-5.038],[17.876,-5.038],[17.876,-5.038],[34.466,-5.038],[34.466,-5.038],[34.966,-5.048],[35.206,-5.058],[35.646,-5.068],[35.856,-5.088],[36.246,-5.118],[39.046,-7.448],[39.116,-7.788],[39.146,-7.968]],"c":true},"ix":2},"nm":"路径 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[33.816,-13.102],[33.816,-16.272],[11.736,-16.272],[11.736,-13.102]],"c":true},"ix":2},"nm":"路径 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[2.26,-0.72],[1.73,-0.1],[0,0],[0.15,-0.01],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.76,1.44],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.72],[0,0],[0,0],[-1.34,-1.87],[0,0],[3.12,2.21],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.97],[-1.2,0.37],[0,0],[-0.14,0.01],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.29,-1.53],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.96,-0.05],[0,0],[0,0],[2.55,1.92],[0,0],[-1.53,-2.35],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[35.306,3.314],[45.146,3.314],[45.146,8.644],[35.306,8.644],[35.306,16.564],[32.326,21.604],[27.956,22.264],[27.136,22.304],[26.706,22.324],[25.826,22.344],[25.826,22.344],[24.896,22.354],[24.896,22.354],[23.426,22.364],[23.426,22.364],[22.396,22.364],[22.396,22.364],[20.476,17.234],[21.376,17.274],[21.376,17.274],[22.616,17.314],[22.616,17.314],[23.856,17.344],[23.856,17.344],[25.596,17.364],[25.596,17.364],[28.106,17.374],[28.106,17.374],[29.396,16.364],[29.396,8.644],[14.806,8.644],[21.336,14.734],[17.206,18.624],[8.956,10.754],[11.256,8.644],[2.616,8.644],[2.616,3.314],[29.396,3.314],[29.396,0.624],[35.306,0.624]],"c":true},"ix":2},"nm":"路径 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[-0.2,1.73],[0,0],[0.4,-1.09],[0,0],[0,0],[0,0],[0,0],[0.15,-0.68],[-0.18,4.24],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.04,-0.07],[-0.19,0],[0,0],[-0.09,0.14],[-0.05,0.24],[0,0],[-0.01,0.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.2,-0.43],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.05,-0.24],[0.58,-0.58],[0.92,0],[0,0],[0.77,0.81],[0.17,0.96],[0,0],[0,0],[0,0],[0.01,0.07],[0,0],[0,0.09],[0,0],[0,0],[0,0],[0.01,0.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.01,-0.13],[0,0],[4,-4.21],[1.3,0.62],[0.67,-0.39],[1.7,-0.09],[0,0],[0.11,0],[0,0],[0.12,0],[0.62,1.29],[-0.2,-0.01],[0,0],[-0.1,0],[0,0],[0,0],[0,0],[0,0],[0,0.57],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.07,-0.14],[0,0],[-0.22,-0.63],[0,0],[0.63,1.45],[0,0],[0.13,0.28],[0,0],[0,0],[2.88,-4.56],[1.15,0.53],[-0.18,5.09],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.39,1.15],[0,0],[0,0],[0,0],[0,0],[0,0.92],[3.21,-3.73],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.03,0.18],[0.09,0.14],[0,0],[0.19,0],[0.08,-0.1],[0,0],[0.01,-0.04],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.92,0.77],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.05,0.38],[-0.29,1.1],[-0.67,0.52],[0,0],[-1.1,0],[-0.45,-0.48],[0,0],[0,0],[0,0],[-0.01,-0.07],[0,0],[0,-0.08],[0,0],[0,0],[0,0],[0,-0.11],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.01,0.14],[0,0],[-0.28,5.46],[-0.91,-0.87],[-0.28,0.62],[-1.01,0.62],[0,0],[-0.11,0],[0,0],[-0.12,0],[-0.15,-1.39],[0.2,0.01],[0,0],[0.1,0],[0,0],[0,0],[0,0],[0,0],[0.53,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.07,0.15],[0,0],[0.36,0.82],[0,0],[-0.3,-1.11],[0,0],[-0.14,-0.29],[0,0],[0,0],[-0.19,6.04],[-0.91,-0.82],[2.47,-4.01],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.48,-1.92]],"v":[[58.06,-22.56],[63.77,-21.65],[62.58,-18.28],[61.99,-16.7],[61.99,-16.7],[68.62,-16.7],[68.62,16.7],[68.42,19.06],[72.64,6.29],[72.67,5.53],[72.67,5.53],[72.69,4.78],[72.69,4.78],[72.7,4.05],[72.7,4.05],[72.7,-6.29],[89.06,-6.29],[89.06,15.35],[89.06,15.35],[89.07,15.76],[89.07,15.76],[89.08,16.12],[89.08,16.12],[89.1,16.42],[89.1,16.42],[89.12,16.67],[89.21,17.04],[89.64,17.23],[90.22,17.23],[90.74,17.04],[90.93,16.55],[90.98,16.29],[91.01,16.14],[91.08,15.6],[91.08,15.6],[91.12,14.64],[91.12,14.64],[91.18,12.68],[91.18,12.68],[91.22,10.46],[91.22,10.46],[94.73,12.43],[94.7,13.37],[94.7,13.37],[94.68,14.02],[94.68,14.02],[94.63,14.98],[94.63,14.98],[94.59,15.61],[94.59,15.61],[94.55,16.22],[94.55,16.22],[94.5,16.79],[94.5,16.79],[94.45,17.33],[94.45,17.33],[94.4,17.82],[94.25,18.77],[92.9,21.22],[90.26,21.94],[87.96,21.94],[84.89,20.74],[83.98,18.78],[83.93,18.42],[83.93,18.42],[83.88,18.02],[83.86,17.8],[83.83,17.33],[83.82,17.07],[83.8,16.53],[83.8,16.53],[83.79,15.92],[83.78,15.59],[83.78,-1.34],[77.98,-1.34],[77.98,3.74],[77.97,4.51],[77.97,4.51],[77.96,5.29],[77.94,5.69],[77.91,6.51],[72.41,22.61],[68.18,19.73],[66.79,21.22],[62.79,22.18],[62.13,22.21],[61.79,22.21],[61.07,22.22],[60.7,22.22],[59.26,17.38],[59.87,17.41],[60.48,17.43],[60.78,17.43],[61.6,17.44],[61.6,17.44],[62.9,17.42],[62.9,17.42],[63.67,16.66],[63.67,2.4],[57.38,2.4],[57.38,2.79],[57.38,2.79],[57.34,4.36],[57.34,4.75],[60.46,3.46],[60.85,4.26],[60.85,4.26],[61.26,5.1],[61.26,5.1],[61.67,5.97],[61.67,5.97],[62.07,6.83],[62.27,7.26],[62.64,8.11],[63.53,10.32],[59.98,11.95],[58.48,7.94],[58.09,7.07],[57.69,6.21],[57.29,5.38],[57.29,5.38],[53.35,22.85],[49.08,20.06],[52.38,5.49],[52.41,4.45],[52.41,4.45],[52.43,3.41],[52.43,3.41],[52.44,2.4],[52.44,2.4],[49.37,2.4],[49.37,-2.16],[52.44,-2.16],[52.44,-16.7],[56.95,-16.7]],"c":true},"ix":2},"nm":"路径 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.48,-1.72],[0,0],[0.23,0.7],[0,0],[0.46,1.08],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[1,2.02],[0,0],[-0.15,-0.56],[0,0],[-0.4,-1.17],[0,0],[0,0],[0,0]],"v":[[63.674,-12.288],[57.384,-12.288],[57.384,-9.838],[60.604,-11.088],[63.144,-4.708],[59.594,-3.218],[59.024,-5.128],[58.724,-5.988],[57.384,-9.458],[57.384,-2.158],[63.674,-2.158]],"c":true},"ix":2},"nm":"路径 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[0,0],[-0.27,-0.6],[0,0],[-0.36,-1.17],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.87,2.02]],"o":[[0.27,0.54],[0,0],[0.66,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.58,-1.92],[0,0]],"v":[[81.764,-22.848],[82.574,-21.118],[82.974,-20.208],[84.604,-15.938],[81.244,-14.878],[93.814,-14.878],[93.814,-9.888],[69.384,-9.888],[69.384,-14.878],[78.744,-14.878],[76.294,-21.408]],"c":true},"ix":2},"nm":"路径 14","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"t1","np":16,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"map1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[490.751,249.794,0],"to":[-66,0,0],"ti":[66,0,0]},{"t":120,"s":[94.751,249.794,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.07,-0.53],[0,0],[-3.68,-4.07],[0,0],[-0.7,3.36],[-5.07,-15.85],[0,0],[-5.61,-0.79],[0,0],[19.32,-12],[0,0],[-1.45,-5.44],[0,0],[-5.8,3.45],[-0.16,0.1],[0,0],[0,0],[0,0],[-0.96,0.5],[-5.99,0.94],[-0.36,-0.01],[0,0],[-5.3,-5.76],[0,0],[-3.65,0],[0,0],[-2.93,-11.52],[5.89,-6.47],[0,0],[2.45,2.23],[-2.23,2.45],[0,0],[1.16,4.57],[6.4,0],[0,0],[4.69,5.08],[0,0],[4.1,-0.43],[0,0],[0.21,0],[1.95,-0.65],[0,0],[1.01,-0.52],[0.28,-0.17],[0,0],[0,0],[0,0],[0,0],[0,0],[0.65,-0.39],[3.79,14.21],[0,0],[-9.51,5.58],[11.74,1.66],[0,0],[3.13,9.79],[0,0],[1.03,-4.02],[0,0],[8.89,9.81],[0,0],[2.36,0.16],[0,0],[2,-3.14],[0,0],[-4.94,1.15],[0,0],[2.98,-9.75],[-0.06,-0.15],[-0.28,-0.18],[-0.2,0],[-0.33,0.29],[0,0],[-6.4,-5.73],[0,0],[17.21,-0.43],[0,0],[-2.72,-4.76],[0,0],[15.26,3.31],[0,0],[3.07,-2.7],[1.53,-3.64],[0,0],[8.68,-3.47],[4.75,3.44],[2.5,5.15],[1.49,10.32],[1.02,1.96],[0,0],[0.08,3.89],[0,0],[6.56,0.92],[0,0],[-0.3,-2.18],[0,0],[6.26,0.71],[0,0],[6.52,-3.19],[0,0],[1.79,-3.23],[0,0],[2.9,1.61],[-1.6,2.9],[0,0],[-5.53,2.7],[0,0],[0.21,2.26],[0,0],[-6.06,-0.61],[0,0],[1.41,1.27],[0,0],[3.26,-1.63],[0,0],[8.85,5.49],[0,0],[4.28,-1.45],[0,0],[3.48,16.12],[0,0],[-3.59,6.38],[0,0],[0.57,3.93],[0,0],[-4.84,-6.91],[0,0],[-2.85,-1.04],[0,0],[-2.66,-6.51],[0,0],[-3.22,-1.38],[0,0],[1.21,-10.57],[0,0],[-2.95,-2.67],[0,0],[0,0],[-0.19,-12.45],[0,0],[-0.99,-1.9],[0,0],[-0.51,-3.51],[-4.26,-8.76],[-2.05,-1.49],[-2.11,0.85],[-1.5,3.6],[0,0],[-4.66,4.1],[0,0],[0,0],[0,0],[-6.81,-1.49],[0,0],[2.68,4.7],[0,0],[-14.43,0.31],[0,0],[4.88,4.37],[0,0],[1.95,-1.68],[0,0],[-3.88,12.7],[0.94,-0.22],[0,0],[-8.51,13.34],[0,0]],"o":[[0,0],[5.47,0.35],[0,0],[2.3,2.55],[3.4,-16.29],[0,0],[1.73,5.4],[0,0],[22.76,3.21],[0,0],[-4.85,2.85],[0,0],[1.74,6.52],[0.16,-0.1],[0,0],[0,0],[0,0],[0.75,-0.49],[3.57,-1.86],[0.37,-0.06],[0,0],[7.79,-0.82],[0,0],[2.42,2.72],[0,0],[11.89,0],[2.16,8.47],[0,0],[-2.23,2.45],[-2.45,-2.23],[0,0],[3.17,-3.48],[-1.59,-6.2],[0,0],[-6.93,0],[0,0],[-2.73,-3.07],[0,0],[-0.22,0.02],[-2.27,0.39],[0,0],[-1.6,0.57],[-0.24,0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.57,0.39],[-12.64,7.52],[0,0],[-2.84,-10.65],[10.23,-5.99],[0,0],[-10.18,-1.43],[0,0],[-1.29,-4.04],[0,0],[-2.71,12.96],[0,0],[-1.59,-1.75],[0,0],[-3.71,-0.24],[0,0],[-2.73,4.27],[0,0],[9.93,-2.3],[-0.13,0.43],[0.07,0.19],[0.28,0.18],[0.16,-0.01],[0,0],[6.51,-5.62],[0,0],[12.96,11.6],[0,0],[-5.48,0],[0,0],[7.82,13.69],[0,0],[-2.07,-0.5],[-2.91,2.56],[0,0],[-2.66,6.66],[-6.24,2.5],[-4.39,-3.19],[-5.05,-10.4],[-0.34,-2.37],[0,0],[-1.8,-3.45],[0,0],[0,-6.62],[0,0],[0.96,1.94],[0,0],[0.91,6.75],[0,0],[0.67,7.23],[0,0],[-3.32,1.62],[0,0],[-1.6,2.9],[-2.9,-1.6],[0,0],[2.98,-5.38],[0,0],[2.04,-1.01],[0,0],[-0.61,-6.55],[0,0],[-0.25,-1.88],[0,0],[-3.61,-0.5],[0,0],[-9.32,4.66],[0,0],[-3.85,-2.38],[0,0],[-15.47,5.71],[0,0],[-1.55,-7.16],[0,0],[1.95,-3.46],[0,0],[-1.22,-8.34],[0,0],[1.74,2.49],[0,0],[6.62,2.43],[0,0],[1.26,3.27],[0,0],[9.81,4.2],[0,0],[-0.52,3.94],[0,0],[0,0],[12.37,1.72],[0,0],[0,2.14],[0,0],[1.73,3.32],[1.42,9.84],[2.15,4.43],[1.69,1.23],[5.39,-2.15],[0,0],[2.09,-5.25],[0,0],[0,0],[0,0],[4.48,-3.68],[0,0],[5.25,1.27],[0,0],[-7.2,-12.63],[0,0],[6.55,0],[0,0],[-1.91,-1.71],[0,0],[-10.05,8.68],[0.28,-0.92],[0,0],[-15.41,3.57],[0,0],[4.36,-6.82]],"v":[[-188.811,-117.657],[-142.961,-114.677],[-128.701,-107.787],[-122.251,-100.677],[-115.031,-102.637],[-83.741,-104.267],[-71.511,-66.047],[-59.501,-55.917],[-47.031,-54.157],[-37.471,-9.097],[-38.061,-8.747],[-43.821,5.273],[-36.961,30.993],[-21.941,37.113],[-21.471,36.823],[-20.981,36.503],[-20.981,36.503],[-19.111,35.223],[-16.521,33.673],[-1.181,28.783],[-0.081,28.703],[18.539,26.743],[39.349,34.603],[39.639,34.923],[49.179,39.203],[52.209,39.203],[77.399,58.783],[71.429,82.713],[53.189,102.743],[44.709,103.143],[44.309,94.663],[62.559,74.633],[65.779,61.743],[52.209,51.203],[49.179,51.203],[30.969,43.233],[30.669,42.893],[19.789,38.683],[0.879,40.673],[0.239,40.703],[-6.191,42.343],[-7.001,42.623],[-10.981,44.313],[-11.761,44.763],[-12.201,45.043],[-12.201,45.043],[-12.681,45.373],[-12.681,45.373],[-13.941,46.223],[-15.801,47.423],[-48.561,34.083],[-55.421,8.363],[-44.131,-19.097],[-48.711,-42.277],[-61.171,-44.037],[-82.941,-62.387],[-95.171,-100.607],[-103.231,-100.397],[-103.281,-100.187],[-131.151,-92.617],[-137.591,-99.737],[-143.741,-102.707],[-189.591,-105.687],[-198.841,-100.997],[-204.821,-91.637],[-198.781,-83.087],[-191.331,-84.807],[-175.681,-68.037],[-175.691,-67.227],[-175.171,-66.627],[-174.411,-66.387],[-173.681,-66.727],[-163.561,-75.457],[-140.981,-75.257],[-97.871,-36.697],[-110.111,-3.297],[-110.631,-3.297],[-116.831,7.383],[-103.511,30.743],[-123.101,57.503],[-123.571,57.393],[-131.341,60.283],[-138.311,70.243],[-138.491,70.703],[-155.021,86.773],[-171.851,84.683],[-182.031,71.373],[-191.621,37.013],[-193.651,30.493],[-195.381,27.173],[-198.241,16.013],[-198.251,15.483],[-209.691,2.333],[-224.521,0.273],[-222.611,6.483],[-220.271,23.733],[-231.391,35.163],[-230.511,44.763],[-240.231,62.073],[-249.821,66.773],[-257.661,74.223],[-280.001,114.613],[-288.151,116.953],[-290.501,108.803],[-268.161,68.413],[-255.091,55.993],[-245.501,51.303],[-242.451,45.873],[-243.591,33.613],[-232.541,22.603],[-234.511,8.093],[-237.081,3.213],[-243.191,-2.327],[-253.731,-0.597],[-258.071,1.573],[-287.311,0.233],[-296.141,-5.257],[-308.981,-6.727],[-309.351,-6.587],[-345.251,-26.297],[-346.191,-30.637],[-343.031,-51.657],[-328.481,-77.607],[-326.361,-89.007],[-327.471,-96.587],[-313.001,-102.327],[-307.591,-94.597],[-300.541,-89.177],[-299.771,-88.897],[-285.211,-74.847],[-285.041,-74.427],[-278.031,-67.157],[-273.491,-65.207],[-259.031,-40.307],[-259.071,-39.927],[-255.191,-29.377],[-237.881,-13.697],[-208.041,-9.547],[-186.251,15.103],[-186.251,15.483],[-184.741,21.623],[-183.011,24.943],[-179.741,35.293],[-171.241,66.123],[-164.811,74.963],[-159.481,75.633],[-149.761,66.543],[-149.641,66.263],[-139.271,51.273],[-139.011,51.053],[-139.011,51.053],[-138.491,50.613],[-121.141,45.643],[-120.741,45.733],[-113.931,36.683],[-127.261,13.323],[-111.071,-15.287],[-110.631,-15.297],[-105.871,-27.747],[-148.981,-66.317],[-155.721,-66.377],[-165.841,-57.647],[-187.161,-71.537],[-188.631,-73.117],[-196.071,-71.397],[-214.941,-98.097],[-208.961,-107.457]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-7.92,-0.36],[0,0],[0,0],[-3.65,-3.86],[0,0],[0,0],[-0.7,3.36],[-5.37,-15.36],[0,0],[0,0],[-5.47,-0.9],[0,0],[0,0],[19.32,-12],[0,0],[-1.28,-5.35],[0,0],[0,0],[-5.8,3.45],[0,0],[0,0],[0,0],[-0.09,0.06],[0,0],[-1.24,0.64],[-5.99,0.94],[-0.52,-3.28],[3.27,-0.52],[2.49,-1.25],[0,0],[0.28,-0.17],[0,0],[0,0],[0,0],[0,0],[0,0],[0.65,-0.39],[4,13.92],[0,0],[0,0],[-9.51,5.58],[11.45,1.91],[0,0],[0,0],[3.23,9.58],[0,0],[0,0],[1.03,-4.02],[0,0],[8.95,9.43],[0,0],[0,0],[2.24,0.23],[0,0],[0,0],[2.03,-2.97],[0,0],[0,0],[-4.83,0.94],[0,0],[0,0],[2.98,-9.75],[-0.06,-0.15],[-0.28,-0.18],[-0.2,0],[-0.28,0.21],[0,0],[0,0],[-6.4,-5.49],[0,0],[0,0],[17.21,-0.43],[0,0],[-2.49,-4.72],[0,0],[0,0],[15.26,3.31],[0,0],[3.07,-2.7],[1.53,-3.64],[0,0],[8.68,-3.47],[4.75,3.44],[2.5,5.15],[1.49,10.32],[0.89,1.84],[0,0],[0,0],[0.08,3.89],[0,0],[6.4,1.05],[0,0],[0,0],[-0.32,-1.98],[0,0],[0,0],[6.17,0.53],[0,0],[0,0],[6.32,-3.26],[0,0],[0,0],[1.79,-3.05],[0,0],[0,0],[2.9,1.61],[-1.44,2.86],[0,0],[0,0],[-5.31,2.72],[0,0],[0,0],[0.11,2.18],[0,0],[0,0],[-5.96,-0.43],[0,0],[0,0],[1.26,1.25],[0,0],[0,0],[3.15,-1.48],[0,0],[0,0],[8.77,5.25],[0,0],[0,0],[4.28,-1.45],[0,0],[3.71,15.82],[0,0],[0,0],[-3.39,6.28],[0,0],[0,0],[0.46,3.79],[0,0],[0,0],[-4.9,-6.61],[0,0],[0,0],[-2.69,-1.07],[0,0],[0,0],[-2.66,-6.51],[0,0],[-3.06,-1.41],[0,0],[0,0],[1.21,-10.57],[0,0],[-2.77,-2.66],[0,0],[0,0],[0,0],[-0.19,-12.45],[0,0],[-0.86,-1.8],[0,0],[0,0],[-0.51,-3.51],[-4.26,-8.76],[-2.05,-1.49],[-2.11,0.85],[-1.5,3.6],[0,0],[-4.66,4.1],[0,0],[0,0],[0,0],[-6.81,-1.49],[0,0],[2.46,4.65],[0,0],[0,0],[-14.43,0.31],[0,0],[4.64,4.41],[0,0],[0,0],[1.94,-1.51],[0,0],[0,0],[-3.88,12.7],[0.88,-0.12],[0,0],[0,0],[-8.02,13.27],[0,0]],"o":[[4.28,-6.7],[0,0],[0,0],[5.32,0.35],[0,0],[0,0],[2.3,2.55],[3.37,-16.13],[0,0],[0,0],[1.69,5.3],[0,0],[0,0],[22.76,3.21],[0,0],[-4.76,2.8],[0,0],[0,0],[1.74,6.52],[0,0],[0,0],[0,0],[0.09,-0.06],[0,0],[0.86,-0.58],[3.57,-1.86],[3.27,-0.52],[0.51,3.27],[-4.54,0.72],[0,0],[-0.24,0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.57,0.39],[-12.51,7.45],[0,0],[0,0],[-2.84,-10.65],[10.12,-5.93],[0,0],[0,0],[-10.04,-1.41],[0,0],[0,0],[-1.29,-4.04],[0,0],[-2.68,12.84],[0,0],[0,0],[-1.52,-1.67],[0,0],[0,0],[-3.6,-0.23],[0,0],[0,0],[-2.69,4.21],[0,0],[0,0],[9.93,-2.3],[-0.13,0.43],[0.07,0.19],[0.28,0.18],[0.14,-0.01],[0,0],[0,0],[6.41,-5.54],[0,0],[0,0],[12.96,11.6],[0,0],[-5.4,0],[0,0],[0,0],[7.82,13.69],[0,0],[-2.07,-0.5],[-2.91,2.56],[0,0],[-2.66,6.66],[-6.24,2.5],[-4.39,-3.19],[-5.05,-10.4],[-0.31,-2.18],[0,0],[0,0],[-1.8,-3.45],[0,0],[0,-6.52],[0,0],[0,0],[0.88,1.78],[0,0],[0,0],[0.9,6.66],[0,0],[0,0],[0.66,7.11],[0,0],[0,0],[-3.18,1.56],[0,0],[0,0],[-1.6,2.9],[-2.83,-1.56],[0,0],[0,0],[2.89,-5.21],[0,0],[0,0],[1.97,-0.97],[0,0],[0,0],[-0.6,-6.46],[0,0],[0,0],[-0.24,-1.77],[0,0],[0,0],[-3.46,-0.48],[0,0],[0,0],[-9.17,4.59],[0,0],[0,0],[-3.85,-2.38],[0,0],[-15.32,5.65],[0,0],[0,0],[-1.51,-6.99],[0,0],[0,0],[1.87,-3.33],[0,0],[0,0],[-1.2,-8.26],[0,0],[0,0],[1.67,2.38],[0,0],[0,0],[6.62,2.43],[0,0],[1.22,3.16],[0,0],[0,0],[9.81,4.2],[0,0],[-0.5,3.82],[0,0],[0,0],[0,0],[12.37,1.72],[0,0],[0,1.99],[0,0],[0,0],[1.73,3.32],[1.42,9.84],[2.15,4.43],[1.69,1.23],[5.39,-2.15],[0,0],[2.09,-5.25],[0,0],[0,0],[0,0],[4.48,-3.68],[0,0],[5.18,1.25],[0,0],[0,0],[-7.2,-12.63],[0,0],[6.47,0],[0,0],[0,0],[-1.85,-1.65],[0,0],[0,0],[-10.05,8.68],[0.27,-0.88],[0,0],[0,0],[-15.26,3.54],[0,0],[0,0]],"v":[[187.039,-107.457],[206.769,-117.687],[207.189,-117.657],[253.039,-114.677],[266.989,-108.127],[267.299,-107.787],[273.749,-100.677],[280.969,-102.637],[312.099,-104.737],[312.259,-104.267],[324.489,-66.047],[336.169,-55.967],[336.499,-55.917],[348.969,-54.157],[358.529,-9.097],[357.939,-8.747],[352.099,4.973],[352.179,5.273],[359.039,30.993],[374.059,37.113],[374.529,36.823],[374.529,36.823],[375.019,36.503],[375.279,36.323],[376.289,35.633],[379.479,33.673],[394.819,28.783],[401.679,33.773],[396.689,40.633],[385.279,44.183],[385.019,44.313],[384.239,44.763],[383.799,45.043],[383.799,45.043],[383.319,45.373],[383.319,45.373],[382.059,46.223],[380.199,47.423],[347.559,34.513],[347.439,34.083],[340.579,8.363],[351.869,-19.097],[347.639,-42.217],[347.289,-42.277],[334.829,-44.037],[313.199,-61.977],[313.059,-62.387],[300.829,-100.607],[292.769,-100.397],[292.719,-100.187],[265.119,-92.327],[264.849,-92.617],[258.409,-99.737],[252.579,-102.677],[252.259,-102.707],[206.409,-105.687],[197.329,-101.267],[197.159,-100.997],[191.179,-91.637],[197.009,-83.037],[197.219,-83.087],[204.669,-84.807],[220.319,-68.037],[220.309,-67.227],[220.829,-66.627],[221.589,-66.387],[222.209,-66.637],[222.319,-66.727],[232.439,-75.457],[254.729,-75.507],[255.019,-75.257],[298.129,-36.697],[285.889,-3.297],[285.369,-3.297],[279.049,7.173],[279.169,7.383],[292.489,30.743],[272.899,57.503],[272.429,57.393],[264.659,60.283],[257.689,70.243],[257.509,70.703],[240.979,86.773],[224.149,84.683],[213.969,71.373],[204.379,37.013],[202.579,30.953],[202.349,30.493],[200.619,27.173],[197.759,16.013],[197.749,15.483],[186.619,2.383],[186.309,2.333],[171.479,0.273],[173.299,5.933],[173.389,6.483],[175.729,23.733],[164.859,35.193],[164.609,35.163],[165.489,44.763],[156.099,61.913],[155.769,62.073],[146.179,66.773],[138.559,73.843],[138.339,74.223],[115.999,114.613],[107.849,116.953],[105.389,109.013],[105.499,108.803],[127.839,68.413],[140.409,56.243],[140.909,55.993],[150.499,51.303],[153.559,46.103],[153.549,45.873],[152.409,33.613],[163.199,22.573],[163.459,22.603],[161.489,8.093],[159.169,3.443],[158.919,3.213],[152.809,-2.327],[142.679,-0.797],[142.269,-0.597],[137.929,1.573],[109.119,0.493],[108.689,0.233],[99.859,-5.257],[87.019,-6.727],[86.649,-6.587],[50.859,-25.817],[50.749,-26.297],[49.809,-30.637],[52.719,-51.207],[52.969,-51.657],[67.519,-77.607],[69.689,-88.577],[69.639,-89.007],[68.529,-96.587],[82.849,-102.537],[82.999,-102.327],[88.409,-94.597],[95.089,-89.317],[95.459,-89.177],[96.229,-88.897],[110.789,-74.847],[110.959,-74.427],[117.639,-67.307],[117.969,-67.157],[122.509,-65.207],[136.969,-40.307],[136.929,-39.927],[140.549,-29.617],[140.809,-29.377],[158.119,-13.697],[187.959,-9.547],[209.749,15.103],[209.749,15.483],[211.059,21.243],[211.259,21.623],[212.989,24.943],[216.259,35.293],[224.759,66.123],[231.189,74.963],[236.519,75.633],[246.239,66.543],[246.359,66.263],[256.729,51.273],[256.989,51.053],[256.989,51.053],[257.509,50.613],[274.859,45.643],[275.259,45.733],[282.169,36.883],[282.069,36.683],[268.739,13.323],[284.929,-15.287],[285.369,-15.297],[290.299,-27.597],[290.129,-27.747],[247.019,-66.317],[240.469,-66.537],[240.279,-66.377],[230.159,-57.647],[208.839,-71.537],[207.489,-73.137],[207.369,-73.117],[199.929,-71.397],[180.809,-97.697],[181.059,-98.097]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-5.3,-5.76],[0,0],[-3.51,-0.1],[0,0],[0,0],[-2.93,-11.52],[5.66,-6.44],[0,0],[0,0],[2.45,2.23],[-2.06,2.45],[0,0],[0,0],[1.17,4.56],[6.26,0.14],[0,0],[0,0],[4.68,5.08],[0,0],[3.97,-0.31],[0,0],[0,0],[0.35,3.3],[-3.18,0.46],[0,0]],"o":[[7.79,-0.82],[0,0],[2.34,2.63],[0,0],[0,0],[11.88,0],[2.13,8.33],[0,0],[0,0],[-2.24,2.45],[-2.39,-2.17],[0,0],[0,0],[3.17,-3.48],[-1.55,-6.1],[0,0],[0,0],[-6.93,0],[0,0],[-2.65,-2.98],[0,0],[0,0],[-3.3,0.35],[-0.34,-3.22],[0,0],[0,0]],"v":[[-377.461,26.752],[-356.651,34.602],[-356.361,34.922],[-347.191,39.202],[-346.821,39.202],[-343.791,39.202],[-318.601,58.782],[-324.261,82.372],[-324.571,82.712],[-342.811,102.742],[-351.291,103.142],[-351.851,94.862],[-351.691,94.662],[-333.441,74.632],[-330.231,61.752],[-343.461,51.212],[-343.791,51.202],[-346.821,51.202],[-365.031,43.232],[-365.331,42.892],[-375.851,38.652],[-376.211,38.682],[-395.121,40.672],[-401.721,35.332],[-396.601,28.762],[-396.381,28.742]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[2.71,2.68],[1.96,-3.65],[0,0],[0,0],[-0.8,-4.16],[0,0],[0,0],[-8.55,2.96],[0,0],[-7.03,-4.2],[0,0],[0,0],[-5.51,2.61],[0,0],[0,0],[-1.16,0.41],[0,0],[0,0],[-0.87,7.7],[0,0],[4.81,2.21],[0,0],[0,0],[2.48,6.08],[0,0],[3.36,1.34],[0,0],[0,0]],"o":[[-0.33,4.09],[0,0],[0,0],[-2.08,3.7],[0,0],[0,0],[1.92,8.89],[0,0],[7.7,-2.84],[0,0],[0,0],[5.2,3.23],[0,0],[0,0],[1.1,-0.56],[0,0],[0,0],[-5.76,-5.21],[0,0],[0.69,-5.28],[0,0],[0,0],[-6.06,-2.59],[0,0],[-1.31,-3.38],[0,0],[0,0],[-3.62,-1.33]],"v":[[81.729,-83.995],[78.269,-72.255],[77.989,-71.735],[63.429,-45.785],[61.449,-33.605],[61.539,-33.175],[62.479,-28.835],[82.199,-17.745],[82.489,-17.845],[105.779,-15.695],[106.179,-15.445],[115.019,-9.965],[132.199,-8.985],[132.559,-9.155],[136.909,-11.325],[140.309,-12.775],[140.999,-13.015],[132.759,-20.485],[124.979,-41.045],[125.029,-41.475],[118.069,-54.055],[117.789,-54.175],[113.249,-56.125],[99.929,-69.675],[99.759,-70.095],[92.439,-77.495],[92.099,-77.625],[91.329,-77.905]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[2.71,2.68],[2.13,-3.79],[0,0],[-0.93,-4.29],[0,0],[-8.55,2.96],[0,0],[-7.1,-4.41],[0,0],[-5.59,2.79],[0,0],[-1.4,0.46],[0,0],[-0.87,7.7],[0,0],[4.98,2.13],[0,0],[2.48,6.08],[0,0],[3.52,1.29],[0,0]],"o":[[-0.35,4.28],[0,0],[-2.15,3.83],[0,0],[1.92,8.89],[0,0],[7.85,-2.9],[0,0],[5.31,3.3],[0,0],[1.32,-0.67],[0,0],[-5.76,-5.21],[0,0],[0.7,-5.38],[0,0],[-6.06,-2.59],[0,0],[-1.35,-3.5],[0,0],[-3.62,-1.33]],"v":[[-314.271,-83.995],[-318.011,-71.735],[-332.571,-45.785],[-334.461,-33.175],[-333.521,-28.835],[-313.801,-17.745],[-313.511,-17.845],[-289.821,-15.445],[-280.981,-9.965],[-263.441,-9.155],[-259.091,-11.325],[-255.001,-13.015],[-263.241,-20.485],[-271.021,-41.045],[-270.971,-41.475],[-278.211,-54.175],[-282.751,-56.125],[-296.071,-69.675],[-296.241,-70.095],[-303.901,-77.625],[-304.671,-77.905]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"map1","np":7,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"c1","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,251,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[214,214],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.959999952129,0.959999952129,0.959999952129,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"r1","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-26.75,1.76],[-23.1,-17.7],[-5.7,-28.54],[14.52,-25.22],[27.55,-9.39],[26.91,11.09],[12.92,26.08],[-5.36,26.13],[-3.66,-0.98],[0.74,-3.71],[-10.43,-21.04],[-23.83,-9.83],[-24.4,8.32],[-12.86,22.33],[5.05,25.28],[20.46,15.68],[25.72,-1.69],[17.54,-15.41],[2.67,2.67],[-2.82,2.52]],"o":[[29.04,-1.91],[23.1,17.7],[5.7,28.54],[-14.53,25.22],[-27.54,9.39],[-26.9,-11.1],[-11.9,-24.02],[0.77,-3.71],[3.66,0.97],[-4.53,22.92],[11.44,23.1],[23.83,9.83],[24.4,-8.31],[12.87,-22.34],[-5.05,-25.27],[-20.46,-15.68],[-23.43,1.54],[-2.85,2.5],[-2.68,-2.68],[19.91,-17.76]],"v":[[-7.88,-119.74],[73,-95.24],[117.68,-23.5],[103.99,59.89],[38.72,113.58],[-45.75,110.94],[-107.53,53.27],[-117.55,-24.14],[-109.35,-29.05],[-104.27,-20.62],[-95.24,47.18],[-40.52,98.26],[34.3,100.6],[92.1,53.05],[104.23,-20.82],[64.66,-84.36],[-6.98,-106.06],[-70.15,-79.85],[-80,-80],[-79.87,-89.56]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-4.97,0],[0,-4.97],[4.97,0],[0,4.97]],"o":[[4.97,0],[0,4.97],[-4.97,0],[0,-4.97]],"v":[[-99,-64],[-90,-55],[-99,-46],[-108,-55]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"f2","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.292,-169.35,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.25,1.32],[0,0],[0.94,-1.6],[0,0],[-2.29,-0.04],[0,0],[0,0]],"o":[[0,0],[-0.34,-1.82],[0,0],[-1.17,1.98],[0,0],[0,0],[-1.33,-0.13]],"v":[[-20.987,1.962],[-22.787,-7.748],[-26.477,-8.398],[-33.607,3.722],[-31.077,8.242],[34.023,9.392],[-18.317,4.402]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.721568644047,0.568627476692,0.376470595598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"f2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"f1","parent":8,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.547,-155.303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.42,2.01],[0,0],[-0.43,-2.24],[0,0],[-1.33,-0.13],[0,0],[3.34,-0.74],[0,0]],"o":[[0,0],[1.75,-1.46],[0,0],[0.25,1.31],[0,0],[3.41,0.32],[0,0],[-3.07,0.68]],"v":[[-55.596,19.196],[-3.826,-23.814],[1.034,-22.084],[2.964,-12.074],[5.634,-9.654],[53.974,-5.134],[54.344,0.786],[-53.036,24.436]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.529411792755,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"f1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"c0","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":120,"s":[-720]}],"ix":10},"p":{"a":0,"k":[200,251,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[214,214],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch02.json b/app/src/main/assets/touch02.json new file mode 100644 index 0000000..4bafee3 --- /dev/null +++ b/app/src/main/assets/touch02.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":24,"ip":0,"op":96,"w":600,"h":600,"nm":"Frame 4","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Ellipse 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":96,"s":[360]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“TOUCH ME”轮廓","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[90]},{"t":96,"s":[95]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302.5,343.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[98,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[98,98,100]},{"t":96,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-121.213,-25.428],[-121.213,-21.839],[-111.062,-21.839],[-111.062,4.698],[-106.94,4.698],[-106.94,-21.839],[-96.788,-21.839],[-96.788,-25.428]],"c":true},"ix":2},"nm":"T","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"T","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.318,0],[2.597,-3.719],[0,-4.074],[-2.365,-2.953],[-4.635,0],[-2.68,3.5],[0,4.498],[1.996,2.666]],"o":[[-5.086,0],[-2.024,2.899],[0,4.512],[2.652,3.063],[4.963,0],[2.283,-2.98],[0,-4.156],[-2.557,-3.418]],"v":[[-80.772,-26.249],[-92.297,-20.67],[-95.332,-10.211],[-91.785,0.986],[-80.854,5.58],[-69.39,0.33],[-65.965,-10.888],[-68.959,-21.122]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.596,0],[1.688,2.292],[0,3.339],[-1.969,2.141],[-3.117,0],[-1.853,-2.162],[0,-3.544],[1.606,-2.579]],"o":[[-3.787,0],[-1.689,-2.292],[0,-4.173],[1.969,-2.141],[3.213,0],[1.852,2.162],[0,3.352],[-1.607,2.579]],"v":[[-80.362,1.95],[-88.575,-1.488],[-91.108,-9.934],[-88.155,-19.406],[-80.526,-22.619],[-72.928,-19.376],[-70.149,-10.817],[-72.558,-1.919]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"O","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.002,-1.996],[-5.104,0],[-1.839,3.637],[0,3.705],[0,0],[0,0],[0,0],[0.675,-1.285],[3.486,0],[1.226,2.188],[0,2.188],[0,0]],"o":[[0,0],[0,3.705],[1.825,3.637],[5.103,0],[1.001,-1.996],[0,0],[0,0],[0,0],[0,2.174],[-1.254,2.365],[-2.908,0],[-0.827,-1.449],[0,0],[0,0]],"v":[[-60.818,-25.428],[-60.818,-8.509],[-59.316,0.042],[-48.923,5.498],[-38.51,0.042],[-37.008,-8.509],[-37.008,-25.428],[-41.13,-25.428],[-41.13,-6.807],[-42.143,-1.619],[-49.254,1.929],[-55.455,-1.352],[-56.696,-6.807],[-56.696,-25.428]],"c":true},"ix":2},"nm":"U","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"U","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.77,0],[2.513,-3.092],[0,-4.446],[-3.095,-2.804],[-3.46,0],[-2.365,2.584],[-0.352,3.172],[0,0],[0.819,-1.217],[2.955,0],[1.618,2.196],[0,3.531],[-1.793,2.087],[-2.914,0],[-1.323,-1.135],[-0.443,-1.941],[0,0],[2.081,2.01]],"o":[[-4.419,0],[-2.324,2.846],[0,5.856],[2.351,2.121],[4.014,0],[1.973,-2.146],[0,0],[-0.403,1.983],[-1.544,2.311],[-3.21,0],[-1.619,-2.196],[0,-4.31],[1.793,-2.087],[2.39,0],[1.322,1.135],[0,0],[-0.23,-2.556],[-2.081,-2.01]],"v":[[-18.243,-26.249],[-28.641,-21.611],[-32.127,-10.673],[-27.485,2.317],[-18.768,5.498],[-9.2,1.622],[-5.713,-6.356],[-9.692,-6.356],[-11.525,-1.557],[-18.274,1.909],[-25.516,-1.385],[-27.944,-9.975],[-25.255,-19.571],[-18.196,-22.701],[-12.627,-20.999],[-9.979,-16.384],[-6,-16.384],[-9.466,-23.234]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"C","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.34,4.698],[3.782,4.698],[3.782,-9.391],[19.265,-9.391],[19.265,4.698],[23.387,4.698],[23.387,-25.428],[19.265,-25.428],[19.265,-12.98],[3.782,-12.98],[3.782,-25.428],[-0.34,-25.428]],"c":true},"ix":2},"nm":"H","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"H","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.041,1.511],[0,0.738],[0,0],[0,0],[0,0],[0,0],[0.027,-1.422],[0,-0.615],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-0.711],[-0.041,-1.511],[0,0],[0,0],[0,0],[0,0],[0,1.627],[-0.028,1.422],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.455,4.698],[45.351,4.698],[45.351,-13.083],[45.29,-16.415],[45.228,-19.789],[45.228,-20.711],[53.911,4.698],[57.955,4.698],[66.556,-20.711],[66.515,-16.138],[66.474,-13.083],[66.474,4.698],[70.371,4.698],[70.371,-25.428],[64.565,-25.428],[55.964,0.042],[47.301,-25.428],[41.455,-25.428]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"M","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.933,4.698],[99.102,4.698],[99.102,1.109],[80.912,1.109],[80.912,-9.104],[97.441,-9.104],[97.441,-12.59],[80.912,-12.59],[80.912,-21.737],[98.795,-21.737],[98.795,-25.428],[76.933,-25.428]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"E","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"“点我导航”轮廓","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"t":96,"s":[90]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302,280.667,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[104,104,100]},{"t":96,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-113.287,-25.546],[-83.703,-25.546],[-83.703,-17.231],[-113.287,-17.231]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.416],[0,0],[0.967,4.318]],"o":[[0.838,4.447],[0,0],[-0.064,-3.416],[0,0]],"v":[[-109.999,-5.179],[-108.646,8.421],[-100.847,7.454],[-102.652,-5.888]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.645,-3.416],[0,0],[1.934,4.061]],"o":[[1.869,4.189],[0,0],[-0.773,-3.416],[0,0]],"v":[[-96.722,-5.114],[-92.275,8.099],[-84.734,6.165],[-89.632,-6.726]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[-1.354,-3.738],[0,0],[3.158,4.125]],"o":[[3.029,4.318],[0,0],[-1.611,-3.803],[0,0]],"v":[[-83.574,-5.501],[-75.646,8.421],[-68.169,5.521],[-76.677,-8.015]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[3.158,-2.771],[0,0],[-1.869,5.156]],"o":[[-1.869,4.705],[0,0],[3.352,-3.48],[0,0]],"v":[[-120.57,-7.499],[-128.691,5.134],[-121.537,8.614],[-113.158,-5.63]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.699,-32.7],[-120.699,-10.077],[-75.775,-10.077],[-75.775,-32.7],[-94.724,-32.7],[-94.724,-38.759],[-71.521,-38.759],[-71.521,-45.978],[-94.724,-45.978],[-94.724,-51.714],[-102.587,-51.714],[-102.587,-32.7]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"点","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.611,-3.029],[0,0],[3.48,3.029]],"o":[[3.48,3.223],[0,0],[-1.869,-3.094],[0,0]],"v":[[-21.121,-45.978],[-11.968,-35.214],[-5.716,-39.532],[-15.32,-49.909]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[2.385,-2.707],[0.516,3.932],[0,0],[0,0],[0,0],[-0.129,6.059],[0,0],[-0.516,-5.865],[0,0],[0,0],[-3.287,0.967],[0,0],[9.023,-1.16],[-0.322,-1.869],[-3.48,0.516],[0,0],[0,0],[0,0],[0,0],[0,0],[3.674,-0.516],[0,0],[0,0],[0,0],[1.096,0],[3.609,0.193],[-0.322,-2.127],[-2.578,1.225],[0,4.189],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.418,-5.092],[5.092,-2.32],[-1.096,-1.869],[-3.738,3.029],[-4.705,0],[-1.225,11.344],[1.676,1.805],[1.289,0],[1.74,4.963],[-2.9,5.221]],"o":[[-1.676,3.158],[-0.709,-3.287],[0,0],[0,0],[0,0],[-0.516,-5.736],[0,0],[0.064,5.93],[0,0],[0,0],[3.803,-0.773],[0,0],[-6.574,2.191],[0.838,1.74],[3.287,-0.387],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.092,0.838],[0,0],[0,0],[0,0],[0,1.031],[-1.16,0.064],[1.096,2.127],[5.285,0],[2.578,-1.225],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.773,6.316],[-4.447,3.738],[1.934,1.74],[4.189,-2.191],[2.771,6.316],[5.865,0],[-2.062,-0.838],[-0.322,7.67],[-1.998,0],[4.189,-4.254],[0,0]],"v":[[-14.031,-23.935],[-20.218,-15.104],[-22.087,-26.062],[-5.201,-26.062],[-5.201,-33.345],[-22.861,-33.345],[-23.505,-51.198],[-31.562,-51.198],[-30.789,-33.345],[-43.357,-33.345],[-43.357,-42.046],[-32.658,-44.688],[-37.943,-51.263],[-63.66,-45.849],[-61.468,-39.339],[-51.156,-40.692],[-51.156,-33.345],[-63.337,-33.345],[-63.337,-26.062],[-51.156,-26.062],[-51.156,-17.296],[-64.562,-15.169],[-62.693,-7.37],[-51.156,-9.626],[-51.156,-0.28],[-52.638,1.073],[-61.21,1.009],[-58.503,8.808],[-46.773,7.325],[-43.357,-0.216],[-43.357,-11.237],[-32.722,-13.493],[-33.238,-20.454],[-43.357,-18.649],[-43.357,-26.062],[-30.08,-26.062],[-26.792,-8.659],[-41.359,0.558],[-36.138,6.745],[-24.15,-1.118],[-12.999,9.065],[-3.46,-5.114],[-9.841,-9.562],[-12.226,1.202],[-17.962,-6.726],[-7.263,-20.97]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"我","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.998,-3.094],[0,0],[3.48,2.578],[0,0],[0,0],[1.354,0],[3.932,0.193],[-0.387,-2.062],[-3.029,0.967],[0,3.996],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[4.125,3.029],[0,0],[-1.805,-2.514],[0,0],[0,0],[0,0.967],[-1.225,0],[1.031,1.934],[5.994,0],[3.094,-0.967],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.622,-6.919],[20.708,3.716],[26.379,-1.569],[17.549,-9.755],[37.208,-9.755],[37.208,0.751],[35.467,2.04],[25.155,1.847],[27.733,8.808],[41.139,7.776],[45.264,0.944],[45.264,-9.755],[58.477,-9.755],[58.477,-16.909],[45.264,-16.909],[45.264,-20.647],[37.208,-20.647],[37.208,-16.909],[1.049,-16.909],[1.049,-9.755],[12.715,-9.755]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-12.568,0],[-3.094,0],[-1.031,6.51],[1.934,1.031],[4.963,0],[3.287,0],[0,2.707],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,7.477],[3.029,0],[9.217,0],[-2.256,-0.322],[-0.58,3.416],[-4.189,0],[-6.896,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.303,-46.106],[5.303,-31.282],[21.739,-22.001],[44.426,-22.001],[57.639,-29.993],[50.356,-32.185],[43.717,-28.253],[21.61,-28.253],[13.424,-31.411],[13.424,-32.507],[50.743,-32.507],[50.743,-49.974],[5.303,-49.974]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.424,-43.399],[43.137,-43.399],[43.137,-39.146],[13.424,-39.146]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"导","np":6,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.709,-2.578],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.418,2.965]],"o":[[1.225,2.643],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.773,-2.514],[0,0]],"v":[[99.725,-50.296],[103.012,-41.53],[90.379,-41.53],[90.379,-34.763],[123.444,-34.763],[123.444,-41.53],[106.428,-41.53],[111.004,-42.948],[107.202,-52.294]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[3.996,-6.51],[-1.225,-1.16],[-0.322,8.121],[-0.645,-2.385],[0,0],[1.547,2.965],[0,0],[0,0],[0,0],[0,0],[0.709,0],[2.127,0.129],[-0.193,-1.869],[-1.934,1.16],[-0.387,0.902],[-1.225,-1.16],[0,7.928],[0,0],[0,0],[0,0],[-1.031,-1.16],[-1.547,0],[-0.967,0],[-0.902,0.709],[-0.387,1.482],[-0.064,3.094],[1.225,1.096],[0.129,-1.16],[0.129,-0.258],[0.258,0],[0.129,0],[0.129,0.193],[0,1.418],[0,0],[0,0],[0,0],[5.285,-6.059],[0,1.225],[0,0],[0,0],[0,0],[0,0],[0.58,-2.578],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.064,7.863],[1.611,0.709],[3.867,-6.188],[1.354,2.9],[0,0],[-0.838,-2.449],[0,0],[0,0],[0,0],[0,0],[0,0.773],[-0.709,0],[0.838,1.74],[3.738,0],[0.838,-0.516],[1.74,0.902],[6.381,-6.703],[0,0],[0,0],[0,0],[0,4.77],[1.096,1.096],[0.838,0],[1.289,0],[0.902,-0.773],[0.322,-1.547],[-1.611,-0.58],[-0.064,3.287],[-0.129,1.096],[-0.129,0.193],[-0.258,0],[-0.322,0],[-0.129,-0.258],[0,0],[0,0],[0,0],[0,6.445],[0.193,-0.902],[0,0],[0,0],[0,0],[0,0],[-0.258,2.32],[0,0],[0,0],[0,0]],"v":[[63.374,-24.321],[63.374,-18.134],[67.563,-18.134],[62.987,5.714],[68.788,9.452],[74.137,-14.073],[77.682,-5.243],[82.516,-7.435],[78.327,-16.716],[74.202,-14.976],[74.266,-18.134],[82.645,-18.134],[82.645,1.073],[81.678,2.104],[76.715,2.04],[78.713,8.614],[86.963,7.261],[88.768,5.198],[94.504,9.13],[102.045,-16.329],[102.045,-23.226],[109.909,-23.226],[109.909,-0.731],[111.327,6.616],[115.581,8.228],[118.61,8.228],[122.155,7.261],[124.024,3.974],[124.669,-4.599],[119.899,-7.306],[119.706,-0.345],[119.319,1.589],[118.61,1.847],[117.836,1.847],[117.192,1.589],[117.063,-0.925],[117.063,-29.929],[94.891,-29.929],[94.891,-16.458],[89.09,4.296],[89.348,1.202],[89.348,-43.979],[80.454,-43.979],[82.838,-50.683],[75.104,-51.907],[73.686,-43.979],[67.563,-43.979],[67.563,-24.321]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.516,-2.191],[0,0],[1.289,2.771],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[1.16,2.771],[0,0],[-0.645,-2.32],[0,0],[0,0],[0,0]],"v":[[82.645,-37.985],[82.645,-24.321],[74.266,-24.321],[74.266,-34.118],[77.167,-25.739],[82.001,-27.802],[78.649,-36.438],[74.266,-34.827],[74.266,-37.985]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"航","np":6,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"eyes","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":19,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":35,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":43,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":59,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":63,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":67,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":71,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":75,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":79,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":91,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":95,"s":[0]},{"t":99,"s":[-15]}],"ix":10},"p":{"a":0,"k":[0.925,-16.073,0],"ix":2,"l":2},"a":{"a":0,"k":[-7.299,4.336,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.252,1.485],[0.912,1.383],[1.383,-0.912],[1.879,-0.198],[1.662,0.007],[0.343,0],[0,-1.657],[-1.657,0],[-0.314,-0.002],[-1.936,0.204]],"o":[[1.383,-0.912],[-0.912,-1.383],[-1.108,0.731],[-1.577,0.166],[-0.338,-0.001],[-1.657,0],[0,1.657],[0.288,0],[1.661,0.008],[2.321,-0.245]],"v":[[7.651,1.505],[8.504,-2.651],[4.348,-3.505],[-0.135,-2.156],[-4.978,-2.003],[-6,-2.006],[-9,0.994],[-6,3.994],[-5.095,3.997],[0.495,3.811]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-21.337,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Vector 30 (Stroke)","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"et","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2.84,-238,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":-1,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":7,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":11,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":19,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":35,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":39,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":43,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":47,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":51,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":55,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":63,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":67,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":71,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":79,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":83,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":87,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":95,"s":[{"i":[[-3.812,7.311],[3.095,3.886],[0,0],[-1.388,0.822],[0,0],[0.61,0.921],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.511,-0.979],[0,0],[-1.466,-0.673],[0,0],[3.057,-5.006],[-4.551,-6.875],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[37.627,18.495],[40.565,-0.386],[5.502,0.093],[5.693,-0.32],[40.478,-0.869],[35.512,-22.083],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]},{"t":99,"s":[{"i":[[-1.905,1.693],[0.907,1.011],[0,0],[-1.388,0.822],[0,0],[0.851,0.704],[7.713,3.003],[8.563,-2.588],[5.144,-7.319],[-0.466,-8.933],[-5.877,-6.744],[-8.786,-1.683],[-7.953,4.094]],"o":[[0.826,-0.734],[0,0],[-1.466,-0.673],[0,0],[1.182,-1.631],[-3.227,-2.667],[-8.336,-3.245],[-8.563,2.588],[-5.144,7.319],[0.466,8.933],[5.877,6.744],[8.786,1.683],[7.359,-3.789]],"v":[[27.002,31.495],[26.065,28.864],[3.627,1.593],[3.443,-1.945],[26.978,-27.119],[27.637,-29.833],[16.671,-37.275],[-9.411,-38.29],[-30.566,-23.001],[-37.786,2.083],[-27.997,26.279],[-5.367,39.286],[20.468,35.564]],"c":true}]}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.876157641411,0.722320437431,0.527761459351,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"et","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"c1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"t":20,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[119,-207.846,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[-100,-100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[0,0,100]},{"t":20,"s":[-100,-100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"c2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[0]},{"t":28,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[206.846,-120,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[-100,-100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[0,0,100]},{"t":28,"s":[-100,-100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"c3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[0]},{"t":36,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-239,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[0,0,100]},{"t":36,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"c4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":44,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-206.846,-120,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":40,"s":[0,0,100]},{"t":44,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"c5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[0]},{"t":52,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-119,-207.846,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[0,0,100]},{"t":52,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"c6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":56,"s":[0]},{"t":60,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[1,-240,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":56,"s":[0,0,100]},{"t":60,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"c7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":56,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":64,"s":[0]},{"t":68,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[121,-207.846,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":56,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":64,"s":[0,0,100]},{"t":68,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"c8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":64,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"t":76,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[208.846,-120,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":64,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[0,0,100]},{"t":76,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c8","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"c9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[0]},{"t":84,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-241,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[-100,-100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[0,0,100]},{"t":84,"s":[-100,-100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c9","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"c10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":88,"s":[0]},{"t":92,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-208.846,-120,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80,"s":[-100,-100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":88,"s":[0,0,100]},{"t":92,"s":[-100,-100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c10","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"c11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":88,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"t":100,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[-121,-207.846,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":88,"s":[-100,-100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[0,0,100]},{"t":100,"s":[-100,-100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c11","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"c12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":104,"s":[0]},{"t":108,"s":[100]}],"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[1,-240,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":104,"s":[0,0,100]},{"t":108,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[17.481,10.58],[-15.824,18.173],[-14.172,-9.197],[10.005,-20.765]],"o":[[-16.156,-9.778],[14.396,-16.533],[13.262,8.607],[-9.57,19.862]],"v":[[-25.713,31.132],[-28.178,-21.202],[21.304,-30.551],[35.021,14.658]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch03.json b/app/src/main/assets/touch03.json new file mode 100644 index 0000000..c67c163 --- /dev/null +++ b/app/src/main/assets/touch03.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":24,"ip":0,"op":192,"w":600,"h":600,"nm":"Frame 5","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"t":172,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"t":172,"s":[-33]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[517]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[427]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[427]},{"t":172,"s":[517]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[560]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[477]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[477]},{"t":172,"s":[560]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[0.055,-1.446],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[0,0],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-45.014,18.825],[-47.983,10.221],[-44.126,1.978],[-36.327,-1.145],[-28.527,1.978],[-21.723,8.835],[-21.723,-48.66],[-18.543,-56.608],[-10.683,-60],[-6.489,-59.051],[-2.986,-56.557],[-0.717,-52.905],[-0.033,-48.66],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":127,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[-1.935,-3.183],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[2.568,4.223],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-42.764,18.825],[-45.733,10.221],[-41.876,1.978],[-34.077,-1.145],[-26.277,1.978],[-21.723,8.835],[-35.695,-42.16],[-32.515,-50.108],[-24.655,-53.5],[-20.462,-52.551],[-16.959,-50.057],[-14.69,-46.405],[-10.068,-37.848],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]},{"t":144,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[0.055,-1.446],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[0,0],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-45.014,18.825],[-47.983,10.221],[-44.126,1.978],[-36.327,-1.145],[-28.527,1.978],[-21.723,8.835],[-21.723,-48.66],[-18.543,-56.608],[-10.683,-60],[-6.489,-59.051],[-2.986,-56.557],[-0.717,-52.905],[-0.033,-48.66],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"hand","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"e1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[105,105,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[31.578,127.099],[-152.691,6.678],[-22.831,-105.761],[138.017,-44.904]],"o":[[-29.184,-117.464],[138.909,-6.075],[21.365,98.971],[-132.016,42.952]],"v":[[-244.917,12.25],[-22,-228.702],[243.13,-41.308],[102.856,220.322]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":3},"o":{"a":0,"k":80,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"e2","sr":1,"ks":{"o":{"a":0,"k":90,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[102,102,100]},{"t":192,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[130.689,11.751],[-43.129,145.547],[-107.632,-13.014],[2.146,-144.221]],"o":[[-120.782,-10.861],[39.236,-132.409],[100.722,12.178],[-2.053,137.95]],"v":[[-70.883,238.273],[-227.045,-49.527],[36.439,-237.433],[238.967,-20.496]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.600000023842],"ix":3},"o":{"a":0,"k":60,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"e3","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[720]},{"t":192,"s":[720]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[105,105,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-54.156,119.954],[-120.023,-83.416],[47.68,-97.813],[132.381,44.33]],"o":[[50.05,-110.86],[109.189,75.887],[-44.618,91.533],[-126.625,-42.403]],"v":[[-203.602,-136.021],[113.744,-199.055],[199.829,104.852],[-67.487,232.453]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.300000011921],"ix":3},"o":{"a":0,"k":30,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"“t2”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302.5,343.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":120,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[100,100,100]},{"t":192,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-121.213,-25.428],[-121.213,-21.839],[-111.062,-21.839],[-111.062,4.698],[-106.94,4.698],[-106.94,-21.839],[-96.788,-21.839],[-96.788,-25.428]],"c":true},"ix":2},"nm":"T","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"T","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.318,0],[2.597,-3.719],[0,-4.074],[-2.365,-2.953],[-4.635,0],[-2.68,3.5],[0,4.498],[1.996,2.666]],"o":[[-5.086,0],[-2.024,2.899],[0,4.512],[2.652,3.063],[4.963,0],[2.283,-2.98],[0,-4.156],[-2.557,-3.418]],"v":[[-80.772,-26.249],[-92.297,-20.67],[-95.332,-10.211],[-91.785,0.986],[-80.854,5.58],[-69.39,0.33],[-65.965,-10.888],[-68.959,-21.122]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[3.596,0],[1.688,2.292],[0,3.339],[-1.969,2.141],[-3.117,0],[-1.853,-2.162],[0,-3.544],[1.606,-2.579]],"o":[[-3.787,0],[-1.689,-2.292],[0,-4.173],[1.969,-2.141],[3.213,0],[1.852,2.162],[0,3.352],[-1.607,2.579]],"v":[[-80.362,1.95],[-88.575,-1.488],[-91.108,-9.934],[-88.155,-19.406],[-80.526,-22.619],[-72.928,-19.376],[-70.149,-10.817],[-72.558,-1.919]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"O","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.002,-1.996],[-5.104,0],[-1.839,3.637],[0,3.705],[0,0],[0,0],[0,0],[0.675,-1.285],[3.486,0],[1.226,2.188],[0,2.188],[0,0]],"o":[[0,0],[0,3.705],[1.825,3.637],[5.103,0],[1.001,-1.996],[0,0],[0,0],[0,0],[0,2.174],[-1.254,2.365],[-2.908,0],[-0.827,-1.449],[0,0],[0,0]],"v":[[-60.818,-25.428],[-60.818,-8.509],[-59.316,0.042],[-48.923,5.498],[-38.51,0.042],[-37.008,-8.509],[-37.008,-25.428],[-41.13,-25.428],[-41.13,-6.807],[-42.143,-1.619],[-49.254,1.929],[-55.455,-1.352],[-56.696,-6.807],[-56.696,-25.428]],"c":true},"ix":2},"nm":"U","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"U","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.77,0],[2.513,-3.092],[0,-4.446],[-3.095,-2.804],[-3.46,0],[-2.365,2.584],[-0.352,3.172],[0,0],[0.819,-1.217],[2.955,0],[1.618,2.196],[0,3.531],[-1.793,2.087],[-2.914,0],[-1.323,-1.135],[-0.443,-1.941],[0,0],[2.081,2.01]],"o":[[-4.419,0],[-2.324,2.846],[0,5.856],[2.351,2.121],[4.014,0],[1.973,-2.146],[0,0],[-0.403,1.983],[-1.544,2.311],[-3.21,0],[-1.619,-2.196],[0,-4.31],[1.793,-2.087],[2.39,0],[1.322,1.135],[0,0],[-0.23,-2.556],[-2.081,-2.01]],"v":[[-18.243,-26.249],[-28.641,-21.611],[-32.127,-10.673],[-27.485,2.317],[-18.768,5.498],[-9.2,1.622],[-5.713,-6.356],[-9.692,-6.356],[-11.525,-1.557],[-18.274,1.909],[-25.516,-1.385],[-27.944,-9.975],[-25.255,-19.571],[-18.196,-22.701],[-12.627,-20.999],[-9.979,-16.384],[-6,-16.384],[-9.466,-23.234]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"C","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.34,4.698],[3.782,4.698],[3.782,-9.391],[19.265,-9.391],[19.265,4.698],[23.387,4.698],[23.387,-25.428],[19.265,-25.428],[19.265,-12.98],[3.782,-12.98],[3.782,-25.428],[-0.34,-25.428]],"c":true},"ix":2},"nm":"H","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"H","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.041,1.511],[0,0.738],[0,0],[0,0],[0,0],[0,0],[0.027,-1.422],[0,-0.615],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-0.711],[-0.041,-1.511],[0,0],[0,0],[0,0],[0,0],[0,1.627],[-0.028,1.422],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.455,4.698],[45.351,4.698],[45.351,-13.083],[45.29,-16.415],[45.228,-19.789],[45.228,-20.711],[53.911,4.698],[57.955,4.698],[66.556,-20.711],[66.515,-16.138],[66.474,-13.083],[66.474,4.698],[70.371,4.698],[70.371,-25.428],[64.565,-25.428],[55.964,0.042],[47.301,-25.428],[41.455,-25.428]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"M","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[76.933,4.698],[99.102,4.698],[99.102,1.109],[80.912,1.109],[80.912,-9.104],[97.441,-9.104],[97.441,-12.59],[80.912,-12.59],[80.912,-21.737],[98.795,-21.737],[98.795,-25.428],[76.933,-25.428]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"E","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"“t1”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302,280.667,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":120,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[104,104,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-113.287,-25.546],[-83.703,-25.546],[-83.703,-17.231],[-113.287,-17.231]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.416],[0,0],[0.967,4.318]],"o":[[0.838,4.447],[0,0],[-0.064,-3.416],[0,0]],"v":[[-109.999,-5.179],[-108.646,8.421],[-100.847,7.454],[-102.652,-5.888]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.645,-3.416],[0,0],[1.934,4.061]],"o":[[1.869,4.189],[0,0],[-0.773,-3.416],[0,0]],"v":[[-96.722,-5.114],[-92.275,8.099],[-84.734,6.165],[-89.632,-6.726]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[-1.354,-3.738],[0,0],[3.158,4.125]],"o":[[3.029,4.318],[0,0],[-1.611,-3.803],[0,0]],"v":[[-83.574,-5.501],[-75.646,8.421],[-68.169,5.521],[-76.677,-8.015]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[3.158,-2.771],[0,0],[-1.869,5.156]],"o":[[-1.869,4.705],[0,0],[3.352,-3.48],[0,0]],"v":[[-120.57,-7.499],[-128.691,5.134],[-121.537,8.614],[-113.158,-5.63]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.699,-32.7],[-120.699,-10.077],[-75.775,-10.077],[-75.775,-32.7],[-94.724,-32.7],[-94.724,-38.759],[-71.521,-38.759],[-71.521,-45.978],[-94.724,-45.978],[-94.724,-51.714],[-102.587,-51.714],[-102.587,-32.7]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"点","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.611,-3.029],[0,0],[3.48,3.029]],"o":[[3.48,3.223],[0,0],[-1.869,-3.094],[0,0]],"v":[[-21.121,-45.978],[-11.968,-35.214],[-5.716,-39.532],[-15.32,-49.909]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[2.385,-2.707],[0.516,3.932],[0,0],[0,0],[0,0],[-0.129,6.059],[0,0],[-0.516,-5.865],[0,0],[0,0],[-3.287,0.967],[0,0],[9.023,-1.16],[-0.322,-1.869],[-3.48,0.516],[0,0],[0,0],[0,0],[0,0],[0,0],[3.674,-0.516],[0,0],[0,0],[0,0],[1.096,0],[3.609,0.193],[-0.322,-2.127],[-2.578,1.225],[0,4.189],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.418,-5.092],[5.092,-2.32],[-1.096,-1.869],[-3.738,3.029],[-4.705,0],[-1.225,11.344],[1.676,1.805],[1.289,0],[1.74,4.963],[-2.9,5.221]],"o":[[-1.676,3.158],[-0.709,-3.287],[0,0],[0,0],[0,0],[-0.516,-5.736],[0,0],[0.064,5.93],[0,0],[0,0],[3.803,-0.773],[0,0],[-6.574,2.191],[0.838,1.74],[3.287,-0.387],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.092,0.838],[0,0],[0,0],[0,0],[0,1.031],[-1.16,0.064],[1.096,2.127],[5.285,0],[2.578,-1.225],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.773,6.316],[-4.447,3.738],[1.934,1.74],[4.189,-2.191],[2.771,6.316],[5.865,0],[-2.062,-0.838],[-0.322,7.67],[-1.998,0],[4.189,-4.254],[0,0]],"v":[[-14.031,-23.935],[-20.218,-15.104],[-22.087,-26.062],[-5.201,-26.062],[-5.201,-33.345],[-22.861,-33.345],[-23.505,-51.198],[-31.562,-51.198],[-30.789,-33.345],[-43.357,-33.345],[-43.357,-42.046],[-32.658,-44.688],[-37.943,-51.263],[-63.66,-45.849],[-61.468,-39.339],[-51.156,-40.692],[-51.156,-33.345],[-63.337,-33.345],[-63.337,-26.062],[-51.156,-26.062],[-51.156,-17.296],[-64.562,-15.169],[-62.693,-7.37],[-51.156,-9.626],[-51.156,-0.28],[-52.638,1.073],[-61.21,1.009],[-58.503,8.808],[-46.773,7.325],[-43.357,-0.216],[-43.357,-11.237],[-32.722,-13.493],[-33.238,-20.454],[-43.357,-18.649],[-43.357,-26.062],[-30.08,-26.062],[-26.792,-8.659],[-41.359,0.558],[-36.138,6.745],[-24.15,-1.118],[-12.999,9.065],[-3.46,-5.114],[-9.841,-9.562],[-12.226,1.202],[-17.962,-6.726],[-7.263,-20.97]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"我","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.998,-3.094],[0,0],[3.48,2.578],[0,0],[0,0],[1.354,0],[3.932,0.193],[-0.387,-2.062],[-3.029,0.967],[0,3.996],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[4.125,3.029],[0,0],[-1.805,-2.514],[0,0],[0,0],[0,0.967],[-1.225,0],[1.031,1.934],[5.994,0],[3.094,-0.967],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[9.622,-6.919],[20.708,3.716],[26.379,-1.569],[17.549,-9.755],[37.208,-9.755],[37.208,0.751],[35.467,2.04],[25.155,1.847],[27.733,8.808],[41.139,7.776],[45.264,0.944],[45.264,-9.755],[58.477,-9.755],[58.477,-16.909],[45.264,-16.909],[45.264,-20.647],[37.208,-20.647],[37.208,-16.909],[1.049,-16.909],[1.049,-9.755],[12.715,-9.755]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-12.568,0],[-3.094,0],[-1.031,6.51],[1.934,1.031],[4.963,0],[3.287,0],[0,2.707],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,7.477],[3.029,0],[9.217,0],[-2.256,-0.322],[-0.58,3.416],[-4.189,0],[-6.896,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.303,-46.106],[5.303,-31.282],[21.739,-22.001],[44.426,-22.001],[57.639,-29.993],[50.356,-32.185],[43.717,-28.253],[21.61,-28.253],[13.424,-31.411],[13.424,-32.507],[50.743,-32.507],[50.743,-49.974],[5.303,-49.974]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.424,-43.399],[43.137,-43.399],[43.137,-39.146],[13.424,-39.146]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"导","np":6,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.709,-2.578],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.418,2.965]],"o":[[1.225,2.643],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.773,-2.514],[0,0]],"v":[[99.725,-50.296],[103.012,-41.53],[90.379,-41.53],[90.379,-34.763],[123.444,-34.763],[123.444,-41.53],[106.428,-41.53],[111.004,-42.948],[107.202,-52.294]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[3.996,-6.51],[-1.225,-1.16],[-0.322,8.121],[-0.645,-2.385],[0,0],[1.547,2.965],[0,0],[0,0],[0,0],[0,0],[0.709,0],[2.127,0.129],[-0.193,-1.869],[-1.934,1.16],[-0.387,0.902],[-1.225,-1.16],[0,7.928],[0,0],[0,0],[0,0],[-1.031,-1.16],[-1.547,0],[-0.967,0],[-0.902,0.709],[-0.387,1.482],[-0.064,3.094],[1.225,1.096],[0.129,-1.16],[0.129,-0.258],[0.258,0],[0.129,0],[0.129,0.193],[0,1.418],[0,0],[0,0],[0,0],[5.285,-6.059],[0,1.225],[0,0],[0,0],[0,0],[0,0],[0.58,-2.578],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.064,7.863],[1.611,0.709],[3.867,-6.188],[1.354,2.9],[0,0],[-0.838,-2.449],[0,0],[0,0],[0,0],[0,0],[0,0.773],[-0.709,0],[0.838,1.74],[3.738,0],[0.838,-0.516],[1.74,0.902],[6.381,-6.703],[0,0],[0,0],[0,0],[0,4.77],[1.096,1.096],[0.838,0],[1.289,0],[0.902,-0.773],[0.322,-1.547],[-1.611,-0.58],[-0.064,3.287],[-0.129,1.096],[-0.129,0.193],[-0.258,0],[-0.322,0],[-0.129,-0.258],[0,0],[0,0],[0,0],[0,6.445],[0.193,-0.902],[0,0],[0,0],[0,0],[0,0],[-0.258,2.32],[0,0],[0,0],[0,0]],"v":[[63.374,-24.321],[63.374,-18.134],[67.563,-18.134],[62.987,5.714],[68.788,9.452],[74.137,-14.073],[77.682,-5.243],[82.516,-7.435],[78.327,-16.716],[74.202,-14.976],[74.266,-18.134],[82.645,-18.134],[82.645,1.073],[81.678,2.104],[76.715,2.04],[78.713,8.614],[86.963,7.261],[88.768,5.198],[94.504,9.13],[102.045,-16.329],[102.045,-23.226],[109.909,-23.226],[109.909,-0.731],[111.327,6.616],[115.581,8.228],[118.61,8.228],[122.155,7.261],[124.024,3.974],[124.669,-4.599],[119.899,-7.306],[119.706,-0.345],[119.319,1.589],[118.61,1.847],[117.836,1.847],[117.192,1.589],[117.063,-0.925],[117.063,-29.929],[94.891,-29.929],[94.891,-16.458],[89.09,4.296],[89.348,1.202],[89.348,-43.979],[80.454,-43.979],[82.838,-50.683],[75.104,-51.907],[73.686,-43.979],[67.563,-43.979],[67.563,-24.321]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.516,-2.191],[0,0],[1.289,2.771],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[1.16,2.771],[0,0],[-0.645,-2.32],[0,0],[0,0],[0,0]],"v":[[82.645,-37.985],[82.645,-24.321],[74.266,-24.321],[74.266,-34.118],[77.167,-25.739],[82.001,-27.802],[78.649,-36.438],[74.266,-34.827],[74.266,-37.985]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"航","np":6,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"ccccc3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"r3","tt":2,"sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":191,"s":[-720]}],"ix":10},"p":{"a":0,"k":[312,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[528,446],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ccccc2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"r2","tt":2,"sr":1,"ks":{"o":{"a":0,"k":60,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[720]}],"ix":10},"p":{"a":0,"k":[284,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[520,460],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"ccccc0","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"r1","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[512,480],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch04.json b/app/src/main/assets/touch04.json new file mode 100644 index 0000000..1fc0399 --- /dev/null +++ b/app/src/main/assets/touch04.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":25,"ip":0,"op":100,"w":600,"h":600,"nm":"Frame 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"text2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":75,"s":[60]},{"t":99,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[304,339.833,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-96.304,-19.445],[-96.304,-16.711],[-88.57,-16.711],[-88.57,3.508],[-85.429,3.508],[-85.429,-16.711],[-77.695,-16.711],[-77.695,-19.445]],"c":true},"ix":2},"nm":"T","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"T","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.052,0],[1.979,-2.833],[0,-3.104],[-1.802,-2.25],[-3.531,0],[-2.042,2.667],[0,3.427],[1.521,2.031]],"o":[[-3.875,0],[-1.542,2.208],[0,3.438],[2.021,2.333],[3.781,0],[1.74,-2.271],[0,-3.167],[-1.948,-2.604]],"v":[[-63.892,-20.07],[-72.673,-15.82],[-74.986,-7.852],[-72.283,0.68],[-63.954,4.18],[-55.22,0.18],[-52.611,-8.367],[-54.892,-16.164]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.74,0],[1.286,1.746],[0,2.544],[-1.5,1.632],[-2.375,0],[-1.412,-1.647],[0,-2.7],[1.224,-1.965]],"o":[[-2.885,0],[-1.287,-1.746],[0,-3.18],[1.5,-1.632],[2.448,0],[1.411,1.647],[0,2.554],[-1.224,1.965]],"v":[[-63.579,1.414],[-69.837,-1.205],[-71.767,-7.64],[-69.517,-14.857],[-63.704,-17.305],[-57.915,-14.834],[-55.798,-8.313],[-57.634,-1.534]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"O","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.763,-1.521],[-3.888,0],[-1.401,2.771],[0,2.823],[0,0],[0,0],[0,0],[0.514,-0.979],[2.656,0],[0.934,1.667],[0,1.667],[0,0]],"o":[[0,0],[0,2.823],[1.39,2.771],[3.888,0],[0.763,-1.521],[0,0],[0,0],[0,0],[0,1.656],[-0.956,1.802],[-2.216,0],[-0.63,-1.104],[0,0],[0,0]],"v":[[-47.089,-19.445],[-47.089,-6.555],[-45.944,-0.039],[-38.026,4.117],[-30.093,-0.039],[-28.948,-6.555],[-28.948,-19.445],[-32.089,-19.445],[-32.089,-5.258],[-32.86,-1.305],[-38.278,1.398],[-43.003,-1.102],[-43.948,-5.258],[-43.948,-19.445]],"c":true},"ix":2},"nm":"U","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"U","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.872,0],[1.915,-2.355],[0,-3.387],[-2.358,-2.137],[-2.636,0],[-1.802,1.969],[-0.268,2.417],[0,0],[0.624,-0.927],[2.251,0],[1.233,1.673],[0,2.69],[-1.366,1.59],[-2.22,0],[-1.008,-0.865],[-0.338,-1.479],[0,0],[1.585,1.531]],"o":[[-3.367,0],[-1.771,2.168],[0,4.461],[1.792,1.616],[3.058,0],[1.503,-1.635],[0,0],[-0.307,1.51],[-1.177,1.76],[-2.446,0],[-1.233,-1.673],[0,-3.284],[1.366,-1.59],[1.821,0],[1.008,0.865],[0,0],[-0.175,-1.948],[-1.585,-1.531]],"v":[[-13.051,-20.07],[-20.973,-16.537],[-23.629,-8.203],[-20.093,1.694],[-13.451,4.117],[-6.161,1.164],[-3.504,-4.914],[-6.536,-4.914],[-7.932,-1.258],[-13.074,1.383],[-18.592,-1.127],[-20.442,-7.672],[-18.394,-14.982],[-13.015,-17.367],[-8.772,-16.07],[-6.754,-12.555],[-3.723,-12.555],[-6.364,-17.773]],"c":true},"ix":2},"nm":"C","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"C","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.189,3.508],[5.33,3.508],[5.33,-7.227],[17.127,-7.227],[17.127,3.508],[20.268,3.508],[20.268,-19.445],[17.127,-19.445],[17.127,-9.961],[5.33,-9.961],[5.33,-19.445],[2.189,-19.445]],"c":true},"ix":2},"nm":"H","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"H","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.031,1.151],[0,0.562],[0,0],[0,0],[0,0],[0,0],[0.021,-1.083],[0,-0.469],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,-0.542],[-0.031,-1.151],[0,0],[0,0],[0,0],[0,0],[0,1.24],[-0.021,1.083],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[37.233,3.508],[40.202,3.508],[40.202,-10.039],[40.155,-12.578],[40.108,-15.148],[40.108,-15.852],[46.724,3.508],[49.805,3.508],[56.358,-15.852],[56.327,-12.367],[56.296,-10.039],[56.296,3.508],[59.264,3.508],[59.264,-19.445],[54.841,-19.445],[48.288,-0.039],[41.688,-19.445],[37.233,-19.445]],"c":true},"ix":2},"nm":"M","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"M","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[65.864,3.508],[82.755,3.508],[82.755,0.773],[68.896,0.773],[68.896,-7.008],[81.489,-7.008],[81.489,-9.664],[68.896,-9.664],[68.896,-16.633],[82.521,-16.633],[82.521,-19.445],[65.864,-19.445]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"E","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"text1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[70]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":75,"s":[100]},{"t":99,"s":[70]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,290,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":50,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":75,"s":[102,102,100]},{"t":99,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-84.965,-19.159],[-62.777,-19.159],[-62.777,-12.924],[-84.965,-12.924]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-2.562],[0,0],[0.725,3.239]],"o":[[0.628,3.335],[0,0],[-0.048,-2.562],[0,0]],"v":[[-82.5,-3.884],[-81.484,6.316],[-75.635,5.591],[-76.989,-4.416]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.483,-2.562],[0,0],[1.45,3.045]],"o":[[1.402,3.142],[0,0],[-0.58,-2.562],[0,0]],"v":[[-72.542,-3.836],[-69.206,6.074],[-63.55,4.624],[-67.224,-5.044]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[-1.015,-2.804],[0,0],[2.369,3.094]],"o":[[2.272,3.239],[0,0],[-1.208,-2.852],[0,0]],"v":[[-62.68,-4.126],[-56.734,6.316],[-51.127,4.14],[-57.508,-6.011]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[2.369,-2.079],[0,0],[-1.402,3.867]],"o":[[-1.402,3.529],[0,0],[2.514,-2.61],[0,0]],"v":[[-90.427,-5.624],[-96.518,3.85],[-91.152,6.461],[-84.868,-4.222]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-90.524,-24.525],[-90.524,-7.558],[-56.831,-7.558],[-56.831,-24.525],[-71.043,-24.525],[-71.043,-29.069],[-53.641,-29.069],[-53.641,-34.483],[-71.043,-34.483],[-71.043,-38.785],[-76.941,-38.785],[-76.941,-24.525]],"c":true},"ix":2},"nm":"点","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"点","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.208,-2.272],[0,0],[2.61,2.272]],"o":[[2.61,2.417],[0,0],[-1.402,-2.32],[0,0]],"v":[[-15.84,-34.483],[-8.976,-26.41],[-4.287,-29.649],[-11.49,-37.432]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[1.789,-2.03],[0.387,2.949],[0,0],[0,0],[0,0],[-0.097,4.544],[0,0],[-0.387,-4.399],[0,0],[0,0],[-2.465,0.725],[0,0],[6.768,-0.87],[-0.242,-1.402],[-2.61,0.387],[0,0],[0,0],[0,0],[0,0],[0,0],[2.755,-0.387],[0,0],[0,0],[0,0],[0.822,0],[2.707,0.145],[-0.242,-1.595],[-1.934,0.918],[0,3.142],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.063,-3.819],[3.819,-1.74],[-0.822,-1.402],[-2.804,2.272],[-3.529,0],[-0.918,8.508],[1.257,1.354],[0.967,0],[1.305,3.722],[-2.175,3.916]],"o":[[-1.257,2.369],[-0.532,-2.465],[0,0],[0,0],[0,0],[-0.387,-4.302],[0,0],[0.048,4.447],[0,0],[0,0],[2.852,-0.58],[0,0],[-4.931,1.644],[0.628,1.305],[2.465,-0.29],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.819,0.628],[0,0],[0,0],[0,0],[0,0.773],[-0.87,0.048],[0.822,1.595],[3.964,0],[1.934,-0.918],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.58,4.737],[-3.335,2.804],[1.45,1.305],[3.142,-1.644],[2.079,4.737],[4.399,0],[-1.547,-0.628],[-0.242,5.752],[-1.499,0],[3.142,-3.19],[0,0]],"v":[[-10.523,-17.951],[-15.164,-11.328],[-16.566,-19.546],[-3.9,-19.546],[-3.9,-25.009],[-17.146,-25.009],[-17.629,-38.399],[-23.671,-38.399],[-23.091,-25.009],[-32.518,-25.009],[-32.518,-31.534],[-24.493,-33.516],[-28.457,-38.447],[-47.745,-34.386],[-46.101,-29.504],[-38.367,-30.519],[-38.367,-25.009],[-47.503,-25.009],[-47.503,-19.546],[-38.367,-19.546],[-38.367,-12.972],[-48.421,-11.377],[-47.02,-5.528],[-38.367,-7.219],[-38.367,-0.21],[-39.479,0.805],[-45.908,0.757],[-43.878,6.606],[-35.08,5.494],[-32.518,-0.162],[-32.518,-8.428],[-24.542,-10.12],[-24.928,-15.341],[-32.518,-13.987],[-32.518,-19.546],[-22.56,-19.546],[-20.094,-6.494],[-31.019,0.418],[-27.104,5.059],[-18.112,-0.839],[-9.75,6.799],[-2.595,-3.836],[-7.381,-7.171],[-9.17,0.902],[-13.472,-5.044],[-5.447,-15.727]],"c":true},"ix":2},"nm":"我","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"我","np":5,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.499,-2.32],[0,0],[2.61,1.934],[0,0],[0,0],[1.015,0],[2.949,0.145],[-0.29,-1.547],[-2.272,0.725],[0,2.997],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[3.094,2.272],[0,0],[-1.354,-1.885],[0,0],[0,0],[0,0.725],[-0.918,0],[0.773,1.45],[4.496,0],[2.32,-0.725],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.216,-5.189],[15.531,2.787],[19.785,-1.177],[13.162,-7.316],[27.906,-7.316],[27.906,0.563],[26.601,1.53],[18.866,1.385],[20.8,6.606],[30.854,5.832],[33.948,0.708],[33.948,-7.316],[43.858,-7.316],[43.858,-12.682],[33.948,-12.682],[33.948,-15.486],[27.906,-15.486],[27.906,-12.682],[0.787,-12.682],[0.787,-7.316],[9.537,-7.316]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-9.426,0],[-2.32,0],[-0.773,4.882],[1.45,0.773],[3.722,0],[2.465,0],[0,2.03],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,5.607],[2.272,0],[6.913,0],[-1.692,-0.242],[-0.435,2.562],[-3.142,0],[-5.172,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.977,-34.58],[3.977,-23.462],[16.304,-16.501],[33.32,-16.501],[43.229,-22.495],[37.767,-24.138],[32.788,-21.19],[16.207,-21.19],[10.068,-23.558],[10.068,-24.38],[38.057,-24.38],[38.057,-37.48],[3.977,-37.48]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[10.068,-32.55],[32.353,-32.55],[32.353,-29.359],[10.068,-29.359]],"c":true},"ix":2},"nm":"导","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"导","np":6,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.532,-1.934],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.063,2.224]],"o":[[0.918,1.982],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.58,-1.885],[0,0]],"v":[[74.794,-37.722],[77.259,-31.148],[67.785,-31.148],[67.785,-26.072],[92.583,-26.072],[92.583,-31.148],[79.821,-31.148],[83.253,-32.211],[80.401,-39.22]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[2.997,-4.882],[-0.918,-0.87],[-0.242,6.091],[-0.483,-1.789],[0,0],[1.16,2.224],[0,0],[0,0],[0,0],[0,0],[0.532,0],[1.595,0.097],[-0.145,-1.402],[-1.45,0.87],[-0.29,0.677],[-0.918,-0.87],[0,5.946],[0,0],[0,0],[0,0],[-0.773,-0.87],[-1.16,0],[-0.725,0],[-0.677,0.532],[-0.29,1.112],[-0.048,2.32],[0.918,0.822],[0.097,-0.87],[0.097,-0.193],[0.193,0],[0.097,0],[0.097,0.145],[0,1.063],[0,0],[0,0],[0,0],[3.964,-4.544],[0,0.918],[0,0],[0,0],[0,0],[0,0],[0.435,-1.934],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.048,5.897],[1.208,0.532],[2.9,-4.641],[1.015,2.175],[0,0],[-0.628,-1.837],[0,0],[0,0],[0,0],[0,0],[0,0.58],[-0.532,0],[0.628,1.305],[2.804,0],[0.628,-0.387],[1.305,0.677],[4.786,-5.027],[0,0],[0,0],[0,0],[0,3.577],[0.822,0.822],[0.628,0],[0.967,0],[0.677,-0.58],[0.242,-1.16],[-1.208,-0.435],[-0.048,2.465],[-0.097,0.822],[-0.097,0.145],[-0.193,0],[-0.242,0],[-0.097,-0.193],[0,0],[0,0],[0,0],[0,4.834],[0.145,-0.677],[0,0],[0,0],[0,0],[0,0],[-0.193,1.74],[0,0],[0,0],[0,0]],"v":[[47.53,-18.241],[47.53,-13.6],[50.672,-13.6],[47.24,4.285],[51.591,7.089],[55.603,-10.555],[58.262,-3.932],[61.887,-5.576],[58.745,-12.537],[55.651,-11.232],[55.7,-13.6],[61.984,-13.6],[61.984,0.805],[61.259,1.578],[57.537,1.53],[59.035,6.461],[65.223,5.446],[66.576,3.899],[70.878,6.847],[76.534,-12.247],[76.534,-17.419],[82.432,-17.419],[82.432,-0.549],[83.495,4.962],[86.685,6.171],[88.957,6.171],[91.616,5.446],[93.018,2.98],[93.501,-3.449],[89.924,-5.479],[89.779,-0.259],[89.489,1.192],[88.957,1.385],[88.377,1.385],[87.894,1.192],[87.797,-0.694],[87.797,-22.447],[71.168,-22.447],[71.168,-12.344],[66.818,3.222],[67.011,0.902],[67.011,-32.985],[60.34,-32.985],[62.129,-38.012],[56.328,-38.93],[55.265,-32.985],[50.672,-32.985],[50.672,-18.241]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.387,-1.644],[0,0],[0.967,2.079],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0.87,2.079],[0,0],[-0.483,-1.74],[0,0],[0,0],[0,0]],"v":[[61.984,-28.489],[61.984,-18.241],[55.7,-18.241],[55.7,-25.589],[57.875,-19.304],[61.5,-20.851],[58.987,-27.329],[55.7,-26.12],[55.7,-28.489]],"c":true},"ix":2},"nm":"航","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"航","np":6,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"e1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[90]},{"t":99,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-20]},{"t":99,"s":[340]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[105,105,100]},{"t":99,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[31.578,127.099],[-152.691,6.678],[-22.831,-105.761],[138.017,-44.904]],"o":[[-29.184,-117.464],[138.909,-6.075],[21.365,98.971],[-132.016,42.952]],"v":[[-244.917,12.25],[-22,-228.702],[243.13,-41.308],[102.856,220.322]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":3},"o":{"a":0,"k":80,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"e2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":99,"s":[-360]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[98,98,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[102,102,100]},{"t":99,"s":[98,98,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[130.689,11.751],[-43.129,145.547],[-107.632,-13.014],[2.146,-144.221]],"o":[[-120.782,-10.861],[39.236,-132.409],[100.722,12.178],[-2.053,137.95]],"v":[[-70.883,238.273],[-227.045,-49.527],[36.439,-237.433],[238.967,-20.496]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.600000023842],"ix":3},"o":{"a":0,"k":60,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"e3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[80]},{"t":99,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":99,"s":[720]}],"ix":10},"p":{"a":0,"k":[301,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-54.156,119.954],[-120.023,-83.416],[47.68,-97.813],[132.381,44.33]],"o":[[50.05,-110.86],[109.189,75.887],[-44.618,91.533],[-126.625,-42.403]],"v":[[-203.602,-136.021],[113.744,-199.055],[199.829,104.852],[-67.487,232.453]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.300000011921],"ix":3},"o":{"a":0,"k":30,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"e0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":99,"s":[360]}],"ix":10},"p":{"a":0,"k":[287,307,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[106,106,100]},{"t":99,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[27.956,114.953],[-137.503,5.429],[-20.16,-95.641],[124.435,-40.023]],"o":[[-25.836,-106.239],[125.092,-4.939],[18.866,89.5],[-119.024,38.283]],"v":[[-220.576,10.025],[-18.966,-206.782],[219.047,-36.432],[91.768,199.384]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[28.852,126.892],[-137.503,5.429],[-20.16,-95.641],[124.435,-40.023]],"o":[[-24.372,-106.573],[125.092,-4.939],[18.866,89.5],[-119.024,38.283]],"v":[[-218.054,2.069],[-2.868,-212.752],[208.481,-41.979],[94.685,203.147]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[29.749,138.831],[-137.503,5.429],[-20.16,-95.641],[124.435,-40.023]],"o":[[-22.908,-106.908],[125.092,-4.939],[18.866,89.5],[-119.024,38.283]],"v":[[-226.475,24.765],[-18.966,-206.782],[219.047,-36.432],[91.768,199.384]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":75,"s":[{"i":[[28.834,126.648],[-137.503,5.429],[-20.16,-95.641],[124.435,-40.023]],"o":[[-24.402,-106.567],[125.092,-4.939],[18.866,89.5],[-119.025,38.283]],"v":[[-212.446,88.299],[-32.297,-206.147],[229.748,-32.17],[77.394,198.16]],"c":true}]},{"t":99,"s":[{"i":[[27.956,114.953],[-137.503,5.429],[-20.16,-95.641],[124.435,-40.023]],"o":[[-25.836,-106.239],[125.092,-4.939],[18.866,89.5],[-119.024,38.283]],"v":[[-220.576,10.025],[-18.966,-206.782],[219.047,-36.432],[91.768,199.384]],"c":true}]}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.876157641411,0.722320437431,0.527761459351,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":100,"st":-24,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch05.json b/app/src/main/assets/touch05.json new file mode 100644 index 0000000..eedb157 --- /dev/null +++ b/app/src/main/assets/touch05.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":24,"ip":0,"op":96,"w":600,"h":600,"nm":"画板","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"t":80,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":16,"s":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"t":80,"s":[-15]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[451,518,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":36,"s":[391,463,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[391,463,0],"to":[0,0,0],"ti":[0,0,0]},{"t":80,"s":[471,534,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":16,"s":[80,80,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[100,100,100]},{"t":80,"s":[80,80,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[1.64,-1.12],[1.84,1.44],[2.33,0.04],[1.78,-1.1],[1.1,1.19],[1.52,0.58],[1.62,-0.15],[1.38,-0.85],[0,0],[0.51,1.35],[0.99,1.06],[1.32,0.59],[1.44,0.04],[2.07,-2.12],[-0.04,-2.97],[0,0],[0,0],[2.91,0],[2.11,-2.01],[0.16,-3.14],[-2.07,-2.37],[0,0],[-0.76,-0.44],[-9.23,1.01],[0,21.4],[0,0],[0.49,1.36],[1,1.05],[1.33,0.59],[1.45,0.01]],"o":[[-2,-0.03],[-0.6,-2.25],[-1.83,-1.44],[-2.09,0],[-0.46,-1.56],[-1.11,-1.19],[-1.51,-0.58],[-1.61,0.15],[0,0],[0.05,-1.45],[-0.5,-1.36],[-0.99,-1.05],[-1.32,-0.59],[-2.97,0.05],[-2.07,2.13],[0,0],[0,0],[-2.1,-2.01],[-2.9,0],[-2.3,2.14],[-0.17,3.15],[0,0],[0.61,0.62],[7.28,5.76],[31.29,0],[0,0],[0.08,-1.45],[-0.5,-1.37],[-0.99,-1.06],[-1.33,-0.58],[0,0]],"v":[[37.34,-13.05],[31.74,-11.37],[27.99,-17.06],[21.57,-19.35],[15.65,-17.67],[13.27,-21.84],[9.28,-24.53],[4.52,-25.18],[-0.03,-23.66],[-0.03,-48.66],[-0.72,-52.9],[-2.99,-56.56],[-6.49,-59.05],[-10.68,-60],[-18.54,-56.61],[-21.72,-48.66],[-21.72,8.83],[-28.53,1.98],[-36.33,-1.14],[-44.13,1.98],[-47.98,10.22],[-45.01,18.82],[-14.04,50.77],[-11.96,52.37],[13.81,59.79],[47.98,20.99],[47.98,-1.69],[47.35,-5.96],[45.08,-9.63],[41.56,-12.13],[37.34,-13.03]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":48,"s":[{"i":[[0,0],[1.64,-1.12],[1.84,1.44],[2.33,0.04],[1.78,-1.1],[1.1,1.19],[1.52,0.58],[1.62,-0.15],[1.38,-0.85],[0,0],[0.51,1.35],[0.99,1.06],[1.32,0.59],[1.44,0.04],[2.07,-2.12],[-0.04,-2.97],[0,0],[0,0],[2.91,0],[2.11,-2.01],[0.16,-3.14],[-2.07,-2.37],[0,0],[-0.76,-0.44],[-9.23,1.01],[0,21.4],[0,0],[0.49,1.36],[1,1.05],[1.33,0.59],[1.45,0.01]],"o":[[-2,-0.03],[-0.6,-2.25],[-1.83,-1.44],[-2.09,0],[-0.46,-1.56],[-1.11,-1.19],[-1.51,-0.58],[-1.61,0.15],[0,0],[-1.158,-1.528],[-0.5,-1.36],[-0.99,-1.05],[-1.32,-0.59],[-2.97,0.05],[-2.07,2.13],[0,0],[0,0],[-2.1,-2.01],[-2.9,0],[-2.3,2.14],[-0.17,3.15],[0,0],[0.61,0.62],[7.28,5.76],[31.29,0],[0,0],[0.08,-1.45],[-0.5,-1.37],[-0.99,-1.06],[-1.33,-0.58],[0,0]],"v":[[37.34,-13.05],[31.74,-11.37],[27.99,-17.06],[21.57,-19.35],[15.65,-17.67],[13.27,-21.84],[9.28,-24.53],[4.52,-25.18],[-0.03,-23.66],[-8.655,-38.347],[-13.22,-47.15],[-15.49,-50.81],[-18.99,-53.3],[-23.18,-54.25],[-31.04,-50.86],[-34.22,-42.91],[-17.845,6.205],[-22.655,3.855],[-32.83,0.485],[-40.63,3.605],[-44.48,11.845],[-41.51,20.445],[-14.04,50.77],[-11.96,52.37],[13.81,59.79],[47.98,20.99],[47.98,-1.69],[47.35,-5.96],[45.08,-9.63],[41.56,-12.13],[37.34,-13.03]],"c":true}]},{"t":60,"s":[{"i":[[0,0],[1.64,-1.12],[1.84,1.44],[2.33,0.04],[1.78,-1.1],[1.1,1.19],[1.52,0.58],[1.62,-0.15],[1.38,-0.85],[0,0],[0.51,1.35],[0.99,1.06],[1.32,0.59],[1.44,0.04],[2.07,-2.12],[-0.04,-2.97],[0,0],[0,0],[2.91,0],[2.11,-2.01],[0.16,-3.14],[-2.07,-2.37],[0,0],[-0.76,-0.44],[-9.23,1.01],[0,21.4],[0,0],[0.49,1.36],[1,1.05],[1.33,0.59],[1.45,0.01]],"o":[[-2,-0.03],[-0.6,-2.25],[-1.83,-1.44],[-2.09,0],[-0.46,-1.56],[-1.11,-1.19],[-1.51,-0.58],[-1.61,0.15],[0,0],[0.05,-1.45],[-0.5,-1.36],[-0.99,-1.05],[-1.32,-0.59],[-2.97,0.05],[-2.07,2.13],[0,0],[0,0],[-2.1,-2.01],[-2.9,0],[-2.3,2.14],[-0.17,3.15],[0,0],[0.61,0.62],[7.28,5.76],[31.29,0],[0,0],[0.08,-1.45],[-0.5,-1.37],[-0.99,-1.06],[-1.33,-0.58],[0,0]],"v":[[37.34,-13.05],[31.74,-11.37],[27.99,-17.06],[21.57,-19.35],[15.65,-17.67],[13.27,-21.84],[9.28,-24.53],[4.52,-25.18],[-0.03,-23.66],[-0.03,-48.66],[-0.72,-52.9],[-2.99,-56.56],[-6.49,-59.05],[-10.68,-60],[-18.54,-56.61],[-21.72,-48.66],[-21.72,8.83],[-28.53,1.98],[-36.33,-1.14],[-44.13,1.98],[-47.98,10.22],[-45.01,18.82],[-14.04,50.77],[-11.96,52.37],[13.81,59.79],[47.98,20.99],[47.98,-1.69],[47.35,-5.96],[45.08,-9.63],[41.56,-12.13],[37.34,-13.03]],"c":true}]}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"hand","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"t2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"t":96,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[298.811,334.8,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[98,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[98,98,100]},{"t":96,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-82.264,-7.68],[-89.684,-7.68],[-89.684,-11.2],[-70.673,-11.2],[-70.673,-7.68],[-78.104,-7.68],[-78.104,11.2],[-82.264,11.2]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.29,0],[1.83,0.98],[1.04,1.75],[0,2.18],[-1.05,1.75],[-1.84,0.99],[-2.28,0],[-1.83,-1],[-1.04,-1.75],[0,-2.2],[1.05,-1.75],[1.83,-1]],"o":[[-2.28,0],[-1.84,-1],[-1.05,-1.77],[0,-2.18],[1.04,-1.77],[1.83,-1],[2.29,0],[1.83,0.99],[1.05,1.75],[0,2.2],[-1.04,1.75],[-1.83,0.98]],"v":[[-57.406,11.52],[-63.577,10.05],[-67.896,5.92],[-69.467,0],[-67.896,-5.89],[-63.577,-10.02],[-57.406,-11.52],[-51.227,-10.02],[-46.906,-5.92],[-45.337,0],[-46.906,5.92],[-51.227,10.05]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-1.49,0],[-1.19,0.66],[-0.68,1.19],[0,1.5],[0.68,1.19],[1.2,0.67],[1.5,0],[1.19,-0.68],[0.69,-1.22],[0,-1.49],[-0.68,-1.22],[-1.19,-0.68]],"o":[[1.5,0],[1.2,-0.68],[0.68,-1.22],[0,-1.49],[-0.68,-1.22],[-1.19,-0.68],[-1.49,0],[-1.19,0.67],[-0.68,1.19],[0,1.5],[0.69,1.19],[1.19,0.66]],"v":[[-57.404,7.868],[-53.374,6.878],[-50.555,4.068],[-49.535,-0.002],[-50.555,-4.032],[-53.374,-6.852],[-57.404,-7.872],[-61.434,-6.852],[-64.255,-4.032],[-65.275,-0.002],[-64.255,4.068],[-61.434,6.878]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[3.1,0],[1.73,1.73],[0,3.24],[0,0],[0,0],[0,0],[-3.8,0],[0,4.39],[0,0],[0,0],[0,0],[1.73,-1.75]],"o":[[-3.09,0],[-1.73,-1.75],[0,0],[0,0],[0,0],[0,4.39],[3.77,0],[0,0],[0,0],[0,0],[0,3.24],[-1.7,1.73]],"v":[[-31.301,11.52],[-38.531,8.93],[-41.12,1.44],[-41.12,-11.2],[-36.96,-11.2],[-36.96,1.28],[-31.26,7.87],[-25.6,1.28],[-25.6,-11.2],[-21.501,-11.2],[-21.501,1.44],[-24.1,8.93]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[1.83,0],[1.84,0.98],[1.04,1.75],[0,2.2],[-1.05,1.75],[-1.82,0.99],[-2.26,0],[-1.51,-0.64],[-1.04,-1.21],[0,0],[2.37,0],[1.22,-0.68],[0.68,-1.2],[0,-1.51],[-0.69,-1.19],[-1.21,-0.68],[-1.53,0],[-1.63,1.77],[0,0],[1.54,-0.64]],"o":[[-2.26,0],[-1.81,-1],[-1.03,-1.75],[0,-2.2],[1.04,-1.75],[1.83,-1],[1.83,0],[1.52,0.64],[0,0],[-1.63,-1.75],[-1.53,0],[-1.21,0.66],[-0.69,1.19],[0,1.51],[0.68,1.2],[1.22,0.66],[2.37,0],[0,0],[-1.04,1.21],[-1.51,0.64]],"v":[[-5.309,11.52],[-11.458,10.05],[-15.738,5.92],[-17.279,0],[-15.708,-5.92],[-11.419,-10.02],[-5.279,-11.52],[-0.258,-10.56],[3.581,-7.78],[0.902,-5.25],[-5.089,-7.87],[-9.219,-6.85],[-12.059,-4.06],[-13.089,0],[-12.059,4.06],[-9.219,6.88],[-5.089,7.87],[0.902,5.22],[3.581,7.78],[-0.288,10.56]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[27.471,-11.2],[27.471,11.2],[23.311,11.2],[23.311,1.6],[11.732,1.6],[11.732,11.2],[7.572,11.2],[7.572,-11.2],[11.732,-11.2],[11.732,-1.95],[23.311,-1.95],[23.311,-11.2]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[62.902,11.2],[62.861,-3.65],[55.501,8.64],[53.652,8.64],[46.292,-3.46],[46.292,11.2],[42.322,11.2],[42.322,-11.2],[45.742,-11.2],[54.641,3.65],[63.382,-11.2],[66.801,-11.2],[66.831,11.2]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[89.684,7.71],[89.684,11.2],[72.883,11.2],[72.883,-11.2],[89.234,-11.2],[89.234,-7.71],[77.044,-7.71],[77.044,-1.89],[87.863,-1.89],[87.863,1.54],[77.044,1.54],[77.044,7.71]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":10,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"t1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.24,283.76,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[103,103,100]},{"t":96,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-83.376,-3.072],[-61.346,-3.072],[-61.346,3.118],[-83.376,3.118]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-2.55],[0,0],[0.72,3.22]],"o":[[0.62,3.31],[0,0],[-0.05,-2.55],[0,0]],"v":[[-80.928,12.098],[-79.918,22.228],[-74.108,21.508],[-75.458,11.568]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-0.37,-0.95],[0,0],[-0.21,-0.63],[0,0],[-0.17,-0.93],[0,0],[0.87,2.12],[0,0],[0.27,0.61],[0,0],[0,0]],"o":[[0.38,0.85],[0,0],[0.23,0.65],[0,0],[0.38,1.22],[0,0],[-0.36,-1.57],[0,0],[-0.27,-0.65],[0,0],[0,0],[0,0]],"v":[[-71.04,12.144],[-69.91,14.874],[-69.55,15.834],[-68.88,17.754],[-68.58,18.694],[-67.73,21.984],[-62.11,20.544],[-64.1,14.704],[-64.51,13.724],[-65.34,11.834],[-65.76,10.944],[-65.76,10.944]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-0.18,-0.29],[0,0],[-0.72,-2],[0,0],[2.02,2.79],[0,0],[0.2,0.27]],"o":[[0,0],[0,0],[0,0],[0.18,0.28],[0,0],[1.67,2.63],[0,0],[-0.99,-2.34],[0,0],[-0.21,-0.28],[0,0]],"v":[[-61.248,11.854],[-60.978,12.244],[-60.978,12.244],[-60.418,13.054],[-59.868,13.904],[-59.308,14.764],[-55.348,22.224],[-49.778,20.064],[-54.858,11.674],[-55.488,10.804],[-56.108,9.984]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[2.35,-2.07],[0,0],[-1.39,3.84]],"o":[[-1.39,3.5],[0,0],[2.49,-2.59],[0,0]],"v":[[-88.798,10.368],[-94.848,19.778],[-89.518,22.368],[-83.278,11.758]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-88.896,-8.4],[-88.896,8.45],[-55.436,8.45],[-55.436,-8.4],[-69.556,-8.4],[-69.556,-12.91],[-52.276,-12.91],[-52.276,-18.29],[-69.556,-18.29],[-69.556,-22.56],[-75.406,-22.56],[-75.406,-8.4]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[-1.2,-2.25],[0,0],[2.35,2.14],[0,0],[0.11,0.1]],"o":[[2.59,2.4],[0,0],[-1.21,-2.01],[0,0],[-0.11,-0.1],[0,0]],"v":[[-14.4,-18.286],[-7.58,-10.276],[-2.93,-13.486],[-9.04,-20.286],[-9.74,-20.916],[-10.08,-21.216]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[1.78,-2.02],[0.39,2.93],[0,0],[0,0],[0,0],[-0.1,4.51],[0,0],[-0.38,-4.36],[0,0],[0,0],[-2.45,0.72],[0,0],[3.46,-0.72],[0,0],[2.78,-0.36],[-0.24,-1.39],[0,0],[-1.85,0.28],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.82,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.24,-1.59],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.46,0.7],[0,3.12],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.06,-3.79],[3.79,-1.73],[-0.82,-1.39],[-2.79,2.26],[-3.5,0],[-1.06,5.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.02,0.13],[0,0],[-0.01,0.13],[1.25,1.34],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5,0],[1.3,3.69],[-2.16,3.89]],"o":[[-1.25,2.35],[-0.52,-2.45],[0,0],[0,0],[0,0],[-0.39,-4.27],[0,0],[0.04,4.41],[0,0],[0,0],[2.83,-0.57],[0,0],[-2.53,0.84],[0,0],[-2.82,0.54],[0.63,1.3],[0,0],[1.82,-0.22],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.77],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.81,1.58],[0,0],[0,0],[0,0],[0,0],[0,0],[2.62,-0.1],[1.92,-0.91],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.58,4.7],[-3.31,2.78],[1.44,1.3],[3.12,-1.63],[2.06,4.71],[3.55,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.02,-0.12],[0,0],[0.02,-0.13],[-1.53,-0.63],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.3,1.41],[-1.49,0],[3.12,-3.17],[0,0]],"v":[[-9.122,-1.874],[-13.732,4.706],[-15.122,-3.454],[-2.542,-3.454],[-2.542,-8.884],[-15.692,-8.884],[-16.172,-22.174],[-22.172,-22.174],[-21.602,-8.884],[-30.962,-8.884],[-30.962,-15.364],[-22.992,-17.324],[-26.932,-22.224],[-36.162,-19.844],[-37.562,-19.564],[-46.082,-18.194],[-44.452,-13.344],[-42.312,-13.604],[-36.772,-14.354],[-36.772,-8.884],[-45.842,-8.884],[-45.842,-3.454],[-36.772,-3.454],[-36.772,3.076],[-42.152,3.956],[-42.152,3.956],[-43.992,4.246],[-43.992,4.246],[-45.692,4.506],[-45.692,4.506],[-46.752,4.656],[-46.752,4.656],[-45.362,10.466],[-36.772,8.786],[-36.772,15.746],[-37.872,16.756],[-38.572,16.776],[-38.572,16.776],[-39.622,16.796],[-39.622,16.796],[-40.652,16.796],[-40.652,16.796],[-41.502,16.796],[-41.502,16.796],[-42.402,16.776],[-42.402,16.776],[-43.322,16.746],[-43.322,16.746],[-44.252,16.706],[-44.252,16.706],[-42.242,22.516],[-41.312,22.506],[-41.312,22.506],[-40.432,22.496],[-40.432,22.496],[-39.592,22.476],[-33.502,21.406],[-30.962,15.796],[-30.962,7.586],[-23.042,5.906],[-23.422,0.716],[-30.962,2.066],[-30.962,-3.454],[-21.072,-3.454],[-18.622,9.506],[-29.472,16.366],[-25.582,20.976],[-16.652,15.116],[-8.352,22.706],[-1.872,16.256],[-1.752,15.656],[-1.752,15.656],[-1.632,15.026],[-1.632,15.026],[-1.532,14.356],[-1.532,14.356],[-1.432,13.656],[-1.382,13.286],[-1.292,12.536],[-1.252,12.146],[-6.002,8.836],[-6.052,9.906],[-6.052,9.906],[-6.092,10.576],[-6.092,10.576],[-6.152,11.506],[-6.152,11.506],[-6.202,12.086],[-6.202,12.086],[-6.262,12.626],[-6.262,12.626],[-6.312,13.136],[-6.312,13.136],[-6.372,13.606],[-6.372,13.606],[-6.442,14.036],[-6.442,14.036],[-6.512,14.436],[-6.512,14.436],[-6.582,14.806],[-7.772,16.846],[-12.052,10.946],[-4.082,0.336]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[-0.47,-0.37],[0,0],[-1.16,-1.79],[0,0],[2.59,1.92],[0,0],[0,0],[1.01,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.29,-1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.15,0.01],[0,0],[0,0],[0,0],[-0.13,0.01],[0,0],[-0.96,0.3],[0,2.98],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0.46,0.34],[0,0],[2.5,2.05],[0,0],[-1.34,-1.87],[0,0],[0,0],[0,0.72],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.77,1.44],[0,0],[0,0],[0,0],[0,0],[0,0],[0.15,0],[0,0],[0,0],[0,0],[0.14,0],[0,0],[1.33,-0.11],[2.3,-0.72],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.828,10.796],[10.228,11.866],[10.938,12.446],[17.088,18.716],[21.308,14.786],[14.738,8.686],[29.378,8.686],[29.378,16.516],[28.078,17.476],[25.558,17.456],[25.558,17.456],[23.488,17.426],[23.488,17.426],[22.238,17.396],[22.238,17.396],[21.298,17.366],[21.298,17.366],[20.398,17.326],[20.398,17.326],[22.318,22.516],[23.818,22.506],[23.818,22.506],[24.768,22.506],[24.768,22.506],[25.668,22.486],[26.108,22.476],[26.948,22.456],[26.948,22.456],[27.748,22.416],[28.138,22.396],[28.888,22.346],[32.308,21.746],[35.378,16.656],[35.378,8.686],[45.218,8.686],[45.218,3.356],[35.378,3.356],[35.378,0.576],[29.378,0.576],[29.378,3.356],[2.448,3.356],[2.448,8.686],[11.138,8.686]],"c":true},"ix":2},"nm":"路径 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.87,-0.62],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.11,-0.01],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.1,0.01],[0,0],[0,0],[0,0],[-0.62,3.86],[1.44,0.77],[0,0],[1.87,-0.18],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.14,0.02],[0,0],[0.04,0.01],[0,0],[0.06,0.81],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,4.22],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.11,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.1,0],[0,0],[0,0],[0,0],[4.07,-0.44],[-1.68,-0.24],[0,0],[-0.35,1.71],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.17,-0.02],[0,0],[-0.05,-0.02],[0,0],[-0.81,-0.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.616,-21.264],[5.616,-7.344],[12.136,-0.714],[12.696,-0.644],[12.696,-0.644],[13.286,-0.594],[13.286,-0.594],[13.906,-0.544],[13.906,-0.544],[14.556,-0.504],[14.896,-0.484],[15.586,-0.464],[15.586,-0.464],[16.316,-0.444],[16.316,-0.444],[17.066,-0.434],[17.066,-0.434],[35.096,-0.434],[35.096,-0.434],[35.766,-0.444],[35.766,-0.444],[36.396,-0.454],[36.396,-0.454],[37.006,-0.484],[37.296,-0.504],[37.856,-0.544],[37.856,-0.544],[38.386,-0.594],[44.596,-6.384],[39.166,-8.014],[39.106,-7.654],[36.266,-5.164],[35.876,-5.134],[35.876,-5.134],[35.456,-5.104],[35.456,-5.104],[34.986,-5.094],[34.986,-5.094],[34.486,-5.084],[34.486,-5.084],[17.156,-5.094],[17.156,-5.094],[16.316,-5.104],[16.316,-5.104],[15.566,-5.124],[15.566,-5.124],[15.106,-5.144],[15.106,-5.144],[14.686,-5.164],[14.686,-5.164],[14.306,-5.204],[14.306,-5.204],[13.956,-5.244],[13.486,-5.314],[13.206,-5.374],[13.076,-5.414],[12.836,-5.484],[11.676,-7.084],[11.666,-7.314],[11.666,-7.314],[11.666,-8.254],[39.456,-8.254],[39.456,-21.264]],"c":true},"ix":2},"nm":"路径 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[11.664,-16.368],[33.794,-16.368],[33.794,-13.198],[11.664,-13.198]],"c":true},"ix":2},"nm":"路径 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[0,0],[-0.53,-1.92],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.66,1.55],[0,0],[0.13,0.29],[0,0],[0,0]],"o":[[0.91,1.97],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.36,-1.17],[0,0],[-0.14,-0.31],[0,0],[0,0],[0,0]],"v":[[76.272,-21.502],[78.722,-14.972],[69.312,-14.972],[69.312,-9.932],[93.932,-9.932],[93.932,-14.972],[81.262,-14.972],[84.672,-16.032],[83.052,-20.312],[82.652,-21.232],[82.242,-22.132],[81.842,-22.992],[81.842,-22.992]],"c":true},"ix":2},"nm":"路径 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2.64,-4.29],[-0.91,-0.87],[-0.39,5.28],[0,0],[-0.01,0.19],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.07,-0.14],[0,0],[-0.27,-1],[0,0],[0.52,1.15],[0,0],[0,0],[0,0],[0.07,0.14],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.53,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.14,-1.39],[0,0],[-1.31,0.79],[-0.29,0.67],[-0.91,-0.87],[-0.36,5.29],[0,0],[0,0],[0,0],[-0.01,0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.04,-0.22],[0,0],[-0.19,-0.31],[0,0],[-0.07,-0.08],[-1.15,0],[0,0],[0,0],[-0.67,0.53],[-0.29,1.1],[-0.04,0.29],[0,0],[-0.01,0.09],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.92,0.81],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.03,-0.06],[0.2,0],[0,0],[0,0],[0.09,0.14],[0.01,0.13],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.04,-0.63],[0,0],[2.98,-3.42],[0,0.91],[0,0],[0,0],[0,0],[0,0],[0.43,-1.92],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.14,5.39],[1.2,0.53],[2.44,-3.91],[0,0],[0.01,-0.18],[0,0],[0,0],[0,0],[0,0],[0,0],[0.07,0.14],[0,0],[0.55,1.31],[0,0],[-0.29,-0.86],[0,0],[0,0],[0,0],[-0.07,-0.15],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.57],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.63,1.29],[0,0],[2.38,-0.03],[0.62,-0.38],[1.3,0.67],[3.84,-4.04],[0,0],[0,0],[0,0],[0,-0.14],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.03,0.27],[0,0],[0.11,0.48],[0,0],[0.06,0.09],[0.82,0.82],[0,0],[0,0],[0.96,0],[0.68,-0.57],[0.04,-0.2],[0,0],[0.01,-0.08],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.2,-0.43],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.03,0.13],[-0.09,0.14],[0,0],[0,0],[-0.24,0],[-0.03,-0.05],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.01,0.61],[0,0],[-0.29,3.99],[0.14,-0.68],[0,0],[0,0],[0,0],[0,0],[-0.19,1.73],[0,0],[0,0],[0,0]],"v":[[49.202,-2.164],[49.202,2.446],[52.322,2.446],[52.312,3.466],[52.312,3.466],[52.292,4.496],[48.912,20.206],[53.232,22.996],[57.062,8.266],[57.132,7.136],[57.162,6.576],[57.212,5.476],[57.212,5.476],[57.602,6.306],[57.602,6.306],[57.982,7.166],[58.182,7.596],[58.552,8.466],[59.852,12.046],[63.452,10.416],[62.192,7.316],[61.792,6.456],[61.792,6.456],[61.382,5.586],[61.172,5.156],[60.752,4.306],[60.752,4.306],[60.332,3.506],[60.332,3.506],[57.262,4.796],[57.312,2.446],[63.552,2.446],[63.552,16.756],[62.832,17.516],[61.592,17.536],[61.592,17.536],[60.682,17.526],[60.682,17.526],[60.182,17.516],[60.182,17.516],[59.662,17.496],[59.662,17.496],[59.132,17.476],[59.132,17.476],[60.622,22.366],[61.392,22.366],[66.772,21.356],[68.112,19.826],[72.382,22.756],[77.882,7.386],[77.932,6.556],[77.932,6.556],[77.972,5.746],[77.982,5.346],[77.992,4.556],[77.992,4.556],[78.002,3.796],[78.002,3.796],[78.002,-1.344],[83.852,-1.344],[83.852,15.736],[83.852,15.736],[83.862,16.346],[83.862,16.346],[83.882,16.896],[83.882,16.896],[83.902,17.406],[83.902,17.406],[83.932,17.866],[83.932,17.866],[83.962,18.276],[84.062,18.996],[84.132,19.306],[84.582,20.456],[84.712,20.626],[84.912,20.876],[88.082,22.076],[90.332,22.076],[90.332,22.076],[92.972,21.356],[94.372,18.916],[94.492,18.166],[94.542,17.686],[94.572,17.436],[94.622,16.886],[94.622,16.886],[94.672,16.306],[94.672,16.306],[94.732,15.376],[94.732,15.376],[94.782,14.416],[94.782,14.416],[94.822,13.456],[94.822,13.456],[94.852,12.526],[94.852,12.526],[91.292,10.516],[91.242,13.696],[91.242,13.696],[91.212,14.656],[91.212,14.656],[91.202,15.056],[91.202,15.056],[91.182,15.406],[91.182,15.406],[91.152,15.696],[91.152,15.696],[91.102,16.076],[91.102,16.076],[91.052,16.386],[91.052,16.386],[91.012,16.646],[91.012,16.646],[90.962,16.856],[90.862,17.136],[90.332,17.326],[89.762,17.326],[89.762,17.326],[89.282,17.136],[89.222,16.866],[89.202,16.656],[89.202,16.656],[89.192,16.386],[89.192,16.386],[89.182,15.886],[89.182,15.886],[89.182,-6.334],[72.672,-6.334],[72.672,4.046],[72.672,4.046],[72.662,4.766],[72.602,6.636],[72.562,7.406],[68.352,19.156],[68.542,16.846],[68.542,-16.804],[61.922,-16.804],[63.692,-21.794],[57.932,-22.704],[56.882,-16.804],[52.322,-16.804],[52.322,-2.164]],"c":true},"ix":2},"nm":"路径 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.06,-0.14],[0,0],[-0.22,-0.92],[0,0],[0.96,2.07],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.05,0.13],[0,0],[0.45,1.25],[0,0],[-0.48,-1.72],[0,0],[0,0],[0,0]],"v":[[63.552,-12.336],[63.552,-2.156],[57.312,-2.156],[57.312,-9.456],[57.642,-8.666],[57.642,-8.666],[57.962,-7.836],[58.122,-7.426],[58.422,-6.586],[59.472,-3.216],[63.072,-4.756],[60.572,-11.186],[57.312,-9.986],[57.312,-12.336]],"c":true},"ix":2},"nm":"路径 14","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":16,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"c1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[90,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[90,90,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78,"s":[105,105,100]},{"t":96,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-91.13],[91.13,0],[0,91.13],[-91.13,0]],"o":[[0,91.13],[-91.13,0],[0,-91.13],[91.13,0]],"v":[[165,0],[0,165],[-165,0],[0,-165]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"c5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[50]},{"t":90,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":52,"s":[65,65,100]},{"t":90,"s":[110,110,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[436,436],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.92549020052,0.811764717102,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"c4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":68,"s":[20]},{"t":86,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":56,"s":[50,50,100]},{"t":96,"s":[120,120,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[550,550],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.886274516582,0.760784327984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"c2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[50]},{"t":42,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":4,"s":[65,65,100]},{"t":42,"s":[110,110,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[436,436],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.92549020052,0.811764717102,0.666666686535,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"c3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[20]},{"t":38,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":8,"s":[50,50,100]},{"t":48,"s":[120,120,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[550,550],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.886274516582,0.760784327984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"miaobian3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[60]},{"t":92,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":54,"s":[90,90,100]},{"t":92,"s":[180,180,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[332,332],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"miaobian1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"miaobian2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[40]},{"t":68,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[90,90,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":68,"s":[180,180,100]},{"t":92,"s":[180,180,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[332,332],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"miaobian1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"miaobian1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[80]},{"t":44,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,303,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":6,"s":[90,90,100]},{"t":44,"s":[180,180,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[332,332],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"miaobian1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":96,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch06.json b/app/src/main/assets/touch06.json new file mode 100644 index 0000000..6991f84 --- /dev/null +++ b/app/src/main/assets/touch06.json @@ -0,0 +1 @@ +{"v":"5.7.13","fr":24,"ip":0,"op":72,"w":600,"h":800,"nm":"画板","ddd":0,"assets":[{"id":"image_0","w":204,"h":210,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_1","w":420,"h":420,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_2","w":420,"h":420,"u":"","p":"data:image/png;base64,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","e":1},{"id":"image_3","w":419,"h":420,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"yuan3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[38.462]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[38.462]},{"t":77,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,152,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[75.385,75.385,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":5,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":54,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":59,"s":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":64,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[75.385,75.385,100]},{"t":77,"s":[60,60,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"yuan3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yuan2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"t":53,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[183,359,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":26,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":35,"s":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"t":53,"s":[60,60,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"yuan2","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"yuan1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[100]},{"t":30,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[427,388,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[60,60,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[110,110,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":17,"s":[100,100,100]},{"t":30,"s":[60,60,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"yuan1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"p3","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-10,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[80,80,100]},{"t":60,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"p3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"p2","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-10,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[105,105,100]},{"t":60,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"p2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"p1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[300,276,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[300,266,0],"to":[0,0,0],"ti":[0,0,0]},{"t":72,"s":[300,276,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.94,0],[0,24.3],[-6.75,6.75],[-9.55,0],[-6.76,-6.75],[0,-9.55]],"o":[[-3.88,0],[0,-9.55],[6.76,-6.75],[9.55,0],[6.75,6.75],[0,24.3]],"v":[[0,48],[-36,-12],[-25.46,-37.46],[0,-48],[25.46,-37.46],[36,-12]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"p1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"zz1","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[315,210,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[210,4],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"zz1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"zz2","parent":9,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[318,105,0],"ix":2,"l":2},"a":{"a":0,"k":[102,105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":2,"nm":"zz_zz","refId":"image_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":72,"s":[360]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[210,210,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":2,"nm":"zhezhao","td":1,"refId":"image_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[50]},{"t":72,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[210,210,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":2,"nm":"map","tt":2,"refId":"image_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.5,299.558,0],"ix":2,"l":2},"a":{"a":0,"k":[209.5,210,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"t2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.619,657.3,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[98,98,100]},{"t":72,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-109.041,-9.16],[-118.451,-9.16],[-118.451,-14.7],[-92.831,-14.7],[-92.831,-9.16],[-102.241,-9.16],[-102.241,14.7],[-109.041,14.7]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.05,0],[2.47,1.32],[1.4,2.29],[0,2.89],[-1.37,2.3],[-2.43,1.32],[-3.06,0],[-2.44,-1.31],[-1.4,-2.32],[0,-2.88],[1.4,-2.33],[2.43,-1.31]],"o":[[-3.06,0],[-2.43,-1.31],[-1.37,-2.33],[0,-2.88],[1.4,-2.32],[2.47,-1.31],[3.05,0],[2.43,1.32],[1.4,2.3],[0,2.89],[-1.4,2.29],[-2.44,1.32]],"v":[[0.004,15.206],[-8.276,13.226],[-14.026,7.816],[-16.086,-0.004],[-14.026,-7.774],[-8.276,-13.234],[0.004,-15.204],[8.234,-13.234],[13.984,-7.774],[16.084,-0.004],[13.984,7.816],[8.234,13.226]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.74,0],[-1.4,0.78],[-0.79,1.43],[0,1.82],[0.81,1.42],[1.4,0.78],[1.73,0],[1.4,-0.81],[0.81,-1.43],[0,-1.82],[-0.79,-1.43],[-1.4,-0.81]],"o":[[1.73,0],[1.4,-0.81],[0.81,-1.43],[0,-1.82],[-0.79,-1.43],[-1.4,-0.81],[-1.74,0],[-1.4,0.78],[-0.79,1.42],[0,1.82],[0.81,1.43],[1.4,0.78]],"v":[[0.002,9.412],[4.702,8.232],[7.982,4.872],[9.202,0.002],[7.982,-4.868],[4.702,-8.188],[0.002,-9.408],[-4.708,-8.188],[-8.018,-4.868],[-9.198,0.002],[-8.018,4.872],[-4.708,8.232]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[-75.342,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[4.2,0],[2.35,2.32],[0,4.32],[0,0],[0,0],[0,0],[-4.37,0],[-1.12,1.26],[0,2.72],[0,0],[0,0],[0,0],[2.35,-2.33]],"o":[[-4.2,0],[-2.33,-2.33],[0,0],[0,0],[0,0],[0,5.27],[2.12,0],[1.12,-1.29],[0,0],[0,0],[0,0],[0,4.32],[-2.32,2.32]],"v":[[-41.085,15.2],[-50.905,11.72],[-54.395,1.76],[-54.395,-14.7],[-47.595,-14.7],[-47.595,1.51],[-41.035,9.41],[-36.165,7.52],[-34.485,1.51],[-34.485,-14.7],[-27.765,-14.7],[-27.765,1.76],[-31.295,11.72]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[2.55,0],[2.44,1.28],[1.4,2.29],[0,2.92],[-1.37,2.3],[-2.41,1.29],[-3.02,0],[-2.05,-0.89],[-1.4,-1.68],[0,0],[2.94,0],[1.43,-0.81],[0.82,-1.43],[0,-1.82],[-0.78,-1.43],[-1.42,-0.82],[-1.82,0],[-1.99,2.32],[0,0],[2.07,-0.89]],"o":[[-3,0],[-2.41,-1.32],[-1.37,-2.33],[0,-2.91],[1.4,-2.32],[2.44,-1.31],[2.55,0],[2.07,0.9],[0,0],[-1.99,-2.3],[-1.82,0],[-1.42,0.79],[-0.78,1.43],[0,1.82],[0.82,1.42],[1.43,0.78],[2.94,0],[0,0],[-1.4,1.71],[-2.07,0.9]],"v":[[-6.971,15.206],[-15.121,13.276],[-20.831,7.856],[-22.891,-0.004],[-20.831,-7.814],[-15.121,-13.234],[-6.931,-15.204],[-0.041,-13.864],[5.169,-9.994],[0.799,-5.964],[-6.591,-9.404],[-11.471,-8.194],[-14.831,-4.874],[-16.001,-0.004],[-14.831,4.876],[-11.471,8.236],[-6.591,9.406],[0.799,5.926],[5.169,9.956],[-0.041,13.856]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.72,-14.7],[36.72,14.7],[29.92,14.7],[29.92,2.65],[16.56,2.65],[16.56,14.7],[9.76,14.7],[9.76,-14.7],[16.56,-14.7],[16.56,-3.11],[29.92,-3.11],[29.92,-14.7]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[82.324,14.7],[82.284,-2.94],[73.634,11.59],[70.564,11.59],[61.954,-2.56],[61.954,14.7],[55.574,14.7],[55.574,-14.7],[61.204,-14.7],[72.204,3.57],[83.044,-14.7],[88.624,-14.7],[88.714,14.7]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[118.447,9.24],[118.447,14.7],[95.687,14.7],[95.687,-14.7],[117.907,-14.7],[117.907,-9.24],[102.447,-9.24],[102.447,-2.86],[116.097,-2.86],[116.097,2.44],[102.447,2.44],[102.447,9.24]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"t2","np":9,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"t1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.288,589.68,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":36,"s":[105,105,100]},{"t":72,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.66,4.226],[-14.72,4.226],[-14.72,-3.904],[14.66,-3.904]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[22.398,-10.94],[3.708,-10.94],[3.708,-17.02],[26.628,-17.02],[26.628,-24.13],[3.708,-24.13],[3.708,-29.76],[-4.032,-29.76],[-4.032,-10.94],[-21.952,-10.94],[-21.952,11.26],[22.398,11.26]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[-1.86,5.12],[0,0],[3.14,-2.82]],"o":[[3.39,-3.39],[0,0],[-1.79,4.61],[0,0]],"v":[[-22.848,29.758],[-14.528,15.678],[-21.888,13.888],[-29.888,26.368]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.32],[0,0],[0.96,4.35]],"o":[[0.77,4.42],[0,0],[-0.12,-3.32],[0,0]],"v":[[-11.392,16.124],[-10.112,29.564],[-2.372,28.604],[-4.162,15.424]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[0,0],[-0.7,-3.33],[0,0],[1.98,4.03]],"o":[[1.86,4.22],[0,0],[-0.77,-3.33],[0,0]],"v":[[1.664,16.196],[6.144,29.246],[13.504,27.326],[8.644,14.656]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[-1.34,-3.65],[0,0],[3.07,4.03]],"o":[[3.07,4.29],[0,0],[-1.6,-3.78],[0,0]],"v":[[14.656,15.806],[22.526,29.566],[29.886,26.756],[21.506,13.376]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[-96.416,-0.128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":7,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.39,2.94],[0,0],[-1.67,-2.94]],"o":[[-1.85,-3.01],[0,0],[3.46,3.08],[0,0]],"v":[[27.902,-18.236],[18.432,-28.416],[12.672,-24.516],[21.762,-13.956]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[2.3,-2.75],[0.51,3.84],[0,0],[0,0],[0,0],[-0.13,5.95],[0,0],[-0.51,-5.76],[0,0],[0,0],[-3.2,0.96],[0,0],[8.96,-1.22],[-0.32,-1.86],[-3.45,0.57],[0,0],[0,0],[0,0],[0,0],[0,0],[3.65,-0.58],[0,0],[-4.09,0.84],[0,0],[1.15,0],[3.58,0.2],[-0.32,-2.11],[-2.5,1.22],[0,4.16],[0,0],[0,0],[0,0],[3.27,-0.57],[0,0],[0,0],[-1.41,-5.06],[4.92,-2.24],[-1.09,-1.8],[-3.71,3.07],[-4.67,0],[-1.22,11.2],[1.66,1.79],[1.35,0],[1.73,4.93],[-2.88,5.18]],"o":[[-1.67,3.07],[-0.71,-3.26],[0,0],[0,0],[0,0],[-0.51,-5.63],[0,0],[0.07,5.82],[0,0],[0,0],[3.71,-0.76],[0,0],[-6.52,2.11],[0.83,1.72],[3.27,-0.39],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.05,0.9],[0,0],[3.39,-0.64],[0,0],[0,1.03],[-1.16,0.06],[1.09,2.12],[5.18,0.07],[2.56,-1.21],[0,0],[0,0],[0,0],[-3.27,0.58],[0,0],[0,0],[0.77,6.27],[-4.42,3.65],[1.85,1.73],[4.1,-2.12],[2.75,6.27],[5.82,0],[-2.05,-0.83],[-0.32,7.55],[-1.92,0],[4.16,-4.16],[0,0]],"v":[[19.716,-2.75],[13.636,5.95],[11.776,-4.86],[28.416,-4.86],[28.416,-12.1],[11.006,-12.1],[10.366,-29.63],[2.366,-29.63],[3.136,-12.1],[-9.154,-12.1],[-9.154,-20.74],[1.276,-23.3],[-3.844,-29.76],[-29.244,-24.38],[-27.074,-17.98],[-16.834,-19.39],[-16.834,-12.1],[-28.924,-12.1],[-28.924,-4.86],[-16.834,-4.86],[-16.834,3.71],[-30.144,5.89],[-28.284,13.57],[-16.834,11.26],[-16.834,20.54],[-18.364,21.89],[-26.814,21.82],[-24.124,29.5],[-12.604,28.03],[-9.154,20.61],[-9.154,9.66],[1.276,7.55],[0.706,0.64],[-9.154,2.43],[-9.154,-4.86],[3.836,-4.86],[7.106,12.29],[-7.164,21.31],[-2.114,27.46],[9.726,19.65],[20.736,29.76],[30.146,15.74],[23.876,11.39],[21.436,22.02],[15.806,14.14],[26.436,0.13]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[-31.968,0.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[13.248,-22.496],[13.248,-18.276],[-16.192,-18.276],[-16.192,-22.496]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.09,6.47],[1.86,1.02],[4.93,0],[0,0],[0,2.63],[0,0],[0,0],[0,0],[0,0],[0,0],[-12.36,0]],"o":[[9.15,0],[-2.24,-0.32],[-0.57,3.33],[0,0],[-6.91,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,7.3],[0,0]],"v":[[14.468,-1.374],[27.518,-9.314],[20.348,-11.424],[13.758,-7.524],[-8.002,-7.524],[-16.192,-10.594],[-16.192,-11.744],[20.738,-11.744],[20.738,-29.024],[-24.192,-29.024],[-24.192,-10.464],[-7.932,-1.374]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.05,-3.14],[0,0],[3.39,2.56],[0,0],[0,0],[1.28,-0.07],[3.9,0.2],[-0.39,-2.05],[-3.08,0.96],[0,3.97],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.16,2.95],[0,0],[-1.79,-2.5],[0,0],[0,0],[0,0.96],[-1.21,0],[1.02,1.92],[5.89,0],[3,-0.96],[0,0],[0,0],[0,0]],"v":[[28.348,3.612],[15.228,3.612],[15.228,0.032],[7.358,0.032],[7.358,3.612],[-28.352,3.612],[-28.352,10.722],[-16.832,10.722],[-19.902,13.532],[-8.892,24.032],[-3.392,18.852],[-12.092,10.722],[7.358,10.722],[7.358,21.022],[5.628,22.372],[-4.542,22.172],[-1.982,29.022],[11.268,28.002],[15.228,21.282],[15.228,10.722],[28.348,10.722]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[31.84,0.8],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.41,2.88],[0,0],[-0.77,-2.56],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-0.77,-2.5],[0,0],[1.15,2.69],[0,0],[0,0],[0,0],[0,0]],"v":[[29.22,-19.844],[12.45,-19.844],[16.93,-21.244],[13.15,-30.464],[5.86,-28.544],[9.12,-19.844],[-3.36,-19.844],[-3.36,-13.184],[29.22,-13.184]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.57,-2.24],[0,0],[1.34,2.69],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.15,2.68],[0,0],[-0.64,-2.3],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-19.36,-2.884],[-19.36,-12.604],[-16.42,-4.284],[-11.68,-6.274],[-15.07,-14.784],[-19.36,-13.124],[-19.36,-16.384],[-10.98,-16.384],[-10.98,-2.884]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0.13,0.19],[0,1.47],[0,0],[0,0],[0,0],[5.19,-6.02],[0,1.22],[0,0],[0,0],[-0.76,2.3],[0,0],[0.64,-2.56],[0,0],[0,0],[0,0],[0,0],[0,0],[3.97,-6.46],[-1.22,-1.08],[-0.25,8.06],[-0.64,-2.37],[0,0],[1.47,2.94],[0,0],[0,1.02],[0,0],[0,0],[0.71,0],[2.05,0.13],[-0.19,-1.85],[-1.86,1.15],[-0.38,0.84],[-1.21,-1.15],[0,7.87],[0,0],[0,0],[0,0],[-1.08,-1.15],[-1.47,0],[0,0],[-0.89,0.7],[-0.38,1.48],[-0.06,3.13],[1.22,1.03],[0.06,-1.09],[0.19,-0.26],[0.25,0]],"o":[[-0.26,0],[-0.12,-0.26],[0,0],[0,0],[0,0],[0,6.33],[0.19,-0.9],[0,0],[0,0],[0.76,-2.05],[0,0],[-0.26,2.3],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.06,7.81],[1.54,0.71],[3.84,-6.08],[1.41,2.88],[0,0],[-0.83,-2.37],[0,0],[0,-1.03],[0,0],[0,0],[0,0.77],[-0.7,0],[0.83,1.73],[3.71,0],[0.89,-0.51],[1.73,0.84],[6.28,-6.59],[0,0],[0,0],[0,0],[0,4.8],[1.03,1.09],[0,0],[1.22,0],[0.77,-0.77],[0.32,-1.47],[-1.6,-0.58],[-0.06,3.2],[-0.13,1.09],[-0.13,0.19],[0,0]],"v":[[23.648,22.98],[23.068,22.72],[22.878,20.16],[22.878,-8.38],[1.058,-8.38],[1.058,4.93],[-4.642,25.41],[-4.382,22.27],[-4.382,-22.27],[-13.212,-22.27],[-10.852,-28.86],[-18.462,-30.08],[-19.932,-22.27],[-25.952,-22.27],[-25.952,-2.88],[-30.052,-2.88],[-30.052,3.2],[-25.952,3.2],[-30.432,26.75],[-24.732,30.46],[-19.492,7.17],[-15.902,15.94],[-11.172,13.76],[-15.262,4.61],[-19.422,6.34],[-19.362,3.2],[-10.972,3.2],[-10.972,22.21],[-12.002,23.23],[-16.862,23.17],[-14.942,29.63],[-6.812,28.29],[-4.962,26.3],[0.668,30.14],[8.098,4.99],[8.098,-1.79],[15.838,-1.79],[15.838,20.35],[17.308,27.65],[21.408,29.25],[24.478,29.25],[27.998,28.29],[29.788,25.02],[30.428,16.58],[25.758,13.95],[25.568,20.8],[25.118,22.72],[24.418,22.98]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[95.872,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"mm","mm":2,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"t1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":72,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/touch_ytg.json b/app/src/main/assets/touch_ytg.json new file mode 100644 index 0000000..5173019 --- /dev/null +++ b/app/src/main/assets/touch_ytg.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":24,"ip":0,"op":192,"w":600,"h":600,"nm":"Frame 5","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"T22","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[299.786,381.431,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":120,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[100,100,100]},{"t":192,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-109.041,14.7],[-109.041,-9.16],[-118.451,-9.16],[-118.451,-14.7],[-92.831,-14.7],[-92.831,-9.16],[-102.241,-9.16],[-102.241,14.7]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.29,0],[1.99,0.76],[1.45,1.37],[0.81,1.85],[0,2.19],[-0.79,1.84],[-1.46,1.37],[-1.96,0.76],[-2.3,0],[-1.93,-0.75],[-1.43,-1.38],[-0.81,-1.85],[0,-2.21],[0.82,-1.87],[1.46,-1.37],[1.96,-0.75]],"o":[[-2.33,0],[-1.96,-0.75],[-1.43,-1.37],[-0.79,-1.85],[0,-2.18],[0.81,-1.85],[1.45,-1.38],[1.96,-0.75],[2.32,0],[1.96,0.76],[1.46,1.37],[0.82,1.82],[0,2.19],[-0.81,1.85],[-1.43,1.35],[-1.93,0.76]],"v":[[-75.298,15.206],[-81.768,14.066],[-86.888,10.876],[-90.248,6.046],[-91.428,-0.004],[-90.248,-6.044],[-86.848,-10.874],[-81.728,-14.074],[-75.338,-15.204],[-68.958,-14.074],[-63.878,-10.874],[-60.478,-6.044],[-59.258,-0.004],[-60.478,6.086],[-63.878,10.916],[-68.958,14.066]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[-1.32,0],[-1.09,0.45],[-0.84,0.84],[-0.45,1.15],[0,1.4],[0.48,1.14],[0.84,0.84],[1.12,0.45],[1.31,0],[1.12,-0.45],[0.84,-0.84],[0.48,-1.15],[0,-1.4],[-0.45,-1.18],[-0.81,-0.84],[-1.12,-0.44]],"o":[[1.31,0],[1.12,-0.44],[0.84,-0.84],[0.48,-1.15],[0,-1.4],[-0.45,-1.15],[-0.81,-0.84],[-1.12,-0.45],[-1.32,0],[-1.09,0.45],[-0.84,0.84],[-0.45,1.14],[0,1.37],[0.48,1.15],[0.84,0.84],[1.12,0.45]],"v":[[-75.34,9.412],[-71.73,8.732],[-68.79,6.802],[-66.86,3.822],[-66.14,0.002],[-66.86,-3.818],[-68.79,-6.808],[-71.69,-8.738],[-75.34,-9.408],[-79,-8.738],[-81.89,-6.808],[-83.87,-3.818],[-84.54,0.002],[-83.87,3.822],[-81.94,6.802],[-79,8.732]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[4.18,0],[2.35,2.32],[0,4.32],[0,0],[0,0],[0,0],[-1.15,-1.23],[-2.08,0],[-1.15,1.23],[0,2.8],[0,0],[0,0],[0,0],[2.35,-2.33]],"o":[[-4.17,0],[-2.35,-2.33],[0,0],[0,0],[0,0],[0,2.8],[1.14,1.23],[2.07,0],[1.14,-1.23],[0,0],[0,0],[0,0],[0,4.32],[-2.35,2.32]],"v":[[-41.085,15.2],[-50.865,11.72],[-54.395,1.76],[-54.395,-14.7],[-47.595,-14.7],[-47.595,1.51],[-45.865,7.56],[-41.035,9.41],[-36.205,7.56],[-34.485,1.51],[-34.485,-14.7],[-27.765,-14.7],[-27.765,1.76],[-31.295,11.72]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[2.57,0],[1.96,0.72],[1.42,1.38],[0.81,1.85],[0,2.22],[-0.79,1.85],[-1.43,1.38],[-1.93,0.73],[-2.3,0],[-2.05,-0.89],[-1.4,-1.71],[0,0],[1.23,0.56],[1.45,0],[1.14,-0.45],[0.84,-0.84],[0.48,-1.15],[0,-1.4],[-0.45,-1.15],[-0.84,-0.84],[-1.15,-0.45],[-1.38,0],[-1.23,0.56],[-1.01,1.17],[0,0],[2.07,-0.89]],"o":[[-2.27,0],[-1.94,-0.76],[-1.43,-1.37],[-0.79,-1.84],[0,-2.21],[0.81,-1.84],[1.45,-1.37],[1.93,-0.75],[2.55,0],[2.07,0.87],[0,0],[-1.01,-1.15],[-1.23,-0.59],[-1.38,0],[-1.15,0.45],[-0.84,0.84],[-0.45,1.15],[0,1.4],[0.48,1.14],[0.84,0.84],[1.14,0.45],[1.45,0],[1.23,-0.59],[0,0],[-1.4,1.71],[-2.05,0.9]],"v":[[-6.971,15.206],[-13.311,14.116],[-18.351,10.916],[-21.711,6.086],[-22.891,-0.004],[-21.711,-6.094],[-18.351,-10.924],[-13.271,-14.074],[-6.931,-15.204],[-0.041,-13.864],[5.169,-9.994],[0.799,-5.964],[-2.561,-8.524],[-6.591,-9.404],[-10.371,-8.734],[-13.361,-6.804],[-15.331,-3.824],[-16.001,-0.004],[-15.331,3.826],[-13.361,6.806],[-10.371,8.736],[-6.591,9.406],[-2.561,8.566],[0.799,5.926],[5.169,9.956],[-0.041,13.856]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[29.92,-14.7],[36.72,-14.7],[36.72,14.7],[29.92,14.7]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.56,14.7],[9.76,14.7],[9.76,-14.7],[16.56,-14.7]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[30.42,2.642],[16.06,2.642],[16.06,-3.108],[30.42,-3.108]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[55.574,14.7],[55.574,-14.7],[61.204,-14.7],[73.714,6.05],[70.734,6.05],[83.044,-14.7],[88.624,-14.7],[88.714,14.7],[82.324,14.7],[82.284,-4.91],[83.464,-4.91],[73.634,11.59],[70.564,11.59],[60.534,-4.91],[61.954,-4.91],[61.954,14.7]],"c":true},"ix":2},"nm":"路径 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[101.945,-2.856],[116.095,-2.856],[116.095,2.434],[101.945,2.434]],"c":true},"ix":2},"nm":"路径 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[102.447,9.24],[118.447,9.24],[118.447,14.7],[95.687,14.7],[95.687,-14.7],[117.907,-14.7],[117.907,-9.24],[102.447,-9.24]],"c":true},"ix":2},"nm":"路径 11","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":4},"o":{"a":0,"k":80,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":13,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":384,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"T11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.391,259.939,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":24,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":72,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":120,"s":[104,104,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":168,"s":[104,104,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-111.072,-42.224],[-111.072,-33.964],[-81.692,-33.964],[-81.692,-42.224]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.83,4.42],[0,0],[-0.07,-3.39],[0,0]],"o":[[0,0],[0.96,4.29],[0,0],[0,-3.39]],"v":[[-107.808,-22.004],[-100.508,-22.704],[-98.718,-9.454],[-106.468,-8.494]],"c":true},"ix":2},"nm":"路径 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[1.86,4.16],[0,0],[-0.76,-3.39],[0,0]],"o":[[0,0],[1.92,4.03],[0,0],[-0.64,-3.39]],"v":[[-94.624,-21.936],[-87.584,-23.536],[-82.724,-10.736],[-90.204,-8.816]],"c":true},"ix":2},"nm":"路径 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[3.01,4.28],[0,0],[-1.6,-3.78],[0,0]],"o":[[0,0],[3.13,4.1],[0,0],[-1.34,-3.71]],"v":[[-81.568,-22.316],[-74.718,-24.816],[-66.268,-11.376],[-73.698,-8.496]],"c":true},"ix":2},"nm":"路径 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":4,"ty":"sh","ix":5,"ks":{"a":0,"k":{"i":[[-1.85,4.67],[0,0],[3.33,-3.46],[0,0]],"o":[[0,0],[-1.85,5.12],[0,0],[3.14,-2.75]],"v":[[-118.308,-24.304],[-110.948,-22.444],[-119.268,-8.304],[-126.368,-11.764]],"c":true},"ix":2},"nm":"路径 5","mn":"ADBE Vector Shape - Group","hd":false},{"ind":5,"ty":"sh","ix":6,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-118.432,-49.328],[-100.452,-49.328],[-100.452,-68.208],[-92.642,-68.208],[-92.642,-62.508],[-69.602,-62.508],[-69.602,-55.348],[-92.642,-55.348],[-92.642,-49.328],[-73.822,-49.328],[-73.822,-26.868],[-118.432,-26.868]],"c":true},"ix":2},"nm":"路径 6","mn":"ADBE Vector Shape - Group","hd":false},{"ind":6,"ty":"sh","ix":7,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-55.714,-32.814],[-47.524,-32.814],[-47.524,-18.484],[-35.934,-18.484],[-35.934,-36.594],[-61.024,-36.594],[-61.024,-44.274],[-35.934,-44.274],[-35.934,-51.694],[-56.414,-51.694],[-56.414,-59.244],[-35.934,-59.244],[-35.934,-68.144],[-27.744,-68.144],[-27.744,-59.244],[-7.524,-59.244],[-7.524,-51.694],[-27.744,-51.694],[-27.744,-44.274],[-3.294,-44.274],[-3.294,-36.594],[-27.744,-36.594],[-27.744,-18.484],[-16.604,-18.484],[-16.604,-32.944],[-8.604,-32.944],[-8.604,-8.044],[-16.604,-8.044],[-16.604,-10.994],[-55.714,-10.994]],"c":true},"ix":2},"nm":"路径 7","mn":"ADBE Vector Shape - Group","hd":false},{"ind":7,"ty":"sh","ix":8,"ks":{"a":0,"k":{"i":[[3.46,3.26],[0,0],[-2.11,-2.88],[0,0]],"o":[[0,0],[3.46,3.01],[0,0],[-1.92,-2.95]],"v":[[3.616,-62.702],[9.116,-66.992],[19.296,-56.692],[13.406,-51.822]],"c":true},"ix":2},"nm":"路径 8","mn":"ADBE Vector Shape - Group","hd":false},{"ind":8,"ty":"sh","ix":9,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.74,-3.97],[1.6,1.03],[-1.09,3.65],[0,0],[0,0],[0,0],[0,1.54],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.22,5.76],[-1.09,-1.47],[3.39,-2.81],[0,0],[0,0],[0,0],[0.13,-1.66],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.444,-66.42],[52.064,-66.42],[52.064,-57.2],[59.424,-57.2],[59.424,-49.78],[52.064,-49.78],[52.064,-40.88],[60.704,-40.88],[60.704,-33.52],[52.064,-33.52],[52.064,-19.12],[44.444,-19.12],[44.444,-33.52],[36.064,-33.52],[27.614,-18.16],[21.854,-23.54],[28.254,-33.52],[21.024,-33.52],[21.024,-40.88],[29.474,-40.88],[29.604,-45.68],[29.604,-49.78],[21.534,-49.78],[21.534,-57.2],[29.604,-57.2],[29.604,-66.48],[37.154,-66.48],[37.154,-57.2],[44.444,-57.2]],"c":true},"ix":2},"nm":"路径 9","mn":"ADBE Vector Shape - Group","hd":false},{"ind":9,"ty":"sh","ix":10,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.06,-1.67],[0,0],[0,0]],"o":[[0,0],[0,1.54],[0,0],[0,0],[0,0]],"v":[[37.154,-49.776],[37.154,-45.616],[37.024,-40.876],[44.444,-40.876],[44.444,-49.776]],"c":true},"ix":2},"nm":"路径 10","mn":"ADBE Vector Shape - Group","hd":false},{"ind":10,"ty":"sh","ix":11,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.47,-0.77],[-7.17,0],[-6.4,0.96],[0.07,-2.17],[6.59,0],[4.67,2.56],[1.47,0],[2.3,-3.78],[0,0],[-2.68,1.22],[0,0],[0,0],[0,0]],"o":[[0,0],[0.96,0.64],[4.36,2.5],[6.79,0],[-0.83,2.05],[-4.54,0.26],[-8.06,0],[-2.94,-1.6],[-1.92,0],[0,0],[2.94,-3.07],[0,0],[0,0],[0,0],[0,0]],"v":[[17.508,-44.912],[17.508,-21.492],[21.148,-19.312],[38.558,-16.492],[62.178,-17.972],[59.998,-9.972],[38.238,-9.332],[19.998,-12.592],[13.408,-16.172],[6.368,-8.172],[1.248,-15.472],[9.948,-22.132],[9.948,-37.812],[2.528,-37.812],[2.528,-44.912]],"c":true},"ix":2},"nm":"路径 11","mn":"ADBE Vector Shape - Group","hd":false},{"ind":11,"ty":"sh","ix":12,"ks":{"a":0,"k":{"i":[[4.03,2.68],[0,0],[-20.67,-13.06],[0.45,-2.37],[6.52,12.03],[11.58,-6.85],[2.05,1.47],[-3.77,16.96]],"o":[[0,0],[20.48,14.91],[-1.21,2.11],[-13.18,-7.36],[-5.06,14.65],[-1.41,-1.6],[13.7,-6.79],[-2.75,-3.84]],"v":[[81.124,-61.164],[85.924,-67.824],[126.364,-17.454],[122.654,-8.624],[97.444,-41.134],[72.864,-8.814],[65.824,-15.084],[91.164,-51.244]],"c":true},"ix":2},"nm":"路径 12","mn":"ADBE Vector Shape - Group","hd":false},{"ind":12,"ty":"sh","ix":13,"ks":{"a":0,"k":{"i":[[0.7,3.97],[0,0],[-0.07,-3.14],[0,0]],"o":[[0,0],[0.84,3.9],[0,0],[0,-3.13]],"v":[[-107.296,55.214],[-100.196,54.384],[-98.526,66.484],[-106.076,67.564]],"c":true},"ix":2},"nm":"路径 13","mn":"ADBE Vector Shape - Group","hd":false},{"ind":13,"ty":"sh","ix":14,"ks":{"a":0,"k":{"i":[[1.41,3.96],[0,0],[-0.51,-3.2],[0,0]],"o":[[0,0],[1.6,3.78],[0,0],[-0.38,-3.14]],"v":[[-94.24,55.092],[-87.07,53.872],[-83.3,65.842],[-90.98,67.312]],"c":true},"ix":2},"nm":"路径 14","mn":"ADBE Vector Shape - Group","hd":false},{"ind":14,"ty":"sh","ix":15,"ks":{"a":0,"k":{"i":[[2.88,4.16],[0,0],[-1.6,-3.52],[0,0]],"o":[[0,0],[2.95,3.84],[0,0],[-1.35,-3.45]],"v":[[-81.184,54.964],[-74.404,52.144],[-66.274,64.944],[-73.564,68.204]],"c":true},"ix":2},"nm":"路径 15","mn":"ADBE Vector Shape - Group","hd":false},{"ind":15,"ty":"sh","ix":16,"ks":{"a":0,"k":{"i":[[-2.05,4.48],[0,0],[2.62,-3.59],[0,0]],"o":[[0,0],[-2.05,4.67],[0,0],[2.56,-3.01]],"v":[[-118.242,52.592],[-110.882,54.512],[-118.752,68.212],[-126.112,65.202]],"c":true},"ix":2},"nm":"路径 16","mn":"ADBE Vector Shape - Group","hd":false},{"ind":16,"ty":"sh","ix":17,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-1.99,0],[-0.19,4.55],[-1.72,-0.51],[4.8,0],[-0.32,17.28],[0,0],[0.9,-3.52],[-1.86,-1.47],[0,0],[2.43,1.67],[4.54,-2.81],[1.66,1.28],[-1.73,3.65],[0,0],[0,0],[0,0],[0,0],[2.18,-1.16],[4.29,0],[0.9,1.99],[-0.83,0],[0,0.77],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.19,2.95],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.7,17.79],[0.89,0],[1.41,1.22],[-0.7,7.88],[-8.2,0],[0,0],[-0.26,4.36],[3.01,1.86],[0,0],[-1.47,-1.35],[-2.05,4.36],[-0.9,-1.73],[3.97,-2.37],[0,0],[0,0],[0,0],[0,0],[0,3.46],[-2.17,1.08],[-0.19,-1.99],[2.56,0.13],[0.9,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.45,-2.43],[0,0],[0,0],[0,0],[0,0]],"v":[[-93.598,7.728],[-86.368,7.728],[-86.558,16.688],[-73.698,16.688],[-72.668,44.658],[-71.198,38.188],[-65.508,41.068],[-72.988,51.248],[-80.928,23.148],[-86.878,23.148],[-88.548,34.988],[-80.928,40.108],[-84.768,46.258],[-90.848,41.708],[-100.508,52.398],[-105.248,46.708],[-96.988,37.678],[-102.368,34.418],[-102.238,34.228],[-109.028,35.948],[-109.028,43.758],[-111.778,50.228],[-121.248,51.508],[-123.298,44.588],[-117.218,44.718],[-116.068,43.698],[-116.068,37.748],[-124.508,39.858],[-126.048,32.428],[-116.068,30.318],[-116.068,23.408],[-124.578,23.408],[-124.578,16.368],[-116.068,16.368],[-116.068,7.988],[-109.028,7.988],[-109.028,16.368],[-102.368,16.368],[-102.368,23.408],[-109.028,23.408],[-109.028,28.718],[-102.688,27.248],[-101.988,33.838],[-98.718,29.108],[-94.948,31.218],[-93.988,23.148],[-101.218,23.148],[-101.218,16.688],[-93.728,16.688]],"c":true},"ix":2},"nm":"路径 17","mn":"ADBE Vector Shape - Group","hd":false},{"ind":17,"ty":"sh","ix":18,"ks":{"a":0,"k":{"i":[[3.26,3.91],[0,0],[-1.92,-3.33],[0,0]],"o":[[0,0],[3.26,3.65],[0,0],[-1.79,-3.39]],"v":[[-57.184,11.308],[-51.294,7.408],[-41.764,19.378],[-48.034,23.918]],"c":true},"ix":2},"nm":"路径 18","mn":"ADBE Vector Shape - Group","hd":false},{"ind":18,"ty":"sh","ix":19,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-59.104,22],[-51.234,22],[-51.234,67.82],[-59.104,67.82]],"c":true},"ix":2},"nm":"路径 19","mn":"ADBE Vector Shape - Group","hd":false},{"ind":19,"ty":"sh","ix":20,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[2.69,-1.21],[5.95,0.07],[1.09,1.92],[-1.28,0.06],[0,1.28],[0,0],[0,0]],"o":[[0,0],[0,0],[0,4.16],[-2.69,1.22],[-0.39,-2.04],[3.78,0.19],[1.22,0],[0,0],[0,0],[0,0]],"v":[[-40.864,9.904],[-5.084,9.904],[-5.084,59.244],[-8.734,66.604],[-21.404,67.884],[-24.034,60.654],[-14.564,60.784],[-12.894,59.124],[-12.894,17.264],[-40.864,17.264]],"c":true},"ix":2},"nm":"路径 20","mn":"ADBE Vector Shape - Group","hd":false},{"ind":20,"ty":"sh","ix":21,"ks":{"a":0,"k":{"i":[[1.34,2.43],[0,0],[-0.83,-2.43],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.35,-1.54],[0,0],[0,0],[0,0],[0,0],[1.99,-1.28],[4.23,0],[0.96,2.18],[-0.77,0.07],[0,0.9],[0,0],[0,0],[0,0],[-2.94,0.77],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.7,0.58],[-2.94,9.47],[0,0],[1.28,-2.88],[0,0]],"o":[[0,0],[1.79,2.75],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.34,1.86],[0,0],[0,0],[0,0],[0,0],[0,3.65],[-2.05,1.28],[-0.19,-2.05],[2.24,0.07],[0.77,0],[0,0],[0,0],[0,0],[2.24,-0.51],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.96,-1.02],[5.89,-5.82],[0,0],[-1.02,2.95],[0,0],[-0.83,-2.43]],"v":[[40.864,10.926],[47.454,8.306],[51.804,17.196],[47.844,18.926],[60.194,18.926],[60.194,25.906],[49.884,25.906],[49.884,31.596],[59.424,31.596],[59.424,38.386],[49.884,38.386],[49.884,44.146],[59.364,44.146],[59.364,50.926],[49.884,50.926],[49.884,57.006],[61.604,57.006],[61.604,63.986],[34.844,63.986],[34.844,68.016],[27.484,68.016],[27.484,33.456],[23.454,38.516],[21.984,36.846],[22.754,41.966],[16.484,43.826],[16.484,59.186],[13.854,66.156],[4.764,67.696],[2.724,60.206],[8.034,60.206],[9.054,59.116],[9.054,45.936],[2.914,47.726],[1.184,40.306],[9.054,38.386],[9.054,26.736],[1.954,26.736],[1.954,19.636],[9.054,19.636],[9.054,7.856],[16.484,7.856],[16.484,19.636],[22.814,19.636],[22.814,26.736],[16.484,26.736],[16.484,36.466],[20.644,35.376],[17.954,32.816],[31.904,8.176],[39.134,10.156],[35.684,18.926],[44.514,18.926]],"c":true},"ix":2},"nm":"路径 21","mn":"ADBE Vector Shape - Group","hd":false},{"ind":21,"ty":"sh","ix":22,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34.848,38.384],[34.848,44.144],[42.718,44.144],[42.718,38.384]],"c":true},"ix":2},"nm":"路径 22","mn":"ADBE Vector Shape - Group","hd":false},{"ind":22,"ty":"sh","ix":23,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34.848,31.604],[42.718,31.604],[42.718,25.904],[34.848,25.904]],"c":true},"ix":2},"nm":"路径 23","mn":"ADBE Vector Shape - Group","hd":false},{"ind":23,"ty":"sh","ix":24,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[34.848,50.928],[34.848,57.008],[42.718,57.008],[42.718,50.928]],"c":true},"ix":2},"nm":"路径 24","mn":"ADBE Vector Shape - Group","hd":false},{"ind":24,"ty":"sh","ix":25,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2.11,-2.56],[0,0],[0,0],[0,0],[2.17,-1.34],[1.54,1.48],[-4.03,5.82],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.73,3.01],[0,0],[0,0],[0,0],[-1.99,1.66],[-0.9,-1.66],[6.14,-3.39],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[67.1,11.632],[79.97,11.632],[79.97,7.852],[87.46,7.852],[87.46,11.632],[104.35,11.632],[104.35,7.792],[111.84,7.792],[111.84,11.632],[124.38,11.632],[124.38,18.352],[111.84,18.352],[111.84,22.452],[104.35,22.452],[104.35,18.352],[87.46,18.352],[87.46,19.892],[93.98,21.492],[92.38,25.452],[124,25.452],[124,32.242],[88.93,32.242],[83.17,40.622],[83.17,67.952],[75.94,67.952],[75.94,48.052],[69.73,52.592],[64.8,46.252],[80.22,32.242],[67.3,32.242],[67.3,25.452],[84.26,25.452],[85.54,22.512],[79.97,22.512],[79.97,18.352],[67.1,18.352]],"c":true},"ix":2},"nm":"路径 25","mn":"ADBE Vector Shape - Group","hd":false},{"ind":25,"ty":"sh","ix":26,"ks":{"a":0,"k":{"i":[[0,0],[-1.66,1.21],[0,0],[0,0],[0,0],[0,0],[0,0],[3.91,-2.37],[0,0],[0,0],[0,0],[0,0],[0,0],[2.49,-1.02],[4.48,0],[0.96,1.86],[-0.9,0],[0,0.77],[0,0],[0,0],[0,0],[0,0]],"o":[[1.67,-0.9],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.07,2.75],[0,0],[0,0],[0,0],[0,0],[0,0],[0,3.33],[-2.37,1.02],[-0.32,-1.92],[2.82,0.13],[0.89,-0.07],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[102.878,45.04],[107.998,41.78],[91.428,41.78],[91.428,35.82],[115.108,35.82],[116.578,35.44],[121.058,39.09],[110.238,47.15],[110.238,48.24],[124.958,48.24],[124.958,54.7],[110.238,54.7],[110.238,60.72],[107.108,66.8],[96.988,67.82],[94.688,61.36],[101.668,61.49],[102.878,60.46],[102.878,54.7],[86.368,54.7],[86.368,48.24],[102.878,48.24]],"c":true},"ix":2},"nm":"路径 26","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"合并路径 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"形状","np":28,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":384,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"t":172,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[-33]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"t":172,"s":[-33]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[517]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[427]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[427]},{"t":172,"s":[517]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92,"s":[560]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[477]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[477]},{"t":172,"s":[560]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[0.055,-1.446],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[0,0],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-45.014,18.825],[-47.983,10.221],[-44.126,1.978],[-36.327,-1.145],[-28.527,1.978],[-21.723,8.835],[-21.723,-48.66],[-18.543,-56.608],[-10.683,-60],[-6.489,-59.051],[-2.986,-56.557],[-0.717,-52.905],[-0.033,-48.66],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":127,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[-1.935,-3.183],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[2.568,4.223],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-42.764,18.825],[-45.733,10.221],[-41.876,1.978],[-34.077,-1.145],[-26.277,1.978],[-21.723,8.835],[-35.695,-42.16],[-32.515,-50.108],[-24.655,-53.5],[-20.462,-52.551],[-16.959,-50.057],[-14.69,-46.405],[-10.068,-37.848],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]},{"t":144,"s":[{"i":[[-0.595,-2.255],[-1.997,-0.035],[0,0],[-1.33,-0.584],[-0.994,-1.059],[-0.499,-1.365],[0.077,-1.451],[0,0],[31.29,0],[7.281,5.763],[0.618,0.624],[0,0],[-0.166,3.145],[-2.308,2.143],[-2.905,0],[-2.102,-2.004],[0,0],[0,0],[-2.069,2.125],[-2.965,0.047],[-1.321,-0.591],[-0.991,-1.055],[-0.507,-1.356],[0.055,-1.446],[0,0],[-1.616,0.151],[-1.516,-0.579],[-1.104,-1.189],[-0.464,-1.555],[-2.094,0],[-1.834,-1.441]],"o":[[1.648,-1.128],[0,0],[1.453,0.015],[1.33,0.584],[0.994,1.059],[0.499,1.365],[0,0],[0,21.401],[-9.231,1.007],[-0.762,-0.438],[0,0],[-2.07,-2.373],[0.166,-3.145],[2.102,-2.004],[2.905,0],[0,0],[0,0],[-0.032,-2.965],[2.069,-2.125],[1.447,0.036],[1.321,0.591],[0.991,1.055],[0.507,1.356],[0,0],[1.382,-0.85],[1.616,-0.151],[1.516,0.579],[1.104,1.189],[1.782,-1.098],[2.332,0.044],[1.834,1.441]],"v":[[31.737,-11.366],[37.341,-13.046],[37.341,-13.034],[41.559,-12.126],[45.083,-9.635],[47.346,-5.961],[47.985,-1.694],[47.985,20.985],[13.809,59.791],[-11.961,52.37],[-14.043,50.768],[-45.014,18.825],[-47.983,10.221],[-44.126,1.978],[-36.327,-1.145],[-28.527,1.978],[-21.723,8.835],[-21.723,-48.66],[-18.543,-56.608],[-10.683,-60],[-6.489,-59.051],[-2.986,-56.557],[-0.717,-52.905],[-0.033,-48.66],[-0.033,-23.659],[4.525,-25.181],[9.285,-24.531],[13.267,-21.843],[15.651,-17.672],[21.573,-19.352],[27.994,-17.062]],"c":true}]}],"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"hand","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"e1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[105,105,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[31.578,127.099],[-152.691,6.678],[-22.831,-105.761],[138.017,-44.904]],"o":[[-29.184,-117.464],[138.909,-6.075],[21.365,98.971],[-132.016,42.952]],"v":[[-244.917,12.25],[-22,-228.702],[243.13,-41.308],[102.856,220.322]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.800000011921],"ix":3},"o":{"a":0,"k":80,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"e2","sr":1,"ks":{"o":{"a":0,"k":90,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[102,102,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[102,102,100]},{"t":192,"s":[102,102,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[130.689,11.751],[-43.129,145.547],[-107.632,-13.014],[2.146,-144.221]],"o":[[-120.782,-10.861],[39.236,-132.409],[100.722,12.178],[-2.053,137.95]],"v":[[-70.883,238.273],[-227.045,-49.527],[36.439,-237.433],[238.967,-20.496]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.600000023842],"ix":3},"o":{"a":0,"k":60,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"e3","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[720]},{"t":192,"s":[720]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[105,105,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-54.156,119.954],[-120.023,-83.416],[47.68,-97.813],[132.381,44.33]],"o":[[50.05,-110.86],[109.189,75.887],[-44.618,91.533],[-126.625,-42.403]],"v":[[-203.602,-136.021],[113.744,-199.055],[199.829,104.852],[-67.487,232.453]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,0.300000011921],"ix":3},"o":{"a":0,"k":30,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"e3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ccccc4","sr":1,"ks":{"o":{"a":0,"k":70,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.58431372549,0.490196078431,0.372549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"ccccc3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"r3","tt":2,"tp":10,"sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":191,"s":[-720]}],"ix":10},"p":{"a":0,"k":[312,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[528,446],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"ccccc2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.768627464771,0.768627464771,0.768627464771,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"r2","tt":2,"tp":12,"sr":1,"ks":{"o":{"a":0,"k":60,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[720]}],"ix":10},"p":{"a":0,"k":[284,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[520,460],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-30,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"ccccc0","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[-1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":48,"s":[101.5,101.5,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":96,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":144,"s":[101.5,101.5,100]},{"t":192,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-118.189,0],[0,121.503],[118.189,0],[0,-121.503]],"o":[[118.189,0],[0,-121.503],[-118.189,0],[0,121.503]],"v":[[0,220],[214,0],[0,-220],[-214,0]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.58431372549,0.490196078431,0.372549019608,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"c0","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"r1","tt":2,"tp":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":192,"s":[1440]}],"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[512,480],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874509811401,0.721568644047,0.525490224361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"r1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/activity/BaseActivity.java b/app/src/main/java/qianmu/container/activity/BaseActivity.java new file mode 100644 index 0000000..e9f104a --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/BaseActivity.java @@ -0,0 +1,317 @@ +package qianmu.container.activity; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.google.gson.Gson; +import com.jakewharton.processphoenix.ProcessPhoenix; +import com.sdkapi.api.SdkApi; +import com.sun.jna.Native; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.text.SimpleDateFormat; +import java.util.concurrent.Executors; + +import qianmu.container.activity.H5.CoreService; +import qianmu.container.activity.H5.UpdateFileActivity; +import qianmu.container.activity.program.ScreenSaverActivity; +import qianmu.container.adapter.KeyAdapter; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.entity.MessageEvent; +import qianmu.container.manager.QMWindowManager; +import qianmu.container.mqtt.MQTTService; +import qianmu.container.service.ContainerService; +import qianmu.container.service.MessengerService; +import qianmu.container.service.MusicService; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.CalendarUtils; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; +import qianmu.container.util.ViplexCore; + +@SuppressWarnings("All") +public abstract class BaseActivity extends AppCompatActivity { + + protected String currRoute = ""; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //隐藏标题栏 + requestWindowFeature(Window.FEATURE_NO_TITLE); + + //隐藏状态栏 + Window window = getWindow(); + int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN; + window.setFlags(flag, flag); + + int flags; + int curApiVersion = Build.VERSION.SDK_INT; + if (curApiVersion >= Build.VERSION_CODES.KITKAT) { + flags = View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + } else { + flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + } + getWindow().getDecorView().setSystemUiVisibility(flags); + + initView(); + setData(); + setListener(); + } + + protected abstract void initView(); + + protected abstract void setData(); + + protected abstract void setListener(); + + @Override + protected void onResume() { + super.onResume(); + SignWayUtil.hideStatusBar(false); + EventBus.getDefault().register(this); + sendPackageName(); + Constant.whoActivity = currRoute; + Log.e("TAG","哪个activty:"+Constant.whoActivity); + if(Constant.androidBoardType.equals("huamo") && Constant.ROUTE_SCREEN_SAVER==currRoute){ + + } + } + + @Override + protected void onPause() { + super.onPause(); + EventBus.getDefault().unregister(this); + } + + @Override + protected void onStop() { + super.onStop(); + + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(MessageEvent message) { + if (Constant.ACTION_CAPTURE_SCREEN.equals(message.getCode())) { + uploadScreenCapture(); + } else if (Constant.ACTION_SHOW_SPLASH.equals(message.getCode())) { + if (currRoute == Constant.ROUTE_SCREEN_SAVER) return; + ScreenSaverActivity.startAction(this); +// ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } else if (Constant.UPDATE_DEVICE_IP.equals(message.getCode())) { + //ip变更 + DeviceUtil.updateDeviceIP(this); + + } else if(Constant.ACTION_UPDATE_WEBVIEW.equals(message.getCode())){ + //显示主页,并更新webview + LoggerUtil.e("BaseActivity","ACTION_UPDATE_WEBVIEW"); + if(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("信发") || DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("双面屏")) return; + if (currRoute == Constant.ROUTE_WEB_VIEW || currRoute == Constant.ROUTE_UPDATE_FILE) return; + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + + }else if(Constant.ACTION_RESTART_APP.equals(message.getCode())){ + //重启app + restartApp(); + }else if(Constant.ACTION_RESTART_MQTT.equals(message.getCode())){ + //重启mqtt服务 + LoggerUtil.e("BaseActivity","通知关闭mqtt服务"); + stopService(new Intent(this, MQTTService.class));//关闭Mqtt服务 + Constant.mqttState = "off"; + + } + + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + ContainerService.initFirstTime(); + ContainerService.initTempTime(); + return super.dispatchTouchEvent(ev); + } + + //当前activity截图 + public Bitmap captureScreen() { + getWindow().getDecorView().setDrawingCacheEnabled(true); + getWindow().getDecorView().destroyDrawingCache(); + return getWindow().getDecorView().getDrawingCache(); + } + + //上传界面截图 + private void uploadScreenCapture() { + String dataStr = StringUtil.strSplice("{\"code\":\"", DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE), "\",\"filename\":\"screenshot.jpg\"}"); + final byte[] bytes1 = StringUtil.strSplice(String.format("%06d", dataStr.length()), dataStr).getBytes(); //ip和文件名转成字节数组 + //图片转成字节数组 + String filePath = BitmapUtil.saveBitmapToSDCard(captureScreen()); + final byte[] bytes2 = BitmapUtil.file2byte(filePath); + //开启线程池 上传文件 + final String requestURL = StringUtil.strSplice(Constant.getBaseAddress(), "/API/Dev/UploadScreenshot"); + Executors.newSingleThreadExecutor().execute(() -> FileUtil.uploadFile(bytes1, bytes2, requestURL)); + } + + /** + * + * */ + Long onkey = 0l; + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + Log.e("TAG","按键:"+keyCode); + if ((keyCode == KeyEvent.KEYCODE_F1)) { + if(System.currentTimeMillis()- onkey<1000) { + LoggerUtil.e("遥控按键", "退出应用"); + sendExitPackageName(); + exitApp(); + }else { + onkey = System.currentTimeMillis(); + } + }else if ((keyCode == KeyEvent.KEYCODE_F4)) { + + if(System.currentTimeMillis()- onkey<1000){ + LoggerUtil.e("遥控按键","重启设备"); + SignWayUtil.reboot(); + }else { + onkey = System.currentTimeMillis(); + } + + }else if(keyCode == KeyEvent.KEYCODE_F3){ + + }else if ((keyCode == KeyEvent.KEYCODE_F2)) { + if(System.currentTimeMillis()- onkey<1000) { + LoggerUtil.e("遥控按键", "退到设置"); + ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).navigation(); + }else { + onkey = System.currentTimeMillis(); + } + }else if ((keyCode == KeyEvent.KEYCODE_F10)) { + + } + + return super.onKeyDown(keyCode, event); + } + + + /** + * 发送广播给奔溃自启app告诉包名 + * */ + public void sendPackageName(){ + Intent intent = new Intent(Constant.APP_SEND_PACKAGE_NAME); + intent.putExtra(Constant.PACKAGE_NAME, DeviceUtil.getPackageName()); + sendStickyBroadcast(intent); + } + + /** + * 发送广播给奔溃自启app告诉包名 + * */ + public void sendExitPackageName(){ + Intent intent = new Intent(Constant.APP_SEND_PACKAGE_NAME); + intent.putExtra(Constant.PACKAGE_NAME, "packageName"); + this.sendStickyBroadcast(intent); + }; + + /** + * 退出软件 + * */ + public void exitApp(){ + LoggerUtil.e("BaseActivity", "退出软件"); + sendExitPackageName(); + SignWayUtil.hideStatusBar(true); + QMWindowManager.removeMenuWindow(); + stopService(new Intent(this, ContainerService.class)); + stopService(new Intent(this, MessengerService.class)); + stopService(new Intent(this, CoreService.class)); + stopService(new Intent(this, MQTTService.class)); + + //欣威视通看门狗 + if(Constant.androidBoardType.equals("xwst2")){ + boolean ret= SdkApi.getInstance().Watchdog().getWatchdogOnoff(); + if(ret){ + SdkApi.getInstance().Watchdog().setWatchdogOnoff(false); + } + } + + if("指路机".equals(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))){ + //开启背景音乐 + stopService(new Intent(this, MusicService.class));//背景音乐 + } + try { + + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(Constant.androidBoardType.equals("xwst")){ + SignWayUtil.killbackgroundapk(DeviceUtil.getPackageName()); + }else { + Intent startMain = new Intent(Intent.ACTION_MAIN); + startMain.addCategory(Intent.CATEGORY_HOME); + startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//栈内复用模式 + startActivity(startMain); + System.exit(0); + } + } + + /** + * 重启软件 + * */ + public void restartApp(){ + LoggerUtil.e("BaseActivity", "重启软件"); + stopService(new Intent(this, ContainerService.class)); + stopService(new Intent(this, MessengerService.class)); + stopService(new Intent(this, CoreService.class)); + stopService(new Intent(this, MQTTService.class)); + + //欣威视通看门狗 + if(Constant.androidBoardType.equals("xwst2")){ + boolean ret= SdkApi.getInstance().Watchdog().getWatchdogOnoff(); + if(ret){ + SdkApi.getInstance().Watchdog().setWatchdogOnoff(false); + } + } + + if("指路机".equals(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))){ + //开启背景音乐 + stopService(new Intent(this, MusicService.class));//背景音乐 + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + ProcessPhoenix.triggerRebirth(this); + } +} diff --git a/app/src/main/java/qianmu/container/activity/H5/CoreService.java b/app/src/main/java/qianmu/container/activity/H5/CoreService.java new file mode 100644 index 0000000..bd4f86c --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/CoreService.java @@ -0,0 +1,101 @@ +/* + * Copyright © 2018 Yan Zhenjie. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package qianmu.container.activity.H5; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import androidx.annotation.Nullable; + +import com.yanzhenjie.andserver.AndServer; +import com.yanzhenjie.andserver.Server; + +import java.net.InetAddress; +import java.util.concurrent.TimeUnit; + +import qianmu.container.app.Constant; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + + +public class CoreService extends Service { + + private Server mServer; + + @Override + public void onCreate() { + try { + mServer = AndServer.serverBuilder().inetAddress(InetAddress.getByName("127.0.0.1")).port(8080) + .timeout(10, TimeUnit.SECONDS).listener(new Server.ServerListener() { + @Override + public void onStarted() { + LoggerUtil.i("服务器已启动", "服务器已启动"); + Constant.isCoreService = true; + } + + @Override + public void onStopped() { + LoggerUtil.i("服务器已停止", "服务器已停止"); + Constant.isCoreService = false; + } + + @Override + public void onException(Exception e) { + LoggerUtil.i("服务器发生异常", StringUtil.getThrowableStr(e)); + } + }) + .build(); + + } catch (Throwable t) { + LoggerUtil.e("初始化服务器异常", StringUtil.getThrowableStr(t)); + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + startServer(); + return START_STICKY; + } + + @Override + public void onDestroy() { + super.onDestroy(); + Constant.isCoreService = false; + stopServer(); + } + + /** + * Start server. + */ + private void startServer() { + if (mServer.isRunning()) return; + mServer.startup(); + } + + /** + * Stop server. + */ + private void stopServer() { + mServer.shutdown(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/activity/H5/H5Data.java b/app/src/main/java/qianmu/container/activity/H5/H5Data.java new file mode 100644 index 0000000..6f02ff8 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/H5Data.java @@ -0,0 +1,534 @@ +package qianmu.container.activity.H5; + +import android.content.Context; +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; +import com.loopj.android.http.RequestParams; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.FileCallback; + +import org.greenrobot.eventbus.EventBus; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cz.msebera.android.httpclient.Header; +import cz.msebera.android.httpclient.entity.StringEntity; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.BaseData; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.entity.AppVersion; +import qianmu.container.entity.DeviceOption; +import qianmu.container.entity.KdxfBean; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.ResourceFileBean; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.util.AesUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class H5Data extends BaseData { + + public static final String NAME = "H5_app_data"; + public static final String H5_APP_VERSION = "H5_version"; + public static final String INTERFACE_LIST = "interface_list"; + public static final String FILE_RESOURCE_LIST = "fileResource_list";//资源文件下载,图片,视频 + public static final String MODEL_FILE_RESOURCE_LIST = "modelFileResource_list";//模型资源文件下载,图片,(水牌使用) + public static final String H5_URL = "h5_url"; // 除导视外其他url + public static final String KDXF_DATA = "kdxf_data"; // 科大讯飞地址 + + /** + * 保存H5路径 + * */ + public static void saveH5Url(String data) { + saveDataJson(NAME, H5_URL, data); + } + + + public static void saveH5AppVersion(String data) { + saveDataJson(NAME, H5_APP_VERSION, data); + } + + /** + * 保存科大讯飞代理地址 + * */ + public static void saveKDXFData(String data) { + saveDataJson(NAME, KDXF_DATA, data); + } + + public static void saveInterfaceList(Object data) { + String dataJson; + if (data instanceof String) dataJson = (String) data; + else dataJson = new GsonBuilder().disableHtmlEscaping().create().toJson(data); + saveDataJson(NAME, INTERFACE_LIST, dataJson); + } + + /** + * 保存文件资源列表 + * */ + public static void saveResourceFileList(Object data) { + String dataJson; + if (data instanceof String) dataJson = (String) data; + else dataJson = new Gson().toJson(data); + saveDataJson(NAME, FILE_RESOURCE_LIST, dataJson); + } + + /** + * 保存模型文件资源列表 + * */ + public static void saveModelResourceFileList(Object data) { + String dataJson; + if (data instanceof String) dataJson = (String) data; + else dataJson = new Gson().toJson(data); + saveDataJson(NAME, MODEL_FILE_RESOURCE_LIST, dataJson); + } + + /** + * 获取文件资源列表 + * */ + public static List getResourceFileList() { + try { + String dataJson = getDataJson(NAME, FILE_RESOURCE_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getResourceFileList", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + + + /** + * 获取模型文件资源列表 + * */ + public static List getModelResourceFileList() { + try { + String dataJson = getDataJson(NAME, MODEL_FILE_RESOURCE_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getResourceFileList3", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + + public static String getH5Version() { + try { + String dataJson = getDataJson(NAME, H5_APP_VERSION); + return dataJson; + } catch (Throwable t) { + LoggerUtil.e("getH5AppList", StringUtil.getThrowableStr(t)); + } + return ""; + } + + /** + * 获取科大讯飞代理地址 + * */ + public static KdxfBean getKdxf() { + try { + String dataJson = getDataJson(NAME, KDXF_DATA); + return new Gson().fromJson(dataJson, new TypeToken() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getKdxf()", StringUtil.getThrowableStr(t)); + return new KdxfBean(); + } + } + + /** + * 获取H5路径 + * */ + public static String getH5Url() { + try { + String dataJson = getDataJson(NAME, H5_URL); + return dataJson; + } catch (Throwable t) { + LoggerUtil.e("getH5AppList", StringUtil.getThrowableStr(t)); + } + return ""; + } + + public static List getInterfaceList() { + try { + String dataJson = getDataJson(NAME, INTERFACE_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getH5AppList", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + + /** + * 资源文件列表 + * */ + public static void queryFileResources(QueryPreparedListener preparedListener, QueryFinishListener finishListener , Map bigFiles ) { + if (preparedListener != null) preparedListener.onPrepared(); + String mallCode = FloorData.getMallCode(); + RetrofitUtil.getBaseService().getFileResourceList2(mallCode).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson = new Gson().toJson(response.body().getData()); + if(dataJson.contains("capacity")){ + Object data = response.body().getData(); + saveResourceFileList(data); + }else { + //解密 + dataJson= AesUtil.decrypt((String.valueOf(response.body().getData()))); + saveResourceFileList(dataJson); + } + for(ResourceFileBean fileBean:getResourceFileList()){ + bigFiles.put(fileBean.getUrl(), StringUtil.strSplice("dist", "/static/offline/", fileBean.getUrl())); + } + + } + } catch (Throwable t) { + LoggerUtil.e("queryFileResources", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 模型资源文件列表(水牌使用) + * */ + public static void getModelFileResource(QueryPreparedListener preparedListener, QueryFinishListener finishListener , Map bigFiles ) { + if (preparedListener != null) preparedListener.onPrepared(); + String mallCode = FloorData.getMallCode(); + RetrofitUtil.getBaseService().getModelFileResource(mallCode).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson = new Gson().toJson(response.body().getData()); + if(dataJson.contains("capacity")){ + Object data = response.body().getData(); + saveModelResourceFileList(data); + }else { + //解密 + dataJson= AesUtil.decrypt((String.valueOf(response.body().getData()))); + saveModelResourceFileList(dataJson); + } + if(getModelResourceFileList()!=null && getModelResourceFileList().size()>0){ + for(ResourceFileBean fileBean:getModelResourceFileList()){ + bigFiles.put(fileBean.getUrl(), StringUtil.strSplice("dist", "/static/offline/", fileBean.getUrl())); + } + } + } + } catch (Throwable t) { + LoggerUtil.e("queryFileResources", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + public static void queryInterfaceList(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + String mallCode = FloorData.getMallCode(); + RetrofitUtil.getBaseService().getInterfaceApi(mallCode).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson= new Gson().toJson(response.body().getData()); + if(dataJson.contains("name")){ + Object data = response.body().getData(); + saveInterfaceList(data); + }else { + //解密 + dataJson= AesUtil.decrypt((String.valueOf(response.body().getData()))); + saveInterfaceList(dataJson); + } + + } + } catch (Throwable t) { + LoggerUtil.e("queryInterfaceList", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("queryInterfaceList", "报错"+StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + //GET方式获取离线数据 + public static void queryOfflineDataByInterfaceToGet(String url, String jsonData, String fileName, Map bigFiles , QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + AsyncHttpClient client; + if(url.contains("https")){ + client = new AsyncHttpClient(true, 80, 443); + }else { + client = new AsyncHttpClient(); + } + client.setTimeout(30000); + client.setMaxRetriesAndTimeout(0, 20000); + if(url.contains("?")){ + url = url +"&projectCode="+FloorData.getMallCode(); + }else { + url = url +"?projectCode="+FloorData.getMallCode(); + } + if(jsonData.contains("code")){ + String deviceCode = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + url = url +"&"+"code="+deviceCode; + } + String finalUrl = url; + client.get(url, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + try { + + String response = new String(responseBody).replace("\\\\", "/"); + +// Log.d("url", finalUrl); +// Log.d("response", response); + //获取数据成功时 才解析解析素材url并更新离线文件 + Resp resp = new Gson().fromJson(response, new TypeToken() {}.getType()); + if (resp.getCode() == 200) { + + String filePath = StringUtil.strSplice(Constant.CACHE_PATH, "dist/static/offline/JSON/", fileName, ".json"); + String decryptDataJson =AesUtil.decrypt((String.valueOf(resp.getData()))); + if(decryptDataJson.equals("解密失败")|| decryptDataJson.isEmpty()){ + FileUtil.writeDataToFile(response, filePath, false); + if(fileName.equals("getDevCoordinateByIP")){ + + LoggerUtil.e("getDevCoordinateByIP()",response); + //保存科大讯飞地址 + saveKDXFData(response); + } + }else { + try { + JSONObject entries = JSONUtil.parseObj(decryptDataJson); + resp.setData(entries); + }catch (Exception e){ + JSONArray entries = JSONUtil.parseArray(decryptDataJson); + resp.setData(entries); + } + String s = GsonUtil.getGson().toJson(resp); + FileUtil.writeDataToFile(s, filePath, false); + if(fileName.equals("getDevCoordinateByIP")){ + + LoggerUtil.e("getDevCoordinateByIP()",response); + //保存科大讯飞地址 + saveKDXFData(s); + } + } + +// FileUtil.writeDataToFile(response, filePath, false); +// if(fileName.equals("getDevCoordinateByIP")){ +// +// LoggerUtil.e("getDevCoordinateByIP()",response); +// //保存科大讯飞地址 +// saveKDXFData(response); +// } + }else { + LoggerUtil.e("导视接口报错:"+finalUrl, response); + } + } catch (Throwable t) { + LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + LoggerUtil.e("请求失败:"+finalUrl, StringUtil.getThrowableStr(error)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + //POST方式获取离线数据 多添加一个JSON请求体(参数必须是JSON格式) + public static void queryOfflineDataByInterface(String url, String jsonData, String fileName, Map bigFiles, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + try { + AsyncHttpClient client; + if(url.contains("https")){ + client = new AsyncHttpClient(true, 80, 443); + }else { + client = new AsyncHttpClient(); + } + client.setTimeout(30000); + client.setMaxRetriesAndTimeout(0, 20000); + StringEntity entity = new StringEntity(jsonData); + client.post(MyApplication.getInstance().getApplicationContext(), url, entity, RequestParams.APPLICATION_JSON, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + try { + String response = new String(responseBody).replace("\\\\", "/"); +// Log.d("url", url); +// Log.d("response", response); + //获取数据成功时 才解析解析素材url并更新离线文件 + Resp resp = new Gson().fromJson(response, new TypeToken() {}.getType()); + + if (resp.getCode() == 200) { + //解析离线数据中的大后台图片 +// analysisUrlByStr(response, "/Files/", "dist", bigFiles); + //将离线数据保存为json文件格式 + String decryptDataJson =AesUtil.decrypt((String.valueOf(resp.getData()))); + String filePath = StringUtil.strSplice(Constant.CACHE_PATH, "dist", "/static/offline/JSON/", fileName, ".json"); + if(decryptDataJson.equals("解密失败")|| decryptDataJson.isEmpty()) { + + FileUtil.writeDataToFile(response, filePath, false); + }else { + try { + JSONObject entries = JSONUtil.parseObj(decryptDataJson); + resp.setData(entries); + }catch (Exception e){ + JSONArray entries = JSONUtil.parseArray(decryptDataJson); + resp.setData(entries); + } + String s = GsonUtil.getGson().toJson(resp); + FileUtil.writeDataToFile(s, filePath, false); + } + + }else { + LoggerUtil.e("导视接口报错:"+url, response); + } + } catch (Throwable t) { + LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + Log.d("error", StringUtil.getThrowableStr(error)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } catch (Throwable t) { + if (finishListener != null) finishListener.onFinish(); + LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + } + + /** + * 从字符串中解析图片url + * + * @param content 文本 + * @param matchStr 匹配字符串 + * @param h5Dir H5文件夹 + * @param map 图片列表 + */ + private static void analysisUrlByStr(String content, String matchStr, String h5Dir, Map map) { + while (content.indexOf(matchStr) != -1) { + int startIndex = content.indexOf(matchStr); + content = content.substring(startIndex); + int endIndex = content.indexOf("\""); + String tempSrt = content.substring(0, endIndex); + map.put(tempSrt, StringUtil.strSplice(h5Dir, "/static/offline/", tempSrt).replace("//","/")); + content = content.substring(endIndex); + } + } + + /** + * 下载app并解压 + */ + public static void downloadH5AppFile(String url, String name, String version, String type, QueryFinishListener finishListener) { + String fileName = StringUtil.strSplice(name, version, ".", type); + final String fileUrl = url; + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/", fileName); + FileUtil.downloadFile(fileUrl, localPath, () -> { + File file = new File(localPath); + if (!file.exists()) { + LoggerUtil.i("downloadAppFile", "压缩包下载失败"); + if (finishListener != null) finishListener.onFinish(); + return; + } + + LoggerUtil.i("downloadAppFile", "下载完成,准备解压"); + if (!localPath.toLowerCase().endsWith("zip")) { + LoggerUtil.i("downloadAppFile", "压缩文件不是zip格式"); + if (finishListener != null) finishListener.onFinish(); + return; + } + + UnzipLocalZipFile(name, localPath, version); + if (finishListener != null) finishListener.onFinish(); + }); + } + + /** + * 解压本地压缩文件 + * + * @param name 解压后的文件夹名称 + * @param localPath 压缩文件路径 + */ + private static void UnzipLocalZipFile(String name, String localPath,String version) { + //源文件夹 + File cssDir = new File(StringUtil.strSplice(Constant.CACHE_PATH, name, "/css")); + File jsDir = new File(StringUtil.strSplice(Constant.CACHE_PATH, name, "/js")); + //临时文件夹 + File newCssDir = new File(StringUtil.strSplice(Constant.CACHE_PATH, name, "/newCss")); + File newJsDir = new File(StringUtil.strSplice(Constant.CACHE_PATH, name, "/newJs")); + + if (cssDir.exists()) cssDir.renameTo(newCssDir); + if (jsDir.exists()) jsDir.renameTo(newJsDir); + + //解压Zip包覆盖旧文件夹 返回解压结果 + boolean result = FileUtil.upZipFile(localPath, StringUtil.strSplice(Constant.CACHE_PATH, name,"/")); + if (result) { + LoggerUtil.i("downloadAppFile", "压缩文件解压成功"); + saveH5AppVersion(version);//保存解压完成的版本号 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_UPDATE_WEBVIEW));//通知webview刷新 + //上传设备版本号 + DeviceData.sendVersion(null, null ); + FileUtil.delFolder(newCssDir.getAbsolutePath()); + FileUtil.delFolder(newJsDir.getAbsolutePath()); + + File zipFile = new File(localPath); + if (zipFile.exists() && zipFile.delete()) + LoggerUtil.i("downloadAppFile", "压缩包删除成功"); + else LoggerUtil.i("downloadAppFile", "压缩包删除失败"); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_SHOW_UPDATE_H5));//通知页面更新 + } else { + LoggerUtil.i("downloadAppFile", "压缩文件解压失败"); + FileUtil.delFolder(cssDir); + FileUtil.delFolder(jsDir); + if (newCssDir.exists()) newCssDir.renameTo(cssDir); + if (newJsDir.exists()) newJsDir.renameTo(jsDir); + } + } + +} diff --git a/app/src/main/java/qianmu/container/activity/H5/Interface.java b/app/src/main/java/qianmu/container/activity/H5/Interface.java new file mode 100644 index 0000000..561cff9 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/Interface.java @@ -0,0 +1,53 @@ +package qianmu.container.activity.H5; + +/** + * 接口列表 + * */ +public class Interface { + + private String name;//接口名称 + private String des;//简介 + private String url; + private String parameter;//请求参数 + private String method;//get post + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDes() { + return des; + } + + public void setDes(String des) { + this.des = des; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getParameter() { + return parameter; + } + + public void setParameter(String parameter) { + this.parameter = parameter; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } +} diff --git a/app/src/main/java/qianmu/container/activity/H5/InternalWebsite.java b/app/src/main/java/qianmu/container/activity/H5/InternalWebsite.java new file mode 100644 index 0000000..60a9771 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/InternalWebsite.java @@ -0,0 +1,21 @@ + +package qianmu.container.activity.H5; + + +import android.os.Environment; + +import com.yanzhenjie.andserver.annotation.Website; +import com.yanzhenjie.andserver.framework.website.StorageWebsite; + + +/** + * Created by YanZhenjie on 2018/9/17. + */ +@Website +public class InternalWebsite extends StorageWebsite { + + public InternalWebsite() { + super("/mnt/sdcard/QMContainer/dist"); + } +} + diff --git a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java new file mode 100644 index 0000000..86f9ee8 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java @@ -0,0 +1,367 @@ +package qianmu.container.activity.H5; + +import android.content.Intent; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.util.TimeUtils; +import android.view.View; + +import androidx.databinding.DataBindingUtil; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.sdkapi.api.SdkApi; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.huidu.toolkit.HuiduTech; +import qianmu.container.R; +import qianmu.container.activity.BaseActivity; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.data.MqttData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.databinding.ActivityUpdateFileBinding; +import qianmu.container.entity.MqttInfoBean; +import qianmu.container.entity.NewProgramBean; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.manager.QMWindowManager; +import qianmu.container.mqtt.MQTTService; +import qianmu.container.service.ContainerService; + +import qianmu.container.service.MessengerService; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.KeyboardUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; + +import static qianmu.container.util.LoggerUtil.SAVE_LOG_DIR_PATH; +import static qianmu.container.util.LoggerUtil.e; + +@Route(path = Constant.ROUTE_UPDATE_FILE) +public class UpdateFileActivity extends BaseActivity { + + static final int TYPE_REQUEST_DATA = 1;//请求接口数据 + static final int TYPE_DOWNLOAD_FILE = 2;//下载文件 + static final int TYPE_LOAD_DELAYED = 3;//延时加载数据 + static final int TYPE_DOWNLOAD_H5 = 4;//下载H5离线包 + static final int TYPE_DOWNLOAD_H52 = 5;//下载H5离线包 + static final int TYPE_GO_HOME = 6;//5分钟后强制进入主页 + int currentCount = 0;//已下载图片数量 + int queryResponseCount = 0;//已完成请求的数量 + int totalQueryCount = 0; //请求总数 + Map bigFiles = new HashMap<>(); //大后台文件 + + ActivityUpdateFileBinding binding; + + String deviceType; + + @SuppressWarnings("all") + Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + + switch (msg.what) { + case TYPE_DOWNLOAD_H5: + //验证设备是否注册 + String deviceCode = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + MqttInfoBean mqttInfo = MqttData.getMqttInfo(); + + if (mqttInfo.getServer() == null || StringUtil.isEmpty(deviceCode)) { + ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).navigation(); + finish(); + return; + } + + startService(new Intent(UpdateFileActivity.this, ContainerService.class)); + startService(new Intent(UpdateFileActivity.this, CoreService.class)); + startService(new Intent(UpdateFileActivity.this, MessengerService.class)); + startService(new Intent(UpdateFileActivity.this, MQTTService.class));//启动Mqtt服务 + + Log.e("TAG","设备code:"+deviceCode); + //上传前一天日志文件 + String fileName = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis()-24*3600*1000); + String path= StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/", fileName, ".txt"); + LoggerUtil.uploadLogFile(path,deviceCode,"","0"); + + //获取图片视频下载地址 + DeviceData.getUploadUrl(null,null); + + if ("信发".equals(deviceType)||"双面屏".equals(deviceType)) { + //信发无需下载离线接口 + sendEmptyMessageDelayed(TYPE_LOAD_DELAYED, 1000); + + }else { + + H5Data.queryInterfaceList(null, () -> sendEmptyMessageDelayed(TYPE_LOAD_DELAYED, 1000)); + } + + removeMessages(TYPE_GO_HOME); + sendEmptyMessageDelayed(TYPE_GO_HOME,600*1000);//10分钟后强制进入主页 + + break; + + case TYPE_LOAD_DELAYED: + //清空资源离线信息 + ContainerService.initFirstTime(); + totalQueryCount = 0; + queryResponseCount = 0; + bigFiles.clear(); + //获取屏保信息 + ScreenSaverData.queryScreensaver(() -> totalQueryCount++, () -> queryResponseCount++ ); + //上传设备版本号 + DeviceData.sendVersion(() -> totalQueryCount++, () -> queryResponseCount++ ); + //获取定时开关机时间 + DeviceData.getMachineOnOffTime(() -> totalQueryCount++, () -> queryResponseCount++ ); + //获取同屏 +// DeviceData.getPrimaryMachine(() -> totalQueryCount++, () -> queryResponseCount++ ); + //信发节目 + ScreenSaverData.getProgramList(() -> totalQueryCount++, new QueryFinishListener() { + @Override + public void onFinish() { + //模型资源,图片(水牌使用) + try { + if ("信发".equals(deviceType)||"双面屏".equals(deviceType)) { + List screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + if(screenSaverList!=null && screenSaverList.size()>0){ + String s = GsonUtil.getGson().toJson(screenSaverList); + NewProgramBean newProgramBean = screenSaverList.get(0); + if(s.contains("\"typeCode\":\"map\"") || s.contains("\"typeCode\":\"brand_list\"")){ + //有地图组件 + for(NewProgramBean.schedule schedule : newProgramBean.getSchedule()){ + for(NewProgramBean.programs programs :schedule.getPrograms()){ + for(NewProgramBean.components components : programs.getComponents()){ + ScreenSaverData. getGetMapData(UpdateFileActivity.this,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getApi/",components.getCode()),() -> totalQueryCount++, () -> queryResponseCount++ ); + ScreenSaverData.getApiFileResourceList(UpdateFileActivity.this,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getFileResourceList/",components.getCode()),() -> totalQueryCount++, () -> queryResponseCount++ , bigFiles); + break; + } + } + } + } + if(s.contains("\"typeCode\":\"flow\"")){ + //有水牌组件 + H5Data.getModelFileResource(() -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); + } + } + } + queryResponseCount++; + }catch (Exception e){ + queryResponseCount++; + } + } + }, bigFiles); + + //根据离线接口列表 获取离线数据和图片 + if (!"信发".equals(deviceType)&&!"双面屏".equals(deviceType)) { + H5Data.queryFileResources( () -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); + + getOfflineDataByInterface(); + + } + + if("指路机".equals(deviceType)){ + DeviceData.getBackgroundMusic( () -> totalQueryCount++, () -> queryResponseCount++ ,bigFiles); + } + + sendEmptyMessageDelayed(TYPE_REQUEST_DATA, 3000); + + break; + + case TYPE_REQUEST_DATA://请求接口数据 + ContainerService.initFirstTime(); + binding.tvCurrentNumber.setText(StringUtil.strSplice("数据获取进度:", String.valueOf(queryResponseCount), " / ", String.valueOf(totalQueryCount))); + Log.e("TAG","请求接口数据"); + //接口请求完毕时 进入下载文件阶段 + if (totalQueryCount <= queryResponseCount) { + currentCount = 0; + downloadFiles(); + handler.sendEmptyMessageDelayed(TYPE_DOWNLOAD_FILE, 2000); + return; + } + sendEmptyMessageDelayed(TYPE_REQUEST_DATA, 1000); + break; + + case TYPE_DOWNLOAD_FILE://下载文件 + ContainerService.initFirstTime(); + binding.tvCurrentNumber.setText(StringUtil.strSplice("文件下载进度:", String.valueOf(currentCount), " / ", String.valueOf(bigFiles.size() ))); + //图片下载完毕进入主界面 + + if (currentCount >= bigFiles.size()) { + ContainerService.initFirstTime(); + Constant.showScreenSaver = true; + removeMessages(TYPE_GO_HOME); + //判断设备类型 + if ("信发".equals(deviceType)||"双面屏".equals(deviceType)) { + LoggerUtil.e("UpdateFileActivity","TYPE_DOWNLOAD_FILE-跳转至信发"); + ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } else{ + LoggerUtil.e("UpdateFileActivity","TYPE_DOWNLOAD_FILE-跳转至导视"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + + finish(); + return; + } + sendEmptyMessageDelayed(TYPE_DOWNLOAD_FILE, 1000); + break; + + case TYPE_GO_HOME://5分钟后强制进入主页 + //判断设备类型 + LoggerUtil.e("UpdateFileActivity","强制进入主页"); + if ("信发".equals(deviceType)||"双面屏".equals(deviceType)) { + ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } else{ + LoggerUtil.e("UpdateFileActivity","TYPE_GO_HOME-跳转至导视页面"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + + finish(); + break; + + } + } + }; + + @Override + protected void initView() { + binding = DataBindingUtil.setContentView(this, R.layout.activity_update_file); + + if(Constant.androidBoardType.equals("huidu")){ + //灰度主板静默安装apk需要提前连接 + initHuidu(); + } + + if(Constant.androidBoardType.equals("xwst2")){ + //新版欣威视通初始化 + SdkApi.newInstance(this); + } + } + + @Override + protected void setData() { + Constant.showScreenSaver = false; + LoggerUtil.e("UpdateFileActivity","setData()"); + //清除文件 + try { + if (DeviceUtil.getSDAvailableSize() < DeviceUtil.getSDTotalSize() * 0.3) { + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH, "Files/")); + File file2 = new File(StringUtil.strSplice(Constant.CACHE_PATH, "iotFile/")); + DeviceUtil.recursionDeleteFile(file); + DeviceUtil.recursionDeleteFile(file2); + } + }catch (Exception e){ + + } + //删除没用日志 + LoggerUtil.deleteLogFiles(); + Constant.isScreen4K = DeviceUtil.screenIs4K(this); + } + + @Override + protected void setListener() { + + binding.ivExit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!MyApplication.addClickTimes()) return; + ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, true).navigation(); + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + currRoute = Constant.ROUTE_UPDATE_FILE; + LoggerUtil.e("UpdateFileActivity","onResume()"); + handler.removeMessages(TYPE_DOWNLOAD_H5); + handler.sendEmptyMessageDelayed(TYPE_DOWNLOAD_H5, 30000); + deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + } + + @Override + protected void onPause() { + super.onPause(); + KeyboardUtil.hideKeyboard(binding.getRoot()); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (handler == null) return; + handler.removeMessages(TYPE_REQUEST_DATA); + handler.removeMessages(TYPE_DOWNLOAD_FILE); + handler.removeMessages(TYPE_LOAD_DELAYED); + handler.removeMessages(TYPE_DOWNLOAD_H5); + handler.removeMessages(TYPE_GO_HOME); + handler = null; + } + + /** + * 初始化灰度主版 + * */ + private void initHuidu(){ + try { + Log.e("TAG", "开始初始化灰度"); + HuiduTech huiduTech = new HuiduTech(this); + huiduTech.setCompleteConnectionListener(new HuiduTech.CompleteConnection() { + @Override + public void completeConnectionCallback(boolean b) { + Log.e("huiduTech", "结果:"+ b); + } + }); + }catch (Exception e){ + + } + } + + public void getOfflineDataByInterface() { + if(H5Data.getInterfaceList()==null||H5Data.getInterfaceList().size()==0){ + return; + } + for (Interface anInterface : H5Data.getInterfaceList()) { + if (anInterface == null) continue; + String url = StringUtil.getString(anInterface.getUrl()); + String fileName = StringUtil.getString(anInterface.getName()); + String method = StringUtil.getString(anInterface.getMethod()); + String params = StringUtil.getString(anInterface.getParameter()); + if (method.toLowerCase().equals("get")) { + H5Data.queryOfflineDataByInterfaceToGet(url, params,fileName, bigFiles, () -> totalQueryCount++, () -> queryResponseCount++); + } else { + H5Data.queryOfflineDataByInterface(url, params, fileName, bigFiles, () -> totalQueryCount++, () -> queryResponseCount++); + } + } + } + + //批量下载图片 + private void downloadFiles() { + for (String bigFile : bigFiles.keySet()) + downloadFile(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), bigFile, bigFiles.get(bigFile)); + } + + private void downloadFile(String imgPath, final String address, String localAddress) { + //容器图片 + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH, localAddress)); + //h5图片 + if (file.exists()) { + currentCount++; + return; + } + String internetPath = StringUtil.strSplice(imgPath, address); + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, localAddress); + FileUtil.downloadFile(internetPath, localPath, () -> currentCount++); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java new file mode 100644 index 0000000..8c8aa35 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/H5/WebViewActivity.java @@ -0,0 +1,670 @@ +package qianmu.container.activity.H5; + +import android.annotation.SuppressLint; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Debug; +import android.os.Handler; +import android.os.Message; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.webkit.ConsoleMessage; +import android.webkit.JavascriptInterface; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; +import com.google.gson.Gson; +import com.iflytek.cloud.ErrorCode; +import com.iflytek.cloud.InitListener; +import com.iflytek.cloud.RecognizerListener; +import com.iflytek.cloud.RecognizerResult; +import com.iflytek.cloud.SpeechConstant; +import com.iflytek.cloud.SpeechError; +import com.iflytek.cloud.SpeechRecognizer; +import com.iflytek.cloud.SpeechUtility; +import com.shockman.sm.vendor.IHttp; +import com.shockman.sm.vendor.SmUtils; +import com.shockman.sm.vendor.TargetVo; + +import org.greenrobot.eventbus.EventBus; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Scanner; +import java.util.concurrent.Executors; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import qianmu.container.R; +import qianmu.container.activity.BaseActivity; +import qianmu.container.adapter.KeyAdapter; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.AppData; +import qianmu.container.data.DeviceData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.databinding.ActivityWebviewBinding; +import qianmu.container.entity.AppVersion; +import qianmu.container.entity.KdxfBean; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.ResourceFileBean; +import qianmu.container.entity.ScreenSaver; +import qianmu.container.entity.Vocbean; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.util.AppUtil; +import qianmu.container.util.CalendarUtils; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.KeyboardUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; + +import static qianmu.container.service.ContainerService.initFirstTime; + +@Route(path = Constant.ROUTE_WEB_VIEW) +public class WebViewActivity extends BaseActivity { + + String TAG="WebViewActivity"; + ActivityWebviewBinding binding; + static final int TYPE_REFURBISH_WEBVIEW = 100;//刷新webview + static final int TYPE_GO_SAVESCREEN = 300;//导视通知跳转屏保 + static final int TYPE_HINT_PASSWORD = 3;//隐藏密码输入框 + static final int TYPE_START_SERVER = 4;//重新启动web服务 + static final int TYPE_SHENG_HTML_MAG = 5;//返回接口请求值给h5 + static String HtmlUrl = "http://127.0.0.1:8080/index.html";//webServer服务地址 + String vocMsg = "";//语音内容 + // 语音听写对象 + private SpeechRecognizer mIat; + int time = 0; + String interfaceRequestData=""; + + Handler handler = new Handler() { + @SuppressLint("HandlerLeak") + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + + switch (msg.what){ + + case TYPE_REFURBISH_WEBVIEW://刷新webview + try { + binding.web.clearCache(true); + binding.web.loadUrl(HtmlUrl); + Constant.isCoreService=true; + }catch (Exception e){ + + } + + + break; + + case TYPE_GO_SAVESCREEN://导视通知跳转屏保 + + try { + initFirstTime(); + if (!ScreenSaverData.isProgramPlay()) return; + + if (AppData.getFrontApp().equals(DeviceUtil.getPackageName())) { //信发处于系统前端时 显示屏保页面 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_SHOW_SPLASH)); + } else { //重新启动信发软件并打开屏保页面 + ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } + } catch (Throwable t) { + LoggerUtil.e("WebViewActivity()", "导视通知跳转报错:"+StringUtil.getThrowableStr(t)); + } + break; + + case TYPE_HINT_PASSWORD: + sendEmptyMessageDelayed(TYPE_HINT_PASSWORD,1000); + if(time>=30){ + binding.layoutPass.setVisibility(View.GONE); + removeMessages(TYPE_HINT_PASSWORD); + } + time++; + try { + + }catch (Exception e){ + + } + break; + + case TYPE_START_SERVER: + removeMessages(TYPE_REFURBISH_WEBVIEW); + sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,2000); + startService(new Intent(WebViewActivity.this, CoreService.class)); + LoggerUtil.e("WebViewActivity","CoreService重启"); + break; + + case TYPE_SHENG_HTML_MAG: + getHandWriting(interfaceRequestData); + interfaceRequestData=""; + DeviceData.saveInterfaceRequest(""); + break; + } + } + }; + + @Override + protected void initView() { + DeviceUtil.screenType(this); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + binding = DataBindingUtil.setContentView(this, R.layout.activity_webview); + //设置密码 + initPass(); + //初始化科大讯飞 + initKDXF(); + } + + @Override + protected void setData() { + Log.e("WebViewActivity", "setData"); + WebSettings webSettings = binding.web.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setUseWideViewPort(true); + webSettings.setLoadWithOverviewMode(true); + webSettings.setSupportZoom(false); + webSettings.setBuiltInZoomControls(false); + webSettings.setDisplayZoomControls(false); + webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); + webSettings.setAllowFileAccess(true); + webSettings.setJavaScriptCanOpenWindowsAutomatically(true); + webSettings.setLoadsImagesAutomatically(true); + webSettings.setDefaultTextEncodingName("utf-8"); + webSettings.setUserAgentString(""); + //加载web + currRoute = Constant.ROUTE_WEB_VIEW; + loadH5Url(getIntent().getBooleanExtra(Constant.KEY_LOAD_H5_URL, false)); + //加载语音 + initVoice(); + } + + //初始化科大讯飞 + private void initKDXF(){ + try { + KdxfBean kdxf = H5Data.getKdxf(); + if(kdxf.getData()==null || kdxf.getData().getDeployType()==null || kdxf.getData().getDeployType().isEmpty() || kdxf.getData().getDeployType().toLowerCase().equals("saas")){ + SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5c2055f8"); + }else { + SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5c2055f8" + "," + "net_type=custom, proxy_ip="+kdxf.getData().getXfyunIp()+", proxy_port="+kdxf.getData().getXfyunPort()); + } + }catch (Throwable t) { + LoggerUtil.e("初始化语音", StringUtil.getThrowableStr(t)); + } + } + + //初始化语音 + private void initVoice(){ + mIat = SpeechRecognizer.createRecognizer(this, mInitListener); + } + + @Override + protected void setListener() { + binding.web.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + + }); + + binding.web.setOnLongClickListener((View v) -> { + LoggerUtil.e("OnLongClick", "用户长按了页面"); + return false; + }); + + binding.setting.setOnClickListener((view) -> { + if (!MyApplication.addClickTimes()) return; + binding.layoutPass.setVisibility(View.VISIBLE); + time = 0; + handler.removeMessages(TYPE_HINT_PASSWORD); + handler.sendEmptyMessage(TYPE_HINT_PASSWORD); + binding.tvPass.setText(""); +// ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, true).navigation(); + }); + } + + //密码输入框 + public void initPass(){ + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 5); + KeyAdapter keyAdapter = new KeyAdapter(this); + binding.recycKey.setLayoutManager(gridLayoutManager); + binding.recycKey.setAdapter(keyAdapter); + + keyAdapter.setOnitemClickLintener(new KeyAdapter.OnitemClick() { + @Override + public void onItemClick(String position) { + time = 0; + if(position.equals("清空")){ + binding.tvPass.setText(""); + }else if(position.equals("删除")){ + String s = binding.tvPass.getText().toString(); + if(s.length()>0){ + binding.tvPass.setText( s.substring(0,s.length()-1)); + }else { + binding.tvPass.setText(""); + } + }else if(position.equals("取消")){ + binding.layoutPass.setVisibility(View.GONE); + }else if(position.equals("确定")){ + SimpleDateFormat format = new SimpleDateFormat("ddMM"); + String pwd = format.format(System.currentTimeMillis());//当前日期当前月份 + StringBuilder sb = new StringBuilder(pwd); + String whatDay4 = CalendarUtils.getWhatDay4(System.currentTimeMillis()); + pwd = sb.insert(2, whatDay4).toString();//密码为日星期月6位数 + String inputPWD = binding.tvPass.getText().toString().trim();//输入的密码 + if (!pwd.equals(inputPWD)) { + ToastUtils.showToast("密码错误"); + return; + } + binding.layoutPass.setVisibility(View.GONE); + ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, false).navigation(); + }else { + binding.tvPass.setText(binding.tvPass.getText().toString()+position); + } + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + leaveScreenSave(); + binding.layoutPass.setVisibility(View.GONE); + //判断web服务是否正常 + if(!Constant.isCoreService || !DeviceUtil.isServiceRunning( MyApplication.getInstance(),"CoreService")){ + LoggerUtil.e("WebViewActivity","CoreService被关闭"); + //开启本地web服务器 + stopService(new Intent(WebViewActivity.this, CoreService.class)); + handler.removeMessages(TYPE_START_SERVER); + handler.sendEmptyMessageDelayed(TYPE_START_SERVER,1000); + return; + } + + } + + @Override + protected void onPause() { + super.onPause(); + KeyboardUtil.hideKeyboard(binding.getRoot()); + } + + @Override + protected void onStop() { + super.onStop(); + if(handler!=null){ + handler.removeMessages(TYPE_HINT_PASSWORD); + handler.removeMessages(TYPE_SHENG_HTML_MAG); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LoggerUtil.e(TAG, "onDestroy()"); + if (mIat != null) { + // 退出时释放连接 + mIat.cancel(); + mIat.destroy(); + } + } + + private void loadH5Url(boolean loadUrl) { + if (!loadUrl) return; + String Url; + if(H5Data.getH5Url().isEmpty()){ + Url = HtmlUrl; + }else { + Url = H5Data.getH5Url(); + } + binding.web.clearCache(true); + binding.web.loadUrl(Url); + binding.web.setWebChromeClient(new WebChromeClient() { + + public boolean onConsoleMessage(ConsoleMessage cm) { + if(!cm.message().contains("THREE.WebGLRenderer:") && !cm.message().contains("Uncaught (in promise) AbortError")){ + LoggerUtil.e("WebView日志",cm.message()); + } + return super.onConsoleMessage(cm); + } + }); + + binding.web.addJavascriptInterface(new AndroidtoJs(), "android"); + + } + + public class AndroidtoJs extends Object { + + // 回到屏保页面 + @JavascriptInterface + public void goScreenSave() { + + LoggerUtil.e(TAG,"JS调用了Android的方法:goScreenSave()"); + if(handler!=null){ + handler.removeMessages(TYPE_GO_SAVESCREEN); + handler.sendEmptyMessage(TYPE_GO_SAVESCREEN); + } + } + + // 获取是否有屏保数据 + @JavascriptInterface + public boolean hasProgram() { + boolean programPlay = ScreenSaverData.isProgramPlay(); + LoggerUtil.e(TAG,"JS调用了Android的方法:hasProgram():"+programPlay); + return programPlay; + } + + // 获取后台地址 + @JavascriptInterface + public String getBaseAddress() { + LoggerUtil.e(TAG,"JS调用了Android的方法:getBaseAddress()"); + return Constant.getBaseAddress(); + } + + // h5调用android:重启webView + @JavascriptInterface + public void restartWebView() { + LoggerUtil.e(TAG,"JS调用了Android的方法:restartWebView()"); + handler.removeMessages(TYPE_REFURBISH_WEBVIEW); + handler.sendEmptyMessageDelayed(TYPE_REFURBISH_WEBVIEW,3000); + } + + // h5调用android:开始识别语音 + @JavascriptInterface + public void startVoice() { + LoggerUtil.e(TAG,"JS调用了Android的方法:startVoice()"); + mIat.startListening(mRecognizerListener); + } + + // h5调用android:结束识别语音 + @JavascriptInterface + public void stopVoice() { + LoggerUtil.e(TAG,"JS调用了Android的方法:stopVoice()"); + + } + + // h5调用android:传入要播报语音 + @JavascriptInterface + public void TTS(String content) { + LoggerUtil.e(TAG,"JS调用了Android的方法:TTS()"); + + } + // h5调用android:停止语音播报播报语音 + @JavascriptInterface + public void TTSStop() { + LoggerUtil.e(TAG,"JS调用了Android的方法:TTSStop()"); + } + + // h5调用android:新版指路机传入的数据 + @JavascriptInterface + public void jxbData(String data) { + LoggerUtil.e(TAG,"JS调用了Android的方法:jxbData()"); + DeviceData.saveDeviceInfo(DeviceData.JXB_DATA,data); + } + + // h5调用android:接口请求post + @JavascriptInterface + public void interfaceRequest(String url , String map , boolean state) { + DeviceData.queryOfflineDataByInterfaceToPost(url, map, new QueryFinishListener() { + @Override + public void onFinish() { + if(state){ + interfaceRequestData = DeviceData.getInterfaceRequestData(); + handler.sendEmptyMessage(TYPE_SHENG_HTML_MAG); + } + } + }); + +// LoggerUtil.e(TAG,"JS调用了Android的方法:interfaceRequest1():"+url+","+map); + + } + + // h5调用android:接口请求get + @JavascriptInterface + public void interfaceRequest(String url , boolean state) { + + DeviceData.queryOfflineDataByInterfaceToGet(url, new QueryFinishListener() { + @Override + public void onFinish() { + if(state){ + interfaceRequestData = DeviceData.getInterfaceRequestData(); + handler.sendEmptyMessage(TYPE_SHENG_HTML_MAG); + } + } + }); +// LoggerUtil.e(TAG,"JS调用了Android的方法:interfaceRequest2():"+url); + } + + + //旧版指路机:移动手臂 + @JavascriptInterface + public void moveArm(String shopName) { + //直梯+编号 扶梯+编号 + LoggerUtil.e("MainActivity","JS调用了Android的方法:moveArm:"+shopName); + getMoveArm(shopName); + } + + //旧版指路机:是否轮播摇臂 + @JavascriptInterface + public void setRotateSwitcher(String isRotate) { + + try { + SmUtils instance = SmUtils.getInstance(); + instance.rotateSwitcher(Boolean.parseBoolean(isRotate)); + }catch (Exception e){ + + } + +// LoggerUtil.e("MainActivity","JS调用了Android的方法:getArmNum:"+isCarousel); + + } + + + } + + /** + * 安卓调用h5方法通知进入导视 + * */ + public void leaveScreenSave(){ + if(binding.web!=null){ + binding.web.loadUrl(StringUtil.strSplice("javascript:leaveScreenSave();")); + } + } + + /** + * android调用js:传送识别语音内容 + * */ + public void voiceContent(String msg){ + if(binding.web!=null){ + binding.web.loadUrl(StringUtil.strSplice("javascript:voiceContent("+ msg +");")); + LoggerUtil.e(TAG,"android调用js方法:voiceContent(),语音内容:"+msg); + } + } + + /** + * android调用js 传送接口请求数据 + * */ + public void getHandWriting(String msg){ + if(binding.web!=null){ + binding.web.loadUrl(StringUtil.strSplice("javascript:handWriting("+ msg +");")); +// LoggerUtil.e(TAG,"android调用js方法:getHandWriting(),接口请求数据:"+msg); + } + } + + /** + * 初始化监听器。 + */ + private InitListener mInitListener = new InitListener() { + + @Override + public void onInit(int code) { + + LoggerUtil.e(TAG, "语音初始化"+"SpeechRecognizer init() code = " + code); + if (code == ErrorCode.SUCCESS) { + mIat.setParameter(SpeechConstant.CLOUD_GRAMMAR, null); //设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。 + mIat.setParameter(SpeechConstant.SUBJECT, null); + mIat.setParameter(SpeechConstant.RESULT_TYPE, "plain"); //设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容 + mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //此处engineType为“cloud” + mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); //设置语音输入语言,zh_cn为简体中文 +// mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); //设置语音输入语言,zh_cn为简体中文 + mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); //设置结果返回语言 + mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); //取值范围{1000~10000} 设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理 + mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); //自动停止录音,范围{0~10000} 设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, + mIat.setParameter(SpeechConstant.ASR_PTT, "0"); //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 + } + } + }; + + /** + * 听写监听器。 + */ + private RecognizerListener mRecognizerListener = new RecognizerListener() { + + @Override + public void onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 + Log.e(TAG,"开始说话"); + vocMsg=""; + } + + @Override + public void onError(SpeechError error) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + LoggerUtil.e(TAG, "onError " + error.getPlainDescription(true)); + Vocbean vocbean = new Vocbean(); + vocbean.setCode(error.getErrorCode()+""); + vocbean.setMsg(""); + vocMsg=new Gson().toJson(vocbean); + voiceContent(vocMsg); + } + + @Override + public void onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 + LoggerUtil.e(TAG,"结束说话"); + } + + @Override + public void onResult(RecognizerResult results, boolean isLast) { + Log.e(TAG, results.getResultString()); + + if(!results.getResultString().isEmpty()){ + Vocbean vocbean = new Vocbean(); + vocbean.setCode("200"); + vocbean.setMsg(results.getResultString()); + vocMsg= new Gson().toJson(vocbean); + voiceContent(vocMsg); + } + if (isLast) { + Log.d(TAG, "onResult 结束"); + } + + } + + @Override + public void onVolumeChanged(int volume, byte[] data) { +// Log.e(TAG,"当前正在说话,音量大小 = " + volume + " 返回音频数据 = " + data.length); + } + + @Override + public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null + // if (SpeechEvent.EVENT_SESSION_ID == eventType) { + // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); + // Log.d(TAG, "session id =" + sid); + // } + } + }; + + /** + * 调用手臂方法 + * */ + public void getMoveArm(String name){ + int masterArm = H5Data.getKdxf().getData().getControlInfo().getMasterArm();//机械臂编号1、2、3 + SmUtils instance = SmUtils.getInstance(); + instance.getTargets("00:00:00:00:00:00", masterArm, new IHttp() { + @Override + public void onHttpResponse(int i, Object o) { + //获取到表单 +// Log.e("TAG","极点:"+ GsonUtil.getGson().toJson(o)); + List targetList = (List)o; + for(int x=0;x { + + public static final int ACTION_CHANGE_SERVER_INFO = 1; + public static final int ACTION_CHANGE_DEVICE_INFO = 2; + public static final int ACTION_SAVE_DEVICE_INFO = 3; + public static final int ACTION_INPUT_PASSWORD = 4; + public static final int ACTION_CANCEL = 5; + + protected Context context; + protected T binding; + protected ViewClickListener listener; + + public ViewBase(Context context, View view) { + this.context = context; + binding = DataBindingUtil.getBinding(view); + initView(); + setData(); + setListener(); + } + + protected void initView() { + + } + + + protected void setData() { + + } + + + protected void setListener() { + + } + + public void showView() { + binding.getRoot().setVisibility(View.VISIBLE); + setData(); + } + + public void hideView() { + binding.getRoot().setVisibility(View.GONE); + } + + public void destroyView() { + + } + + public void setViewClickListener(ViewClickListener listener) { + this.listener = listener; + } + + +} diff --git a/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java b/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java new file mode 100644 index 0000000..a635b72 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java @@ -0,0 +1,187 @@ +package qianmu.container.activity.device; + +import android.Manifest; +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.databinding.DataBindingUtil; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.android.arouter.launcher.ARouter; + +import cn.huidu.toolkit.HuiduTech; +import qianmu.container.R; +import qianmu.container.activity.BaseActivity; +import qianmu.container.activity.H5.CoreService; +import qianmu.container.activity.H5.UpdateFileActivity; +import qianmu.container.activity.ViewBase; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.data.MqttData; +import qianmu.container.databinding.ActivityDeviceInfoBinding; +import qianmu.container.entity.MqttInfoBean; +import qianmu.container.manager.QMWindowManager; +import qianmu.container.mqtt.MQTTService; +import qianmu.container.service.ContainerService; +import qianmu.container.service.MessengerService; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.KeyboardUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; + +@SuppressWarnings("All") +@Route(path = Constant.ROUTE_DEVICE_INFO) +public class DeviceInfoActivity extends BaseActivity { + + ActivityDeviceInfoBinding binding; + ViewServerInfo serverInfo; + ViewDeviceInfo deviceInfo; + ViewInputPassword inputPassword; + int PERMISSION_CODE=2; + + @Override + protected void initView() { + currRoute = Constant.ROUTE_DEVICE_INFO; + binding = DataBindingUtil.setContentView(this, R.layout.activity_device_info); + serverInfo = new ViewServerInfo(this, binding.viewServerInfo.getRoot()); + deviceInfo = new ViewDeviceInfo(this, binding.viewDeviceInfo.getRoot()); + inputPassword = new ViewInputPassword(this, binding.viewInputPassword.getRoot()); + setPermission(); + } + + @Override + protected void setData() { + + } + + @Override + protected void onResume() { + super.onResume(); + boolean result = getIntent().getBooleanExtra(Constant.INPUT_PASSWORD, false); + if (result) showInputPassword(); + else showServerInfo(); + + } + + @Override + protected void setListener() { + inputPassword.setViewClickListener(this::viewClick); + serverInfo.setViewClickListener(this::viewClick); + deviceInfo.setViewClickListener(this::viewClick); + binding.getRoot().setOnClickListener(KeyboardUtil::hideKeyboard); + + binding.exit.setOnClickListener((view) -> { + LoggerUtil.e("DeviceInfoActivity", "退出软件"); + exitApp(); + + }); + + binding.restart.setOnClickListener(view -> { + LoggerUtil.e("DeviceInfoActivity", "重启设备"); + SignWayUtil.reboot(); + }); + } + + /** + * 检测权限并授权 + * */ + private void setPermission(){ + + if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ + + ActivityCompat.requestPermissions(this,new String[]{ + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.ACCESS_NETWORK_STATE, + Manifest.permission.CAMERA, + Manifest.permission.RECORD_AUDIO, + Manifest.permission.RECEIVE_BOOT_COMPLETED, + Manifest.permission.SYSTEM_ALERT_WINDOW, + Manifest.permission.READ_PHONE_STATE, + Manifest.permission.ACCESS_NETWORK_STATE},PERMISSION_CODE); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if(requestCode==PERMISSION_CODE){ + + } + } + + private void viewClick(int action) { + if (action == ViewBase.ACTION_INPUT_PASSWORD) { + inputPassword.showView(); + deviceInfo.hideView(); + serverInfo.hideView(); + binding.exit.setVisibility(View.GONE); + } else if (action == ViewBase.ACTION_CHANGE_SERVER_INFO) { + inputPassword.hideView(); + deviceInfo.hideView(); + serverInfo.showView(); + binding.exit.setVisibility(View.VISIBLE); + } else if (action == ViewBase.ACTION_CHANGE_DEVICE_INFO) { +// if (FloorData.getBuildingList().size() == 0) { +// ToastUtils.showToast("楼栋数据异常"); +// return; +// } + //获取图片视频下载地址 + DeviceData.getUploadUrl(null,null); + + inputPassword.hideView(); + serverInfo.hideView(); + deviceInfo.showView(); + binding.exit.setVisibility(View.VISIBLE); + } else if (action == ViewBase.ACTION_SAVE_DEVICE_INFO) { + MqttInfoBean mqttInfo = MqttData.getMqttInfo(); + if (mqttInfo.getServer()== null) return; + //跳转至数据更新页面 + ARouter.getInstance().build(Constant.ROUTE_UPDATE_FILE).navigation(); + finish(); + } else if (action == ViewBase.ACTION_CANCEL) { + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if ("信发".equals(deviceType) || "双面屏".equals(deviceType)) { + LoggerUtil.e("DeviceInfoActivity","ACTION_CANCEL-跳转信发"); + ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } else{ + LoggerUtil.e("DeviceInfoActivity","ACTION_CANCEL-跳转导视"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + finish(); + } + } + + //显示输入密码 + private void showInputPassword() { + inputPassword.showView(); + serverInfo.hideView(); + deviceInfo.hideView(); + binding.exit.setVisibility(View.GONE); + } + + //显示服务器信息 + private void showServerInfo() { + inputPassword.hideView(); + serverInfo.showView(); + deviceInfo.hideView(); + } + + //显示设备详细信息 + private void showDeviceInfo() { + inputPassword.hideView(); + serverInfo.hideView(); + deviceInfo.showView(); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/device/ViewDeviceInfo.java b/app/src/main/java/qianmu/container/activity/device/ViewDeviceInfo.java new file mode 100644 index 0000000..09b63bc --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/device/ViewDeviceInfo.java @@ -0,0 +1,296 @@ +package qianmu.container.activity.device; + +import android.content.Context; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; + +import java.util.ArrayList; +import java.util.List; + +import qianmu.container.R; +import qianmu.container.activity.ViewBase; +import qianmu.container.adapter.BuildingAdapter; +import qianmu.container.adapter.DeviceNameAdapter; +import qianmu.container.adapter.DeviceTypeAdapter; +import qianmu.container.adapter.FloorAdapter; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.data.MqttData; +import qianmu.container.databinding.ViewDeviceInfoBinding; +import qianmu.container.entity.Building; +import qianmu.container.entity.Dict; +import qianmu.container.listener.ItemSelectedListener; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; + +public class ViewDeviceInfo extends ViewBase { + + + private BuildingAdapter buildingAdapter; + private FloorAdapter floorAdapter; + private DeviceNameAdapter deviceNameAdapter; + + ViewDeviceInfo(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + initBuildingInfo(); + initFloorInfo(); + initDeviceName(); + } + + @Override + protected void setData() { + updateBuildingInfo(); + + String syncTest = DeviceData.getDeviceInfo(DeviceData.HINT_SYNC_TEST, "关闭"); + if ("开启".equals(syncTest)) binding.rgSyncTest.check(R.id.sync_test_open); + else binding.rgSyncTest.check(R.id.sync_test_close); + + binding.deviceIp.setText(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_IP, DeviceUtil.getLocalIP()));//显示Ip + binding.tvProjectName.setText(FloorData.getMallName());//商场名称显示 + binding.deviceMac.setText(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_MAC, SignWayUtil.getEthMacAddress()));//显示Mac + } + + Building.Machine machine; + Building building; + Building.Floor floor; + @Override + protected void setListener() { + //确定按钮 + binding.saveDeviceInfo.setOnClickListener((view) -> saveDeviceInfo()); + + //楼栋 + binding.buildingInfo.setOnItemSelectedListener(new ItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position >= buildingAdapter.getCount()) { + Log.e("onItemSelected", "选中item超出设备类型总个数"); + return; + } + Log.e("TAG", "楼栋选中item"); + building = buildingAdapter.getData().get(position); + if (building == null) return; + + + List floorList = building.getFloor(); +// String buildingCode = StringUtil.getString(building.getCode()); +// DeviceData.saveDeviceInfo(DeviceData.BUILDING_CODE, buildingCode); +// DeviceData.saveDeviceInfo(DeviceData.BUILDING_NAME, building.getName()); + updateFloorInfo(floorList); + } + }); + + //楼层 + binding.floorInfo.setOnItemSelectedListener(new ItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position >= floorAdapter.getCount()) { + Log.e("onItemSelected", "选中item超出设备类型总个数"); + return; + } + Log.e("TAG", "楼层选中item"); + floor = floorAdapter.getData().get(position); + if (floor == null) return; +// String floorCode = StringUtil.getString(floor.getCode()); +// String floorName = StringUtil.getString(floor.getName()); +// DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE, floorCode); +// DeviceData.saveDeviceInfo(DeviceData.FLOOR_NAME, floorName); +// FloorData.saveCurrentFloorInfo(floor); + updateDeviceName(floor.getMachine()); + } + }); + + //设备 + binding.deviceName.setOnItemSelectedListener(new ItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position >= deviceNameAdapter.getCount()) { + Log.e("onItemSelected", "选中item超出设备类型总个数"); + return; + } + Log.e("TAG", "设备选中item"); + machine = deviceNameAdapter.getData().get(position); + if (machine == null) return; +// String dictCode = StringUtil.getString(machine.getCode()); +// DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_CODE, dictCode); +// FloorData.saveCurrentDeviceInfo(machine); + binding.deviceType.setText(machine.getMachineTypeName()); + + } + }); + + binding.updateServerInfo.setOnClickListener((view) -> { + if (listener != null) listener.onClick(ACTION_CHANGE_SERVER_INFO); + }); + binding.getRoot().setOnClickListener((view) -> { + + }); + } + + private void initBuildingInfo() { + buildingAdapter = new BuildingAdapter(context); + binding.buildingInfo.setAdapter(buildingAdapter); + } + + private void initFloorInfo() { + floorAdapter = new FloorAdapter(context); + binding.floorInfo.setAdapter(floorAdapter); + } + + private void initDeviceName() { + deviceNameAdapter = new DeviceNameAdapter(context); + binding.deviceName.setAdapter(deviceNameAdapter); + } + + + private void updateBuildingInfo() { + + List buildingList = FloorData.getBuildingList(); + buildingAdapter.setData(buildingList); + buildingAdapter.notifyDataSetChanged(); + if (buildingList==null || buildingList.size() == 0) return; + + String buildingCode = DeviceData.getDeviceInfo(DeviceData.BUILDING_CODE); + + for (int i = 0; i < buildingList.size(); i++) { + Building building = buildingList.get(i); + if (building == null) continue; + String tempCode = StringUtil.getString(building.getCode()); + + if (!tempCode.equals(buildingCode)) continue; + binding.buildingInfo.setSelection(i); + + List floorList = building.getFloor(); + updateFloorInfo(floorList == null ? new ArrayList<>() : floorList); + return; + } + + Building building = buildingList.get(0); + if (building == null) return; + binding.buildingInfo.setSelection(0); +// DeviceData.saveDeviceInfo(DeviceData.BUILDING_CODE, StringUtil.getString(building.getCode())); + + List floorList = buildingList.get(0).getFloor(); + updateFloorInfo(floorList == null ? new ArrayList<>() : floorList); + } + + private void updateFloorInfo(List floorList) { + + floorAdapter.setData(floorList); + floorAdapter.notifyDataSetChanged(); + if (floorList.size() == 0) return; + + String floorCode = DeviceData.getDeviceInfo(DeviceData.FLOOR_CODE); + + for (int i = 0; i < floorList.size(); i++) { + Building.Floor floor = floorList.get(i); + if (floor == null) continue; + + String tempCode = StringUtil.getString(floor.getCode()); + if (!tempCode.equals(floorCode)) continue; + + binding.floorInfo.setSelection(i); +// DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE, floor.getCode()); +// FloorData.saveCurrentFloorInfo(floor); + List machine = floor.getMachine(); + updateDeviceName(machine == null ? new ArrayList<>() : machine); + return; + } + + Building.Floor floor = floorList.get(0); + if (floor == null) return; + + binding.floorInfo.setSelection(0); + List machineList = floor.getMachine(); + updateDeviceName(machineList == null ? new ArrayList<>() : machineList); + +// DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE, StringUtil.getString(floor.getCode())); + } + + /** + * 设备名称信息 + * */ + private void updateDeviceName(List machineList) { + deviceNameAdapter.setData(machineList); + deviceNameAdapter.notifyDataSetChanged(); + if (machineList.size() == 0) return; + + String deviceId = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + for (int i = 0; i < machineList.size(); i++) { + Building.Machine machine = machineList.get(i); + if (machine == null) continue; + + String machineCode = StringUtil.getString(machine.getCode()); + if (!machineCode.equals(deviceId)) continue; + + binding.deviceName.setSelection(i); + return; + } + + machine = machineList.get(0); + if (machine == null) return; + + binding.deviceName.setSelection(0); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_CODE, StringUtil.getString(machine.getCode()));//设备code + FloorData.saveCurrentDeviceInfo(machine); + binding.deviceType.setText(machine.getMachineTypeName()); + } + + private void saveDeviceInfo() { + + String deviceIp = binding.deviceIp.getText().toString().trim(); + + int checkId = binding.rgSyncTest.getCheckedRadioButtonId(); + + if (StringUtil.isEmpty(deviceIp)) { + ToastUtils.showToast("ip地址未填写"); + return; + } + + if (building == null) { + ToastUtils.showToast("暂无楼栋数据"); + return; + } + String buildingCode = StringUtil.getString(building.getCode()); + DeviceData.saveDeviceInfo(DeviceData.BUILDING_CODE, buildingCode); + DeviceData.saveDeviceInfo(DeviceData.BUILDING_NAME, building.getName()); + + if (floor == null) { + ToastUtils.showToast("暂无楼层数据"); + return; + } + String floorCode = StringUtil.getString(floor.getCode()); + String floorName = StringUtil.getString(floor.getName()); + DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE, floorCode); + DeviceData.saveDeviceInfo(DeviceData.FLOOR_NAME, floorName); + FloorData.saveCurrentFloorInfo(floor); + + if (machine == null){ + ToastUtils.showToast("暂无设备数据"); + return; + } + + FloorData.saveCurrentDeviceInfo(machine); + + DeviceData.saveDeviceInfo(DeviceData.HINT_SYNC_TEST, checkId == R.id.sync_test_open ? "开启" : "关闭"); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_IP, deviceIp);//设备ip + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_CODE, StringUtil.getString(machine.getCode()));//设备code + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_NAME, StringUtil.getString(machine.getName()));//设备名称 + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE, StringUtil.getString(machine.getMachineTypeName()));//设备类型 + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TOUCH, String.valueOf(machine.getAttribute()));//设备触摸 + + String deviceCode = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + MqttData.getMQTTToken(deviceCode,null,null); + DeviceData.addDevice((DeviceInfoActivity) context, null, () -> { + if (listener != null) listener.onClick(ACTION_SAVE_DEVICE_INFO); + }); + } + + +} diff --git a/app/src/main/java/qianmu/container/activity/device/ViewInputPassword.java b/app/src/main/java/qianmu/container/activity/device/ViewInputPassword.java new file mode 100644 index 0000000..0456090 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/device/ViewInputPassword.java @@ -0,0 +1,61 @@ +package qianmu.container.activity.device; + +import android.content.Context; +import android.view.View; + +import java.text.SimpleDateFormat; + +import qianmu.container.activity.ViewBase; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.databinding.ViewInputPasswordBinding; +import qianmu.container.listener.ViewClickListener; +import qianmu.container.util.CalendarUtils; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; + +@SuppressWarnings("All") +public class ViewInputPassword extends ViewBase { + public ViewInputPassword(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + super.initView(); + } + + @Override + protected void setData() { + super.setData(); + binding.password.setText(""); + } + + @Override + protected void setListener() { + super.setListener(); + binding.confirm.setOnClickListener((view) -> { + SimpleDateFormat format = new SimpleDateFormat("ddMM"); + String pwd = format.format(System.currentTimeMillis());//当前日期当前月份 + StringBuilder sb = new StringBuilder(pwd); + String whatDay4 = CalendarUtils.getWhatDay4(System.currentTimeMillis()); + pwd = sb.insert(2, whatDay4).toString();//密码为日星期月6位数 + String inputPWD = binding.password.getText().toString().trim();//输入的密码 + if (!pwd.equals(inputPWD)) { + ToastUtils.showToast("密码错误"); + return; + } + if (listener != null) listener.onClick(ACTION_CHANGE_SERVER_INFO); + }); + binding.cancel.setOnClickListener((View) -> { + if (listener != null) listener.onClick(ACTION_CANCEL); + }); + binding.getRoot().setOnClickListener((view) -> { + + }); + } + + public void setViewClickListener(ViewClickListener listener) { + this.listener = listener; + } +} diff --git a/app/src/main/java/qianmu/container/activity/device/ViewServerInfo.java b/app/src/main/java/qianmu/container/activity/device/ViewServerInfo.java new file mode 100644 index 0000000..480dce2 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/device/ViewServerInfo.java @@ -0,0 +1,94 @@ +package qianmu.container.activity.device; + +import android.content.Context; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Toast; + +import com.alibaba.android.arouter.launcher.ARouter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import qianmu.container.activity.ViewBase; +import qianmu.container.adapter.ContainerTypeAdapter; +import qianmu.container.app.Constant; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.databinding.ViewServerInfoBinding; +import qianmu.container.entity.Building; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.ItemSelectedListener; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; + +public class ViewServerInfo extends ViewBase { + + ViewServerInfo(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + + } + + @Override + protected void setData() { + binding.serverIp.setText(DeviceData.getDeviceInfo(DeviceData.HINT_SERVER_IP).isEmpty()?Constant.DEFAULT_SERVER_IP:DeviceData.getDeviceInfo(DeviceData.HINT_SERVER_IP)); + binding.regKey.setText(DeviceData.getDeviceInfo(DeviceData.HINT_REG_KEY)); + } + + @Override + protected void setListener() { + + //获取楼层楼栋 + binding.queryConstList.setOnClickListener((view) -> { + String serverIP = binding.serverIp.getText().toString().trim(); + String regKey = binding.regKey.getText().toString().trim();//商场注册码 + + if(!serverIP.contains("http")){ + ToastUtils.showToast("请输入正确服务器地址"); + return; + } + //验证服务器信息是否为空 + if (StringUtil.isEmpty(serverIP)) { + ToastUtils.showToast("请先完善服务器信息"); + return; + } + //更新本地的服务器信息 + DeviceData.saveDeviceInfo(DeviceData.HINT_SERVER_IP, serverIP); + DeviceData.saveDeviceInfo(DeviceData.HINT_REG_KEY, regKey); + RetrofitUtil.removeService(); + + //清除缓存的楼层楼栋数据 +// FloorData.saveBuildingList(new ArrayList<>()); + + FloorData.getDeviceOptionsNew(regKey, null, () -> { + if (listener != null) listener.onClick(ACTION_CHANGE_DEVICE_INFO); + }); + + }); + binding.getRoot().setOnClickListener((view) -> { + + }); + + //下一步 + binding.btNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + List buildingList = FloorData.getBuildingList(); + if(buildingList==null||buildingList.size()==0){ + ToastUtils.showToast("请先获取楼层楼栋数据"); + return; + } + if (listener != null) listener.onClick(ACTION_CHANGE_DEVICE_INFO); + } + }); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/program/MyPresentation.java b/app/src/main/java/qianmu/container/activity/program/MyPresentation.java new file mode 100644 index 0000000..a8dde71 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/MyPresentation.java @@ -0,0 +1,4334 @@ +package qianmu.container.activity.program; + +import android.app.Presentation; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.TranslateAnimation; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.VideoView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.airbnb.lottie.LottieAnimationView; +import com.alibaba.android.arouter.launcher.ARouter; +import com.bumptech.glide.Glide; +import com.dl7.player.media.IjkPlayerView; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import cz.msebera.android.httpclient.Header; +import qianmu.container.R; +import qianmu.container.activity.H5.CoreService; +import qianmu.container.adapter.WeatherAdapter0; +import qianmu.container.adapter.WeatherAdapter1; +import qianmu.container.app.Constant; +import qianmu.container.data.DeviceData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.entity.FacilitiesBean; +import qianmu.container.entity.InterFaceBean; +import qianmu.container.entity.MapDataListBean; +import qianmu.container.entity.NewProgramBean; +import qianmu.container.entity.ResourceFileBean; +import qianmu.container.entity.Resp; +import qianmu.container.entity.ShuipaiDataListBean; +import qianmu.container.entity.TextBean; +import qianmu.container.entity.WeatherBean; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.socket.manager.LocSocCliManager; +import qianmu.container.socket.manager.SocketServerManager; +import qianmu.container.util.AesUtil; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.ColorUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; +import qianmu.container.view.AutoScrollTextView; +import qianmu.container.view.CustomerVideoView; +import qianmu.container.view.MarqueeTextView; +import qianmu.container.view.MarqueeTextView2; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * 双屏异显 + * */ +class MyPresentation extends Presentation { + + public static final int PLAY_PROGRAM = 0; + public static final int PLAY_PROGRAM_BY_INDEX = 1; + + static final int TYPE_UPDATE_PROGRAMME = 500;//切换日程单 + static final int TYPE_UPDATE_PROGRAM = 501;//切换节目单 + static final int TYPE_UPDATE_VIDEO0 = 502;//视频更新 + static final int TYPE_UPDATE_VIDEO1 = 503;//视频更新 + static final int TYPE_UPDATE_IMAGE0 = 504;//图片更新 + static final int TYPE_UPDATE_IMAGE1 = 505;//图片更新 + static final int TYPE_UPDATE_IMAGE2 = 506;//图片更新 + static final int TYPE_UPDATE_IMAGE3 = 507;//图片更新 + static final int TYPE_UPDATE_IMAGE4 = 508;//图片更新 + static final int TYPE_UPDATE_IMAGE5 = 509;//图片更新 + static final int TYPE_UPDATE_IMAGE6 = 510;//图片更新 + static final int TYPE_UPDATE_IMAGE7 = 511;//图片更新 + static final int TYPE_UPDATE_IMAGE8 = 512;//图片更新 + static final int TYPE_UPDATE_IMAGE9 = 513;//图片更新 + static final int TYPE_UPDATE_IMAGE10 = 514;//图片更新 + static final int TYPE_UPDATE_IMAGE11 = 515;//图片更新 + static final int TYPE_UPDATE_IMAGE12 = 516;//图片更新 + static final int TYPE_UPDATE_IMAGE13 = 517;//图片更新 + static final int TYPE_UPDATE_IMAGE14 = 518;//图片更新 + static final int TYPE_UPDATE_IMAGE15 = 519;//图片更新 + + static final int TYPE_UPDATE_TEXT4 = 524;//文本更新 + + static final int TYPE_UPDATE_TIME0 = 536;//时间更新 + static final int TYPE_UPDATE_MEIDA0 = 537;//音频更新 + static final int TYPE_UPDATE_WEATHER0 = 538;//天气更新 + static final int TYPE_UPDATE_DATA = 539;//更新JSON + static final int TYPE_TIME_UPDATE_DATA = 540;//定时更新JSON + static final int TYPE_UPDATE_MACTH = 542;//匹配时间是否更新; + static final int TYPE_DOWNLOAD_FILE = 543;//下载文件 + static final int TYPE_GET_NEXT_OTHER_IMG = 544;//下个节目的图片 + static final int TYPE_STOP_VIDEO_PLAY0 = 545;//暂停播放 + static final int TYPE_STOP_VIDEO_PLAY1 = 546;//暂停播放 + static final int TYPE_HINT_IMG0 = 547;//隐藏额外图片 + static final int TYPE_HINT_IMG1 = 548;//隐藏额外图片 + static final int TYPE_HINT_IMG2 = 549;//隐藏额外图片 + static final int TYPE_HINT_IMG3 = 550;//隐藏额外图片 + static final int TYPE_HINT_IMG4 = 551;//隐藏额外图片 + static final int TYPE_HINT_IMG5 = 552;//隐藏额外图片 + static final int TYPE_HINT_IMG6 = 553;//隐藏额外图片 + static final int TYPE_HINT_IMG7 = 554;//隐藏额外图片 + static final int TYPE_HINT_IMG8 = 555;//隐藏额外图片 + static final int TYPE_HINT_IMG9 = 556;//隐藏额外图片 + static final int TYPE_HINT_IMG10 = 557;//隐藏额外图片 + static final int TYPE_HINT_IMG11 = 558;//隐藏额外图片 + static final int TYPE_HINT_IMG12 = 559;//隐藏额外图片 + static final int TYPE_HINT_IMG13 = 560;//隐藏额外图片 + static final int TYPE_HINT_IMG14 = 561;//隐藏额外图片 + static final int TYPE_HINT_IMG15 = 562;//隐藏额外图片 + static final int TYPE_CHANGE_PROGRAMME_STATE = 563;//切换日程状态 + + static final int TYPE_GET_NEXT_PROGRAMME_OTHER_IMG = 564;//获取下个日程的第一个节目的图片 + static final int TYPE_CHANGE_IMG_SHOW0 = 565;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW1 = 566;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW2 = 567;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW3 = 568;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW4 = 569;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW5 = 570;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW6 = 571;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW7 = 572;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW8 = 573;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW9 = 574;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW10 = 575;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW11 = 576;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW12 = 577;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW13 = 578;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW14 = 579;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW15 = 580;//预加载下张图片 + static final int TYPE_START_PLAY_SVGA = 581;//开始播放svga动画 + static final int TYPE_REFRESH_WEBVIEW0 = 582;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW1 = 583;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW2 = 584;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW3 = 585;//网页刷新 + static final int TYPE_SHUIPAI = 586;//水牌 + static final int TYPE_BRAND0 = 587;//品牌 + static final int TYPE_BRAND1 = 588;//品牌 + static final int TYPE_BRAND2 = 589;//品牌 + static final int TYPE_BRAND3 = 590;//品牌 + static final int TYPE_BRAND4 = 591;//品牌 + static final int TYPE_BRAND5 = 592;//品牌 + static final int TYPE_BRAND6 = 593;//品牌 + static final int TYPE_BRAND7 = 594;//品牌 + static final int TYPE_BRAND8 = 595;//品牌 + static final int TYPE_BRAND9 = 596;//品牌 + static final int TYPE_BRAND10 = 597;//品牌 + static final int TYPE_BRAND11 = 598;//品牌 + static final int TYPE_BRAND12 = 599;//品牌 + static final int TYPE_BRAND13 = 600;//品牌 + static final int TYPE_BRAND14 = 601;//品牌 + static final int TYPE_BRAND15 = 602;//品牌 + static final int TYPE_FACILITIES0= 603;//公共设施 + static final int TYPE_FACILITIES1 = 604;//公共设施 + static final int TYPE_FACILITIES2 = 605;//公共设施 + static final int TYPE_FACILITIES3 = 606;//公共设施 + static final int TYPE_FACILITIES4 = 607;//公共设施 + static final int TYPE_FACILITIES5 = 608;//公共设施 + static final int TYPE_FACILITIES6 = 609;//公共设施 + static final int TYPE_FACILITIES7 = 610;//公共设施 + static final int TYPE_FACILITIES8 = 611;//公共设施 + static final int TYPE_FACILITIES9 = 612;//公共设施 + static final int TYPE_FACILITIES10 = 613;//公共设施 + static final int TYPE_FACILITIES11 = 614;//公共设施 + static final int TYPE_FACILITIES12 = 615;//公共设施 + static final int TYPE_FACILITIES13 = 616;//公共设施 + static final int TYPE_FACILITIES14 = 617;//公共设施 + static final int TYPE_FACILITIES15 = 618;//公共设施 + static final int TYPE_POSITION0 = 619;//点位 + static final int TYPE_POSITION1 = 620;//点位 + static final int TYPE_POSITION2 = 621;//点位 + static final int TYPE_POSITION3 = 622;//点位 + static final int TYPE_POSITION4 = 623;//点位 + static final int TYPE_POSITION5 = 624;//点位 + static final int TYPE_POSITION6 = 625;//点位 + static final int TYPE_POSITION7 = 626;//点位 + static final int TYPE_POSITION8 = 627;//点位 + static final int TYPE_POSITION9 = 628;//点位 + static final int TYPE_POSITION10 = 629;//点位 + static final int TYPE_POSITION11 = 630;//点位 + static final int TYPE_POSITION12 = 631;//点位 + static final int TYPE_POSITION13 = 632;//点位 + static final int TYPE_POSITION14 = 633;//点位 + static final int TYPE_POSITION15 = 634;//点位 + + static final int TYPE_JUDGE_START_PROGRAM = 635;//判断是否已经开始了节目播放 + static final int TYPE_START_PLAY_PROGRAM = 636;//开始播放节目 + + static final int TYPE_MAP = 637;//地图组件 + static final int TYPE_LOAD_MAP_DATA = 638;//地图组件数据 + + //开始播放下标 + int videoPlayCount0 = 0; + int videoPlayCount1 = 0; + boolean isvideoPlay0 = false; + boolean isvideoPlay1 = false; + + int imagePlayCount0 = 0; + int imagePlayCount1 = 0; + int imagePlayCount2 = 0; + int imagePlayCount3 = 0; + int imagePlayCount4 = 0; + int imagePlayCount5 = 0; + int imagePlayCount6 = 0; + int imagePlayCount7 = 0; + int imagePlayCount8 = 0; + int imagePlayCount9 = 0; + int imagePlayCount10 = 0; + int imagePlayCount11 = 0; + int imagePlayCount12 = 0; + int imagePlayCount13 = 0; + int imagePlayCount14 = 0; + int imagePlayCount15 = 0; + + //品牌 + int brandImageCount0 = 0; + int brandImageCount1 = 0; + int brandImageCount2 = 0; + int brandImageCount3 = 0; + int brandImageCount4 = 0; + int brandImageCount5 = 0; + int brandImageCount6 = 0; + int brandImageCount7 = 0; + int brandImageCount8 = 0; + int brandImageCount9 = 0; + int brandImageCount10 = 0; + int brandImageCount11 = 0; + int brandImageCount12 = 0; + int brandImageCount13 = 0; + int brandImageCount14 = 0; + int brandImageCount15 = 0; + //设施 + int facilitiesImageCount0 = 0; + int facilitiesImageCount1 = 0; + int facilitiesImageCount2 = 0; + int facilitiesImageCount3 = 0; + int facilitiesImageCount4 = 0; + int facilitiesImageCount5 = 0; + int facilitiesImageCount6 = 0; + int facilitiesImageCount7 = 0; + int facilitiesImageCount8 = 0; + int facilitiesImageCount9 = 0; + int facilitiesImageCount10 = 0; + int facilitiesImageCount11 = 0; + int facilitiesImageCount12 = 0; + int facilitiesImageCount13 = 0; + int facilitiesImageCount14 = 0; + int facilitiesImageCount15 = 0; + + //点位 + int positionImageCount0 = 0; + int positionImageCount1 = 0; + int positionImageCount2 = 0; + int positionImageCount3 = 0; + int positionImageCount4 = 0; + int positionImageCount5 = 0; + int positionImageCount6 = 0; + int positionImageCount7 = 0; + int positionImageCount8 = 0; + int positionImageCount9 = 0; + int positionImageCount10 = 0; + int positionImageCount11 = 0; + int positionImageCount12 = 0; + int positionImageCount13 = 0; + int positionImageCount14 = 0; + int positionImageCount15 = 0; + + int programme = 0;//日程 + int program = 0;//节目 + + boolean imagePlay0 = true; + boolean imagePlay1 = true; + boolean imagePlay2 = true; + boolean imagePlay3 = true; + boolean imagePlay4 = true; + boolean imagePlay5 = true; + boolean imagePlay6 = true; + boolean imagePlay7 = true; + boolean imagePlay8 = true; + boolean imagePlay9 = true; + boolean imagePlay10 = true; + boolean imagePlay11 = true; + boolean imagePlay12 = true; + boolean imagePlay13 = true; + boolean imagePlay14 = true; + boolean imagePlay15 = true; + + boolean firstImagePlay0 = true; + boolean firstImagePlay1 = true; + boolean firstImagePlay2 = true; + boolean firstImagePlay3 = true; + boolean firstImagePlay4 = true; + boolean firstImagePlay5 = true; + boolean firstImagePlay6 = true; + boolean firstImagePlay7 = true; + boolean firstImagePlay8 = true; + boolean firstImagePlay9 = true; + boolean firstImagePlay10 = true; + boolean firstImagePlay11 = true; + boolean firstImagePlay12 = true; + boolean firstImagePlay13 = true; + boolean firstImagePlay14 = true; + boolean firstImagePlay15 = true; + + Map bigFiles = new HashMap<>(); //大后台文件 + Map mapFiles = new HashMap<>(); //大后台文件 + + int mapDownloadCount = 0;//下载数量 + + long startImgTime=0; + long startVideoTime=0; + long startchangeProgram=0;//切换节目开始时间,防止多次切换 + + boolean isNextVideo = false;//下个节目是否有视频 + + boolean isChangProgramme = false;//日程切换 + + + List data = new ArrayList<>(); + int width; + int height; + View[] viewList; + int index = 0; + + Map colorMap; + + boolean isZeroPoint = false; //凌晨时间 + + Handler handler = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + switch (msg.what){ + + case TYPE_UPDATE_PROGRAMME://切换日程单 + + programme++; + Log.e("(双面屏)TAG","切换日程单"+programme); + program=0; + + if(programme >= currentProgramBean.getSchedule().size()){ + deleteView(); + return; + } + NewProgramBean.schedule schedule = currentProgramBean.getSchedule().get(programme); + try { +// String s = TimeUtil.stampToDate(System.currentTimeMillis()); + long beginTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+" "+schedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + if(System.currentTimeMillis() >= beginTimeLong){ + program=0; + isChangProgramme = true; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.sendEmptyMessage(TYPE_UPDATE_PROGRAM); + handler.sendEmptyMessageDelayed(TYPE_CHANGE_PROGRAMME_STATE,5000); + + }else { + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAM,beginTimeLong-System.currentTimeMillis()); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + //是否有下个日程 + if(programme + 1 >= currentProgramBean.getSchedule().size()){ + //没有日程清除所有 + + if(!schedule.getEndTime().equals("23:59:59")){ + try { + //最后一个节目结束时间 + long endTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+" "+schedule.getEndTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,endTimeLong - System.currentTimeMillis()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return; + } + + //下个日程 + NewProgramBean.schedule nextSchedule = currentProgramBean.getSchedule().get(programme + 1); + try { + long beginTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+ " "+ nextSchedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,beginTimeLong - System.currentTimeMillis()); + //提前10秒通知获取下个日程的第一个节目的图片 +// handler.sendEmptyMessageDelayed(TYPE_GET_NEXT_PROGRAMME_OTHER_IMG,beginTimeLong - (System.currentTimeMillis()+5000)); + } catch (Exception e) { + e.printStackTrace(); + } + + break; + + case TYPE_CHANGE_PROGRAMME_STATE: + + isChangProgramme=false; + + break; + + case TYPE_UPDATE_PROGRAM://切换节目单 + Log.e("(双面屏)TAG","切换节目单"+program); + + try { + + if(!isChangProgramme){ + if(System.currentTimeMillis()-startchangeProgram<2000){ + //防止重复调用导致图片不同步 + return; + }else { + startchangeProgram = System.currentTimeMillis(); + } + } + + if(currentProgramBean==null){ + return; + } + if(program >= currentProgramBean.getSchedule().get(programme).getPrograms().size()){ + program=0; + } + if (Constant.isMain) { + Log.e("(双面屏)TAG","主设备向其他设备发送节目下标"+program); + SocketServerManager.sendMessageToClient(LocSocCliManager.NEXT_PROGRAM_INDEX, String.valueOf(program)); + } + + deleteView(); + + createView( currentProgramBean.getSchedule().get(programme), program); + + }catch (Exception e){ + LoggerUtil.e("(双面屏)TYPE_UPDATE_PROGRAM:" ,e.getMessage()); + } + + break; + + case TYPE_GET_NEXT_OTHER_IMG: + //下个节目的图片 + try { + if(currentProgramBean==null){ + return; + } + if(currentProgramBean.getSchedule().size()<=0){ + return; + } + if(currentProgramBean.getSchedule().get(programme)==null){ + return; + } + NewProgramBean.programs nextprograms; + if(nextimg+1 < currentProgramBean.getSchedule().get(programme).getPrograms().size()){ + nextprograms = currentProgramBean.getSchedule().get(programme).getPrograms().get(nextimg + 1); + }else { + nextprograms = currentProgramBean.getSchedule().get(programme).getPrograms().get(0); + } + int videoViewNumb= 0 ; + int otherImgCount = 0; + for(int i=0;i0){ + //视频 + + if(components.getMaterials().get(0).getPreviewUrl()!=null && !components.getMaterials().get(0).getPreviewUrl().isEmpty()){ + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getPreviewUrl(),videoImg2); + } + +// String[] b = localPath.split("\\."); +// String imgUrl = b[0]+".jpg"; +// if(new File(imgUrl).exists()){ +// binding.videoImg0.setVisibility(View.GONE); +// Glide.with(context).load(imgUrl).into(binding.videoImg0) +// } + }else { + //图片 + if(new File(localPath).exists()){ + Glide.with(context).load(localPath).into(videoImg2); + } + } + + if(!isNextVideo){ + Log.e("(双面屏)TAG","预览设置下个视频"); + isNextVideo=true; + if(components.getMaterials().get(0).getDuration()>0){ + videoView2.setVideoPath(localPath); + }else { + //图片 + Drawable drawable = new BitmapDrawable(localPath); + videoView2.setBackground(drawable); + + } + } + }else { + //第二个videoview + if(components.getMaterials().get(0).getDuration()>0){ + //视频 + + if(components.getMaterials().get(0).getPreviewUrl()!=null && !components.getMaterials().get(0).getPreviewUrl().isEmpty()){ + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getPreviewUrl(),videoImg3); + } +// String[] b = localPath.split("\\."); +// String imgUrl = b[0]+".jpg"; +// if(new File(imgUrl).exists()){ +// binding.videoImg1.setVisibility(View.GONE); +// Glide.with(context).load(imgUrl).into(binding.videoImg1); +// } + }else { + //图片 + if(new File(localPath).exists()){ + Glide.with(context).load(localPath).into(videoImg3); + } + } + + if(!isNextVideo){ + Log.e("(双面屏)TAG","预览设置下个视频"); + isNextVideo=true; + if(components.getMaterials().get(0).getDuration()>0){ + videoView2.setVideoPath(localPath); + }else { + //图片 + Drawable drawable = new BitmapDrawable(localPath); + videoView2.setBackground(drawable); + + } + } + } + + videoViewNumb++; + } + } + }catch (Exception e){ + LoggerUtil.e("(双面屏)TYPE_GET_NEXT_OTHER_IMG报错",e.getMessage()); + } + + break; + + case TYPE_GET_NEXT_PROGRAMME_OTHER_IMG://下个日程的第一个节目的图片 + + if(programme >= currentProgramBean.getSchedule().size()){ + return; + } + try { + NewProgramBean.programs nextprogram = currentProgramBean.getSchedule().get(programme+1).getPrograms().get(0); + int otherImgCount2=0; + for(int i=0;i0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW0,getRefreshWebTime(webComponents0)); + onlineWebView0.loadUrl(webComponents0.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW1://网页刷新 + if(getRefreshWebTime(webComponents1)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW1,getRefreshWebTime(webComponents1)); + onlineWebView1.loadUrl(webComponents1.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW2://网页刷新 + if(getRefreshWebTime(webComponents2)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW2,getRefreshWebTime(webComponents2)); + onlineWebView2.loadUrl(webComponents2.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW3://网页刷新 + if(getRefreshWebTime(webComponents3)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW3,getRefreshWebTime(webComponents3)); + onlineWebView3.loadUrl(webComponents3.getMaterials().get(0).getOuterChain()); + } + break; + case TYPE_SHUIPAI://水牌 + if(shuipaifacenumb == shuipaifacenumb_finish){ + LoggerUtil.e("(双面屏)TYPE_SHUIPAI","接口请求完成,开始加载水牌"); + spWebView.clearCache(true); + setWebView(spWebView,"http://127.0.0.1:8080/"+"?url="+Constant.getBaseAddress()); + + }else { + sendEmptyMessageDelayed(TYPE_SHUIPAI,2000); + } + break; + + case TYPE_MAP://地图 + LoggerUtil.e("(双面屏)TYPE_MAP","接口请求完成,开始加载地图"); + if(mapWebView!=null){ + mapWebView.clearCache(true); + setWebView(mapWebView,"http://127.0.0.1:8080/"); + } + break; + + case TYPE_UPDATE_TIME0://时间 +// Log.e("TAG","更新时间"); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_TIME0,60*1000); + chooseTime(timeComponents0.getConfig().getStyle()); + break; + + case TYPE_BRAND0: + brandImageCount0++; + updateBrandOrfacilities(brandImageCount0,0,brandImageViewList,TYPE_BRAND0); + break; + case TYPE_BRAND1: + brandImageCount1++; + updateBrandOrfacilities(brandImageCount1,1,brandImageViewList,TYPE_BRAND1); + break; + case TYPE_BRAND2: + brandImageCount2++; + updateBrandOrfacilities(brandImageCount2,2,brandImageViewList,TYPE_BRAND2); + break; + case TYPE_BRAND3: + brandImageCount3++; + updateBrandOrfacilities(brandImageCount3,3,brandImageViewList,TYPE_BRAND3); + break; + case TYPE_BRAND4: + brandImageCount4++; + updateBrandOrfacilities(brandImageCount4,4,brandImageViewList,TYPE_BRAND4); + break; + case TYPE_BRAND5: + brandImageCount5++; + updateBrandOrfacilities(brandImageCount5,5,brandImageViewList,TYPE_BRAND5); + break; + case TYPE_BRAND6: + brandImageCount6++; + updateBrandOrfacilities(brandImageCount6,6,brandImageViewList,TYPE_BRAND6); + break; + case TYPE_BRAND7: + brandImageCount7++; + updateBrandOrfacilities(brandImageCount7,7,brandImageViewList,TYPE_BRAND7); + break; + case TYPE_BRAND8: + brandImageCount8++; + updateBrandOrfacilities(brandImageCount8,8,brandImageViewList,TYPE_BRAND8); + break; + case TYPE_BRAND9: + brandImageCount9++; + updateBrandOrfacilities(brandImageCount9,9,brandImageViewList,TYPE_BRAND9); + break; + case TYPE_BRAND10: + brandImageCount10++; + updateBrandOrfacilities(brandImageCount10,10,brandImageViewList,TYPE_BRAND10); + break; + case TYPE_BRAND11: + brandImageCount11++; + updateBrandOrfacilities(brandImageCount11,11,brandImageViewList,TYPE_BRAND11); + break; + + case TYPE_BRAND12: + brandImageCount12++; + updateBrandOrfacilities(brandImageCount12,12,brandImageViewList,TYPE_BRAND12); + break; + case TYPE_BRAND13: + brandImageCount13++; + updateBrandOrfacilities(brandImageCount13,13,brandImageViewList,TYPE_BRAND13); + break; + case TYPE_BRAND14: + brandImageCount14++; + updateBrandOrfacilities(brandImageCount14,14,brandImageViewList,TYPE_BRAND14); + break; + case TYPE_BRAND15: + brandImageCount15++; + updateBrandOrfacilities(brandImageCount15,15,brandImageViewList,TYPE_BRAND15); + break; + case TYPE_FACILITIES0: + + facilitiesImageCount0++; + updateBrandOrfacilities(facilitiesImageCount0,0,facilitiesImageViewList,TYPE_FACILITIES0); + break; + case TYPE_FACILITIES1: + + facilitiesImageCount1++; + updateBrandOrfacilities(facilitiesImageCount1,1,facilitiesImageViewList,TYPE_FACILITIES1); + break; + case TYPE_FACILITIES2: + facilitiesImageCount2++; + updateBrandOrfacilities(facilitiesImageCount2,2,facilitiesImageViewList,TYPE_FACILITIES2); + break; + case TYPE_FACILITIES3: + facilitiesImageCount3++; + updateBrandOrfacilities(facilitiesImageCount3,3,facilitiesImageViewList,TYPE_FACILITIES3); + break; + case TYPE_FACILITIES4: + facilitiesImageCount4++; + updateBrandOrfacilities(facilitiesImageCount4,4,facilitiesImageViewList,TYPE_FACILITIES4); + break; + case TYPE_FACILITIES5: + facilitiesImageCount5++; + updateBrandOrfacilities(facilitiesImageCount5,5,facilitiesImageViewList,TYPE_FACILITIES5); + break; + case TYPE_FACILITIES6: + facilitiesImageCount6++; + updateBrandOrfacilities(facilitiesImageCount6,6,facilitiesImageViewList,TYPE_FACILITIES6); + break; + case TYPE_FACILITIES7: + facilitiesImageCount7++; + updateBrandOrfacilities(facilitiesImageCount7,7,facilitiesImageViewList,TYPE_FACILITIES7); + break; + case TYPE_FACILITIES8: + facilitiesImageCount8++; + updateBrandOrfacilities(facilitiesImageCount8,8,facilitiesImageViewList,TYPE_FACILITIES8); + break; + case TYPE_FACILITIES9: + facilitiesImageCount9++; + updateBrandOrfacilities(facilitiesImageCount9,9,facilitiesImageViewList,TYPE_FACILITIES9); + break; + case TYPE_FACILITIES10: + facilitiesImageCount10++; + updateBrandOrfacilities(facilitiesImageCount10,10,facilitiesImageViewList,TYPE_FACILITIES10); + break; + case TYPE_FACILITIES11: + facilitiesImageCount11++; + updateBrandOrfacilities(facilitiesImageCount11,11,facilitiesImageViewList,TYPE_FACILITIES11); + break; + case TYPE_FACILITIES12: + facilitiesImageCount12++; + updateBrandOrfacilities(facilitiesImageCount12,12,facilitiesImageViewList,TYPE_FACILITIES12); + break; + case TYPE_FACILITIES13: + facilitiesImageCount13++; + updateBrandOrfacilities(facilitiesImageCount13,13,facilitiesImageViewList,TYPE_FACILITIES13); + break; + case TYPE_FACILITIES14: + facilitiesImageCount14++; + updateBrandOrfacilities(facilitiesImageCount14,14,facilitiesImageViewList,TYPE_FACILITIES14); + break; + case TYPE_FACILITIES15: + facilitiesImageCount15++; + updateBrandOrfacilities(facilitiesImageCount15,15,facilitiesImageViewList,TYPE_FACILITIES15); + break; + + //点位 + case TYPE_POSITION0: + positionImageCount0++; + updateBrandOrfacilities(positionImageCount0,0,positionImageViewList,TYPE_POSITION0); + break; + case TYPE_POSITION1: + positionImageCount1++; + updateBrandOrfacilities(positionImageCount1,1,positionImageViewList,TYPE_POSITION1); + break; + case TYPE_POSITION2: + positionImageCount2++; + updateBrandOrfacilities(positionImageCount2,2,positionImageViewList,TYPE_POSITION2); + break; + case TYPE_POSITION3: + positionImageCount3++; + updateBrandOrfacilities(positionImageCount3,3,positionImageViewList,TYPE_POSITION3); + break; + case TYPE_POSITION4: + positionImageCount4++; + updateBrandOrfacilities(positionImageCount4,4,positionImageViewList,TYPE_POSITION4); + break; + case TYPE_POSITION5: + positionImageCount5++; + updateBrandOrfacilities(positionImageCount5,5,positionImageViewList,TYPE_POSITION5); + break; + case TYPE_POSITION6: + positionImageCount6++; + updateBrandOrfacilities(positionImageCount6,6,positionImageViewList,TYPE_POSITION6); + break; + case TYPE_POSITION7: + positionImageCount7++; + updateBrandOrfacilities(positionImageCount7,7,positionImageViewList,TYPE_POSITION7); + break; + case TYPE_POSITION8: + positionImageCount8++; + updateBrandOrfacilities(positionImageCount8,8,positionImageViewList,TYPE_POSITION8); + break; + case TYPE_POSITION9: + positionImageCount9++; + updateBrandOrfacilities(positionImageCount9,9,positionImageViewList,TYPE_POSITION9); + break; + case TYPE_POSITION10: + positionImageCount10++; + updateBrandOrfacilities(positionImageCount10,10,positionImageViewList,TYPE_POSITION10); + break; + case TYPE_POSITION11: + positionImageCount11++; + updateBrandOrfacilities(positionImageCount11,11,positionImageViewList,TYPE_POSITION11); + break; + case TYPE_POSITION12: + positionImageCount12++; + updateBrandOrfacilities(positionImageCount12,12,positionImageViewList,TYPE_POSITION12); + break; + case TYPE_POSITION13: + positionImageCount13++; + updateBrandOrfacilities(positionImageCount13,13,positionImageViewList,TYPE_POSITION13); + break; + case TYPE_POSITION14: + positionImageCount14++; + updateBrandOrfacilities(positionImageCount14,14,positionImageViewList,TYPE_POSITION14); + break; + case TYPE_POSITION15: + positionImageCount15++; + updateBrandOrfacilities(positionImageCount15,15,positionImageViewList,TYPE_POSITION15); + break; + case TYPE_UPDATE_MACTH://匹配是否更新数据 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MACTH,5*1000); + + if(TimeUtil.stampTotime(System.currentTimeMillis()).equals("00:00") && isZeroPoint==false){ + //第二天凌晨 + isZeroPoint=true; + LoggerUtil.e("(双面屏)TYPE_UPDATE_MACTH","第二天凌晨更新日程"); + sendEmptyMessage(TYPE_DOWNLOAD_FILE); + }else if(!TimeUtil.stampTotime(System.currentTimeMillis()).equals("00:00") && isZeroPoint==true){ + isZeroPoint=false; + } + + break; + + + case TYPE_TIME_UPDATE_DATA://定时获取数据,有变化则更新 + handler.sendEmptyMessageDelayed(TYPE_TIME_UPDATE_DATA,5*60*1000); + + break; + + case TYPE_UPDATE_WEATHER0://天气更新 + try { + String cityName = weatherComponents0.getConfig().getCityName(); + if(!cityName.isEmpty()){ + getWeather(cityName,null,null); + }else { + if(DeviceData.getDevice().getCity() !=null || !DeviceData.getDevice().getCity().isEmpty()){ + getWeather(DeviceData.getDevice().getCity(),null,null); + } + }; + }catch (Exception e){ + + } + + break; + + case TYPE_DOWNLOAD_FILE://下载文件 + + //下载完成 + LoggerUtil.e("(双面屏)TAG","下载完成"); + if(newdata!=null){ + ScreenSaverData.saveScreenSaverList(newdata); + } + program=0; + programme=0; + isChangProgramme = false;//日程切换 + startchangeProgram=0; + startImgTime=0; + + //清除 + deleteView(); + clearOtherImg(); + sendEmptyMessageDelayed(TYPE_START_PLAY_PROGRAM,1000); + break; + + case TYPE_START_PLAY_PROGRAM://下载完成后,开始播放日程 + try { + LoggerUtil.e("(双面屏)TYPE_START_PLAY_PROGRAM","开始播放节目"); + startProgram(); + + List screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + String s = GsonUtil.getGson().toJson(screenSaverList); + NewProgramBean newProgramBean = screenSaverList.get(0); + if(s.contains("\"typeCode\":\"map\"") || s.contains("\"typeCode\":\"brand_list\"")){ + //有地图组件 + for(NewProgramBean.schedule schedule1 : newProgramBean.getSchedule()){ + for(NewProgramBean.programs programs :schedule1.getPrograms()){ + for(NewProgramBean.components components : programs.getComponents()){ + ScreenSaverData. getGetMapData(context,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getApi/",components.getCode()),null, null ); + getApiFileResourceList(context,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getFileResourceList/",components.getCode()),null, null ); + break; + } + } + } + } + + //没节目时候进入导视 + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE); + if ((!deviceType.equals("信发") && !deviceType.equals("双面屏")) && !ScreenSaverData.isProgramPlay2()) { + LoggerUtil.e("(双面屏)TYPE_START_PLAY_PROGRAM","没节目时候进入导视"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + + + }catch (Exception e){ + LoggerUtil.e("(双面屏)startProgram报错",e.getMessage()); + sendEmptyMessageDelayed(TYPE_DOWNLOAD_FILE,20*1000); + } + break; + + case TYPE_JUDGE_START_PROGRAM://判断是否已经开始了节目播放(设备启动后避免节目不方便) + if(!isStartProgram){ + LoggerUtil.e("启动40秒后判断是否在播节目","开机未启动播放节目,强制开始播放节目"); + startProgram(); + }else { + LoggerUtil.e("启动40秒后判断是否在播节目","有播放节目"); + } + + break; + + case TYPE_LOAD_MAP_DATA://下载地图组件数据 + + + break; + + } + } + }; + + Context context; + + public MyPresentation(Context context, Display display) { + super(context,display); + this.context = context; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.presentation); + initView(); + + } + + CustomerVideoView videoView2; + CustomerVideoView videoView3; + ImageView backgroundImage; + View layoutTime0; + View layoutTime1; + View layoutTime2; + View layoutTime3; + View layoutTime4; + View layoutVideo2; + View layoutVideo3; + View layoutImg0; + View layoutImg1; + View layoutImg2; + View layoutImg3; + View layoutImg4; + View layoutImg5; + View layoutImg6; + View layoutImg7; + View layoutImg8; + View layoutImg9; + View layoutImg10; + View layoutImg11; + View layoutImg12; + View layoutImg13; + View layoutImg14; + View layoutImg15; + ImageView otherImg0; + ImageView otherImg1; + ImageView otherImg2; + ImageView otherImg3; + ImageView otherImg4; + ImageView otherImg5; + ImageView otherImg6; + ImageView otherImg7; + ImageView otherImg8; + ImageView otherImg9; + ImageView otherImg10; + ImageView otherImg11; + ImageView otherImg12; + ImageView otherImg13; + ImageView otherImg14; + ImageView otherImg15; + RelativeLayout relativeLayoutMax; + ImageView videoImg2; + ImageView videoImg3; + ImageView img0; + ImageView img1; + ImageView img2; + ImageView img3; + ImageView img4; + ImageView img5; + ImageView img6; + ImageView img7; + ImageView img8; + ImageView img9; + ImageView img10; + ImageView img11; + ImageView img12; + ImageView img13; + ImageView img14; + ImageView img15; + ImageView img0Behind; + ImageView img1Behind; + ImageView img2Behind; + ImageView img3Behind; + ImageView img4Behind; + ImageView img5Behind; + ImageView img6Behind; + ImageView img7Behind; + ImageView img8Behind; + ImageView img9Behind; + ImageView img10Behind; + ImageView img11Behind; + ImageView img12Behind; + ImageView img13Behind; + ImageView img14Behind; + ImageView img15Behind; + TextView tvTime0; + TextView tvTime1; + TextView tvTime2; + TextView tvTime3; + TextView tvTime4; + TextView tvWeek0; + TextView tvWeek1; + TextView tvWeek2; + TextView tvWeek3; + TextView tvWeek4; + TextView tvDay0; + TextView tvDay1; + TextView tvDay2; + TextView tvDay3; + TextView tvDay4; + + private void initView(){ + videoView2 = findViewById(R.id.videoView2); + videoView3 = findViewById(R.id.videoView3); + backgroundImage = findViewById(R.id.background_image); + layoutTime0 = findViewById(R.id.layout_time0); + layoutTime1 = findViewById(R.id.layout_time1); + layoutTime2 = findViewById(R.id.layout_time2); + layoutTime3 = findViewById(R.id.layout_time3); + layoutTime4 = findViewById(R.id.layout_time4); + layoutVideo2 = findViewById(R.id.layout_video2); + layoutVideo3 = findViewById(R.id.layout_video3); + videoImg2 = findViewById(R.id.videoImg2); + videoImg3 = findViewById(R.id.videoImg3); + layoutImg0 = findViewById(R.id.layout_img0); + layoutImg1 = findViewById(R.id.layout_img1); + layoutImg2 = findViewById(R.id.layout_img2); + layoutImg3 = findViewById(R.id.layout_img3); + layoutImg4 = findViewById(R.id.layout_img4); + layoutImg5 = findViewById(R.id.layout_img5); + layoutImg6 = findViewById(R.id.layout_img6); + layoutImg7 = findViewById(R.id.layout_img7); + layoutImg8 = findViewById(R.id.layout_img8); + layoutImg9 = findViewById(R.id.layout_img9); + layoutImg10 = findViewById(R.id.layout_img10); + layoutImg11 = findViewById(R.id.layout_img11); + layoutImg12 = findViewById(R.id.layout_img12); + layoutImg13 = findViewById(R.id.layout_img13); + layoutImg14 = findViewById(R.id.layout_img14); + layoutImg15 = findViewById(R.id.layout_img15); + otherImg0 = findViewById(R.id.otherImg0); + otherImg1 = findViewById(R.id.otherImg1); + otherImg2 = findViewById(R.id.otherImg2); + otherImg3 = findViewById(R.id.otherImg3); + otherImg4 = findViewById(R.id.otherImg4); + otherImg5 = findViewById(R.id.otherImg5); + otherImg6 = findViewById(R.id.otherImg6); + otherImg7 = findViewById(R.id.otherImg7); + otherImg8 = findViewById(R.id.otherImg8); + otherImg9 = findViewById(R.id.otherImg9); + otherImg10 = findViewById(R.id.otherImg10); + otherImg11 = findViewById(R.id.otherImg11); + otherImg12 = findViewById(R.id.otherImg12); + otherImg13 = findViewById(R.id.otherImg13); + otherImg14 = findViewById(R.id.otherImg14); + otherImg15 = findViewById(R.id.otherImg15); + img0 = findViewById(R.id.img0); + img1 = findViewById(R.id.img1); + img2 = findViewById(R.id.img2); + img3 = findViewById(R.id.img3); + img4 = findViewById(R.id.img4); + img5 = findViewById(R.id.img5); + img6 = findViewById(R.id.img6); + img7 = findViewById(R.id.img7); + img8 = findViewById(R.id.img8); + img9 = findViewById(R.id.img9); + img10 = findViewById(R.id.img10); + img11 = findViewById(R.id.img11); + img12 = findViewById(R.id.img12); + img13 = findViewById(R.id.img13); + img14 = findViewById(R.id.img14); + img15 = findViewById(R.id.img15); + img0Behind = findViewById(R.id.img0_behind); + img1Behind = findViewById(R.id.img1_behind); + img2Behind = findViewById(R.id.img2_behind); + img3Behind = findViewById(R.id.img3_behind); + img4Behind = findViewById(R.id.img4_behind); + img5Behind = findViewById(R.id.img5_behind); + img6Behind = findViewById(R.id.img6_behind); + img7Behind = findViewById(R.id.img7_behind); + img8Behind = findViewById(R.id.img8_behind); + img9Behind = findViewById(R.id.img9_behind); + img10Behind = findViewById(R.id.img10_behind); + img11Behind = findViewById(R.id.img11_behind); + img12Behind = findViewById(R.id.img12_behind); + img13Behind = findViewById(R.id.img13_behind); + img14Behind = findViewById(R.id.img14_behind); + img15Behind = findViewById(R.id.img15_behind); + tvTime0 = findViewById(R.id.tv_time0); + tvTime1 = findViewById(R.id.tv_time1); + tvTime2 = findViewById(R.id.tv_time2); + tvTime3 = findViewById(R.id.tv_time3); + tvTime4 = findViewById(R.id.tv_time4); + tvWeek0 = findViewById(R.id.tv_week0); + tvWeek1 = findViewById(R.id.tv_week1); + tvWeek2 = findViewById(R.id.tv_week2); + tvWeek3 = findViewById(R.id.tv_week3); + tvWeek4 = findViewById(R.id.tv_week4); + tvDay0 = findViewById(R.id.tv_day0); + tvDay1 = findViewById(R.id.tv_day1); + tvDay2 = findViewById(R.id.tv_day2); + tvDay3 = findViewById(R.id.tv_day3); + tvDay4 = findViewById(R.id.tv_day4); + + relativeLayoutMax = findViewById(R.id.relativeLayout_max); + } + + @Override + protected void onStart() { + super.onStart(); + start(); + } + + /** + * 清除视频跟图片缓存(解决导视跳转屏保内存溢出问题) + * */ + public void clearCache(){ + if(videoView2!=null){ + videoView2.stopPlayback(); + videoView2.setBackground(null); + } + if(videoView3!=null){ + videoView3.stopPlayback(); + videoView3.setBackground(null); + } + + if(backgroundImage!=null){ + backgroundImage.setImageBitmap(null); + backgroundImage.setImageDrawable(null); + } + Glide.get(context).clearMemory(); + if(handler!=null){ + handler.removeMessages(TYPE_TIME_UPDATE_DATA); + handler.removeMessages(TYPE_UPDATE_MACTH); + handler.removeMessages(TYPE_JUDGE_START_PROGRAM); + } + + } + /** + * 销毁控件 + * */ + public void deleteView(){ + + try { + //恢复默认背景图 + changeOldBackground(); + + isNextVideo = false; + isStartProgram = false; + //视频切换 + videoPlayCount0 = 0; + videoPlayCount1 = 0; + startVideoTime=0; + isvideoPlay0=false; + isvideoPlay1=false; + + //图片切换 + imagePlayCount0 = 0; + imagePlayCount1 = 0; + imagePlayCount2 = 0; + imagePlayCount3 = 0; + imagePlayCount4 = 0; + imagePlayCount5 = 0; + imagePlayCount6 = 0; + imagePlayCount7 = 0; + imagePlayCount8 = 0; + imagePlayCount9 = 0; + imagePlayCount10 = 0; + imagePlayCount11 = 0; + imagePlayCount12 = 0; + imagePlayCount13 = 0; + imagePlayCount14 = 0; + imagePlayCount15 = 0; + + imagePlay0 = true; + imagePlay1 = true; + imagePlay2 = true; + imagePlay3 = true; + imagePlay4 = true; + imagePlay5 = true; + imagePlay6 = true; + imagePlay7 = true; + imagePlay8 = true; + imagePlay9 = true; + imagePlay10 = true; + imagePlay11 = true; + imagePlay12 = true; + imagePlay13 = true; + imagePlay14 = true; + imagePlay15 = true; + + firstImagePlay0 = true; + firstImagePlay1 = true; + firstImagePlay2 = true; + firstImagePlay3 = true; + firstImagePlay4 = true; + firstImagePlay5 = true; + firstImagePlay6 = true; + firstImagePlay7 = true; + firstImagePlay8 = true; + firstImagePlay9 = true; + firstImagePlay10 = true; + firstImagePlay11 = true; + firstImagePlay12 = true; + firstImagePlay13 = true; + firstImagePlay14 = true; + firstImagePlay15 = true; + + //品牌 + brandImageCount0 = 0; + brandImageCount1 = 0; + brandImageCount2 = 0; + brandImageCount3 = 0; + brandImageCount4 = 0; + brandImageCount5 = 0; + brandImageCount6 = 0; + brandImageCount7 = 0; + brandImageCount8 = 0; + brandImageCount9 = 0; + brandImageCount10 = 0; + brandImageCount11 = 0; + brandImageCount12 = 0; + brandImageCount13 = 0; + brandImageCount14 = 0; + brandImageCount15 = 0; + //设施 + facilitiesImageCount0 = 0; + facilitiesImageCount1 = 0; + facilitiesImageCount2 = 0; + facilitiesImageCount3 = 0; + facilitiesImageCount4 = 0; + facilitiesImageCount5 = 0; + facilitiesImageCount6 = 0; + facilitiesImageCount7 = 0; + facilitiesImageCount8 = 0; + facilitiesImageCount9 = 0; + facilitiesImageCount10 = 0; + facilitiesImageCount11 = 0; + facilitiesImageCount12 = 0; + facilitiesImageCount13 = 0; + facilitiesImageCount14 = 0; + facilitiesImageCount15 = 0; + //点位 + positionImageCount0 = 0; + positionImageCount1 = 0; + positionImageCount2 = 0; + positionImageCount3 = 0; + positionImageCount4 = 0; + positionImageCount5 = 0; + positionImageCount6 = 0; + positionImageCount7 = 0; + positionImageCount8 = 0; + positionImageCount9 = 0; + positionImageCount10 = 0; + positionImageCount11 = 0; + positionImageCount12 = 0; + positionImageCount13 = 0; + positionImageCount14 = 0; + positionImageCount15 = 0; + + shuipaifacenumb = 0; + shuipaifacenumb_finish = 0; + + if(sendRecordTimer!=null){ + sendRecordTimer.cancel(); + sendRecordTimer=null; + } + + //时间布局显示 + try { + layoutTime0.setVisibility(View.INVISIBLE); + layoutTime1.setVisibility(View.INVISIBLE); + layoutTime2.setVisibility(View.INVISIBLE); + layoutTime3.setVisibility(View.INVISIBLE); + layoutTime4.setVisibility(View.INVISIBLE); + }catch (Exception e){ + LoggerUtil.e("(双面屏)deleteView()报错",e.getMessage()); + } + + if(handler!=null){ + //清除节目更新 + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.removeMessages(TYPE_UPDATE_VIDEO0); + handler.removeMessages(TYPE_UPDATE_VIDEO1); + handler.removeMessages(TYPE_UPDATE_IMAGE0); + handler.removeMessages(TYPE_UPDATE_IMAGE1); + handler.removeMessages(TYPE_UPDATE_IMAGE2); + handler.removeMessages(TYPE_UPDATE_IMAGE3); + handler.removeMessages(TYPE_UPDATE_IMAGE4); + handler.removeMessages(TYPE_UPDATE_IMAGE5); + handler.removeMessages(TYPE_UPDATE_IMAGE6); + handler.removeMessages(TYPE_UPDATE_IMAGE7); + handler.removeMessages(TYPE_UPDATE_IMAGE8); + handler.removeMessages(TYPE_UPDATE_IMAGE9); + handler.removeMessages(TYPE_UPDATE_IMAGE10); + handler.removeMessages(TYPE_UPDATE_IMAGE11); + handler.removeMessages(TYPE_UPDATE_IMAGE12); + handler.removeMessages(TYPE_UPDATE_IMAGE13); + handler.removeMessages(TYPE_UPDATE_IMAGE14); + handler.removeMessages(TYPE_UPDATE_IMAGE15); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW0); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW1); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW2); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW3); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW4); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW5); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW6); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW7); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW8); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW9); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW10); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW11); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW12); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW13); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW14); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW15); + handler.removeMessages(TYPE_UPDATE_TEXT4); + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + handler.removeMessages(TYPE_REFRESH_WEBVIEW0); + handler.removeMessages(TYPE_REFRESH_WEBVIEW1); + handler.removeMessages(TYPE_REFRESH_WEBVIEW2); + handler.removeMessages(TYPE_REFRESH_WEBVIEW3); + handler.removeMessages(TYPE_SHUIPAI); + + handler.removeMessages(TYPE_BRAND0); + handler.removeMessages(TYPE_BRAND1); + handler.removeMessages(TYPE_BRAND2); + handler.removeMessages(TYPE_BRAND3); + handler.removeMessages(TYPE_BRAND4); + handler.removeMessages(TYPE_BRAND5); + handler.removeMessages(TYPE_BRAND6); + handler.removeMessages(TYPE_BRAND7); + handler.removeMessages(TYPE_BRAND8); + handler.removeMessages(TYPE_BRAND9); + handler.removeMessages(TYPE_BRAND10); + handler.removeMessages(TYPE_BRAND11); + handler.removeMessages(TYPE_BRAND12); + handler.removeMessages(TYPE_BRAND13); + handler.removeMessages(TYPE_BRAND14); + handler.removeMessages(TYPE_BRAND15); + handler.removeMessages(TYPE_FACILITIES0); + handler.removeMessages(TYPE_FACILITIES1); + handler.removeMessages(TYPE_FACILITIES2); + handler.removeMessages(TYPE_FACILITIES3); + handler.removeMessages(TYPE_FACILITIES4); + handler.removeMessages(TYPE_FACILITIES5); + handler.removeMessages(TYPE_FACILITIES6); + handler.removeMessages(TYPE_FACILITIES7); + handler.removeMessages(TYPE_FACILITIES8); + handler.removeMessages(TYPE_FACILITIES9); + handler.removeMessages(TYPE_FACILITIES10); + handler.removeMessages(TYPE_FACILITIES11); + handler.removeMessages(TYPE_FACILITIES12); + handler.removeMessages(TYPE_FACILITIES13); + handler.removeMessages(TYPE_FACILITIES14); + handler.removeMessages(TYPE_FACILITIES15); + handler.removeMessages(TYPE_POSITION0); + handler.removeMessages(TYPE_POSITION1); + handler.removeMessages(TYPE_POSITION2); + handler.removeMessages(TYPE_POSITION3); + handler.removeMessages(TYPE_POSITION4); + handler.removeMessages(TYPE_POSITION5); + handler.removeMessages(TYPE_POSITION6); + handler.removeMessages(TYPE_POSITION7); + handler.removeMessages(TYPE_POSITION8); + handler.removeMessages(TYPE_POSITION9); + handler.removeMessages(TYPE_POSITION10); + handler.removeMessages(TYPE_POSITION11); + handler.removeMessages(TYPE_POSITION12); + handler.removeMessages(TYPE_POSITION13); + handler.removeMessages(TYPE_POSITION14); + handler.removeMessages(TYPE_POSITION15); + handler.removeMessages(TYPE_MAP); + } + + try { + //清除视频 + layoutVideo2.setVisibility(View.GONE); + if( videoView2.isPlaying()){ + videoView2.pause(); + } + videoView3.setZOrderOnTop(false); + videoView3.setZOrderMediaOverlay(false); + videoView3.setVisibility(View.GONE); + layoutVideo3.setVisibility(View.GONE); + + if( videoView3.isPlaying()){ + videoView3.pause(); + } + + }catch (Exception e){ + LoggerUtil.e("(双面屏)deleteView()清除视频报错",e.getMessage()); + } + //清除图片组件 + clearImgView(); + + if(textList!=null &&textList.size()>0){ + textList.clear(); + } + //清除文字 + if(MarqueeTextList!=null&&MarqueeTextList.size()>0){ + for(MarqueeTextView marqueeText : MarqueeTextList){ + relativeLayoutMax.removeView(marqueeText); + } + MarqueeTextList.clear(); + } + + if(textViewlist2!=null&&textViewlist2.size()>0){ + for(TextView marqueeText : textViewlist2){ + relativeLayoutMax.removeView(marqueeText); + } + textViewlist2.clear(); + } + + if(AutoScrollTextList!=null&&AutoScrollTextList.size()>0){ + for(AutoScrollTextView autoScrollText : AutoScrollTextList){ + relativeLayoutMax.removeView(autoScrollText); + } + AutoScrollTextList.clear(); + } + if(webList!=null&& webList.size()>0){ + for(WebView webView : webList){ + relativeLayoutMax.removeView(webView); + } + webList.clear(); + } + + //清除天气列表 + if(recycle_weather0!=null){ + relativeLayoutMax.removeView(recycle_weather0); + } + + //清除视频直播 + if(livePlaylist!=null&&livePlaylist.size()>0){ + for(IjkPlayerView ijkPlayerView :livePlaylist){ + if(ijkPlayerView!=null){ + ijkPlayerView.stop(); + relativeLayoutMax.removeView(ijkPlayerView); + } + } + livePlaylist.clear(); + } + + //回收音频资源 + if (mediaPlayer0 != null && mediaPlayer0.isPlaying()) { + mediaPlayer0.stop(); + mediaPlayer0.release(); + mediaPlayer0 = null; + } + + //清除json动图列表 + if(ltGiftList.size()>0){ + for( LottieAnimationView lottie : ltGiftList){ + relativeLayoutMax.removeView(lottie); + } + ltGiftList.clear(); + } + //清除公共设施图片 + if(imageViewlist!=null&&imageViewlist.size()>0){ + for(ImageView imageView: imageViewlist){ + relativeLayoutMax.removeView(imageView); + } + imageViewlist.clear(); + } + + //清除text + if(textViewlist!=null&&textViewlist.size()>0){ + for(MarqueeTextView2 textView: textViewlist){ + relativeLayoutMax.removeView(textView); + } + textViewlist.clear(); + } + + }catch (Exception e){ + LoggerUtil.e("(双面屏)deleteView()报错",e.getMessage()); + + } + } + + /** + * 清除图片组件 + * */ + public void clearImgView(){ + try { + //清除图片 + layoutImg0.setVisibility(View.GONE); + layoutImg1.setVisibility(View.GONE); + layoutImg2.setVisibility(View.GONE); + layoutImg3.setVisibility(View.GONE); + layoutImg4.setVisibility(View.GONE); + layoutImg5.setVisibility(View.GONE); + layoutImg6.setVisibility(View.GONE); + layoutImg7.setVisibility(View.GONE); + layoutImg8.setVisibility(View.GONE); + layoutImg9.setVisibility(View.GONE); + layoutImg10.setVisibility(View.GONE); + layoutImg11.setVisibility(View.GONE); + layoutImg12.setVisibility(View.GONE); + layoutImg13.setVisibility(View.GONE); + layoutImg14.setVisibility(View.GONE); + layoutImg15.setVisibility(View.GONE); + }catch (Exception e){ + LoggerUtil.e("(双面屏)deleteView()清除图片报错",e.getMessage()); + } + + //设置背景颜色 + try { + if(nomallImgList!=null&&nomallImgList.size()>0){ + for(ImageView img :nomallImgList){ + if(img!=null){ + img.setImageBitmap(null); + } + } + nomallImgList.clear(); + } + }catch (Exception e){ + LoggerUtil.e("(双面屏)deleteView()图片报错",e.getMessage()); + } + } + + /** + * 清除额外的图片 + * */ + public void clearOtherImg(){ + try{ + if(otherImg0!=null){ + otherImg0.setImageBitmap(null); + } + if(otherImg1!=null){ + otherImg1.setImageBitmap(null); + } + if(otherImg2!=null){ + otherImg2.setImageBitmap(null); + } + if(otherImg3!=null){ + otherImg3.setImageBitmap(null); + } + if(otherImg4!=null){ + otherImg4.setImageBitmap(null); + } + if(otherImg5!=null){ + otherImg5.setImageBitmap(null); + } + if(otherImg6!=null){ + otherImg6.setImageBitmap(null); + } + if(otherImg7!=null){ + otherImg7.setImageBitmap(null); + } + if(otherImg8!=null){ + otherImg8.setImageBitmap(null); + } + if(otherImg9!=null){ + otherImg9.setImageBitmap(null); + } + if(otherImg10!=null){ + otherImg10.setImageBitmap(null); + } + if(otherImg11!=null){ + otherImg11.setImageBitmap(null); + } + if(otherImg12!=null){ + otherImg12.setImageBitmap(null); + } + if(otherImg13!=null){ + otherImg13.setImageBitmap(null); + } + if(otherImg14!=null){ + otherImg14.setImageBitmap(null); + } + if(otherImg15!=null){ + otherImg15.setImageBitmap(null); + } + }catch (Exception e){ + LoggerUtil.e("(双面屏)clearOtherImg报错",e.getMessage()); + } + } + + + String downloadaddress; + public void start(){ + LoggerUtil.e("(双面屏)屏保页面调用","start"); + //设置透明列表 + colorMap = ColorUtil. getColorTransparent(); + downloadaddress = DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP); + + //4分后判断是是否开始播放了节目 + handler.removeMessages(TYPE_JUDGE_START_PROGRAM); + handler.sendEmptyMessageDelayed(TYPE_JUDGE_START_PROGRAM,240*1000); + isStartProgram = false; + + program=0; + programme=0; + isChangProgramme = false;//日程切换 + //匹配时间 + handler.removeMessages(TYPE_UPDATE_MACTH); + handler.sendEmptyMessage(TYPE_UPDATE_MACTH); + + deleteView(); + //开始播放日程 + startProgram(); + } + + /** + * 从新获取信息发布 + * istiming 定时获取 + * */ + NewProgramBean currentProgramBean;//当天的日程 + List screenSaverList; + + // Object newdata;//用于素材下载完成后更新数据 + String newdata;//用于素材下载完成后更新数据 + + /** + * 开始播放节目 + * */ + boolean isStartProgram = false;//开始播放节目的状态(用于判断开机后一直不进这个方法显示) + public void startProgram(){ + + screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + //获取当天时间段 + for(NewProgramBean newProgramBean: screenSaverList){ + if(newProgramBean.date.equals(TimeUtil.stampToDate(System.currentTimeMillis()))){ + currentProgramBean = newProgramBean; + } + } + if(currentProgramBean == null && screenSaverList.size()>0){ + LoggerUtil.e("(双面屏)startProgram()","网络问题暂未获取当天节目单,使用前天节目"); + //2天网络不通没有获取最新的节目单,沿用前一天日程。 + currentProgramBean = screenSaverList.get(screenSaverList.size() - 1); + String s = TimeUtil.stampToDate(System.currentTimeMillis()); + currentProgramBean.setDate(s); + } + + if(currentProgramBean!=null&&!currentProgramBean.getDate().equals(TimeUtil.stampToDate(System.currentTimeMillis()))){ + LoggerUtil.e("(双面屏)startProgram()","多天网络问题,使用前天数据"); + String s = TimeUtil.stampToDate(System.currentTimeMillis()); + currentProgramBean.setDate(s); + } + + if(currentProgramBean==null || currentProgramBean.getSchedule().size()<=0){ + LoggerUtil.e("(双面屏)startProgram()","当前日程里没有节目"); + return; + } + + //当天里面的日程 + for(int i=0;i beginTimeLong && currentlong < endTimeLong ){ + //正在进行中 + programme= i ; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,endTimeLong-System.currentTimeMillis()); + //提前5秒获取下个日程的第一个节目的图片 +// handler.sendEmptyMessageDelayed(TYPE_GET_NEXT_PROGRAMME_OTHER_IMG,endTimeLong-(System.currentTimeMillis()+5000)); + //开始播放进行中的日程 + if(schedule==null){ + return; + } + program=0; + createView( schedule , program); + + break; + + }else if( currentlong < beginTimeLong ){ + //未开始 + programme= -1 ; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + Log.e("(双面屏)TAG","未开始,等待"); + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,beginTimeLong - System.currentTimeMillis()); + + break; + } + + } catch (Exception e) { + LoggerUtil.e("(双面屏)startProgram","报错:"+e.getMessage()); + e.printStackTrace(); + } + } + } + + /** + * 创建控件 + * */ + Timer sendRecordTimer;//发送节目单记录定时器 + int nextimg = 0; + public void createView( NewProgramBean.schedule schedule ,int position){ + + Log.e("(双面屏)TAG","节目切换"+position); + nextimg= position ; + NewProgramBean.programs programme = schedule.getPrograms().get(position).getScreenList().get(1); + + String[] split = programme.getDuration().split(":"); + int duration = Integer.parseInt(split[0])*3600*1000+Integer.parseInt(split[1])*60*1000+Integer.parseInt(split[2])*1000; + //只有一个的时候不会从新创建 + if(schedule.getPrograms().size()>1){ + //节目更新 + if(Constant.isSecondary && !Constant.isMain){ + //从设备不主动更新节目 + Log.e("(双面屏)TAG","从设备不主动更新"); + }else { + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAM,duration); + program++; + } + ScreenSaverData.uploadPlayRecord(programme.getCode(),programme.getDuration(),null,null); + }else { + //需要定时发送上传节目单记录 + try { + sendRecordTimer = new Timer(); + sendRecordTimer.schedule(new TimerTask() { + @Override + public void run() { + ScreenSaverData.uploadPlayRecord(programme.getCode(),programme.getDuration(),null,null); + } + },duration); + }catch (Exception e){ + + } + } + + if(programme.getComponents()==null || programme.getComponents().size()<=0){ + LoggerUtil.e("(双面屏)TAG","获取到的节目控件列表为0"); + }else { + int videoCount=0; + int imageCount=0; + int weatherCount=0; + int textCount=0; + int clockCount=0; + int onlineWebCount=0; + int facilitiesCount=0; + int brandCount=0; + int positionCount=0; + for(int i=0;i imageViewlist = new ArrayList<>(); + List facilitiesImageViewList = new ArrayList<>();//设施图片控件 + List brandImageViewList = new ArrayList<>();//设施图片控件 + List positionImageViewList = new ArrayList<>();//设施图片控件 + + public void initSignImageLogo(NewProgramBean.subComponents subComponents , String type , int position){ + if(subComponents.getMaterials()==null||subComponents.getMaterials().size()<=0){ + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); + ImageView imageView0 = new ImageView(context); + relativeLayoutMax.addView(imageView0, lParams); + imageViewlist.add(imageView0); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, subComponents.getMaterials().get(0).getFileUrl() ,imageView0); + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setImageView(imageView0); + facilitiesBean.setType("image"); + facilitiesBean.setPosition(position); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + } + + + /** + * 公共设施json动图 + * */ + private void initSignImageLogoLottie(NewProgramBean.subComponents subComponents , String type , int position){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); + + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, subComponents.getMaterials().get(0).getFileUrl()); + + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = new LottieAnimationView(context); + relativeLayoutMax.addView(ltGift, lParams); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + ltGiftList.add(ltGift); + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setLottieView(ltGift); + facilitiesBean.setType("lottie"); + facilitiesBean.setPosition(position); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + } + + /** + * 更新设施跟品牌轮播 + * */ + private void updateBrandOrfacilities(int count, int position ,List list, int handlerType){ + for(FacilitiesBean facilitiesBean: list){ + if(facilitiesBean.getPosition()==position){ + if(facilitiesBean.getType().equals("image")){ + //图片 + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getFileUrl(),facilitiesBean.getImageView()); + }else if(facilitiesBean.getType().equals("lottie")){ + //动图 + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getFileUrl()); + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = facilitiesBean.getLottieView(); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + }else if(facilitiesBean.getType().equals("text")){ + //文字 + facilitiesBean.getTextView().setTextinfo(facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getText()); + facilitiesBean.getTextView().setVisibility(View.INVISIBLE); + facilitiesBean.getTextView().setVisibility(View.VISIBLE); + }else if(facilitiesBean.getType().equals("text2")){ + //文字 + facilitiesBean.getTextView2().setText(facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getText()); + } + handler.removeMessages(handlerType); + handler.sendEmptyMessageDelayed(handlerType,facilitiesBean.getTransitionPeriod()*1000); + } + } + } + + /** + * 判断给handler定时轮播 + * */ + private void sendhandlerBrandOrFacilities(NewProgramBean.components components,String type, int position){ + if(type.equals("brand")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //品牌 + if(position==0){ + handler.removeMessages(TYPE_BRAND0); + handler.sendEmptyMessageDelayed(TYPE_BRAND0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_BRAND1); + handler.sendEmptyMessageDelayed(TYPE_BRAND1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_BRAND2); + handler.sendEmptyMessageDelayed(TYPE_BRAND2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_BRAND3); + handler.sendEmptyMessageDelayed(TYPE_BRAND3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_BRAND4); + handler.sendEmptyMessageDelayed(TYPE_BRAND4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_BRAND5); + handler.sendEmptyMessageDelayed(TYPE_BRAND5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_BRAND6); + handler.sendEmptyMessageDelayed(TYPE_BRAND6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_BRAND7); + handler.sendEmptyMessageDelayed(TYPE_BRAND7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_BRAND8); + handler.sendEmptyMessageDelayed(TYPE_BRAND8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_BRAND9); + handler.sendEmptyMessageDelayed(TYPE_BRAND9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_BRAND10); + handler.sendEmptyMessageDelayed(TYPE_BRAND10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_BRAND11); + handler.sendEmptyMessageDelayed(TYPE_BRAND11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_BRAND12); + handler.sendEmptyMessageDelayed(TYPE_BRAND12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_BRAND13); + handler.sendEmptyMessageDelayed(TYPE_BRAND13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_BRAND14); + handler.sendEmptyMessageDelayed(TYPE_BRAND14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_BRAND15); + handler.sendEmptyMessageDelayed(TYPE_BRAND15,components.getConfig().getTransitionPeriod()*1000); + } + }else if(type.equals("facility")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //设施 + if(position==0){ + handler.removeMessages(TYPE_FACILITIES0); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_FACILITIES1); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_FACILITIES2); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_FACILITIES3); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_FACILITIES4); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_FACILITIES5); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_FACILITIES6); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_FACILITIES7); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_FACILITIES8); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_FACILITIES9); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_FACILITIES10); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_FACILITIES11); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_FACILITIES12); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_FACILITIES13); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_FACILITIES14); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_FACILITIES15); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES15,components.getConfig().getTransitionPeriod()*1000); + } + }else if(type.equals("position")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //设施 + if(position==0){ + handler.removeMessages(TYPE_POSITION0); + handler.sendEmptyMessageDelayed(TYPE_POSITION0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_POSITION1); + handler.sendEmptyMessageDelayed(TYPE_POSITION1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_POSITION2); + handler.sendEmptyMessageDelayed(TYPE_POSITION2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_POSITION3); + handler.sendEmptyMessageDelayed(TYPE_POSITION3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_POSITION4); + handler.sendEmptyMessageDelayed(TYPE_POSITION4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_POSITION5); + handler.sendEmptyMessageDelayed(TYPE_POSITION5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_POSITION6); + handler.sendEmptyMessageDelayed(TYPE_POSITION6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_POSITION7); + handler.sendEmptyMessageDelayed(TYPE_POSITION7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_POSITION8); + handler.sendEmptyMessageDelayed(TYPE_POSITION8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_POSITION9); + handler.sendEmptyMessageDelayed(TYPE_POSITION9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_POSITION10); + handler.sendEmptyMessageDelayed(TYPE_POSITION10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_POSITION11); + handler.sendEmptyMessageDelayed(TYPE_POSITION11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_POSITION12); + handler.sendEmptyMessageDelayed(TYPE_POSITION12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_POSITION13); + handler.sendEmptyMessageDelayed(TYPE_POSITION13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_POSITION14); + handler.sendEmptyMessageDelayed(TYPE_POSITION14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_POSITION15); + handler.sendEmptyMessageDelayed(TYPE_POSITION15,components.getConfig().getTransitionPeriod()*1000); + } + } + } + /** + * 公共设施 + * */ + List textViewlist = new ArrayList<>(); + List textViewlist2 = new ArrayList<>(); + public void initSignTxtDistance(NewProgramBean.subComponents subComponents,String type, int position){ + if(subComponents.getMaterials()==null||subComponents.getMaterials().size()<=0){ + return; + } + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); +// TextView textView = new TextView(this); + + + + if(subComponents.getConfig().getAnimation().equals("固定")){ + + TextView textView = new TextView(context); + if(subComponents.getConfig().getFontStyle().equals("正常")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(subComponents.getConfig().getFontStyle().equals("斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗、斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + relativeLayoutMax.addView(textView, lParams); + textViewlist2.add(textView); + ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); + + layoutParams.width=subComponents.getWidth(); + layoutParams.height=subComponents.getHeight(); + textView.setLayoutParams(layoutParams); + + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setTextView2( textView ); + facilitiesBean.setPosition(position); + facilitiesBean.setType("text2"); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + + if(subComponents.getConfig().getBackgroundColor()!=null&&!subComponents.getConfig().getBackgroundColor().isEmpty()){ + String backgroundColor = subComponents.getConfig().getBackgroundColor(); + String backgroundOpacity = (String)colorMap.get(subComponents.getConfig().getBackgroundOpacity()); + backgroundColor="#"+backgroundOpacity+backgroundColor.substring(1); + textView.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + textView.setTextColor(Color.parseColor(subComponents.getConfig().getFontColor())); + textView.setText(subComponents.getMaterials().get(0).getText()); + textView.setTextSize(subComponents.getConfig().getFontSize()); + textView.setGravity(Gravity.CENTER_VERTICAL); + + }else { + MarqueeTextView2 textView =new MarqueeTextView2(context); + + if(subComponents.getConfig().getFontStyle().equals("正常")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(subComponents.getConfig().getFontStyle().equals("斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗、斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + relativeLayoutMax.addView(textView, lParams); + textViewlist2.add(textView); + ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); + + layoutParams.width=subComponents.getWidth(); + layoutParams.height=subComponents.getHeight(); + textView.setLayoutParams(layoutParams); + + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setTextView( textView ); + facilitiesBean.setPosition(position); + facilitiesBean.setType("text"); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + + if(subComponents.getConfig().getBackgroundColor()!=null&&!subComponents.getConfig().getBackgroundColor().isEmpty()){ + String backgroundColor = subComponents.getConfig().getBackgroundColor(); + String backgroundOpacity = (String)colorMap.get(subComponents.getConfig().getBackgroundOpacity()); + backgroundColor="#"+backgroundOpacity+backgroundColor.substring(1); + textView.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + textView.setTextColor(Color.parseColor(subComponents.getConfig().getFontColor())); + textView.setTextSize(subComponents.getConfig().getFontSize()); + textView.setTextinfo(subComponents.getMaterials().get(0).getText(),subComponents.getConfig().getFontSize(),subComponents.getWidth(), subComponents.getHeight()); + textView.setGravity(Gravity.CENTER_VERTICAL); + + } + +// if(components.getConfig().getAnimation().equals("自动")){ +// textView.setMarqueeRepeatLimit(3); +// textView.setFocusable(true); +// textView.setEllipsize(TextUtils.TruncateAt.MARQUEE); +// textView.setSingleLine(); +// textView.setFocusableInTouchMode(true); +// textView.setHorizontallyScrolling(true); +// textView.setSelected(true); +// } + } + + /** + * 添加视频 + * */ + NewProgramBean.components videoComponents0; + NewProgramBean.components videoComponents1; + public void addVideoView( NewProgramBean.components components,int position){ + + //如果没有内容不创建 + if(components == null ||components.getMaterials()==null || components.getMaterials().size() <= 0){ + return; + } + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + if(position==0){ + + isNextVideo = true; + isvideoPlay0 = true; + videoView2.pause(); + videoView2.seekTo(0); + layoutVideo2.setX(components.getOffsetX()); + layoutVideo2.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = layoutVideo2.getLayoutParams(); + layoutParams.height = components.getHeight(); + layoutParams.width = components.getWidth(); + videoComponents0 = components; + + layoutVideo2.setVisibility(View.VISIBLE); + layoutVideo2.bringToFront(); + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO0); + videoImg2.setVisibility(View.VISIBLE); + videoView2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) + videoView2.setBackgroundColor(Color.TRANSPARENT); + videoImg2.setVisibility(View.GONE); + return true; + + } + }); + + //视频准备完毕,可以进行播放 + Log.e("(双面屏)TAG","准备好视频,开始播放"); + if( isvideoPlay0 ){ + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + if(components.getConfig().isPlayAudio()){ + mp.setVolume(15f,15f); + }else { + mp.setVolume(0f,0f); + } + mp.start(); + + }else{ + Log.e("(双面屏)TAG","预加载播放暂停"); + mp.start(); + mp.setVolume(0f,0f); + //暂停播放 + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + handler.sendEmptyMessageDelayed(TYPE_STOP_VIDEO_PLAY0,5000); + } + } + }); + + //视频播放发送错误时回调 + videoView2.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + //视频播放失败 + return true; + } + }); + + + + + }else if(position==1){ + + isvideoPlay1 = true; + layoutVideo3.setX(components.getOffsetX()); + layoutVideo3.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = layoutVideo3.getLayoutParams(); + layoutParams.height = components.getHeight(); + layoutParams.width = components.getWidth(); + videoView3.pause(); + videoView3.seekTo(0); + videoView3.setZOrderOnTop(true); + videoView3.setZOrderMediaOverlay(true); + videoView3.setVisibility(View.VISIBLE); + layoutVideo3.setVisibility(View.VISIBLE); + layoutVideo3.bringToFront(); + + videoImg3.setVisibility(View.VISIBLE); + + videoComponents1 = components; + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO1); + + videoView3.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) + videoView3.setBackgroundColor(Color.TRANSPARENT); + videoImg3.setVisibility(View.GONE); + return true; + + } + }); + + //视频准备完毕,可以进行播放 + Log.e("(双面屏)TAG","准备好视频,开始播放"); + if( isvideoPlay1 ){ + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + if(components.getConfig().isPlayAudio()){ + mp.setVolume(15f,15f); + }else { + mp.setVolume(0f,0f); + } + mp.start(); + + }else { + Log.e("(双面屏)TAG","预加载播放暂停"); + mp.start(); + mp.setVolume(0f,0f); + //暂停播放 + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + handler.sendEmptyMessageDelayed(TYPE_STOP_VIDEO_PLAY1,5000); + } + } + }); + + //视频播放发送错误时回调 + videoView3.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + //视频播放失败 + + return true; + } + }); + } + } + + /** + * 更新video + * */ + public void updateVideo(NewProgramBean.components videoComponents, int videoPlayCount, CustomerVideoView videoView, int TYPE_UPDATE_VIDE){ + if(videoComponents.getMaterials()==null||videoComponents.getMaterials().size()==0){ + return; + } + if(videoPlayCount>=videoComponents.getMaterials().size()){ + videoPlayCount=0; + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + videoPlayCount0 = 0; + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + videoPlayCount1 = 0 ; + } + } + + NewProgramBean.materials materials0 = videoComponents.getMaterials().get(videoPlayCount); + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, materials0.getFileUrl()); + if (!new File(localPath).exists()) { + FileUtil.downloadFile(downloadaddress + materials0.getFileUrl(), localPath); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_VIDE,2000); + return; + } + + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + videoPlayCount0++; + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + videoPlayCount1++; + } + + //上传播放记录 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String playTime = format.format(System.currentTimeMillis()); +// ScreenSaverData.uploadPlayRecord(materials0.getMaterialCode(), materials0.getDuration(), playTime, null, null); + + if(materials0.getDuration()>0){ + //视频 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_VIDE,materials0.getDuration()*1000); + Log.e("(双面屏)TAG","设置视频路径"); + videoView.setVideoPath(localPath); + + //获取节目第一个视频的第一帧 + +// if(videoPlayCount==0){ +// MediaMetadataRetriever media = new MediaMetadataRetriever(); +// media.setDataSource(localPath); +// Bitmap bitmap = media.getFrameAtTime(0); +// if(bitmap==null){ +// Log.e("TAG","第一帧为空"); +// }else { +// String[] b = StringUtil.strSplice(Constant.CACHE_PATH, materials0.getFileUrl()).split("\\."); +// String imgUrl = b[0]+".jpg"; +// +// if(!new File(imgUrl).exists()){ +// try { +// FileOutputStream fileOutputStream = new FileOutputStream(imgUrl); +// bitmap.compress(Bitmap.CompressFormat.JPEG,100,fileOutputStream); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } +// } +// } +// //获取视频中的第一帧照片,设置为封面 +//// Bitmap bitmap = media.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST_SYNC ); +// +// } + + }else { + //图片 + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + ViewGroup.LayoutParams layoutParams = videoView2.getLayoutParams(); + layoutParams.height = videoComponents.getHeight(); + layoutParams.width = videoComponents.getWidth(); + videoView2.setLayoutParams(layoutParams); + + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + ViewGroup.LayoutParams layoutParams = videoView3.getLayoutParams(); + layoutParams.height = videoComponents.getHeight(); + layoutParams.width = videoComponents.getWidth(); + videoView3.setLayoutParams(layoutParams); + } + + videoImg2.setVisibility(View.GONE); + videoImg3.setVisibility(View.GONE); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_VIDE,videoComponents.getConfig().getTransitionPeriod()*1000); + Drawable drawable = new BitmapDrawable(localPath); + videoView.setBackground(drawable); + + } + + } + + /** + * 初始化直播 + * */ + List livePlaylist = new ArrayList(); + public void initLivePlayer(NewProgramBean.components components) { + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + IjkPlayerView ijkPlayerView = new IjkPlayerView(context); + livePlaylist.add(ijkPlayerView); + relativeLayoutMax.addView(ijkPlayerView, lParams); + ijkPlayerView.init(); + String url = components.getMaterials().get(0).getOuterChain(); + Log.e("(双面屏)TAG","直播路径"+url); + ijkPlayerView.setVideoPath(url); + ijkPlayerView.start(); + if(!components.getConfig().isPlayAudio()){ + ijkPlayerView.setVolume(1); + }else { + ijkPlayerView.setVolume(15); + } + } + + /** + * 添加音频 + * + * @param path*/ + MediaPlayer mediaPlayer0; + NewProgramBean.components mediaComponents0; + public void initMediaPlayer(NewProgramBean.components components){ + if(!components.getConfig().isPlayAudio() || components.getMaterials()==null || components.getMaterials().size()==0){ + return; + } + mediaComponents0 = components; + mediaPlayer0 = new MediaPlayer(); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MEIDA0,100); + } + + /** + * 更新音频文件 + * */ + public void updateMedia(NewProgramBean.components components){ + + NewProgramBean.materials materials0 = mediaComponents0.getMaterials().get(0); + + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, materials0.getFileUrl()); + + if (!new File(localPath).exists()) { + FileUtil.downloadFile(downloadaddress + materials0.getFileUrl(), localPath); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MEIDA0,2000); + return; + } + + Log.e("(双面屏)TAG","有音频播放"); + try { + File file = new File(localPath); + mediaPlayer0.setDataSource(file.getPath()); //指定音频文件的路径 + mediaPlayer0.prepareAsync(); //让MediaPlayer进入到准备状态 + mediaPlayer0.setLooping(true);//自动循环 + //装载音频完成监听 + mediaPlayer0.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + // 装载完毕回调 + mediaPlayer0.start(); + } + }); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 添加图片 + * */ + NewProgramBean.components imageComponents0; + NewProgramBean.components imageComponents1; + NewProgramBean.components imageComponents2; + NewProgramBean.components imageComponents3; + NewProgramBean.components imageComponents4; + NewProgramBean.components imageComponents5; + NewProgramBean.components imageComponents6; + NewProgramBean.components imageComponents7; + NewProgramBean.components imageComponents8; + NewProgramBean.components imageComponents9; + NewProgramBean.components imageComponents10; + NewProgramBean.components imageComponents11; + NewProgramBean.components imageComponents12; + NewProgramBean.components imageComponents13; + NewProgramBean.components imageComponents14; + NewProgramBean.components imageComponents15; + + List nomallImgList =new ArrayList<>();//普通图片 + public void initImage(NewProgramBean.components components,int position){ + //如果没有内容不创建 + if(components==null ||components.getMaterials()==null|| components.getMaterials().size()<=0){ + LoggerUtil.e("(双面屏)initImage添加图片","认为没有内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + if(position==0){ + + buildImgView(layoutImg0,components,TYPE_HINT_IMG0,TYPE_UPDATE_IMAGE0); + imageComponents0 = components; + buildImgView( otherImg0,components,TYPE_HINT_IMG0,TYPE_UPDATE_IMAGE0); + nomallImgList.add(img0); + nomallImgList.add(img0Behind); + }else if(position==1){ + + buildImgView( layoutImg1,components,TYPE_HINT_IMG1,TYPE_UPDATE_IMAGE1); + imageComponents1 = components; + buildImgView( otherImg1,components,TYPE_HINT_IMG1,TYPE_UPDATE_IMAGE1); + nomallImgList.add(img1); + nomallImgList.add(img1Behind); + }else if(position==2){ + + buildImgView( layoutImg2,components, TYPE_HINT_IMG2, TYPE_UPDATE_IMAGE2); + imageComponents2 = components; + buildImgView( otherImg2,components, TYPE_HINT_IMG2, TYPE_UPDATE_IMAGE2); + nomallImgList.add(img2); + nomallImgList.add(img2Behind); + }else if(position==3){ + + buildImgView( layoutImg3, components, TYPE_HINT_IMG3, TYPE_UPDATE_IMAGE3); + imageComponents3 = components; + buildImgView( otherImg3,components, TYPE_HINT_IMG3, TYPE_UPDATE_IMAGE3); + nomallImgList.add(img3); + nomallImgList.add(img3Behind); + }else if(position==4){ + + buildImgView( layoutImg4, components, TYPE_HINT_IMG4, TYPE_UPDATE_IMAGE4); + imageComponents4 = components; + nomallImgList.add(img4); + nomallImgList.add(img4Behind); + }else if(position==5){ + + buildImgView( layoutImg5, components, TYPE_HINT_IMG5, TYPE_UPDATE_IMAGE5); + imageComponents5 = components; + nomallImgList.add(img5); + nomallImgList.add(img5Behind); + }else if(position==6){ + + buildImgView( layoutImg6, components, TYPE_HINT_IMG6, TYPE_UPDATE_IMAGE6); + imageComponents6 = components; + nomallImgList.add(img6); + nomallImgList.add(img6Behind); + }else if(position==7){ + + buildImgView( layoutImg7, components, TYPE_HINT_IMG7, TYPE_UPDATE_IMAGE7); + imageComponents7 = components; + nomallImgList.add(img7); + nomallImgList.add(img7Behind); + }else if(position==8){ + + buildImgView( layoutImg8, components, TYPE_HINT_IMG8, TYPE_UPDATE_IMAGE8); + imageComponents8 = components; + nomallImgList.add(img8); + nomallImgList.add(img8Behind); + }else if(position==9){ + + buildImgView( layoutImg9, components, TYPE_HINT_IMG9, TYPE_UPDATE_IMAGE9); + imageComponents9 = components; + nomallImgList.add(img9); + nomallImgList.add(img9Behind); + }else if(position==10){ + + buildImgView( layoutImg10, components, TYPE_HINT_IMG10, TYPE_UPDATE_IMAGE10); + imageComponents10 = components; + nomallImgList.add(img10); + nomallImgList.add(img10Behind); + }else if(position==11){ + + buildImgView( layoutImg11, components, TYPE_HINT_IMG11, TYPE_UPDATE_IMAGE11); + imageComponents11 = components; + nomallImgList.add(img11); + nomallImgList.add(img11Behind); + }else if(position==12){ + + buildImgView( layoutImg12, components, TYPE_HINT_IMG12, TYPE_UPDATE_IMAGE12); + imageComponents12 = components; + nomallImgList.add(img12); + nomallImgList.add(img12Behind); + }else if(position==13){ + + buildImgView( layoutImg13, components, TYPE_HINT_IMG13, TYPE_UPDATE_IMAGE13); + imageComponents13 = components; + nomallImgList.add(img13); + nomallImgList.add(img13Behind); + }else if(position==14){ + + buildImgView( layoutImg14, components, TYPE_HINT_IMG14, TYPE_UPDATE_IMAGE14); + imageComponents14 = components; + nomallImgList.add(img14); + nomallImgList.add(img14Behind); + }else if(position==15){ + + buildImgView( layoutImg15, components, TYPE_HINT_IMG15, TYPE_UPDATE_IMAGE15); + imageComponents15 = components; + nomallImgList.add(img15); + nomallImgList.add(img15Behind); + } + } + + /** + * 创建更图片位置 + * */ + public void buildImgView(View view, NewProgramBean.components components,int TYPE_HINT_IMG , int TYPE_UPDATE_IMAGE){ + view.setVisibility(View.VISIBLE); + view.bringToFront(); + changeViewLocation(view,components); + handler.removeMessages(TYPE_HINT_IMG); + handler.sendEmptyMessageDelayed(TYPE_HINT_IMG,3000); + handler.removeMessages(TYPE_UPDATE_IMAGE); + handler.sendEmptyMessage(TYPE_UPDATE_IMAGE); + } + + /** + * 创建更改控件位置 + * */ + public void changeViewLocation(View view, NewProgramBean.components components){ + view.setX(components.getOffsetX()); + view.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); + layoutParams.width = components.getWidth(); + layoutParams.height = components.getHeight(); + } + + /** + * 添加额外的图片 + * */ + + public void addOtherImg( NewProgramBean.components components, int otherImgCount){ + if(components.getMaterials()==null||components.getMaterials().size()<=0){ + return; + } + if(otherImgCount==0){ + Log.e("(双面屏)TAG","隐藏额外图片"); + otherImg0.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg0,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg0); + + }else if(otherImgCount==1){ + otherImg1.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg1,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg1); + + }else if(otherImgCount==2){ + otherImg2.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg2,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg2); + + }else if(otherImgCount==3){ + otherImg3.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg3,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg3); + }else if(otherImgCount==4){ + otherImg4.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg4,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg4); + }else if(otherImgCount==5){ + otherImg5.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg5,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg5); + }else if(otherImgCount==6){ + otherImg6.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg6,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg6); + }else if(otherImgCount==7){ + otherImg7.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg7,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg7); + }else if(otherImgCount==8){ + otherImg8.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg8,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg8); + }else if(otherImgCount==9){ + otherImg9.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg9,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg9); + }else if(otherImgCount==10){ + otherImg10.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg10,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg10); + }else if(otherImgCount==11){ + otherImg11.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg11,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg11); + }else if(otherImgCount==12){ + otherImg12.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg12,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg12); + }else if(otherImgCount==13){ + otherImg13.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg13,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg13); + }else if(otherImgCount==14){ + otherImg14.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg14,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg14); + }else if(otherImgCount==15){ + otherImg15.setVisibility(View.INVISIBLE); + changeViewLocation( otherImg15,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), otherImg15); + } + } + + /** + * 更新替换图片 + * */ + + public void updateImage( NewProgramBean.components imageComponents0, int imagePlayCount, boolean firstImagePlay , boolean imagePlay ,ImageView imageView0 ,ImageView imageView00 ,int TYPE_UPDATE ){ + Log.e("(双面屏)TAG","切换图片"+imagePlayCount); + if(imageComponents0.getMaterials()==null||imageComponents0.getMaterials().size()==0){ + return; + } + + //如果只有一张图就不切换图片 + if(imageComponents0.getMaterials().size()>1){ + handler.sendEmptyMessageDelayed(TYPE_UPDATE,imageComponents0.getConfig().getTransitionPeriod()*1000);//切换 + } + + Log.e("(双面屏)TAG","开始切换图片"+TYPE_UPDATE); + if(imagePlayCount >= imageComponents0.getMaterials().size()){ + imagePlayCount = 0; + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlayCount0=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlayCount1=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlayCount2=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlayCount3=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlayCount4=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlayCount5=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlayCount6=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlayCount7=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlayCount8=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlayCount9=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlayCount10=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlayCount11=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlayCount12=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlayCount13=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlayCount14=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlayCount15=0; + } + } + String fileurl1 = imageComponents0.getMaterials().get(imagePlayCount).getFileUrl(); + long fileLength = imageComponents0.getMaterials().get(imagePlayCount).getFileLength(); + + //上传播放记录 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String playTime = format.format(System.currentTimeMillis()); +// ScreenSaverData.uploadPlayRecord(imageComponents0.getMaterials().get(imagePlayCount).getMaterialCode(), imageComponents0.getMaterials().get(imagePlayCount).getDuration(), playTime, null, null); + + String fileurl2; + if(imagePlayCount+1>=imageComponents0.getMaterials().size()){ + + fileurl2 = imageComponents0.getMaterials().get(0).getFileUrl(); + + }else { + + fileurl2 = imageComponents0.getMaterials().get(imagePlayCount+1).getFileUrl(); + } + + //第一张图显示 + if(firstImagePlay){ + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + firstImagePlay0=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + firstImagePlay1=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + firstImagePlay2=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + firstImagePlay3=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + firstImagePlay4=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + firstImagePlay5=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + firstImagePlay6=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + firstImagePlay7=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + firstImagePlay8=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + firstImagePlay9=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + firstImagePlay10=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + firstImagePlay11=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + firstImagePlay12=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + firstImagePlay13=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + firstImagePlay14=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + firstImagePlay15=false; + + } + + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH, fileurl1)); + if(Math.abs(file.length()-fileLength)>1){ + file.delete(); + }else { + } + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, fileurl1, imageView00); + }else { + + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + otherImg0.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + otherImg1.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + otherImg2.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + otherImg3.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + otherImg4.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + otherImg5.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + otherImg6.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + otherImg7.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + otherImg8.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + otherImg9.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + otherImg10.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + otherImg11.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + otherImg12.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + otherImg13.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + otherImg14.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + otherImg15.setVisibility(View.INVISIBLE); + } + } + + if(imagePlay){ + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlay0=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlay1=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlay2=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlay3=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlay4=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlay5=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlay6=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlay7=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlay8=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlay9=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlay10=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlay11=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlay12=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlay13=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlay14=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlay15=false; + + } + + //移动动画 + if(imageComponents0.getConfig().getTransition()!=null) { + if (imageComponents0.getConfig().getTransition().equals("上下滚动")) { + imgAnimation(imageView00, 0, 0, -imageComponents0.getHeight(), 0); + imgAnimation(imageView0, 0, 0, 0, imageComponents0.getHeight()); + } else if (imageComponents0.getConfig().getTransition().equals("左右滚动")) { + imgAnimation(imageView00, imageComponents0.getWidth(), 0, 0, 0); + imgAnimation(imageView0, 0, -imageComponents0.getWidth(), 0, 0); + } + } + + imageView00.setVisibility(View.VISIBLE); + imageView0.setVisibility(View.INVISIBLE); + }else { + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlay0=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlay1=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlay2=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlay3=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlay4=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlay5=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlay6=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlay7=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlay8=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlay9=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlay10=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlay11=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlay12=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlay13=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlay14=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlay15=true; + + } + + Log.e("TAG",""+TYPE_UPDATE); + //移动动画 + if(imageComponents0.getConfig().getTransition()!=null) { + if (imageComponents0.getConfig().getTransition().equals("上下滚动")) { + imgAnimation(imageView0, 0, 0, -imageComponents0.getHeight(), 0); + imgAnimation(imageView00, 0, 0, 0, imageComponents0.getHeight()); + } else if (imageComponents0.getConfig().getTransition().equals("左右滚动")) { + imgAnimation(imageView0, imageComponents0.getWidth(), 0, 0, 0); + imgAnimation(imageView00, 0, -imageComponents0.getWidth(), 0, 0); + } + } + + imageView00.setVisibility(View.INVISIBLE); + imageView0.setVisibility(View.VISIBLE); + } + + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW0,fileurl2); + imagePlayCount0++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW1,fileurl2); + imagePlayCount1++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW2,fileurl2); + imagePlayCount2++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW3,fileurl2); + imagePlayCount3++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + sendMsg(TYPE_CHANGE_IMG_SHOW4,fileurl2); + imagePlayCount4++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + sendMsg(TYPE_CHANGE_IMG_SHOW5,fileurl2); + imagePlayCount5++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + sendMsg(TYPE_CHANGE_IMG_SHOW6,fileurl2); + imagePlayCount6++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + sendMsg(TYPE_CHANGE_IMG_SHOW7,fileurl2); + imagePlayCount7++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + sendMsg(TYPE_CHANGE_IMG_SHOW8,fileurl2); + imagePlayCount8++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + sendMsg(TYPE_CHANGE_IMG_SHOW9,fileurl2); + imagePlayCount9++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + sendMsg(TYPE_CHANGE_IMG_SHOW10,fileurl2); + imagePlayCount10++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + sendMsg(TYPE_CHANGE_IMG_SHOW11,fileurl2); + imagePlayCount11++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + sendMsg(TYPE_CHANGE_IMG_SHOW12,fileurl2); + imagePlayCount12++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + sendMsg(TYPE_CHANGE_IMG_SHOW13,fileurl2); + imagePlayCount13++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + sendMsg(TYPE_CHANGE_IMG_SHOW14,fileurl2); + imagePlayCount14++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + sendMsg(TYPE_CHANGE_IMG_SHOW15,fileurl2); + imagePlayCount15++; + + } + } + + /** + *发送handler命令 + * */ + public void sendMsg(int TYPE_UPDATE_IMAGE, String url){ + handler.removeMessages(TYPE_UPDATE_IMAGE); + Message msg = new Message(); + msg.what = TYPE_UPDATE_IMAGE; + Bundle bundle = new Bundle(); + bundle.putString("url", url); + msg.setData(bundle); + handler.sendMessageDelayed(msg,1000); + } + + + /** + * 添加json动图 + * */ + List ltGiftList = new ArrayList(); + private void initLottie(NewProgramBean.components components){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl()); + + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = new LottieAnimationView(context); + relativeLayoutMax.addView(ltGift, lParams); + ltGiftList.add(ltGift); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + } + + /** + * 初始化文本 + * */ + + + List MarqueeTextList = new ArrayList(); + List AutoScrollTextList = new ArrayList(); + List textList = new ArrayList(); + + public void initText(NewProgramBean.components components,int position){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + NewProgramBean.materials textMaterials = components.getMaterials().get(0); + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, textMaterials.getFileUrl());//文本本地路径 + + if(components.getConfig().getAnimation().equals("自动")||components.getConfig().getAnimation().equals("固定")){ + MarqueeTextView textView = new MarqueeTextView(context); + setText2(components,textView); + relativeLayoutMax.addView(textView, lParams); + textView.setText(components.getMaterials().get(0).getText()); +// if(!new File(localPath).exists()){ +// //不存在 +// TextBean textBean = new TextBean(); +// textBean.setText(textMaterials.getText()); +// textBean.setPosition(position); +// textBean.setMarqueeTextView(textView); +// textBean.setWidth(components.getWidth()); +// textList.add(textBean); +// handler.removeMessages(TYPE_UPDATE_TEXT4); +// handler.sendEmptyMessageDelayed(TYPE_UPDATE_TEXT4,5000); +// }else { +// textView.setText(FileUtil.loadFromSDFile(localPath).trim()); +// } + + + }else { + AutoScrollTextView AutoScrollText = new AutoScrollTextView(context); + setText(components, AutoScrollText); + relativeLayoutMax.addView(AutoScrollText, lParams); + AutoScrollText.setText(components.getMaterials().get(0).getText()); + AutoScrollText.init(components.getWidth()); + AutoScrollText.startScroll(); + +// if(!new File(localPath).exists()){ +// //不存在 +// TextBean textBean = new TextBean(); +// textBean.setText(textMaterials.getText()); +// textBean.setPosition(position); +// textBean.setAutoScrollTextView(AutoScrollText); +// textBean.setWidth(components.getWidth()); +// textList.add(textBean); +// handler.removeMessages(TYPE_UPDATE_TEXT4); +// handler.sendEmptyMessageDelayed(TYPE_UPDATE_TEXT4,5000); +// }else { +// AutoScrollText.setText(FileUtil.loadFromSDFile(localPath)); +// AutoScrollText.init(components.getWidth()); +// AutoScrollText.startScroll(); +// } + + } + } + + /** + * 设置文字 + * */ + public void setText(NewProgramBean.components components, AutoScrollTextView text){ + AutoScrollTextList.add(text); + text.init(components.getWidth()); + text.setTextColor1(components.getConfig().getFontColor()); + if(components.getConfig().getAnimationSpeed().equals("慢")){ + text.setSpeed(1); + }else if(components.getConfig().getAnimationSpeed().equals("中等")){ + text.setSpeed(2); + }else if(components.getConfig().getAnimationSpeed().equals("快")){ + text.setSpeed(3); + }else if(components.getConfig().getAnimationSpeed().equals("很快")){ + text.setSpeed(4); + } + + String backgroundColor = components.getConfig().getBackgroundColor(); + String opacity = (String)colorMap.get(components.getConfig().getBackgroundOpacity()); + if(backgroundColor!=null&&!backgroundColor.isEmpty()){ + backgroundColor="#"+opacity+backgroundColor.substring(1); + text.setBackgroundColor(Color.parseColor(backgroundColor)); + } + text.setTextSize(components.getConfig().getFontSize()); + + if(components.getConfig().getFontStyle().equals("正常")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(components.getConfig().getFontStyle().equals("加粗")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(components.getConfig().getFontStyle().equals("斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(components.getConfig().getFontStyle().equals("加粗、斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + int top=(components.getHeight()-components.getConfig().getFontSize())/2; + text.setPadding(0,top,0,0); + } + + /** + * 设置文字 + * */ + public void setText2(NewProgramBean.components components, MarqueeTextView text){ + MarqueeTextList.add(text); + text.setTextColor(Color.parseColor(components.getConfig().getFontColor())); + String backgroundColor = components.getConfig().getBackgroundColor(); + String opacity = (String)colorMap.get(components.getConfig().getBackgroundOpacity()); + if(backgroundColor!=null&&!backgroundColor.isEmpty()){ + backgroundColor="#"+opacity+backgroundColor.substring(1); + text.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + if(components.getConfig().getFontStyle().equals("正常")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(components.getConfig().getFontStyle().equals("加粗")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(components.getConfig().getFontStyle().equals("斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(components.getConfig().getFontStyle().equals("加粗、斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + text.setTextSize(components.getConfig().getFontSize()); + text.setSingleLine(); + if(components.getConfig().getAnimation().equals("自动")){ + text.setMarqueeRepeatLimit(Integer.MAX_VALUE); + text.setFocusable(true); + text.setEllipsize(TextUtils.TruncateAt.MARQUEE); + text.setHorizontallyScrolling(true); + } + text.setHeight(components.getHeight()); + text.setWidth(components.getWidth()); + text.setGravity(Gravity.CENTER_VERTICAL); + } + + /** + * 添加html + * */ + WebView onlineWebView0; + WebView onlineWebView1; + WebView onlineWebView2; + WebView onlineWebView3; + NewProgramBean.components webComponents0; + NewProgramBean.components webComponents1; + NewProgramBean.components webComponents2; + NewProgramBean.components webComponents3; + List webList=new ArrayList(); + public void initOnlineWeb(NewProgramBean.components components,int position){ + if(components==null||components.getMaterials().size()<=0){ + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + if(position==0){ + + onlineWebView0 = new WebView(context); + webList.add(onlineWebView0); + relativeLayoutMax.addView(onlineWebView0, lParams); + setWebView(onlineWebView0,components.getMaterials().get(0).getOuterChain()); + webComponents0 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW0,refreshWebTime); + } + + } else if (position==1){ + + onlineWebView1 = new WebView(context); + webList.add(onlineWebView1); + relativeLayoutMax.addView(onlineWebView1, lParams); + setWebView(onlineWebView1,components.getMaterials().get(0).getOuterChain()); + webComponents1 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW1,refreshWebTime); + } + } else if (position==2){ + + onlineWebView2 = new WebView(context); + webList.add(onlineWebView2); + relativeLayoutMax.addView(onlineWebView2, lParams); + setWebView(onlineWebView2,components.getMaterials().get(0).getOuterChain()); + webComponents2 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW2,refreshWebTime); + } + } else if (position==3){ + + onlineWebView3 = new WebView(context); + webList.add(onlineWebView3); + relativeLayoutMax.addView(onlineWebView3, lParams); + setWebView(onlineWebView3,components.getMaterials().get(0).getOuterChain()); + webComponents3 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW3,refreshWebTime); + } + } + } + + public int getRefreshWebTime(NewProgramBean.components components){ + String refreshPeriod = components.getConfig().getRefreshPeriod(); + String[] split = refreshPeriod.split(":"); + int time=Integer.parseInt(split[0])*3600*1000+Integer.parseInt(split[1])*60*1000+Integer.parseInt(split[2])*1000; + return time; + } + + public void setWebView(WebView mWebView,String url){ +// mWebView.setBackgroundColor(Color.TRANSPARENT); + mWebView.setHorizontalScrollBarEnabled(false);//水平不显示 + mWebView.setVerticalScrollBarEnabled(false); //垂直不显示 + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 + webSettings.setSupportZoom(true);//调整图片至适合webview的大小 + webSettings.setUseWideViewPort(true);// 缩放至屏幕的大小 + webSettings.setLoadWithOverviewMode(true); + webSettings.setLoadsImagesAutomatically(true); +// webSettings.setAppCacheEnabled(true);//是否使用缓存 + webSettings.setDomStorageEnabled(true);//DOM Storage + webSettings.setDefaultTextEncodingName("utf-8"); + mWebView.setWebViewClient(new WebViewClient()); + mWebView.loadUrl(url); + } + + class MyWebViewClient extends WebViewClient { + + } + /** + * 添加水牌 + * */ + WebView spWebView; + public void intSuipai(NewProgramBean.components components){ + if(components==null||components.getMaterials().size()<=0){ + LoggerUtil.e("(双面屏)intSuipai","水牌暂无内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + //开启本地服务 + if(!Constant.isCoreService){ + context.startService(new Intent(context, CoreService.class)); + } + spWebView = new WebView(context); + webList.add(spWebView); + relativeLayoutMax.addView(spWebView, lParams); + + if(new File(Constant.CACHE_PATH +components.getMaterials().get(0).getFileUrl()).exists()){ + //存在判断dist文件夹是否存在index + String shuipai_version = components.getMaterials().get(0).getFileUrl(); + Log.e("(双面屏)intSuipai","水牌版本:"+shuipai_version); + if(!shuipai_version.equals(DeviceData.getDeviceInfo(DeviceData.SHUIPAI_VERSION)) || !new File(Constant.CACHE_PATH2).exists()){ + LoggerUtil.e("(双面屏)intSuipai","版本号与本地不同,解压水牌zip"); + + if(new File(Constant.CACHE_PATH2).exists()){ + FileUtil.deleteDirectory(Constant.CACHE_PATH2); + } + FileUtil.makeRootDirectory(Constant.CACHE_PATH2); + boolean upZip = FileUtil.upZipFile(Constant.CACHE_PATH + components.getMaterials().get(0).getFileUrl(), Constant.CACHE_PATH2); + LoggerUtil.e("(双面屏)intSuipai","解压水牌zip结果:"+upZip); + if(upZip){ + + DeviceData.saveDeviceInfo(DeviceData.SHUIPAI_VERSION , shuipai_version); + readShuiPaiJson(); + } + }else { + LoggerUtil.e("(双面屏)intSuipai","水牌zip版本与本地相同,直接读取数据"); + readShuiPaiJson(); + } + + handler.sendEmptyMessageDelayed(TYPE_SHUIPAI,5000); + }else { + LoggerUtil.e("(双面屏)intSuipai","水牌zip本地不存在"); + } + } + + /** + * 读取水牌json离线数据 + * */ + int shuipaifacenumb = 0;//接口数量 + int shuipaifacenumb_finish = 0;//接口请求完成 + public void readShuiPaiJson(){ + try { + String url = Constant.CACHE_PATH+"dist/" +"/InterfaceList.json"; + if(!new File(url).exists()){ + LoggerUtil.e("(双面屏)redSuiPaiJson()","不存在水牌离线json"); + return; + } + String s = FileUtil.loadFromSDFile(url); + Log.e("(双面屏)TAG","水牌离线json:"+s); + ShuipaiDataListBean shuipaiDataListBean = GsonUtil.getGson().fromJson(s, new TypeToken() { + }.getType()); + List InterFaceList = shuipaiDataListBean.getData(); + shuipaifacenumb = InterFaceList.size(); + for(InterFaceBean interFacebean: InterFaceList ){ + if(interFacebean.getInterfaceName().equals("GetDevCoordinateByIP")){ + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + } + }else { + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + } + } + } + }catch (Throwable t){ + LoggerUtil.e("(双面屏)redShuiPaiJson()", StringUtil.getThrowableStr(t)); + } + } + + /** + * 添加水牌 + * */ + WebView mapWebView; + public void initMap(NewProgramBean.components components){ + if(components==null||components.getMaterials().size()<=0){ + LoggerUtil.e("(双面屏)initMap","地图组件暂无内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + //开启本地服务 + if(!Constant.isCoreService){ + context.startService(new Intent(context, CoreService.class)); + } + mapWebView = new WebView(context); + webList.add(mapWebView); + relativeLayoutMax.addView(mapWebView, lParams); + + if(new File(Constant.CACHE_PATH +components.getMaterials().get(0).getFileUrl()).exists()){ + //存在判断dist文件夹是否存在index + String shuipai_version = components.getMaterials().get(0).getFileUrl(); + Log.e("(双面屏)intSuipai","地图版本:"+shuipai_version); + if(!shuipai_version.equals(DeviceData.getDeviceInfo(DeviceData.SHUIPAI_VERSION)) || !new File(Constant.CACHE_PATH2).exists()){ + LoggerUtil.e("(双面屏)intSuipai","版本号与本地不同,解压地图zip"); + + if(new File(Constant.CACHE_PATH2).exists()){ + FileUtil.deleteDirectory(Constant.CACHE_PATH2); + } + FileUtil.makeRootDirectory(Constant.CACHE_PATH2); + boolean upZip = FileUtil.upZipFile(Constant.CACHE_PATH + components.getMaterials().get(0).getFileUrl(), Constant.CACHE_PATH2); + LoggerUtil.e("(双面屏)intSuipai","解压地图zip结果:"+upZip); + if(upZip){ + + DeviceData.saveDeviceInfo(DeviceData.SHUIPAI_VERSION , shuipai_version); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,2000); + } + }else { + LoggerUtil.e("(双面屏)intSuipai","地图zip版本与本地相同,直接读取数据"); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,2000); + } + + + }else { + LoggerUtil.e("(双面屏)intSuipai","地图zip本地不存在"); + } + } + + public void getApiFileResourceList(Context context, String url, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + + AsyncHttpClient client = new AsyncHttpClient(); + + client.get( context, url ,new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + + try { + if (responseBody!=null) { + String response = new String(responseBody).replace("\\\\", "/"); + Log.e("(双面屏)地图组件资源列表数据",response); + MapDataListBean mapDataListBean = GsonUtil.getGson().fromJson(response, new TypeToken() {}.getType()); + + for (ResourceFileBean bean : mapDataListBean.getData()){ + mapFiles.put(bean.getUrl(),bean.getUrl()) ; + } + mapDownloadCount=0; + downloadFiles(); + } + + } catch (Throwable t) { + + + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 开始批量下载图片 + * ishandler 是否需要通知更新 + */ + public void downloadFiles() { + Log.e("(双面屏)TAG","地图文件下载的数量"+mapFiles.size()+",下载地址前缀"+DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP)); + if(mapFiles.size()<=0 ){ + handler.sendEmptyMessageDelayed(TYPE_MAP,5000); + return; + } + for (String bigFile : mapFiles.keySet()) { + + Log.e("(双面屏)TAG",bigFile); + downloadFile(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), bigFile); + } + } + + + private void downloadFile(String imgPath, final String address) { + + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH2, address)); + if (file.exists()) { + mapDownloadCount++ ; + mapDownCount(); + return; + } + + FileUtil.downloadFile2(StringUtil.strSplice(imgPath, address), StringUtil.strSplice(Constant.CACHE_PATH3, address), new QueryFinishListener() { + @Override + public void onFinish() { + mapDownloadCount++ ; + mapDownCount(); + } + }); + } + + /** + * 下载完成度 + * */ + public void mapDownCount(){ + if(mapFiles.size() == mapDownloadCount){ + LoggerUtil.e("(双面屏)mapDownCount()","地图资源下载完成"); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,6000); + } + } + + + /** + * 添加天气 + * */ + private WeatherAdapter0 weatherAdapter0; + private WeatherAdapter1 weatherAdapter00; + private RecyclerView recycle_weather0; + NewProgramBean.components weatherComponents0; + + public void initWeather(NewProgramBean.components components , int position){ + //没有城市名不显示天气 + if(components.getConfig().getCityName().isEmpty() && DeviceData.getDevice().getCity()==null){ + return; + } + //设置列表大小 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); +// Log.e("TAG","初始化天气"); + List weatherList = new ArrayList<>(); + for(int i=0;i<6;i++){ + weatherList.add(""); + } + LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); + + if(position==0){ + recycle_weather0 = new RecyclerView(context); + relativeLayoutMax.addView(recycle_weather0, params); + + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + recycle_weather0.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + recycle_weather0.setLayoutManager(layoutManager); + + ViewGroup.LayoutParams layoutParams = recycle_weather0.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + recycle_weather0.setLayoutParams(layoutParams); + if(components.getConfig().getStyle()==0){ + weatherAdapter0 = new WeatherAdapter0(context,components); + weatherAdapter0.setData(weatherList); + recycle_weather0.setAdapter(weatherAdapter0); + }else { + weatherAdapter00 = new WeatherAdapter1(context,components); + weatherAdapter00.setData(weatherList); + recycle_weather0.setAdapter(weatherAdapter00); + } + } + + if(!components.getConfig().getCityName().isEmpty()){ + getWeather(components.getConfig().getCityName(),null,null); + }else { + getWeather(DeviceData.getDevice().getCity(),null,null); + } + } + + + NewProgramBean.components timeComponents0; + public void initTime(NewProgramBean.components components ,int position){ + timeComponents0=components; + showTimeStyle(components); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_TIME0,10); + } + + /** + * 显示时间风格 + * */ + public void showTimeStyle(NewProgramBean.components components ){ +// Log.e("TAG","显示时间"); + int style = components.getConfig().getStyle(); + int offsetX = components.getOffsetX(); + int offsetY = components.getOffsetY(); + layoutTime0.setVisibility(View.INVISIBLE); + layoutTime1.setVisibility(View.INVISIBLE); + layoutTime2.setVisibility(View.INVISIBLE); + layoutTime3.setVisibility(View.INVISIBLE); + layoutTime4.setVisibility(View.INVISIBLE); + //得到变换比例 + int width = components.getWidth(); + float proportion = (float)width/(float) 320; + + String fontColor = components.getConfig().getFontColor(); + if(style==0){ + //改变大小 + ViewGroup.LayoutParams layoutParams = layoutTime0.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + layoutTime0.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + + layoutTime0.setLayoutParams(layoutParams); + tvTime0.setTextColor(Color.parseColor(fontColor)); + tvWeek0.setTextColor(Color.parseColor(fontColor)); + tvDay0.setTextColor(Color.parseColor(fontColor)); + tvTime0.setTextSize((int)(proportion*24)); + tvWeek0.setTextSize((int)(proportion*24)); + tvDay0.setTextSize((int)(proportion*24)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + layoutTime0.setLayoutParams(params); + layoutTime0.setVisibility(View.VISIBLE); + }else if(style==1){ + + ViewGroup.LayoutParams layoutParams = layoutTime1.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + layoutTime1.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + layoutTime1.setLayoutParams(layoutParams); + tvTime1.setTextColor(Color.parseColor(fontColor)); + tvWeek1.setTextColor(Color.parseColor(fontColor)); + tvDay1.setTextColor(Color.parseColor(fontColor)); + tvTime1.setTextSize((int)(proportion*24)); + tvWeek1.setTextSize((int)(proportion*24)); + tvDay1.setTextSize((int)(proportion*24)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + layoutTime1.setLayoutParams(params); + layoutTime1.setVisibility(View.VISIBLE); + }else if(style==2){ + ViewGroup.LayoutParams layoutParams = layoutTime2.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + layoutTime2.setLayoutParams(layoutParams); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + layoutTime2.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + tvTime2.setTextColor(Color.parseColor(fontColor)); + tvWeek2.setTextColor(Color.parseColor(fontColor)); + tvDay2.setTextColor(Color.parseColor(fontColor)); + tvTime2.setTextSize((int)(proportion*24)); + tvWeek2.setTextSize((int)(proportion*18)); + tvDay2.setTextSize((int)(proportion*18)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + layoutTime2.setLayoutParams(params); + layoutTime2.setVisibility(View.VISIBLE); + }else if(style==3){ + ViewGroup.LayoutParams layoutParams = layoutTime3.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + layoutTime3.setLayoutParams(layoutParams); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + layoutTime3.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + tvTime3.setTextColor(Color.parseColor(fontColor)); + tvWeek3.setTextColor(Color.parseColor(fontColor)); + tvDay3.setTextColor(Color.parseColor(fontColor)); + tvTime3.setTextSize((int)(proportion*24)); + tvWeek3.setTextSize((int)(proportion*14)); + tvDay3.setTextSize((int)(proportion*14)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + layoutTime3.setLayoutParams(params); + layoutTime3.setVisibility(View.VISIBLE); + }else if(style==4){ + ViewGroup.LayoutParams layoutParams = layoutTime4.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + layoutTime4.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + layoutTime4.setLayoutParams(layoutParams); + tvTime4.setTextColor(Color.parseColor(fontColor)); + tvWeek4.setTextColor(Color.parseColor(fontColor)); + tvDay4.setTextColor(Color.parseColor(fontColor)); + tvTime4.setTextSize((int)(proportion*36)); + tvWeek4.setTextSize((int)(proportion*14)); + tvDay4.setTextSize((int)(proportion*14)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + layoutTime4.setLayoutParams(params); + layoutTime4.setVisibility(View.VISIBLE); + } + } + + /** + * 时间更新 + * */ + public void chooseTime(int style){ + long longtime = System.currentTimeMillis(); + String day = TimeUtil.stampToDate(longtime); + String time = TimeUtil.stampTotime(longtime); + String week = TimeUtil.getWeek2(day); + if(style==0){ + tvTime0.setText(time); + tvWeek0.setText(week); + tvDay0.setText(day); + }else if(style==1){ + tvTime1.setText(time); + tvWeek1.setText(week); + tvDay1.setText(day); + }else if(style==2){ + tvTime2.setText(time); + tvWeek2.setText(week); + tvDay2.setText(day); + }else if(style==3){ + tvTime3.setText(time); + tvWeek3.setText(week); + tvDay3.setText(day); + }else if(style==4){ + tvTime4.setText(time); + tvWeek4.setText(week); + tvDay4.setText(day); + } + } + + /** + * 获取天气 + * */ + public void getWeather(String city, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getBaseService().getWeather(city).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + + WeatherBean weatherbean = new Gson().fromJson(new Gson().toJson(response.body().getData()), new TypeToken() { + }.getType()); + + if(weatherAdapter0!=null){ + List weatherList = new ArrayList<>(); + weatherList.add(""+weatherbean.getTemperatureNow()); + weatherList.add(weatherbean.getHumidity().substring(0,weatherbean.getHumidity().length()-1)); + weatherList.add(weatherbean.getWindPower()); + weatherList.add(weatherbean.getAqi()+""); + weatherList.add(weatherbean.getPm()+""); + weatherList.add(weatherbean.getWeather()); + weatherAdapter0.setData(weatherList); + } + + if(weatherAdapter00!=null){ + List weatherList = new ArrayList<>(); + weatherList.add(""+weatherbean.getTemperatureNow()); + weatherList.add(weatherbean.getHumidity().substring(0,weatherbean.getHumidity().length()-1)); + weatherList.add(weatherbean.getWindPower()); + weatherList.add(weatherbean.getAqi()+""); + weatherList.add(weatherbean.getPm()+""); + weatherList.add(weatherbean.getWeather()); + weatherAdapter00.setData(weatherList); + + } + + } catch (Throwable t) { + LoggerUtil.e("(双面屏)getWeather()", StringUtil.getThrowableStr(t)); + } + //一小时更新一次天气 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_WEATHER0,3600*1000); + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("(双面屏)getWeather()", StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + //一小时更新一次天气 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_WEATHER0,3600*1000); + + } + }); + } + + /** + * 修改成默认背景图 + * */ + public void changeOldBackground(){ + try { + backgroundImage.setBackgroundColor(Color.TRANSPARENT); + backgroundImage.setImageBitmap(null); + }catch (Exception e){ + LoggerUtil.e("(双面屏)修改成默认背景图",e.getMessage()); + } + } + + /** + * 图片移动动画 + * */ + public void imgAnimation(View view, int fromX ,int toX,int fromY,int toY){ + Animation translateAnimation = new TranslateAnimation(fromX, toX, fromY, toY);//设置平移的起点和终点 + translateAnimation.setDuration(1000);//动画持续的时间为10s + view.startAnimation(translateAnimation); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/program/ScreenSaverActivity.java b/app/src/main/java/qianmu/container/activity/program/ScreenSaverActivity.java new file mode 100644 index 0000000..84fa777 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ScreenSaverActivity.java @@ -0,0 +1 @@ +package qianmu.container.activity.program; import android.annotation.SuppressLint; import android.app.Presentation; import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Display; import android.view.View; import androidx.annotation.NonNull; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.GridLayoutManager; import com.alibaba.android.arouter.facade.annotation.Route; import com.alibaba.android.arouter.launcher.ARouter; import com.google.gson.Gson; import com.squareup.leakcanary.RefWatcher; import com.sun.jna.Native; import java.io.File; import java.lang.ref.WeakReference; import java.text.SimpleDateFormat; import java.util.List; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import qianmu.container.R; import qianmu.container.activity.BaseActivity; import qianmu.container.activity.H5.H5Data; import qianmu.container.adapter.KeyAdapter; import qianmu.container.app.Constant; import qianmu.container.app.MyApplication; import qianmu.container.data.AppData; import qianmu.container.entity.NovaDeviceBean; import qianmu.container.entity.JxbBean; import qianmu.container.entity.Resp; import qianmu.container.entity.ScreenSaverTime; import qianmu.container.http.retrofit.RetrofitUtil; import qianmu.container.manager.QMWindowManager; import qianmu.container.data.DeviceData; import qianmu.container.data.ScreenSaverData; import qianmu.container.databinding.ActivityScreenSaverBinding; import qianmu.container.entity.MessageEvent; import qianmu.container.mqtt.MQTTService; import qianmu.container.service.ContainerService; import qianmu.container.service.MessengerService; import qianmu.container.util.AppUtil; import qianmu.container.util.BitmapUtil; import qianmu.container.util.CalendarUtils; import qianmu.container.util.DeviceUtil; import qianmu.container.util.LoggerUtil; import qianmu.container.util.SignWayUtil; import qianmu.container.util.StringUtil; import qianmu.container.util.ToastUtils; import qianmu.container.util.ViplexCore; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @SuppressWarnings("All") @Route(path = Constant.ROUTE_SCREEN_SAVER) public class ScreenSaverActivity extends BaseActivity { ViplexCore instance ; ActivityScreenSaverBinding binding; ViewScreenSaver screenSaver; ViewSubtitle subtitle; ViewTouch touch; ViewMedia media; ViewTest test; private WeakReference weakReference; static final int TYPE_HINT_PASSWORD = 3;//隐藏密码输入框 static final int NOVA_HINT = 4;//隐藏密码输入框 static final int SHOW_JXB = 5;//机械臂轮播 String TB40_password="SN2008@+";//华贸SN2008@+ int time = 0; int jxbPlayNum = 0; Handler handler = new Handler() { @SuppressLint("HandlerLeak") @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what){ case TYPE_HINT_PASSWORD: sendEmptyMessageDelayed(TYPE_HINT_PASSWORD,1000); if(time>=30){ binding.layoutPass.setVisibility(View.GONE); removeMessages(TYPE_HINT_PASSWORD); } time++; try { }catch (Exception e){ } break; case NOVA_HINT: initNova(); break; case SHOW_JXB: List jxbData = DeviceData.getJxbData(); if(jxbData.size()>0){ if(jxbPlayNum>=jxbData.size())jxbPlayNum=0; JxbBean jxbBean = jxbData.get(jxbPlayNum); DeviceData.setJxbPlay(jxbBean.getOneText(),jxbBean.getTwoText(),jxbBean.getCost()+"m", jxbBean.getAngle(),null,null); jxbPlayNum++; if(H5Data.getKdxf().getData().getControlInfo()!=null){ handler.removeMessages(SHOW_JXB); handler.sendEmptyMessageDelayed(SHOW_JXB,H5Data.getKdxf().getData().getControlInfo().getRotationTime()*1000); }else { handler.removeMessages(SHOW_JXB); handler.sendEmptyMessageDelayed(SHOW_JXB,60000); } } break; } } }; @Override protected void initView() { currRoute = Constant.ROUTE_SCREEN_SAVER; binding = DataBindingUtil.setContentView(this, R.layout.activity_screen_saver); screenSaver = new ViewScreenSaver(this, binding.viewScreenSaver.getRoot()); touch = new ViewTouch(this, binding.viewTouch.getRoot()); media = new ViewMedia(this, binding.viewMedia.getRoot()); test = new ViewTest(this, binding.viewTest.getRoot()); } @Override protected void setData() { LoggerUtil.e("ScreenSaverActivity","setData"); Constant.isScreen4K = DeviceUtil.screenIs4K(this); //设置默认屏保图 ScreenSaverTime screenSaverTime = ScreenSaverData.getScreenSaver(); String url = screenSaverTime.getUrl(); if(url!=null && !url.isEmpty()){ BitmapUtil.loadImage(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), Constant.CACHE_PATH, url, binding.defaultImage); } String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE); if (!deviceType.equals("信发") && !deviceType.equals("双面屏")) { LoggerUtil.e("ScreenSaverActivity","setData调用start"); screenSaver.start(); } initPass(); //诺瓦吊顶信发 if(Constant.androidBoardType.equals("nova")){ instance = (ViplexCore) Native.loadLibrary("viplexcore",ViplexCore.class); handler.sendEmptyMessageDelayed(NOVA_HINT,5000); } } @Override protected void setListener() { binding.setting.setOnClickListener((view) -> { if (!MyApplication.getInstance().addClickTimes()) return; binding.layoutPass.setVisibility(View.VISIBLE); time = 0; handler.sendEmptyMessage(TYPE_HINT_PASSWORD); binding.tvPass.setText(""); // ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, true).navigation(); }); binding.layoutTouch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //点击跳转到webview页面 String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE); if (!deviceType.equals("信发") && !deviceType.equals("双面屏")) { DeviceData.guideClickDataUpload(null,null); ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); } } }); } @Override protected void onResume() { super.onResume(); LoggerUtil.e("ScreenSaverActivity","onResume"); if (exitProgress()) return; if (navigationDeviceInfo()) return; AppData.saveFrontApp(DeviceUtil.getPackageName()); // ScreenSaverData.queryScreensaver(null, null); //是否显示touch me String touchType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TOUCH); String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 if (deviceType.equals("信发")||deviceType.equals("双面屏")) { LoggerUtil.e("ScreenSaverActivity","onResume调用start"); screenSaver.start(); } if(deviceType.equals("信发")||deviceType.equals("双面屏")){ touch.hideTouch(); }else { touch.showTouch(); } //是否显示同屏测试信息 String syncTest = DeviceData.getDeviceInfo(DeviceData.HINT_SYNC_TEST, "关闭"); if ("开启".equals(syncTest)) test.showViewTest(); else test.hideViewTest(); AppUtil.updateMenuWindowState(); //开启双面屏 if(deviceType.equals("双面屏")){ if(presentation != null){ presentation.cancel(); } showSecondByDisplayManager(ScreenSaverActivity.this); } binding.layoutPass.setVisibility(View.GONE); if(deviceType.equals("指路机")){ handler.removeMessages(SHOW_JXB); handler.sendEmptyMessageDelayed(SHOW_JXB,5000); } } @Override protected void onPause() { super.onPause(); touch.hideTouch(); } @Override protected void onStop() { super.onStop(); LoggerUtil.e("ScreenSaverActivity","onStop"); screenSaver.hideScreenSaver(); touch.hideTouch(); test.hideViewTest(); if(handler!=null){ handler.removeMessages(TYPE_HINT_PASSWORD); handler.removeMessages(SHOW_JXB); } } @Override protected void onDestroy() { super.onDestroy(); LoggerUtil.e("ScreenSaverActivity","onDestroy"); // RefWatcher refWatcher = MyApplication.getRefWatcher(this); // refWatcher.watch(this); } @Override public void onMessageEvent(MessageEvent message) { super.onMessageEvent(message); if (Constant.ACTION_START_INTER_CUT.equals(message.getCode())) { //开始插播 // screenSaver.showScreenSaver(); } else if (Constant.ACTION_PLAY_PROGRAM_BY_INDEX.equals(message.getCode())) { int index = Integer.valueOf(message.getData()); // screenSaver.playProgramByIndex(index); } else if (Constant.ACTION_PLAY_CUT_PROGRAM_BY_INDEX.equals(message.getCode())) { int index = Integer.valueOf(message.getData()); } else if (Constant.ACTION_PLAY_VIDEO_PROGRAM_BY_INDEX.equals(message.getCode())) { //视频下标 int index = Integer.valueOf(message.getData()); Log.e("TAG","收到视频下标"+index); screenSaver.videoProgramByIndex(index); } else if (Constant.ACTION_PLAY_IMG_PROGRAM_BY_INDEX.equals(message.getCode())) { //图片下标 int index = Integer.valueOf(message.getData()); Log.e("TAG","收到图片下标"+index); screenSaver.imgProgramByIndex(index); }else if (Constant.ACTION_PLAY_NEXT_PROGRAM_BY_INDEX.equals(message.getCode())) { //节目下标 int index = Integer.valueOf(message.getData()); Log.e("TAG","收到节目下标"+index); screenSaver.programByIndex(index); } else if (Constant.ACTION_MEDIA_UPDATE_COMPLETE.equals(message.getCode())) { // screenSaver.playProgramByIndex(0); } else if(Constant.ACTION_SHOW_TOUCH_ME.equals(message.getCode())){ //是否显示touch me String touchType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TOUCH); String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 if(deviceType.equals("信发")||deviceType.equals("双面屏") || "1".equals(deviceType)){ touch.hideTouch(); }else { touch.showTouch(); } }else if(Constant.ACTION_UPDATE_PROG.equals(message.getCode())){ //发布新的节目 LoggerUtil.e("ScreenSaverActivity","收到MQTT通知拉取节目"); screenSaver.setNewData(); }else if(Constant.ACTION_RESTART_MY_PRESENTATION.equals(message.getCode())){ //开启双面屏 if(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("双面屏")){ LoggerUtil.e("ScreenSaverActivity","新节目通知双面屏"); if(presentation != null){ presentation.cancel(); } showSecondByDisplayManager(ScreenSaverActivity.this); } }else if (Constant.NOVA_INIT.equals(message.getCode())) { // init(); }else if(Constant.NOVA_REBOOT.equals(message.getCode())){ LoggerUtil.e("ScreenSaverActivity","诺瓦设备重启"); reboot(); }else if(Constant.NOVA_UPDATE_APP.equals(message.getCode())){ LoggerUtil.e("ScreenSaverActivity","诺瓦设备更新app"); updateApp(message.getData()); }else if(Constant.NOVA_SCREEN_SHOT.equals(message.getCode())){ LoggerUtil.e("ScreenSaverActivity","诺瓦设备截屏"); Screenshot(message.getData()); }else if(Constant.NOVA_SCREEN_POWER_ON.equals(message.getCode())){ LoggerUtil.e("ScreenSaverActivity","诺瓦设备开屏"); screenPower("OPEN"); }else if(Constant.NOVA_SCREEN_POWER_CLOSE.equals(message.getCode())){ LoggerUtil.e("ScreenSaverActivity","诺瓦设备关屏"); screenPower("CLOSE"); } } private boolean exitProgress() { boolean exitResult = getIntent().getBooleanExtra(Constant.ACTION_EXIT, false); if (exitResult) { getIntent().removeExtra(Constant.ACTION_EXIT); SignWayUtil.hideStatusBar(true); QMWindowManager.removeMenuWindow(); sendExitPackageName(); stopService(new Intent(this, ContainerService.class)); stopService(new Intent(this, MessengerService.class)); stopService(new Intent(this, MQTTService.class));//停止Mqtt服务 Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//栈内复用模式 startActivity(startMain); System.exit(0); // finish(); } return exitResult; } //密码输入框 public void initPass(){ GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 5); KeyAdapter keyAdapter = new KeyAdapter(this); binding.recycKey.setLayoutManager(gridLayoutManager); binding.recycKey.setAdapter(keyAdapter); keyAdapter.setOnitemClickLintener(new KeyAdapter.OnitemClick() { @Override public void onItemClick(String position) { time = 0; if(position.equals("清空")){ binding.tvPass.setText(""); }else if(position.equals("删除")){ String s = binding.tvPass.getText().toString(); if(s.length()>0){ binding.tvPass.setText( s.substring(0,s.length()-1)); }else { binding.tvPass.setText(""); } }else if(position.equals("取消")){ binding.layoutPass.setVisibility(View.GONE); }else if(position.equals("确定")){ SimpleDateFormat format = new SimpleDateFormat("ddMM"); String pwd = format.format(System.currentTimeMillis());//当前日期当前月份 StringBuilder sb = new StringBuilder(pwd); String whatDay4 = CalendarUtils.getWhatDay4(System.currentTimeMillis()); pwd = sb.insert(2, whatDay4).toString();//密码为日星期月6位数 String inputPWD = binding.tvPass.getText().toString().trim();//输入的密码 if (!pwd.equals(inputPWD)) { ToastUtils.showToast("密码错误"); return; } binding.layoutPass.setVisibility(View.GONE); ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).withBoolean(Constant.INPUT_PASSWORD, false).navigation(); }else { binding.tvPass.setText(binding.tvPass.getText().toString()+position); } } }); } private boolean navigationDeviceInfo() { String deviceCode = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); if (StringUtil.isEmpty(deviceCode)) { ARouter.getInstance().build(Constant.ROUTE_DEVICE_INFO).navigation(); return true; } return false; } public static void startAction(Context context) { Intent intent = new Intent(context, ScreenSaverActivity.class); context.startActivity(intent); ((BaseActivity) context).overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } /** * 华贸led设备 * */ String sn; public void initNova(){ String companyInfo = "{\"company\":\"NovaStar\",\"phone\":\"029-68216000\",\"email\":\"hr@novastar.tech\"}"; instance.nvSetDevLang("Java"); int i = instance.nvInit(getDiskCacheDir(MyApplication.getInstance()), companyInfo); LoggerUtil.e("华贸led设备初始化","code"+i); String ip="{\"ip\":\""+DeviceUtil.getEthIpAddress()+"\"}"; instance.nvSearchAppointIpAsync(ip, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 搜索:", "code:"+code+",data:"+data); if(code==0){ NovaDeviceBean novaDeviceBean = new Gson().fromJson(data, NovaDeviceBean.class); sn = novaDeviceBean.getSn(); login(); } } }); } //TB40 华贸SN2008@+ 江湾里123456 public void login(){ instance.nvLoginAsync("{\"sn\":\""+sn+"\",\"username\":\"admin\",\"rememberPwd\":1,\"password\":\""+TB40_password+"\",\"loginType\":0}",new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 登录1:", "code:"+code+"data:"+data); } }); instance.nvLoginAsync("{\"sn\":\""+sn+"\",\"username\":\"admin\",\"rememberPwd\":1,\"password\":\""+TB40_password+"\",\"loginType\":1}",new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 登录2:", "code:"+code+"data:"+data); } }); } //TB40 重启 public void reboot(){ String data="{\"sn\":\""+sn+"\",\"taskInfo\":{\"type\":\"REBOOT\",\"source\":{\"type\":0,\"platform\":1},\"executionType\":\"IMMEDIATELY\",\"reason\":\"Just to test\",\"conditions\":[{\"cron\":[\"0 15 10 ? * *\",\"0 0 12 * * ?\"],\"enable\":true}]}}"; instance.nvSetReBootTaskAsync(data, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 重启:", "code:"+code+",data:"+data); } }); } //本地路径 public void updateApp(String url){ String data4="{\n" + " \"sn\":\""+sn+"\",\n" + " \"taskInfo\":{\n" + " \"isLocal\":false,\n" + " \"source\":{\n" + " \"platform\":2,\n" + " \"type\":0\n" + " },\n" + " \"tasks\":[\n" + " {\n" + " \"checkFeasibility\":false,\n" + " \"executionType\":\"IMMEDIATELY\",\n" + " \"packageType\":\"AUTO\",\n" + " \"source\":\""+url+"\",\n" + " \"startupAfterBoot\":false,\n" + " \"startupAfterInstalled\":true,\n" + " \"updateType\":\"UPDATE\",\n" + " \"version\":\"\"\n" + " }\n" + " ],\n" + " \"type\":\"UPDATE\"\n" + " }\n" + "}"; instance .nvStartUploadApkCoreAsync(data4, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 更新:", "code:"+code+",data:"+data); } }); } public void screenPower(String state){ String data="{\"sn\":\""+sn+"\",\"taskInfo\":{\"state\":\""+state+"\"}}"; instance.nvSetScreenPowerStateAsync(data, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 开关屏:", "code:"+code+",data:"+data); } }); } public void Screenshot(String time){ String data3="{\"sn\":\""+sn+"\",\"width\":1920,\"height\":1080,\"downLoadDirectoryPath\":\"/storage/emulated/0/\",\"pictureName\":\"screenShot.png\",\"pictureType\":1}"; instance.nvDownLoadScreenshotAsync(data3, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { LoggerUtil.e("QHT: 截屏:", "code:"+code+",data:"+data); if(code==0){ uploadScreenShot("/storage/emulated/0/screenShot.png",DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),time); } } }); } //上传截屏 public static void uploadScreenShot(String filePath,String code,String timestamp) { File file = new File(filePath); if (!file.exists()||code.isEmpty()) return; RequestBody fileRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) .addFormDataPart("code",code) .addFormDataPart("timestamp",timestamp); builder.addFormDataPart("file", file.getName(),fileRequestBody); RequestBody requestBody = builder.build(); RetrofitUtil.getBaseService().upScreenShort(requestBody ).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { LoggerUtil.e("uploadScreenShot", new Gson().toJson(response.body())); } @Override public void onFailure(Call call, Throwable t) { LoggerUtil.e("uploadScreenShot", StringUtil.getThrowableStr(t)); } }); } public void logout(){ String data="{\"sn\":\""+sn+"\",\"loginType\":0}"; instance.nvLogoutAsync(data, new ViplexCore.CallBack() { @Override public void dataCallBack(int code, String data) { Log.e("QHT: 退出登录:", "code:"+code+",data:"+data); } }); } public String getDiskCacheDir(Context context) { // adb push 4.png /storage/emulated/0/Android/data/com.novastar.sdkdemo/files/demotest String x = context.getExternalFilesDir("demotest").getAbsolutePath(); return x; } /** * 双屏异显 * */ private Presentation presentation; private void showSecondByDisplayManager(Context context) { DisplayManager mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = mDisplayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); if (displays != null) { presentation = new MyPresentation(context, displays[displays.length - 1]); presentation.show(); } } } \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/activity/program/ViewMedia.java b/app/src/main/java/qianmu/container/activity/program/ViewMedia.java new file mode 100644 index 0000000..704d1a8 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ViewMedia.java @@ -0,0 +1,173 @@ +package qianmu.container.activity.program; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.View; + +import androidx.annotation.NonNull; + +import org.greenrobot.eventbus.EventBus; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; + +import qianmu.container.activity.ViewBase; +import qianmu.container.app.Constant; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.databinding.ViewMediaBinding; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.ScreenSaver; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +@SuppressWarnings("All") +public class ViewMedia extends ViewBase { + + private static final int UPDATE_CONTENT = 0; + private static final String KEY_CONTENT = "key_content"; + private static final String defaultInternetPath = "/localFiles/"; + + int count; + private static final String DIR_NAME = "信发素材"; + private static final String LOCAL_DIR_PATH = StringUtil.strSplice(Constant.CACHE_PATH, "localFiles/"); + + Handler handler = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if (msg.what == UPDATE_CONTENT) { + Bundle bundle = msg.getData(); + if (bundle == null) return; + binding.content.setText(StringUtil.getString(bundle.getString(KEY_CONTENT))); + } + } + }; + + public ViewMedia(Context context, View view) { + super(context, view); + } + + public void showMedia(String dirPath) { + binding.getRoot().setVisibility(View.VISIBLE); + Executors.newSingleThreadExecutor().execute(() -> { + deleteLodProgramData(); + readProgramList(dirPath); + }); + } + + public void hideMedia() { + binding.getRoot().setVisibility(View.INVISIBLE); + } + + //删除旧数据 + private void deleteLodProgramData() { + + //获取旧列表数据 +// List screenSaverList = ScreenSaverData.getScreenSaverList(); +// Map map = new HashMap(); +// for (ScreenSaver screenSaver : screenSaverList) { +// if (screenSaver == null) continue; +// String fileName = StringUtil.getString(screenSaver.getImg()).replace(defaultInternetPath, ""); +// if (StringUtil.isEmpty(fileName)) continue; +// map.put(fileName, fileName); +// } +// +// File file = new File(LOCAL_DIR_PATH); +// if (!file.exists()) return; +// File[] files = file.listFiles(); +// if (files == null || files.length == 0) return; +// for (File temp : files) { +// if (temp == null || !temp.exists() || map.get(temp.getName()) != null) continue; +// temp.delete(); +// } + } + + //读取U盘内的节目素材 + private void readProgramList(String dirPath) { + updateContent("读取节目素材中\n请勿移动U盘", 0); + String parentPath = StringUtil.strSplice(dirPath, "/", DIR_NAME); + File file = new File(parentPath); + if (!file.exists()) { + updateContent("未读取到文件夹", 1000); + return; + } + File[] files = file.listFiles(); + if (files == null || files.length == 0) { + updateContent("目标文件夹内无数据", 1000); + return; + } + copyProgramList(files); + } + + //创建节目文件数据 + private void copyProgramList(File[] files) { + updateContent("拷贝节目素材中\n请勿移动U盘", 1000); + for (File temp : files) { + if (temp == null) continue; + try { + String name = StringUtil.getString(temp.getName()); + String localFilePath = StringUtil.strSplice(LOCAL_DIR_PATH, name); + File localFile = new File(localFilePath); + File parentFile = localFile.getParentFile(); + if (!parentFile.exists()) parentFile.mkdirs(); + if (localFile.exists()) localFile.delete(); + localFile.createNewFile(); + FileInputStream inputStream = new FileInputStream(temp); + FileOutputStream outputStream = new FileOutputStream(localFile, true); + byte[] buffer = new byte[400000]; + while ((count = inputStream.read(buffer)) > 0) outputStream.write(buffer, 0, count); + outputStream.close(); + inputStream.close(); + } catch (Throwable t) { + LoggerUtil.e("copyFile", StringUtil.getThrowableStr(t)); + } + } + createProgramData(files); + } + + //创建节目文件数据 + private void createProgramData(File[] files) { + updateContent("生成节目数据中\n请勿移动U盘", 1000); + + List screenSaverList = new ArrayList<>(); + for (File temp : files) { + if (temp == null) continue; + String name = StringUtil.getString(temp.getName()); + int fileType = (name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".jpeg") || name.toLowerCase().endsWith(".png")) ? 1 : 2; + ScreenSaver screenSaver = new ScreenSaver(); + screenSaver.setTime(15);//播放时长 + screenSaver.setLaunchTime("1970-01-01T00:00:00");//上架时间 + screenSaver.setExpiryDate("3000-01-01T00:00:00");//下架时间 + screenSaver.setFileType(fileType);//文件类型 + screenSaver.setImg(StringUtil.strSplice(defaultInternetPath, name));//图片地址 + screenSaver.setProType(1);//屏保类型:(1:正常屏保 2:插播) + screenSaverList.add(screenSaver); + } + if (screenSaverList.size() == 0) { + updateContent("生成节目失败", 1000); + return; + } + ScreenSaverData.saveScreenSaverList(screenSaverList); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_MEDIA_UPDATE_COMPLETE)); + updateContent("节目生成完毕\n请拔出U盘", 5000); + } + + //发送消息更新提示信息 + private void updateContent(String content, int delay) { + Bundle bundle = new Bundle(); + bundle.putString(KEY_CONTENT, content); + Message message = new Message(); + message.what = UPDATE_CONTENT; + message.setData(bundle); + if (handler != null) handler.sendMessageDelayed(message, delay); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/program/ViewScreenSaver.java b/app/src/main/java/qianmu/container/activity/program/ViewScreenSaver.java new file mode 100644 index 0000000..a5ee110 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ViewScreenSaver.java @@ -0,0 +1,4430 @@ +package qianmu.container.activity.program; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.media.MediaMetadataRetriever; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.TranslateAnimation; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.airbnb.lottie.LottieAnimationView; +import com.alibaba.android.arouter.launcher.ARouter; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.dl7.player.media.IjkPlayerView; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; + +import org.greenrobot.eventbus.EventBus; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.WeakReference; +import java.net.MalformedURLException; +import java.net.URL; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import cz.msebera.android.httpclient.Header; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.activity.H5.CoreService; +import qianmu.container.activity.H5.UpdateFileActivity; +import qianmu.container.activity.ViewBase; +import qianmu.container.adapter.WeatherAdapter0; +import qianmu.container.adapter.WeatherAdapter1; +import qianmu.container.app.Constant; +import qianmu.container.data.DeviceData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.databinding.ViewScreenSaverBinding; +import qianmu.container.entity.FacilitiesBean; +import qianmu.container.entity.InterFaceBean; +import qianmu.container.entity.MapDataListBean; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.NewProgramBean; +import qianmu.container.entity.ResourceFileBean; +import qianmu.container.entity.Resp; +import qianmu.container.entity.ScreenSaver; +import qianmu.container.entity.ShuipaiDataListBean; +import qianmu.container.entity.TextBean; +import qianmu.container.entity.WeatherBean; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.service.ContainerService; +import qianmu.container.service.MessengerService; +import qianmu.container.socket.manager.LocSocCliManager; +import qianmu.container.socket.manager.SocketServerManager; +import qianmu.container.util.AesUtil; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.ColorUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; +import qianmu.container.util.ViewUtil; +import qianmu.container.view.AutoScrollTextView; +import qianmu.container.view.CustomerVideoView; +import qianmu.container.view.MarqueeTextView; +import qianmu.container.view.MarqueeTextView2; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import tv.danmaku.ijk.media.player.ffmpeg.FFmpegApi; + +@SuppressWarnings("All") +public class ViewScreenSaver extends ViewBase { + + public static final int PLAY_PROGRAM = 0; + public static final int PLAY_PROGRAM_BY_INDEX = 1; + + static final int TYPE_UPDATE_PROGRAMME = 100;//切换日程单 + static final int TYPE_UPDATE_PROGRAM = 101;//切换节目单 + static final int TYPE_UPDATE_VIDEO0 = 102;//视频更新 + static final int TYPE_UPDATE_VIDEO1 = 103;//视频更新 + static final int TYPE_UPDATE_IMAGE0 = 104;//图片更新 + static final int TYPE_UPDATE_IMAGE1 = 105;//图片更新 + static final int TYPE_UPDATE_IMAGE2 = 106;//图片更新 + static final int TYPE_UPDATE_IMAGE3 = 107;//图片更新 + static final int TYPE_UPDATE_IMAGE4 = 108;//图片更新 + static final int TYPE_UPDATE_IMAGE5 = 109;//图片更新 + static final int TYPE_UPDATE_IMAGE6 = 110;//图片更新 + static final int TYPE_UPDATE_IMAGE7 = 111;//图片更新 + static final int TYPE_UPDATE_IMAGE8 = 112;//图片更新 + static final int TYPE_UPDATE_IMAGE9 = 113;//图片更新 + static final int TYPE_UPDATE_IMAGE10 = 114;//图片更新 + static final int TYPE_UPDATE_IMAGE11 = 115;//图片更新 + static final int TYPE_UPDATE_IMAGE12 = 116;//图片更新 + static final int TYPE_UPDATE_IMAGE13 = 117;//图片更新 + static final int TYPE_UPDATE_IMAGE14 = 118;//图片更新 + static final int TYPE_UPDATE_IMAGE15 = 119;//图片更新 + + static final int TYPE_UPDATE_TEXT4 = 124;//文本更新 + + static final int TYPE_UPDATE_TIME0 = 136;//时间更新 + static final int TYPE_UPDATE_MEIDA0 = 137;//音频更新 + static final int TYPE_UPDATE_WEATHER0 = 138;//天气更新 + static final int TYPE_UPDATE_DATA = 139;//更新JSON + static final int TYPE_TIME_UPDATE_DATA = 140;//定时更新JSON + static final int TYPE_UPDATE_MACTH = 142;//匹配时间是否更新; + static final int TYPE_DOWNLOAD_FILE = 143;//下载文件 + static final int TYPE_GET_NEXT_OTHER_IMG = 144;//下个节目的图片 + static final int TYPE_STOP_VIDEO_PLAY0 = 145;//暂停播放 + static final int TYPE_STOP_VIDEO_PLAY1 = 146;//暂停播放 + static final int TYPE_HINT_IMG0 = 147;//隐藏额外图片 + static final int TYPE_HINT_IMG1 = 148;//隐藏额外图片 + static final int TYPE_HINT_IMG2 = 149;//隐藏额外图片 + static final int TYPE_HINT_IMG3 = 150;//隐藏额外图片 + static final int TYPE_HINT_IMG4 = 151;//隐藏额外图片 + static final int TYPE_HINT_IMG5 = 152;//隐藏额外图片 + static final int TYPE_HINT_IMG6 = 153;//隐藏额外图片 + static final int TYPE_HINT_IMG7 = 154;//隐藏额外图片 + static final int TYPE_HINT_IMG8 = 155;//隐藏额外图片 + static final int TYPE_HINT_IMG9 = 156;//隐藏额外图片 + static final int TYPE_HINT_IMG10 = 157;//隐藏额外图片 + static final int TYPE_HINT_IMG11 = 158;//隐藏额外图片 + static final int TYPE_HINT_IMG12 = 159;//隐藏额外图片 + static final int TYPE_HINT_IMG13 = 160;//隐藏额外图片 + static final int TYPE_HINT_IMG14 = 161;//隐藏额外图片 + static final int TYPE_HINT_IMG15 = 162;//隐藏额外图片 + static final int TYPE_CHANGE_PROGRAMME_STATE = 163;//切换日程状态 + + static final int TYPE_GET_NEXT_PROGRAMME_OTHER_IMG = 164;//获取下个日程的第一个节目的图片 + static final int TYPE_CHANGE_IMG_SHOW0 = 165;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW1 = 166;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW2 = 167;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW3 = 168;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW4 = 169;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW5 = 170;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW6 = 171;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW7 = 172;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW8 = 173;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW9 = 174;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW10 = 175;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW11 = 176;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW12 = 177;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW13 = 178;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW14 = 179;//预加载下张图片 + static final int TYPE_CHANGE_IMG_SHOW15 = 180;//预加载下张图片 + static final int TYPE_START_PLAY_SVGA = 181;//开始播放svga动画 + static final int TYPE_REFRESH_WEBVIEW0 = 182;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW1 = 183;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW2 = 184;//网页刷新 + static final int TYPE_REFRESH_WEBVIEW3 = 185;//网页刷新 + static final int TYPE_SHUIPAI = 186;//水牌 + static final int TYPE_BRAND0 = 187;//品牌 + static final int TYPE_BRAND1 = 188;//品牌 + static final int TYPE_BRAND2 = 189;//品牌 + static final int TYPE_BRAND3 = 190;//品牌 + static final int TYPE_BRAND4 = 191;//品牌 + static final int TYPE_BRAND5 = 192;//品牌 + static final int TYPE_BRAND6 = 193;//品牌 + static final int TYPE_BRAND7 = 194;//品牌 + static final int TYPE_BRAND8 = 195;//品牌 + static final int TYPE_BRAND9 = 196;//品牌 + static final int TYPE_BRAND10 = 197;//品牌 + static final int TYPE_BRAND11 = 198;//品牌 + static final int TYPE_BRAND12 = 199;//品牌 + static final int TYPE_BRAND13 = 200;//品牌 + static final int TYPE_BRAND14 = 201;//品牌 + static final int TYPE_BRAND15 = 202;//品牌 + static final int TYPE_FACILITIES0= 203;//公共设施 + static final int TYPE_FACILITIES1 = 204;//公共设施 + static final int TYPE_FACILITIES2 = 205;//公共设施 + static final int TYPE_FACILITIES3 = 206;//公共设施 + static final int TYPE_FACILITIES4 = 207;//公共设施 + static final int TYPE_FACILITIES5 = 208;//公共设施 + static final int TYPE_FACILITIES6 = 209;//公共设施 + static final int TYPE_FACILITIES7 = 210;//公共设施 + static final int TYPE_FACILITIES8 = 211;//公共设施 + static final int TYPE_FACILITIES9 = 212;//公共设施 + static final int TYPE_FACILITIES10 = 213;//公共设施 + static final int TYPE_FACILITIES11 = 214;//公共设施 + static final int TYPE_FACILITIES12 = 215;//公共设施 + static final int TYPE_FACILITIES13 = 216;//公共设施 + static final int TYPE_FACILITIES14 = 217;//公共设施 + static final int TYPE_FACILITIES15 = 218;//公共设施 + static final int TYPE_POSITION0 = 219;//点位 + static final int TYPE_POSITION1 = 220;//点位 + static final int TYPE_POSITION2 = 221;//点位 + static final int TYPE_POSITION3 = 222;//点位 + static final int TYPE_POSITION4 = 223;//点位 + static final int TYPE_POSITION5 = 224;//点位 + static final int TYPE_POSITION6 = 225;//点位 + static final int TYPE_POSITION7 = 226;//点位 + static final int TYPE_POSITION8 = 227;//点位 + static final int TYPE_POSITION9 = 228;//点位 + static final int TYPE_POSITION10 = 229;//点位 + static final int TYPE_POSITION11 = 230;//点位 + static final int TYPE_POSITION12 = 231;//点位 + static final int TYPE_POSITION13 = 232;//点位 + static final int TYPE_POSITION14 = 233;//点位 + static final int TYPE_POSITION15 = 234;//点位 + + static final int TYPE_JUDGE_START_PROGRAM = 235;//判断是否已经开始了节目播放 + static final int TYPE_START_PLAY_PROGRAM = 236;//开始播放节目 + + static final int TYPE_MAP = 237;//地图组件 + static final int TYPE_LOAD_MAP_DATA = 238;//地图组件数据 + + //开始播放下标 + int videoPlayCount0 = 0; + int videoPlayCount1 = 0; + boolean isvideoPlay0 = false; + boolean isvideoPlay1 = false; + + int imagePlayCount0 = 0; + int imagePlayCount1 = 0; + int imagePlayCount2 = 0; + int imagePlayCount3 = 0; + int imagePlayCount4 = 0; + int imagePlayCount5 = 0; + int imagePlayCount6 = 0; + int imagePlayCount7 = 0; + int imagePlayCount8 = 0; + int imagePlayCount9 = 0; + int imagePlayCount10 = 0; + int imagePlayCount11 = 0; + int imagePlayCount12 = 0; + int imagePlayCount13 = 0; + int imagePlayCount14 = 0; + int imagePlayCount15 = 0; + + //品牌 + int brandImageCount0 = 0; + int brandImageCount1 = 0; + int brandImageCount2 = 0; + int brandImageCount3 = 0; + int brandImageCount4 = 0; + int brandImageCount5 = 0; + int brandImageCount6 = 0; + int brandImageCount7 = 0; + int brandImageCount8 = 0; + int brandImageCount9 = 0; + int brandImageCount10 = 0; + int brandImageCount11 = 0; + int brandImageCount12 = 0; + int brandImageCount13 = 0; + int brandImageCount14 = 0; + int brandImageCount15 = 0; + //设施 + int facilitiesImageCount0 = 0; + int facilitiesImageCount1 = 0; + int facilitiesImageCount2 = 0; + int facilitiesImageCount3 = 0; + int facilitiesImageCount4 = 0; + int facilitiesImageCount5 = 0; + int facilitiesImageCount6 = 0; + int facilitiesImageCount7 = 0; + int facilitiesImageCount8 = 0; + int facilitiesImageCount9 = 0; + int facilitiesImageCount10 = 0; + int facilitiesImageCount11 = 0; + int facilitiesImageCount12 = 0; + int facilitiesImageCount13 = 0; + int facilitiesImageCount14 = 0; + int facilitiesImageCount15 = 0; + + //点位 + int positionImageCount0 = 0; + int positionImageCount1 = 0; + int positionImageCount2 = 0; + int positionImageCount3 = 0; + int positionImageCount4 = 0; + int positionImageCount5 = 0; + int positionImageCount6 = 0; + int positionImageCount7 = 0; + int positionImageCount8 = 0; + int positionImageCount9 = 0; + int positionImageCount10 = 0; + int positionImageCount11 = 0; + int positionImageCount12 = 0; + int positionImageCount13 = 0; + int positionImageCount14 = 0; + int positionImageCount15 = 0; + + int programme = 0;//日程 + int program = 0;//节目 + + boolean imagePlay0 = true; + boolean imagePlay1 = true; + boolean imagePlay2 = true; + boolean imagePlay3 = true; + boolean imagePlay4 = true; + boolean imagePlay5 = true; + boolean imagePlay6 = true; + boolean imagePlay7 = true; + boolean imagePlay8 = true; + boolean imagePlay9 = true; + boolean imagePlay10 = true; + boolean imagePlay11 = true; + boolean imagePlay12 = true; + boolean imagePlay13 = true; + boolean imagePlay14 = true; + boolean imagePlay15 = true; + + boolean firstImagePlay0 = true; + boolean firstImagePlay1 = true; + boolean firstImagePlay2 = true; + boolean firstImagePlay3 = true; + boolean firstImagePlay4 = true; + boolean firstImagePlay5 = true; + boolean firstImagePlay6 = true; + boolean firstImagePlay7 = true; + boolean firstImagePlay8 = true; + boolean firstImagePlay9 = true; + boolean firstImagePlay10 = true; + boolean firstImagePlay11 = true; + boolean firstImagePlay12 = true; + boolean firstImagePlay13 = true; + boolean firstImagePlay14 = true; + boolean firstImagePlay15 = true; + + Map bigFiles = new HashMap<>(); //大后台文件 + Map mapFiles = new HashMap<>(); //大后台文件 + + int downloadCount = 0;//下载数量 + int mapDownloadCount = 0;//下载数量 + + long startImgTime=0; + long startVideoTime=0; + long startchangeProgram=0;//切换节目开始时间,防止多次切换 + + boolean isNextVideo = false;//下个节目是否有视频 + + boolean isChangProgramme = false;//日程切换 + + + List data = new ArrayList<>(); + int width; + int height; + View[] viewList; + int index = 0; + + Map colorMap; + + boolean isZeroPoint = false; //凌晨时间 + + Handler handler = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + switch (msg.what){ + + case TYPE_UPDATE_PROGRAMME://切换日程单 + + programme++; + Log.e("TAG","切换日程单"+programme); + program=0; + + if(programme >= currentProgramBean.getSchedule().size()){ + deleteView(); + return; + } + NewProgramBean.schedule schedule = currentProgramBean.getSchedule().get(programme); + try { +// String s = TimeUtil.stampToDate(System.currentTimeMillis()); + long beginTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+" "+schedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + if(System.currentTimeMillis() >= beginTimeLong){ + program=0; + isChangProgramme = true; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.sendEmptyMessage(TYPE_UPDATE_PROGRAM); + handler.sendEmptyMessageDelayed(TYPE_CHANGE_PROGRAMME_STATE,5000); + + }else { + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAM,beginTimeLong-System.currentTimeMillis()); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + //是否有下个日程 + if(programme + 1 >= currentProgramBean.getSchedule().size()){ + //没有日程清除所有 + + if(!schedule.getEndTime().equals("23:59:59")){ + try { + //最后一个节目结束时间 + long endTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+" "+schedule.getEndTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,endTimeLong - System.currentTimeMillis()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return; + } + + //下个日程 + NewProgramBean.schedule nextSchedule = currentProgramBean.getSchedule().get(programme + 1); + try { + long beginTimeLong = TimeUtil.stringToLong(currentProgramBean.getDate()+ " "+ nextSchedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,beginTimeLong - System.currentTimeMillis()); + //提前10秒通知获取下个日程的第一个节目的图片 +// handler.sendEmptyMessageDelayed(TYPE_GET_NEXT_PROGRAMME_OTHER_IMG,beginTimeLong - (System.currentTimeMillis()+5000)); + } catch (Exception e) { + e.printStackTrace(); + } + + break; + + case TYPE_CHANGE_PROGRAMME_STATE: + + isChangProgramme=false; + + break; + + case TYPE_UPDATE_PROGRAM://切换节目单 + Log.e("TAG","切换节目单"+program); + + try { + + if(!isChangProgramme){ + if(System.currentTimeMillis()-startchangeProgram<2000){ + //防止重复调用导致图片不同步 + return; + }else { + startchangeProgram = System.currentTimeMillis(); + } + } + + if(currentProgramBean==null){ + return; + } + if(program >= currentProgramBean.getSchedule().get(programme).getPrograms().size()){ + program=0; + } + if (Constant.isMain) { + Log.e("TAG","主设备向其他设备发送节目下标"+program); + SocketServerManager.sendMessageToClient(LocSocCliManager.NEXT_PROGRAM_INDEX, String.valueOf(program)); + } + + deleteView(); + + createView( currentProgramBean.getSchedule().get(programme), program); + + }catch (Exception e){ + LoggerUtil.e("TYPE_UPDATE_PROGRAM:" ,e.getMessage()); + } + + break; + + case TYPE_GET_NEXT_OTHER_IMG: + //下个节目的图片 + try { + if(currentProgramBean==null){ + return; + } + if(currentProgramBean.getSchedule().size()<=0){ + return; + } + if(currentProgramBean.getSchedule().get(programme)==null){ + return; + } + NewProgramBean.programs nextprograms; + if(nextimg+1 < currentProgramBean.getSchedule().get(programme).getPrograms().size()){ + nextprograms = currentProgramBean.getSchedule().get(programme).getPrograms().get(nextimg + 1); + }else { + nextprograms = currentProgramBean.getSchedule().get(programme).getPrograms().get(0); + } + int videoViewNumb= 0 ; + int otherImgCount = 0; + for(int i=0;i0){ + //视频 + + if(components.getMaterials().get(0).getPreviewUrl()!=null && !components.getMaterials().get(0).getPreviewUrl().isEmpty()){ + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getPreviewUrl(),binding.videoImg0); + } + + }else { + //图片 + if(new File(localPath).exists()){ + Glide.with(context).load(localPath).into(binding.videoImg0); + } + } + + if(!isNextVideo){ + Log.e("TAG","预览设置下个视频"); + isNextVideo=true; + if(components.getMaterials().get(0).getDuration()>0){ + binding.videoView0.setVideoPath(localPath); + }else { + //图片 + Drawable drawable = new BitmapDrawable(localPath); + binding.videoView0.setBackground(drawable); + + } + } + }else { + //第二个videoview + if(components.getMaterials().get(0).getDuration()>0){ + //视频 + + if(components.getMaterials().get(0).getPreviewUrl()!=null && !components.getMaterials().get(0).getPreviewUrl().isEmpty()){ + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getPreviewUrl(),binding.videoImg1); + } +// String[] b = localPath.split("\\."); +// String imgUrl = b[0]+".jpg"; +// if(new File(imgUrl).exists()){ +// binding.videoImg1.setVisibility(View.GONE); +// Glide.with(context).load(imgUrl).into(binding.videoImg1); +// } + }else { + //图片 + if(new File(localPath).exists()){ + Glide.with(context).load(localPath).into(binding.videoImg1); + } + } + + if(!isNextVideo){ + Log.e("TAG","预览设置下个视频"); + isNextVideo=true; + if(components.getMaterials().get(0).getDuration()>0){ + binding.videoView0.setVideoPath(localPath); + }else { + //图片 + Drawable drawable = new BitmapDrawable(localPath); + binding.videoView0.setBackground(drawable); + + } + } + } + + videoViewNumb++; + } + } + }catch (Exception e){ + LoggerUtil.e("TYPE_GET_NEXT_OTHER_IMG报错",e.getMessage()); + } + + break; + + case TYPE_GET_NEXT_PROGRAMME_OTHER_IMG://下个日程的第一个节目的图片 + + if(programme >= currentProgramBean.getSchedule().size()){ + return; + } + try { + NewProgramBean.programs nextprogram = currentProgramBean.getSchedule().get(programme+1).getPrograms().get(0); + int otherImgCount2=0; + for(int i=0;i0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW0,getRefreshWebTime(webComponents0)); + onlineWebView0.loadUrl(webComponents0.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW1://网页刷新 + if(getRefreshWebTime(webComponents1)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW1,getRefreshWebTime(webComponents1)); + onlineWebView1.loadUrl(webComponents1.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW2://网页刷新 + if(getRefreshWebTime(webComponents2)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW2,getRefreshWebTime(webComponents2)); + onlineWebView2.loadUrl(webComponents2.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_REFRESH_WEBVIEW3://网页刷新 + if(getRefreshWebTime(webComponents3)>0){ + sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW3,getRefreshWebTime(webComponents3)); + onlineWebView3.loadUrl(webComponents3.getMaterials().get(0).getOuterChain()); + } + break; + + case TYPE_SHUIPAI://水牌 + if(shuipaifacenumb == shuipaifacenumb_finish){ + LoggerUtil.e("TYPE_SHUIPAI","接口请求完成,开始加载水牌"); + spWebView.clearCache(true); + setWebView(spWebView,"http://127.0.0.1:8080/"+"?url="+Constant.getBaseAddress()); + + }else { + sendEmptyMessageDelayed(TYPE_SHUIPAI,2000); + } + break; + + case TYPE_MAP://地图 + LoggerUtil.e("TYPE_MAP","接口请求完成,开始加载地图"); + if(mapWebView!=null){ + mapWebView.clearCache(true); + setWebView(mapWebView,"http://127.0.0.1:8080/"); + } + break; + + case TYPE_UPDATE_TIME0://时间 +// Log.e("TAG","更新时间"); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_TIME0,60*1000); + chooseTime(timeComponents0.getConfig().getStyle()); + break; + + case TYPE_BRAND0: + brandImageCount0++; + updateBrandOrfacilities(brandImageCount0,0,brandImageViewList,TYPE_BRAND0); + break; + case TYPE_BRAND1: + brandImageCount1++; + updateBrandOrfacilities(brandImageCount1,1,brandImageViewList,TYPE_BRAND1); + break; + case TYPE_BRAND2: + brandImageCount2++; + updateBrandOrfacilities(brandImageCount2,2,brandImageViewList,TYPE_BRAND2); + break; + case TYPE_BRAND3: + brandImageCount3++; + updateBrandOrfacilities(brandImageCount3,3,brandImageViewList,TYPE_BRAND3); + break; + case TYPE_BRAND4: + brandImageCount4++; + updateBrandOrfacilities(brandImageCount4,4,brandImageViewList,TYPE_BRAND4); + break; + case TYPE_BRAND5: + brandImageCount5++; + updateBrandOrfacilities(brandImageCount5,5,brandImageViewList,TYPE_BRAND5); + break; + case TYPE_BRAND6: + brandImageCount6++; + updateBrandOrfacilities(brandImageCount6,6,brandImageViewList,TYPE_BRAND6); + break; + case TYPE_BRAND7: + brandImageCount7++; + updateBrandOrfacilities(brandImageCount7,7,brandImageViewList,TYPE_BRAND7); + break; + case TYPE_BRAND8: + brandImageCount8++; + updateBrandOrfacilities(brandImageCount8,8,brandImageViewList,TYPE_BRAND8); + break; + case TYPE_BRAND9: + brandImageCount9++; + updateBrandOrfacilities(brandImageCount9,9,brandImageViewList,TYPE_BRAND9); + break; + case TYPE_BRAND10: + brandImageCount10++; + updateBrandOrfacilities(brandImageCount10,10,brandImageViewList,TYPE_BRAND10); + break; + case TYPE_BRAND11: + brandImageCount11++; + updateBrandOrfacilities(brandImageCount11,11,brandImageViewList,TYPE_BRAND11); + break; + + case TYPE_BRAND12: + brandImageCount12++; + updateBrandOrfacilities(brandImageCount12,12,brandImageViewList,TYPE_BRAND12); + break; + case TYPE_BRAND13: + brandImageCount13++; + updateBrandOrfacilities(brandImageCount13,13,brandImageViewList,TYPE_BRAND13); + break; + case TYPE_BRAND14: + brandImageCount14++; + updateBrandOrfacilities(brandImageCount14,14,brandImageViewList,TYPE_BRAND14); + break; + case TYPE_BRAND15: + brandImageCount15++; + updateBrandOrfacilities(brandImageCount15,15,brandImageViewList,TYPE_BRAND15); + break; + case TYPE_FACILITIES0: + + facilitiesImageCount0++; + updateBrandOrfacilities(facilitiesImageCount0,0,facilitiesImageViewList,TYPE_FACILITIES0); + break; + case TYPE_FACILITIES1: + + facilitiesImageCount1++; + updateBrandOrfacilities(facilitiesImageCount1,1,facilitiesImageViewList,TYPE_FACILITIES1); + break; + case TYPE_FACILITIES2: + facilitiesImageCount2++; + updateBrandOrfacilities(facilitiesImageCount2,2,facilitiesImageViewList,TYPE_FACILITIES2); + break; + case TYPE_FACILITIES3: + facilitiesImageCount3++; + updateBrandOrfacilities(facilitiesImageCount3,3,facilitiesImageViewList,TYPE_FACILITIES3); + break; + case TYPE_FACILITIES4: + facilitiesImageCount4++; + updateBrandOrfacilities(facilitiesImageCount4,4,facilitiesImageViewList,TYPE_FACILITIES4); + break; + case TYPE_FACILITIES5: + facilitiesImageCount5++; + updateBrandOrfacilities(facilitiesImageCount5,5,facilitiesImageViewList,TYPE_FACILITIES5); + break; + case TYPE_FACILITIES6: + facilitiesImageCount6++; + updateBrandOrfacilities(facilitiesImageCount6,6,facilitiesImageViewList,TYPE_FACILITIES6); + break; + case TYPE_FACILITIES7: + facilitiesImageCount7++; + updateBrandOrfacilities(facilitiesImageCount7,7,facilitiesImageViewList,TYPE_FACILITIES7); + break; + case TYPE_FACILITIES8: + facilitiesImageCount8++; + updateBrandOrfacilities(facilitiesImageCount8,8,facilitiesImageViewList,TYPE_FACILITIES8); + break; + case TYPE_FACILITIES9: + facilitiesImageCount9++; + updateBrandOrfacilities(facilitiesImageCount9,9,facilitiesImageViewList,TYPE_FACILITIES9); + break; + case TYPE_FACILITIES10: + facilitiesImageCount10++; + updateBrandOrfacilities(facilitiesImageCount10,10,facilitiesImageViewList,TYPE_FACILITIES10); + break; + case TYPE_FACILITIES11: + facilitiesImageCount11++; + updateBrandOrfacilities(facilitiesImageCount11,11,facilitiesImageViewList,TYPE_FACILITIES11); + break; + case TYPE_FACILITIES12: + facilitiesImageCount12++; + updateBrandOrfacilities(facilitiesImageCount12,12,facilitiesImageViewList,TYPE_FACILITIES12); + break; + case TYPE_FACILITIES13: + facilitiesImageCount13++; + updateBrandOrfacilities(facilitiesImageCount13,13,facilitiesImageViewList,TYPE_FACILITIES13); + break; + case TYPE_FACILITIES14: + facilitiesImageCount14++; + updateBrandOrfacilities(facilitiesImageCount14,14,facilitiesImageViewList,TYPE_FACILITIES14); + break; + case TYPE_FACILITIES15: + facilitiesImageCount15++; + updateBrandOrfacilities(facilitiesImageCount15,15,facilitiesImageViewList,TYPE_FACILITIES15); + break; + + //点位 + case TYPE_POSITION0: + positionImageCount0++; + updateBrandOrfacilities(positionImageCount0,0,positionImageViewList,TYPE_POSITION0); + break; + case TYPE_POSITION1: + positionImageCount1++; + updateBrandOrfacilities(positionImageCount1,1,positionImageViewList,TYPE_POSITION1); + break; + case TYPE_POSITION2: + positionImageCount2++; + updateBrandOrfacilities(positionImageCount2,2,positionImageViewList,TYPE_POSITION2); + break; + case TYPE_POSITION3: + positionImageCount3++; + updateBrandOrfacilities(positionImageCount3,3,positionImageViewList,TYPE_POSITION3); + break; + case TYPE_POSITION4: + positionImageCount4++; + updateBrandOrfacilities(positionImageCount4,4,positionImageViewList,TYPE_POSITION4); + break; + case TYPE_POSITION5: + positionImageCount5++; + updateBrandOrfacilities(positionImageCount5,5,positionImageViewList,TYPE_POSITION5); + break; + case TYPE_POSITION6: + positionImageCount6++; + updateBrandOrfacilities(positionImageCount6,6,positionImageViewList,TYPE_POSITION6); + break; + case TYPE_POSITION7: + positionImageCount7++; + updateBrandOrfacilities(positionImageCount7,7,positionImageViewList,TYPE_POSITION7); + break; + case TYPE_POSITION8: + positionImageCount8++; + updateBrandOrfacilities(positionImageCount8,8,positionImageViewList,TYPE_POSITION8); + break; + case TYPE_POSITION9: + positionImageCount9++; + updateBrandOrfacilities(positionImageCount9,9,positionImageViewList,TYPE_POSITION9); + break; + case TYPE_POSITION10: + positionImageCount10++; + updateBrandOrfacilities(positionImageCount10,10,positionImageViewList,TYPE_POSITION10); + break; + case TYPE_POSITION11: + positionImageCount11++; + updateBrandOrfacilities(positionImageCount11,11,positionImageViewList,TYPE_POSITION11); + break; + case TYPE_POSITION12: + positionImageCount12++; + updateBrandOrfacilities(positionImageCount12,12,positionImageViewList,TYPE_POSITION12); + break; + case TYPE_POSITION13: + positionImageCount13++; + updateBrandOrfacilities(positionImageCount13,13,positionImageViewList,TYPE_POSITION13); + break; + case TYPE_POSITION14: + positionImageCount14++; + updateBrandOrfacilities(positionImageCount14,14,positionImageViewList,TYPE_POSITION14); + break; + case TYPE_POSITION15: + positionImageCount15++; + updateBrandOrfacilities(positionImageCount15,15,positionImageViewList,TYPE_POSITION15); + break; + case TYPE_UPDATE_MACTH://匹配是否更新数据 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MACTH,5*1000); + + if(TimeUtil.stampTotime(System.currentTimeMillis()).equals("00:00") && isZeroPoint==false){ + //第二天凌晨 + isZeroPoint=true; + LoggerUtil.e("TYPE_UPDATE_MACTH","第二天凌晨更新日程"); + sendEmptyMessage(TYPE_DOWNLOAD_FILE); + }else if(!TimeUtil.stampTotime(System.currentTimeMillis()).equals("00:00") && isZeroPoint==true){ + isZeroPoint=false; + } + + break; + + + case TYPE_TIME_UPDATE_DATA://定时获取数据,有变化则更新 + handler.sendEmptyMessageDelayed(TYPE_TIME_UPDATE_DATA,600*1000); + getProgData(true); + break; + + case TYPE_UPDATE_WEATHER0://天气更新 + try { + String cityName = weatherComponents0.getConfig().getCityName(); + if(!cityName.isEmpty()){ + getWeather(cityName,null,null); + }else { + if(DeviceData.getDevice().getCity() !=null || !DeviceData.getDevice().getCity().isEmpty()){ + getWeather(DeviceData.getDevice().getCity(),null,null); + } + }; + }catch (Exception e){ + + } + + break; + + case TYPE_DOWNLOAD_FILE://下载文件 + + //下载完成 + LoggerUtil.e("TAG","下载完成"); + if(newdata!=null){ + ScreenSaverData.saveScreenSaverList(newdata); + } + program=0; + programme=0; + isChangProgramme = false;//日程切换 + startchangeProgram=0; + startImgTime=0; + + //清除 + deleteView(); + clearOtherImg(); + sendEmptyMessageDelayed(TYPE_START_PLAY_PROGRAM,1000); + break; + + case TYPE_START_PLAY_PROGRAM://下载完成后,开始播放日程 + try { + LoggerUtil.e("TYPE_START_PLAY_PROGRAM","开始播放节目"); + startProgram(); + + List screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + String s = GsonUtil.getGson().toJson(screenSaverList); + NewProgramBean newProgramBean = screenSaverList.get(0); + if(s.contains("\"typeCode\":\"map\"") || s.contains("\"typeCode\":\"brand_list\"")){ + //有地图组件 + for(NewProgramBean.schedule schedule1 : newProgramBean.getSchedule()){ + for(NewProgramBean.programs programs :schedule1.getPrograms()){ + for(NewProgramBean.components components : programs.getComponents()){ + ScreenSaverData. getGetMapData(context,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getApi/",components.getCode()),null, null ); + getApiFileResourceList(context,StringUtil.strSplice(Constant.getBaseAddress(),"/api/msg/v1/client/getFileResourceList/",components.getCode()),null, null ); + break; + } + } + } + } + + //没节目时候进入导视 + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE); + if (!deviceType.equals("信发") && !deviceType.equals("双面屏") && !ScreenSaverData.isProgramPlay2()) { + LoggerUtil.e("TYPE_START_PLAY_PROGRAM","没节目时候进入导视"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_MY_PRESENTATION));//通知双面屏跟新节目 + }catch (Exception e){ + LoggerUtil.e("startProgram报错",e.getMessage()); + sendEmptyMessageDelayed(TYPE_DOWNLOAD_FILE,20*1000); + } + break; + + case TYPE_JUDGE_START_PROGRAM://判断是否已经开始了节目播放(设备启动后避免节目不方便) + if(!isStartProgram){ + LoggerUtil.e("启动40秒后判断是否在播节目","开机未启动播放节目,强制开始播放节目"); + startProgram(); + }else { + LoggerUtil.e("启动40秒后判断是否在播节目","有播放节目"); + } + + break; + + case TYPE_LOAD_MAP_DATA://下载地图组件数据 + + + break; + + } + } + }; + + ViewScreenSaver(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + width = DeviceUtil.screenWidth((Activity) context); + height = DeviceUtil.screenHeight((Activity) context); + + } + + public void setData(List data) { + if (data == null) return; + this.data = data; + } + + @Override + protected void setListener() { + + } + + public void showScreenSaver() { + if (binding.getRoot().getVisibility() == View.VISIBLE) return; + binding.getRoot().setVisibility(View.VISIBLE); + if (handler != null) handler.sendEmptyMessage(PLAY_PROGRAM); + } + + public void hideScreenSaver() { + clearCache(); + deleteView(); +// binding.getRoot().setVisibility(View.INVISIBLE); + if (handler != null) handler.removeMessages(PLAY_PROGRAM); + } + + private void updateDataByZero(int index) { + if (index != 0) return; + setData(ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER)); + ScreenSaverData.getProgramList(null, null, null); + } + + /** + * MQTT通知更新数据 + * */ + public void setNewData(){ + handler.removeMessages(TYPE_TIME_UPDATE_DATA); + handler.sendEmptyMessage(TYPE_TIME_UPDATE_DATA); + + } + + /** + * 清除视频跟图片缓存(解决导视跳转屏保内存溢出问题) + * */ + public void clearCache(){ + if(binding.videoView0!=null){ + binding.videoView0.stopPlayback(); + binding.videoView0.setBackground(null); + } + if(binding.videoView1!=null){ + binding.videoView1.stopPlayback(); + binding.videoView1.setBackground(null); + } + + if(binding.backgroundImage!=null){ + binding.backgroundImage.setImageBitmap(null); + binding.backgroundImage.setImageDrawable(null); + } + Glide.get(context).clearMemory(); + if(handler!=null){ + handler.removeMessages(TYPE_TIME_UPDATE_DATA); + handler.removeMessages(TYPE_UPDATE_MACTH); + handler.removeMessages(TYPE_JUDGE_START_PROGRAM); + } + + } + /** + * 销毁控件 + * */ + public void deleteView(){ + + try { + //恢复默认背景图 + changeOldBackground(); + + isNextVideo = false; + isStartProgram = false; + //视频切换 + videoPlayCount0 = 0; + videoPlayCount1 = 0; + startVideoTime=0; + isvideoPlay0=false; + isvideoPlay1=false; + + //图片切换 + imagePlayCount0 = 0; + imagePlayCount1 = 0; + imagePlayCount2 = 0; + imagePlayCount3 = 0; + imagePlayCount4 = 0; + imagePlayCount5 = 0; + imagePlayCount6 = 0; + imagePlayCount7 = 0; + imagePlayCount8 = 0; + imagePlayCount9 = 0; + imagePlayCount10 = 0; + imagePlayCount11 = 0; + imagePlayCount12 = 0; + imagePlayCount13 = 0; + imagePlayCount14 = 0; + imagePlayCount15 = 0; + + imagePlay0 = true; + imagePlay1 = true; + imagePlay2 = true; + imagePlay3 = true; + imagePlay4 = true; + imagePlay5 = true; + imagePlay6 = true; + imagePlay7 = true; + imagePlay8 = true; + imagePlay9 = true; + imagePlay10 = true; + imagePlay11 = true; + imagePlay12 = true; + imagePlay13 = true; + imagePlay14 = true; + imagePlay15 = true; + + firstImagePlay0 = true; + firstImagePlay1 = true; + firstImagePlay2 = true; + firstImagePlay3 = true; + firstImagePlay4 = true; + firstImagePlay5 = true; + firstImagePlay6 = true; + firstImagePlay7 = true; + firstImagePlay8 = true; + firstImagePlay9 = true; + firstImagePlay10 = true; + firstImagePlay11 = true; + firstImagePlay12 = true; + firstImagePlay13 = true; + firstImagePlay14 = true; + firstImagePlay15 = true; + + //品牌 + brandImageCount0 = 0; + brandImageCount1 = 0; + brandImageCount2 = 0; + brandImageCount3 = 0; + brandImageCount4 = 0; + brandImageCount5 = 0; + brandImageCount6 = 0; + brandImageCount7 = 0; + brandImageCount8 = 0; + brandImageCount9 = 0; + brandImageCount10 = 0; + brandImageCount11 = 0; + brandImageCount12 = 0; + brandImageCount13 = 0; + brandImageCount14 = 0; + brandImageCount15 = 0; + //设施 + facilitiesImageCount0 = 0; + facilitiesImageCount1 = 0; + facilitiesImageCount2 = 0; + facilitiesImageCount3 = 0; + facilitiesImageCount4 = 0; + facilitiesImageCount5 = 0; + facilitiesImageCount6 = 0; + facilitiesImageCount7 = 0; + facilitiesImageCount8 = 0; + facilitiesImageCount9 = 0; + facilitiesImageCount10 = 0; + facilitiesImageCount11 = 0; + facilitiesImageCount12 = 0; + facilitiesImageCount13 = 0; + facilitiesImageCount14 = 0; + facilitiesImageCount15 = 0; + //点位 + positionImageCount0 = 0; + positionImageCount1 = 0; + positionImageCount2 = 0; + positionImageCount3 = 0; + positionImageCount4 = 0; + positionImageCount5 = 0; + positionImageCount6 = 0; + positionImageCount7 = 0; + positionImageCount8 = 0; + positionImageCount9 = 0; + positionImageCount10 = 0; + positionImageCount11 = 0; + positionImageCount12 = 0; + positionImageCount13 = 0; + positionImageCount14 = 0; + positionImageCount15 = 0; + + shuipaifacenumb = 0; + shuipaifacenumb_finish = 0; + + if(sendRecordTimer!=null){ + sendRecordTimer.cancel(); + sendRecordTimer=null; + } + + //时间布局显示 + try { + binding.layoutTime0.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime1.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime2.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime3.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime4.getRoot().setVisibility(View.INVISIBLE); + }catch (Exception e){ + LoggerUtil.e("deleteView()报错",e.getMessage()); + } + + if(handler!=null){ + //清除节目更新 + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.removeMessages(TYPE_UPDATE_VIDEO0); + handler.removeMessages(TYPE_UPDATE_VIDEO1); + handler.removeMessages(TYPE_UPDATE_IMAGE0); + handler.removeMessages(TYPE_UPDATE_IMAGE1); + handler.removeMessages(TYPE_UPDATE_IMAGE2); + handler.removeMessages(TYPE_UPDATE_IMAGE3); + handler.removeMessages(TYPE_UPDATE_IMAGE4); + handler.removeMessages(TYPE_UPDATE_IMAGE5); + handler.removeMessages(TYPE_UPDATE_IMAGE6); + handler.removeMessages(TYPE_UPDATE_IMAGE7); + handler.removeMessages(TYPE_UPDATE_IMAGE8); + handler.removeMessages(TYPE_UPDATE_IMAGE9); + handler.removeMessages(TYPE_UPDATE_IMAGE10); + handler.removeMessages(TYPE_UPDATE_IMAGE11); + handler.removeMessages(TYPE_UPDATE_IMAGE12); + handler.removeMessages(TYPE_UPDATE_IMAGE13); + handler.removeMessages(TYPE_UPDATE_IMAGE14); + handler.removeMessages(TYPE_UPDATE_IMAGE15); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW0); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW1); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW2); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW3); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW4); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW5); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW6); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW7); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW8); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW9); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW10); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW11); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW12); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW13); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW14); + handler.removeMessages(TYPE_CHANGE_IMG_SHOW15); + handler.removeMessages(TYPE_UPDATE_TEXT4); + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + handler.removeMessages(TYPE_REFRESH_WEBVIEW0); + handler.removeMessages(TYPE_REFRESH_WEBVIEW1); + handler.removeMessages(TYPE_REFRESH_WEBVIEW2); + handler.removeMessages(TYPE_REFRESH_WEBVIEW3); + handler.removeMessages(TYPE_SHUIPAI); + + handler.removeMessages(TYPE_BRAND0); + handler.removeMessages(TYPE_BRAND1); + handler.removeMessages(TYPE_BRAND2); + handler.removeMessages(TYPE_BRAND3); + handler.removeMessages(TYPE_BRAND4); + handler.removeMessages(TYPE_BRAND5); + handler.removeMessages(TYPE_BRAND6); + handler.removeMessages(TYPE_BRAND7); + handler.removeMessages(TYPE_BRAND8); + handler.removeMessages(TYPE_BRAND9); + handler.removeMessages(TYPE_BRAND10); + handler.removeMessages(TYPE_BRAND11); + handler.removeMessages(TYPE_BRAND12); + handler.removeMessages(TYPE_BRAND13); + handler.removeMessages(TYPE_BRAND14); + handler.removeMessages(TYPE_BRAND15); + handler.removeMessages(TYPE_FACILITIES0); + handler.removeMessages(TYPE_FACILITIES1); + handler.removeMessages(TYPE_FACILITIES2); + handler.removeMessages(TYPE_FACILITIES3); + handler.removeMessages(TYPE_FACILITIES4); + handler.removeMessages(TYPE_FACILITIES5); + handler.removeMessages(TYPE_FACILITIES6); + handler.removeMessages(TYPE_FACILITIES7); + handler.removeMessages(TYPE_FACILITIES8); + handler.removeMessages(TYPE_FACILITIES9); + handler.removeMessages(TYPE_FACILITIES10); + handler.removeMessages(TYPE_FACILITIES11); + handler.removeMessages(TYPE_FACILITIES12); + handler.removeMessages(TYPE_FACILITIES13); + handler.removeMessages(TYPE_FACILITIES14); + handler.removeMessages(TYPE_FACILITIES15); + handler.removeMessages(TYPE_POSITION0); + handler.removeMessages(TYPE_POSITION1); + handler.removeMessages(TYPE_POSITION2); + handler.removeMessages(TYPE_POSITION3); + handler.removeMessages(TYPE_POSITION4); + handler.removeMessages(TYPE_POSITION5); + handler.removeMessages(TYPE_POSITION6); + handler.removeMessages(TYPE_POSITION7); + handler.removeMessages(TYPE_POSITION8); + handler.removeMessages(TYPE_POSITION9); + handler.removeMessages(TYPE_POSITION10); + handler.removeMessages(TYPE_POSITION11); + handler.removeMessages(TYPE_POSITION12); + handler.removeMessages(TYPE_POSITION13); + handler.removeMessages(TYPE_POSITION14); + handler.removeMessages(TYPE_POSITION15); + handler.removeMessages(TYPE_MAP); + } + + try { + //清除视频 + binding.layoutVideo0.setVisibility(View.GONE); + if( binding.videoView0.isPlaying()){ + binding.videoView0.pause(); + } + binding.layoutVideo0.setBackground(null); + + binding.videoView1.setZOrderOnTop(false); + binding.videoView1.setZOrderMediaOverlay(false); + binding.videoView1.setVisibility(View.GONE); + binding.layoutVideo1.setVisibility(View.GONE); + + if( binding.videoView1.isPlaying()){ + binding.videoView1.pause(); + } + + }catch (Exception e){ + LoggerUtil.e("deleteView()清除视频报错",e.getMessage()); + } + //清除图片组件 + clearImgView(); + + if(textList!=null &&textList.size()>0){ + textList.clear(); + } + //清除文字 + if(MarqueeTextList!=null&&MarqueeTextList.size()>0){ + for(MarqueeTextView marqueeText : MarqueeTextList){ + binding.relativeLayoutMax.removeView(marqueeText); + } + MarqueeTextList.clear(); + } + + if(textViewlist2!=null&&textViewlist2.size()>0){ + for(TextView marqueeText : textViewlist2){ + binding.relativeLayoutMax.removeView(marqueeText); + } + textViewlist2.clear(); + } + + if(AutoScrollTextList!=null&&AutoScrollTextList.size()>0){ + for(AutoScrollTextView autoScrollText : AutoScrollTextList){ + binding.relativeLayoutMax.removeView(autoScrollText); + } + AutoScrollTextList.clear(); + } + if(webList!=null&& webList.size()>0){ + for(WebView webView : webList){ + binding.relativeLayoutMax.removeView(webView); + } + webList.clear(); + } + + //清除天气列表 + if(recycle_weather0!=null){ + binding.relativeLayoutMax.removeView(recycle_weather0); + } + + //清除视频直播 + if(livePlaylist!=null&&livePlaylist.size()>0){ + for(IjkPlayerView ijkPlayerView :livePlaylist){ + if(ijkPlayerView!=null){ + ijkPlayerView.stop(); + binding.relativeLayoutMax.removeView(ijkPlayerView); + } + } + livePlaylist.clear(); + } + + //回收音频资源 + if (mediaPlayer0 != null && mediaPlayer0.isPlaying()) { + mediaPlayer0.stop(); + mediaPlayer0.release(); + mediaPlayer0 = null; + } + + //清除json动图列表 + if(ltGiftList.size()>0){ + for( LottieAnimationView lottie : ltGiftList){ + binding.relativeLayoutMax.removeView(lottie); + } + ltGiftList.clear(); + } + //清除公共设施图片 + if(imageViewlist!=null&&imageViewlist.size()>0){ + for(ImageView imageView: imageViewlist){ + binding.relativeLayoutMax.removeView(imageView); + } + imageViewlist.clear(); + } + + //清除text + if(textViewlist!=null&&textViewlist.size()>0){ + for(MarqueeTextView2 textView: textViewlist){ + binding.relativeLayoutMax.removeView(textView); + } + textViewlist.clear(); + } + + }catch (Exception e){ + LoggerUtil.e("deleteView()报错",e.getMessage()); + + } + } + + /** + * 清除图片组件 + * */ + public void clearImgView(){ + try { + //清除图片 + binding.layoutImg0.setVisibility(View.GONE); + binding.layoutImg1.setVisibility(View.GONE); + binding.layoutImg2.setVisibility(View.GONE); + binding.layoutImg3.setVisibility(View.GONE); + binding.layoutImg4.setVisibility(View.GONE); + binding.layoutImg5.setVisibility(View.GONE); + binding.layoutImg6.setVisibility(View.GONE); + binding.layoutImg7.setVisibility(View.GONE); + binding.layoutImg8.setVisibility(View.GONE); + binding.layoutImg9.setVisibility(View.GONE); + binding.layoutImg10.setVisibility(View.GONE); + binding.layoutImg11.setVisibility(View.GONE); + binding.layoutImg12.setVisibility(View.GONE); + binding.layoutImg13.setVisibility(View.GONE); + binding.layoutImg14.setVisibility(View.GONE); + binding.layoutImg15.setVisibility(View.GONE); + }catch (Exception e){ + LoggerUtil.e("deleteView()清除图片报错",e.getMessage()); + } + + //设置背景颜色 + try { + if(nomallImgList!=null&&nomallImgList.size()>0){ + for(ImageView img :nomallImgList){ + if(img!=null){ + img.setImageBitmap(null); + } + } + nomallImgList.clear(); + } + }catch (Exception e){ + LoggerUtil.e("deleteView()图片报错",e.getMessage()); + } + } + + /** + * 清除额外的图片 + * */ + public void clearOtherImg(){ + try{ + if(binding.otherImg0!=null){ + binding.otherImg0.setImageBitmap(null); + } + if(binding.otherImg1!=null){ + binding.otherImg1.setImageBitmap(null); + } + if(binding.otherImg2!=null){ + binding.otherImg2.setImageBitmap(null); + } + if(binding.otherImg3!=null){ + binding.otherImg3.setImageBitmap(null); + } + if(binding.otherImg4!=null){ + binding.otherImg4.setImageBitmap(null); + } + if(binding.otherImg5!=null){ + binding.otherImg5.setImageBitmap(null); + } + if(binding.otherImg6!=null){ + binding.otherImg6.setImageBitmap(null); + } + if(binding.otherImg7!=null){ + binding.otherImg7.setImageBitmap(null); + } + if(binding.otherImg8!=null){ + binding.otherImg8.setImageBitmap(null); + } + if(binding.otherImg9!=null){ + binding.otherImg9.setImageBitmap(null); + } + if(binding.otherImg10!=null){ + binding.otherImg10.setImageBitmap(null); + } + if(binding.otherImg11!=null){ + binding.otherImg11.setImageBitmap(null); + } + if(binding.otherImg12!=null){ + binding.otherImg12.setImageBitmap(null); + } + if(binding.otherImg13!=null){ + binding.otherImg13.setImageBitmap(null); + } + if(binding.otherImg14!=null){ + binding.otherImg14.setImageBitmap(null); + } + if(binding.otherImg15!=null){ + binding.otherImg15.setImageBitmap(null); + } + }catch (Exception e){ + LoggerUtil.e("clearOtherImg报错",e.getMessage()); + } + } + + + String downloadaddress; + public void start(){ + LoggerUtil.e("屏保页面调用","start"); + //设置透明列表 + colorMap = ColorUtil. getColorTransparent(); + downloadaddress = DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP); + + //4分后判断是是否开始播放了节目 + handler.removeMessages(TYPE_JUDGE_START_PROGRAM); + handler.sendEmptyMessageDelayed(TYPE_JUDGE_START_PROGRAM,240*1000); + isStartProgram = false; + + program=0; + programme=0; + isChangProgramme = false;//日程切换 + //匹配时间 + handler.removeMessages(TYPE_UPDATE_MACTH); + handler.sendEmptyMessage(TYPE_UPDATE_MACTH); + + if(!ScreenSaverData.isProgramList()){ + //30秒拉取数据 + handler.removeMessages(TYPE_TIME_UPDATE_DATA); + handler.sendEmptyMessageDelayed(TYPE_TIME_UPDATE_DATA,30*1000); + }else { + //10分钟定时拉取数据 + handler.removeMessages(TYPE_TIME_UPDATE_DATA); + handler.sendEmptyMessageDelayed(TYPE_TIME_UPDATE_DATA,600*1000); + } + + deleteView(); + //开始播放日程 + startProgram(); + } + + /** + * 关闭 + * */ + public void stopScreen(){ + if(binding.videoImg0!=null){ + binding.videoImg0.setImageBitmap(null); + binding.videoImg0.setVisibility(View.GONE); + } + + if(binding.videoImg1!=null){ + binding.videoImg1.setImageBitmap(null); + binding.videoImg1.setVisibility(View.GONE); + } + } + + //同屏视频 + public void videoProgramByIndex(int index){ + if(Constant.isMain || handler==null)return; + if(binding.layoutVideo0.getVisibility()==View.INVISIBLE || binding.layoutVideo0.getVisibility()==View.GONE){ + return; + } + videoPlayCount0=index; + handler.removeMessages(TYPE_UPDATE_VIDEO0); + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO0); + } + + //同屏图片 + public void imgProgramByIndex(int index){ + if(Constant.isMain || handler==null)return; + if(binding.layoutImg0.getVisibility()==View.INVISIBLE || binding.layoutImg0.getVisibility() == View.GONE){ + return; + } + imagePlayCount0 = index; + handler.removeMessages(TYPE_UPDATE_IMAGE0); + handler.sendEmptyMessage(TYPE_UPDATE_IMAGE0); + } + + //同屏节目 + public void programByIndex(int index){ + if(Constant.isMain || handler==null)return; + program=index; + handler.sendEmptyMessage(TYPE_UPDATE_PROGRAM); + } + /** + * 从新获取信息发布 + * istiming 定时获取 + * */ + NewProgramBean currentProgramBean;//当天的日程 + List screenSaverList; + +// Object newdata;//用于素材下载完成后更新数据 + String newdata;//用于素材下载完成后更新数据 + + public void getProgData(boolean istiming){ + + RetrofitUtil.getBaseService().getprogram(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE)).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { +// LoggerUtil.e("queryScreenProgramList", "拉取节目数据:"+new Gson().toJson(response.body())); + if(response.body().getData()==null){ + //防止后台返回null,而不播放节目 + LoggerUtil.e("queryScreenProgramList报错", "后台返回body().getData()为null"); + getProgramError(); + return; + } + + String decryptdataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + if(decryptdataJson.equals("解密失败")) { + ScreenSaverData.saveScreenNewSaverList(response.body().getData()); + + }else { + ScreenSaverData.saveScreenNewSaverList(decryptdataJson); + } + +// ScreenSaverData.saveScreenNewSaverList(response.body().getData()); + String screenNewSaverListJson = ScreenSaverData.getScreenNewSaverListJson(); + String screenSaverListJson = ScreenSaverData.getScreenSaverListJson(); + List screenNewSaverList = ScreenSaverData.getScreenNewSaverList(); +// newdata = response.body().getData(); + newdata = screenNewSaverListJson; + + //定时获取 ,不同数据更新 + if(istiming && screenNewSaverListJson.equals(screenSaverListJson)){ + return; + } + + if( screenNewSaverList == null || screenNewSaverList.size() <= 0){ + ScreenSaverData.saveScreenSaverList(newdata); + + return; + } + + Log.e("TAG","数据不同,更新布局"); + if(!istiming){ + LoggerUtil.e("queryScreenProgramList", "第一次拉取节目开始下载播放"); + }else { + LoggerUtil.e("queryScreenProgramList", "拉取数据,发现不同节目数据进行更新"); + } + LoggerUtil.e("queryScreenProgramList", "新数据:"+screenNewSaverListJson); + bigFiles.clear(); + downloadCount=0; + getImgUrl(screenNewSaverListJson,"/iotFile"); + downloadFiles(true); + + }else { + //防止后台返回null,而不播放节目 + LoggerUtil.e("queryScreenProgramList报错", "后台返回body为null"); + getProgramError(); + } + } catch (Throwable t) { + LoggerUtil.e("queryScreenProgramList", "报错:"+StringUtil.getThrowableStr(t)); + if(!istiming){ + getProgramError(); + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("queryScreenProgramList",t); + if(!istiming){ + getProgramError(); + } + } + }); + } + + /** + * 获取节目列表数据异常进行处理 + * */ + public void getProgramError(){ + List newScreenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + //判断获取2天的日程 + if(newScreenSaverList == null || newScreenSaverList.size() == 0){ + LoggerUtil.e("getProgramError", "获取到的节目数据为空"); + return; + } + String s1 = new Gson().toJson(newScreenSaverList); + bigFiles.clear(); + downloadCount=0; + getImgUrl(s1,"/iotFile"); + downloadFiles(true); + } + + /** + * 只拉取数据 + * */ + public void getProgData2(){ + + //获取节目数据 + ScreenSaverData.getProgramList(null, new QueryFinishListener() { + @Override + public void onFinish() { + screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + //判断获取2天的日程 + if(screenSaverList==null||screenSaverList.size()==0){ + return; + } + String s1 = new Gson().toJson(screenSaverList); + bigFiles.clear(); + downloadCount=0; + getImgUrl(s1,"/iotFile"); + downloadFiles(false); + } + }, null); + } + + /** + * + * 获取图片路径 + * data 数据 + * params 条件 + * */ + private void getImgUrl(String data,String params){ + + //判断是否字符串是否存在子字符,>0 存在的位置 -1不存在 + while (data.indexOf(params)>0){ + String substring1 = data.substring(data.indexOf(params)); + int i1 = substring1.indexOf("\"");//通过最后双引号判断结束点 + String substring2 = substring1.substring(0, i1); +// Log.e("TAG","截取:"+substring2); + bigFiles.put(substring2,substring2); + data=substring1.substring(i1); + } + } + + /** + * 开始批量下载图片 + * ishandler 是否需要通知更新 + */ + public void downloadFiles(boolean ishandler) { + Log.e("TAG","文件下载的数量"+bigFiles.size()+",下载地址前缀"+DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP)); + if(bigFiles.size()<=0){ + if(ishandler) handler.sendEmptyMessage(TYPE_DOWNLOAD_FILE); + return; + } + for (String bigFile : bigFiles.keySet()) { + + downloadFile(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), bigFile, ishandler); + } + } + + private void downloadFile(String imgPath, final String address , boolean ishandler) { + + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH, address)); + if (file.exists()) { + if(ishandler){ + downloadCount++ ; + downCount(); + } + return; + } + + FileUtil.downloadFile2(StringUtil.strSplice(imgPath, address), StringUtil.strSplice( + Constant.CACHE_PATH, address), new QueryFinishListener() { + @Override + public void onFinish() { + if(ishandler){ + downloadCount++ ; + downCount(); + } + } + }); + } + + /** + * 下载完成度 + * */ + public void downCount(){ + if(bigFiles.size() == downloadCount){ + handler.removeMessages(TYPE_DOWNLOAD_FILE); + handler.sendEmptyMessage(TYPE_DOWNLOAD_FILE); + } + } + + + /** + * 开始播放节目 + * */ + boolean isStartProgram = false;//开始播放节目的状态(用于判断开机后一直不进这个方法显示) + public void startProgram(){ + + screenSaverList = ScreenSaverData.getScreenSaverList(ScreenSaverData.TYPE_SCREEN_SAVER); + //获取当天时间段 + for(NewProgramBean newProgramBean: screenSaverList){ + if(newProgramBean.date.equals(TimeUtil.stampToDate(System.currentTimeMillis()))){ + currentProgramBean = newProgramBean; + } + } + if(currentProgramBean == null && screenSaverList.size()>0){ + LoggerUtil.e("startProgram()","网络问题暂未获取当天节目单,使用前天节目"); + //2天网络不通没有获取最新的节目单,沿用前一天日程。 + currentProgramBean = screenSaverList.get(screenSaverList.size() - 1); + String s = TimeUtil.stampToDate(System.currentTimeMillis()); + currentProgramBean.setDate(s); + } + + if(currentProgramBean!=null&&!currentProgramBean.getDate().equals(TimeUtil.stampToDate(System.currentTimeMillis()))){ + LoggerUtil.e("startProgram()","多天网络问题,使用前天数据"); + String s = TimeUtil.stampToDate(System.currentTimeMillis()); + currentProgramBean.setDate(s); + } + + if(currentProgramBean==null || currentProgramBean.getSchedule().size()<=0){ + LoggerUtil.e("startProgram()","当前日程里没有节目"); + return; + } + + //当天里面的日程 + for(int i=0;i beginTimeLong && currentlong < endTimeLong ){ + //正在进行中 + programme= i ; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,endTimeLong-System.currentTimeMillis()); + //提前5秒获取下个日程的第一个节目的图片 +// handler.sendEmptyMessageDelayed(TYPE_GET_NEXT_PROGRAMME_OTHER_IMG,endTimeLong-(System.currentTimeMillis()+5000)); + //开始播放进行中的日程 + if(schedule==null){ + return; + } + program=0; + createView( schedule , program); + + break; + + }else if( currentlong < beginTimeLong ){ + //未开始 + programme= -1 ; + handler.removeMessages(TYPE_UPDATE_PROGRAM); + Log.e("TAG","未开始,等待"); + handler.removeMessages(TYPE_UPDATE_PROGRAMME); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAMME,beginTimeLong - System.currentTimeMillis()); + + break; + } + + } catch (Exception e) { + LoggerUtil.e("startProgram","报错:"+e.getMessage()); + e.printStackTrace(); + } + } + } + + /** + * 创建控件 + * */ + Timer sendRecordTimer;//发送节目单记录定时器 + int nextimg = 0; + public void createView( NewProgramBean.schedule schedule ,int position){ + + Log.e("TAG","节目切换"+position); + nextimg= position ; + NewProgramBean.programs programme = schedule.getPrograms().get(position); + + String[] split = programme.getDuration().split(":"); + int duration = Integer.parseInt(split[0])*3600*1000+Integer.parseInt(split[1])*60*1000+Integer.parseInt(split[2])*1000; + //只有一个的时候不会从新创建 + if(schedule.getPrograms().size()>1){ + //节目更新 + if(Constant.isSecondary && !Constant.isMain){ + //从设备不主动更新节目 + Log.e("TAG","从设备不主动更新"); + }else { + handler.sendEmptyMessageDelayed(TYPE_UPDATE_PROGRAM,duration); + program++; + } + ScreenSaverData.uploadPlayRecord(programme.getCode(),programme.getDuration(),null,null); + }else { + //需要定时发送上传节目单记录 + try { + sendRecordTimer = new Timer(); + sendRecordTimer.schedule(new TimerTask() { + @Override + public void run() { + ScreenSaverData.uploadPlayRecord(programme.getCode(),programme.getDuration(),null,null); + } + },duration); + }catch (Exception e){ + + } + } + + if(programme.getComponents()==null || programme.getComponents().size()<=0){ + LoggerUtil.e("TAG","获取到的节目控件列表为0"); + }else { + int videoCount=0; + int imageCount=0; + int weatherCount=0; + int textCount=0; + int clockCount=0; + int onlineWebCount=0; + int facilitiesCount=0; + int brandCount=0; + int positionCount=0; + for(int i=0;i imageViewlist = new ArrayList<>(); + List facilitiesImageViewList = new ArrayList<>();//设施图片控件 + List brandImageViewList = new ArrayList<>();//设施图片控件 + List positionImageViewList = new ArrayList<>();//设施图片控件 + + public void initSignImageLogo(NewProgramBean.subComponents subComponents , String type , int position){ + if(subComponents.getMaterials()==null||subComponents.getMaterials().size()<=0){ + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); + ImageView imageView0 = new ImageView(context); + binding.relativeLayoutMax.addView(imageView0, lParams); + imageViewlist.add(imageView0); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, subComponents.getMaterials().get(0).getFileUrl() ,imageView0); + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setImageView(imageView0); + facilitiesBean.setType("image"); + facilitiesBean.setPosition(position); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + } + + + /** + * 公共设施json动图 + * */ + private void initSignImageLogoLottie(NewProgramBean.subComponents subComponents , String type , int position){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); + + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, subComponents.getMaterials().get(0).getFileUrl()); + + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = new LottieAnimationView(context); + binding.relativeLayoutMax.addView(ltGift, lParams); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + ltGiftList.add(ltGift); + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setLottieView(ltGift); + facilitiesBean.setType("lottie"); + facilitiesBean.setPosition(position); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + } + + /** + * 更新设施跟品牌轮播 + * */ + private void updateBrandOrfacilities(int count, int position ,List list, int handlerType){ + for(FacilitiesBean facilitiesBean: list){ + if(facilitiesBean.getPosition()==position){ + if(facilitiesBean.getType().equals("image")){ + //图片 + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getFileUrl(),facilitiesBean.getImageView()); + }else if(facilitiesBean.getType().equals("lottie")){ + //动图 + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getFileUrl()); + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = facilitiesBean.getLottieView(); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + }else if(facilitiesBean.getType().equals("text")){ + //文字 + facilitiesBean.getTextView().setTextinfo(facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getText()); + facilitiesBean.getTextView().setVisibility(View.INVISIBLE); + facilitiesBean.getTextView().setVisibility(View.VISIBLE); + }else if(facilitiesBean.getType().equals("text2")){ + //文字 + facilitiesBean.getTextView2().setText(facilitiesBean.getMaterials().get(count % facilitiesBean.getMaterials().size()).getText()); + } + handler.removeMessages(handlerType); + handler.sendEmptyMessageDelayed(handlerType,facilitiesBean.getTransitionPeriod()*1000); + } + } + } + + /** + * 判断给handler定时轮播 + * */ + private void sendhandlerBrandOrFacilities(NewProgramBean.components components,String type, int position){ + if(type.equals("brand")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //品牌 + if(position==0){ + handler.removeMessages(TYPE_BRAND0); + handler.sendEmptyMessageDelayed(TYPE_BRAND0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_BRAND1); + handler.sendEmptyMessageDelayed(TYPE_BRAND1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_BRAND2); + handler.sendEmptyMessageDelayed(TYPE_BRAND2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_BRAND3); + handler.sendEmptyMessageDelayed(TYPE_BRAND3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_BRAND4); + handler.sendEmptyMessageDelayed(TYPE_BRAND4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_BRAND5); + handler.sendEmptyMessageDelayed(TYPE_BRAND5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_BRAND6); + handler.sendEmptyMessageDelayed(TYPE_BRAND6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_BRAND7); + handler.sendEmptyMessageDelayed(TYPE_BRAND7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_BRAND8); + handler.sendEmptyMessageDelayed(TYPE_BRAND8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_BRAND9); + handler.sendEmptyMessageDelayed(TYPE_BRAND9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_BRAND10); + handler.sendEmptyMessageDelayed(TYPE_BRAND10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_BRAND11); + handler.sendEmptyMessageDelayed(TYPE_BRAND11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_BRAND12); + handler.sendEmptyMessageDelayed(TYPE_BRAND12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_BRAND13); + handler.sendEmptyMessageDelayed(TYPE_BRAND13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_BRAND14); + handler.sendEmptyMessageDelayed(TYPE_BRAND14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_BRAND15); + handler.sendEmptyMessageDelayed(TYPE_BRAND15,components.getConfig().getTransitionPeriod()*1000); + } + }else if(type.equals("facility")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //设施 + if(position==0){ + handler.removeMessages(TYPE_FACILITIES0); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_FACILITIES1); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_FACILITIES2); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_FACILITIES3); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_FACILITIES4); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_FACILITIES5); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_FACILITIES6); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_FACILITIES7); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_FACILITIES8); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_FACILITIES9); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_FACILITIES10); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_FACILITIES11); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_FACILITIES12); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_FACILITIES13); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_FACILITIES14); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_FACILITIES15); + handler.sendEmptyMessageDelayed(TYPE_FACILITIES15,components.getConfig().getTransitionPeriod()*1000); + } + }else if(type.equals("position")&& components.getSubComponents().get(0).getMaterials().size()>1){ + //设施 + if(position==0){ + handler.removeMessages(TYPE_POSITION0); + handler.sendEmptyMessageDelayed(TYPE_POSITION0,components.getConfig().getTransitionPeriod()*1000); + }else if(position==1){ + handler.removeMessages(TYPE_POSITION1); + handler.sendEmptyMessageDelayed(TYPE_POSITION1,components.getConfig().getTransitionPeriod()*1000); + }else if(position==2){ + handler.removeMessages(TYPE_POSITION2); + handler.sendEmptyMessageDelayed(TYPE_POSITION2,components.getConfig().getTransitionPeriod()*1000); + }else if(position==3){ + handler.removeMessages(TYPE_POSITION3); + handler.sendEmptyMessageDelayed(TYPE_POSITION3,components.getConfig().getTransitionPeriod()*1000); + }else if(position==4){ + handler.removeMessages(TYPE_POSITION4); + handler.sendEmptyMessageDelayed(TYPE_POSITION4,components.getConfig().getTransitionPeriod()*1000); + }else if(position==5){ + handler.removeMessages(TYPE_POSITION5); + handler.sendEmptyMessageDelayed(TYPE_POSITION5,components.getConfig().getTransitionPeriod()*1000); + }else if(position==6){ + handler.removeMessages(TYPE_POSITION6); + handler.sendEmptyMessageDelayed(TYPE_POSITION6,components.getConfig().getTransitionPeriod()*1000); + }else if(position==7){ + handler.removeMessages(TYPE_POSITION7); + handler.sendEmptyMessageDelayed(TYPE_POSITION7,components.getConfig().getTransitionPeriod()*1000); + }else if(position==8){ + handler.removeMessages(TYPE_POSITION8); + handler.sendEmptyMessageDelayed(TYPE_POSITION8,components.getConfig().getTransitionPeriod()*1000); + }else if(position==9){ + handler.removeMessages(TYPE_POSITION9); + handler.sendEmptyMessageDelayed(TYPE_POSITION9,components.getConfig().getTransitionPeriod()*1000); + }else if(position==10){ + handler.removeMessages(TYPE_POSITION10); + handler.sendEmptyMessageDelayed(TYPE_POSITION10,components.getConfig().getTransitionPeriod()*1000); + }else if(position==11){ + handler.removeMessages(TYPE_POSITION11); + handler.sendEmptyMessageDelayed(TYPE_POSITION11,components.getConfig().getTransitionPeriod()*1000); + }else if(position==12){ + handler.removeMessages(TYPE_POSITION12); + handler.sendEmptyMessageDelayed(TYPE_POSITION12,components.getConfig().getTransitionPeriod()*1000); + }else if(position==13){ + handler.removeMessages(TYPE_POSITION13); + handler.sendEmptyMessageDelayed(TYPE_POSITION13,components.getConfig().getTransitionPeriod()*1000); + }else if(position==14){ + handler.removeMessages(TYPE_POSITION14); + handler.sendEmptyMessageDelayed(TYPE_POSITION14,components.getConfig().getTransitionPeriod()*1000); + }else if(position==15){ + handler.removeMessages(TYPE_POSITION15); + handler.sendEmptyMessageDelayed(TYPE_POSITION15,components.getConfig().getTransitionPeriod()*1000); + } + } + } + /** + * 公共设施 + * */ + List textViewlist = new ArrayList<>(); + List textViewlist2 = new ArrayList<>(); + public void initSignTxtDistance(NewProgramBean.subComponents subComponents,String type, int position){ + if(subComponents.getMaterials()==null||subComponents.getMaterials().size()<=0){ + return; + } + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(subComponents.getWidth(), subComponents.getHeight()); + lParams.setMargins(subComponents.getOffsetX(), subComponents.getOffsetY(), 0, 0); +// TextView textView = new TextView(this); + + + + if(subComponents.getConfig().getAnimation().equals("固定")){ + + TextView textView = new TextView(context); + if(subComponents.getConfig().getFontStyle().equals("正常")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(subComponents.getConfig().getFontStyle().equals("斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗、斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + binding.relativeLayoutMax.addView(textView, lParams); + textViewlist2.add(textView); + ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); + + layoutParams.width=subComponents.getWidth(); + layoutParams.height=subComponents.getHeight(); + textView.setLayoutParams(layoutParams); + + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setTextView2( textView ); + facilitiesBean.setPosition(position); + facilitiesBean.setType("text2"); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + + if(subComponents.getConfig().getBackgroundColor()!=null&&!subComponents.getConfig().getBackgroundColor().isEmpty()){ + String backgroundColor = subComponents.getConfig().getBackgroundColor(); + String backgroundOpacity = (String)colorMap.get(subComponents.getConfig().getBackgroundOpacity()); + backgroundColor="#"+backgroundOpacity+backgroundColor.substring(1); + textView.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + textView.setTextColor(Color.parseColor(subComponents.getConfig().getFontColor())); + textView.setText(subComponents.getMaterials().get(0).getText()); + textView.setTextSize(subComponents.getConfig().getFontSize()); + textView.setGravity(Gravity.CENTER_VERTICAL); + + }else { + MarqueeTextView2 textView =new MarqueeTextView2(context); + + if(subComponents.getConfig().getFontStyle().equals("正常")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(subComponents.getConfig().getFontStyle().equals("斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(subComponents.getConfig().getFontStyle().equals("加粗、斜体")){ + textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + binding.relativeLayoutMax.addView(textView, lParams); + textViewlist2.add(textView); + ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); + + layoutParams.width=subComponents.getWidth(); + layoutParams.height=subComponents.getHeight(); + textView.setLayoutParams(layoutParams); + + FacilitiesBean facilitiesBean = new FacilitiesBean(); + facilitiesBean.setTextView( textView ); + facilitiesBean.setPosition(position); + facilitiesBean.setType("text"); + facilitiesBean.setTransitionPeriod(subComponents.getConfig().getTransitionPeriod()); + facilitiesBean.setMaterials(subComponents.getMaterials()); + + if(type.equals("brand")){ + brandImageViewList.add(facilitiesBean); + }else if(type.equals("facility")){ + facilitiesImageViewList.add(facilitiesBean); + }else if(type.equals("position")){ + positionImageViewList.add(facilitiesBean); + } + + if(subComponents.getConfig().getBackgroundColor()!=null&&!subComponents.getConfig().getBackgroundColor().isEmpty()){ + String backgroundColor = subComponents.getConfig().getBackgroundColor(); + String backgroundOpacity = (String)colorMap.get(subComponents.getConfig().getBackgroundOpacity()); + backgroundColor="#"+backgroundOpacity+backgroundColor.substring(1); + textView.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + textView.setTextColor(Color.parseColor(subComponents.getConfig().getFontColor())); + textView.setTextSize(subComponents.getConfig().getFontSize()); + textView.setTextinfo(subComponents.getMaterials().get(0).getText(),subComponents.getConfig().getFontSize(),subComponents.getWidth(), subComponents.getHeight()); + textView.setGravity(Gravity.CENTER_VERTICAL); + + } + +// if(components.getConfig().getAnimation().equals("自动")){ +// textView.setMarqueeRepeatLimit(3); +// textView.setFocusable(true); +// textView.setEllipsize(TextUtils.TruncateAt.MARQUEE); +// textView.setSingleLine(); +// textView.setFocusableInTouchMode(true); +// textView.setHorizontallyScrolling(true); +// textView.setSelected(true); +// } + } + + /** + * 添加视频 + * */ + NewProgramBean.components videoComponents0; + NewProgramBean.components videoComponents1; + RelativeLayout videoLayout0; + LinearLayout videoLayout1; + public void addVideoView( NewProgramBean.components components,int position){ + + //如果没有内容不创建 + if(components == null ||components.getMaterials()==null || components.getMaterials().size() <= 0){ + return; + } + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + if(position==0){ + + isNextVideo = true; + isvideoPlay0 = true; + binding.videoView0.pause(); + binding.videoView0.seekTo(0); + binding.layoutVideo0.setX(components.getOffsetX()); + binding.layoutVideo0.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = binding.layoutVideo0.getLayoutParams(); + layoutParams.height = components.getHeight(); + layoutParams.width = components.getWidth(); + videoComponents0 = components; + + binding.layoutVideo0.setVisibility(View.VISIBLE); + binding.layoutVideo0.bringToFront(); + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO0); + + binding.videoImg0.setVisibility(View.VISIBLE); + + binding.videoView0.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) + binding.videoView0.setBackgroundColor(Color.TRANSPARENT); + binding.videoImg0.setVisibility(View.GONE); + return true; + + } + }); + + //视频准备完毕,可以进行播放 + Log.e("TAG","准备好视频,开始播放"); + if( isvideoPlay0 ){ + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + if(components.getConfig().isPlayAudio()){ + mp.setVolume(15f,15f); + }else { + mp.setVolume(0f,0f); + } + mp.start(); + + }else{ + Log.e("TAG","预加载播放暂停"); + mp.start(); + mp.setVolume(0f,0f); + //暂停播放 + handler.removeMessages(TYPE_STOP_VIDEO_PLAY0); + handler.sendEmptyMessageDelayed(TYPE_STOP_VIDEO_PLAY0,5000); + } + } + }); + // 视频播放完成时的操作 + binding.videoView0.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + // 视频播放完成时的操作 + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO0); + } + }); + + //视频播放发送错误时回调 + binding.videoView0.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + //视频播放失败 + return true; + } + }); + + }else if(position==1){ + + isvideoPlay1 = true; + binding.layoutVideo1.setX(components.getOffsetX()); + binding.layoutVideo1.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = binding.layoutVideo1.getLayoutParams(); + layoutParams.height = components.getHeight(); + layoutParams.width = components.getWidth(); + binding.videoView1.pause(); + binding.videoView1.seekTo(0); + binding.videoView1.setZOrderOnTop(true); + binding.videoView1.setZOrderMediaOverlay(true); + binding.videoView1.setVisibility(View.VISIBLE); + binding.layoutVideo1.setVisibility(View.VISIBLE); + binding.layoutVideo1.bringToFront(); + + binding.videoImg1.setVisibility(View.VISIBLE); + + videoComponents1 = components; + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO1); + + binding.videoView1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) + binding.videoView1.setBackgroundColor(Color.TRANSPARENT); + binding.videoImg1.setVisibility(View.GONE); + return true; + + } + }); + + //视频准备完毕,可以进行播放 + Log.e("TAG","准备好视频,开始播放"); + if( isvideoPlay1 ){ + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + if(components.getConfig().isPlayAudio()){ + mp.setVolume(15f,15f); + }else { + mp.setVolume(0f,0f); + } + mp.start(); + + }else { + Log.e("TAG","预加载播放暂停"); + mp.start(); + mp.setVolume(0f,0f); + //暂停播放 + handler.removeMessages(TYPE_STOP_VIDEO_PLAY1); + handler.sendEmptyMessageDelayed(TYPE_STOP_VIDEO_PLAY1,5000); + } + } + }); + + // 视频播放完成时的操作 + binding.videoView1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + // 视频播放完成时的操作 + handler.sendEmptyMessage(TYPE_UPDATE_VIDEO1); + } + }); + //视频播放发送错误时回调 + binding.videoView1.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + //视频播放失败 + + return true; + } + }); + } + } + + /** + * 更新video + * */ + public void updateVideo(NewProgramBean.components videoComponents, int videoPlayCount, CustomerVideoView videoView, int TYPE_UPDATE_VIDE){ + if(videoComponents.getMaterials()==null||videoComponents.getMaterials().size()==0){ + return; + } + if(videoPlayCount>=videoComponents.getMaterials().size()){ + videoPlayCount=0; + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + videoPlayCount0 = 0; + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + videoPlayCount1 = 0 ; + } + } + + NewProgramBean.materials materials0 = videoComponents.getMaterials().get(videoPlayCount); + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, materials0.getFileUrl()); + if (!new File(localPath).exists()) { + FileUtil.downloadFile(downloadaddress + materials0.getFileUrl(), localPath); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_VIDE,2000); + return; + } + + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + videoPlayCount0++; + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + videoPlayCount1++; + } + + if(materials0.getDuration()>0){ + //视频 + videoView.setVideoPath(localPath); + + }else { + //图片 + if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO0){ + ViewGroup.LayoutParams layoutParams = binding.videoView0.getLayoutParams(); + layoutParams.height = videoComponents.getHeight(); + layoutParams.width = videoComponents.getWidth(); + binding.videoView0.setLayoutParams(layoutParams); + binding.videoImg0.setVisibility(View.GONE); + + }else if(TYPE_UPDATE_VIDE==TYPE_UPDATE_VIDEO1){ + ViewGroup.LayoutParams layoutParams = binding.videoView1.getLayoutParams(); + layoutParams.height = videoComponents.getHeight(); + layoutParams.width = videoComponents.getWidth(); + binding.videoView1.setLayoutParams(layoutParams); + binding.videoImg1.setVisibility(View.GONE); + } + + handler.sendEmptyMessageDelayed(TYPE_UPDATE_VIDE,videoComponents.getConfig().getTransitionPeriod()*1000); + Drawable drawable = new BitmapDrawable(localPath); + videoView.setBackground(drawable); +// Bitmap bitmap = BitmapFactory.decodeFile(localPath); +// WeakReference weakBitmap = new WeakReference<>(bitmap); +// videoView.setBackground(new BitmapDrawable(context.getResources(), weakBitmap.get())); + } + + } + + /** + * 初始化直播 + * */ + List livePlaylist = new ArrayList(); + public void initLivePlayer(NewProgramBean.components components) { + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + IjkPlayerView ijkPlayerView = new IjkPlayerView(context); + livePlaylist.add(ijkPlayerView); + binding.relativeLayoutMax.addView(ijkPlayerView, lParams); + ijkPlayerView.init(); + String url = components.getMaterials().get(0).getOuterChain(); + Log.e("TAG","直播路径"+url); + ijkPlayerView.setVideoPath(url); + ijkPlayerView.start(); + if(!components.getConfig().isPlayAudio()){ + ijkPlayerView.setVolume(1); + }else { + ijkPlayerView.setVolume(15); + } + } + + /** + * 添加音频 + * + * @param path*/ + MediaPlayer mediaPlayer0; + NewProgramBean.components mediaComponents0; + public void initMediaPlayer(NewProgramBean.components components){ + if(!components.getConfig().isPlayAudio() || components.getMaterials()==null || components.getMaterials().size()==0){ + return; + } + mediaComponents0 = components; + mediaPlayer0 = new MediaPlayer(); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MEIDA0,100); + } + + /** + * 更新音频文件 + * */ + public void updateMedia(NewProgramBean.components components){ + + NewProgramBean.materials materials0 = mediaComponents0.getMaterials().get(0); + + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, materials0.getFileUrl()); + + if (!new File(localPath).exists()) { + FileUtil.downloadFile(downloadaddress + materials0.getFileUrl(), localPath); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_MEIDA0,2000); + return; + } + + Log.e("TAG","有音频播放"); + try { + File file = new File(localPath); + mediaPlayer0.setDataSource(file.getPath()); //指定音频文件的路径 + mediaPlayer0.prepareAsync(); //让MediaPlayer进入到准备状态 + mediaPlayer0.setLooping(true);//自动循环 + //装载音频完成监听 + mediaPlayer0.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + // 装载完毕回调 + mediaPlayer0.start(); + } + }); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 添加图片 + * */ + NewProgramBean.components imageComponents0; + NewProgramBean.components imageComponents1; + NewProgramBean.components imageComponents2; + NewProgramBean.components imageComponents3; + NewProgramBean.components imageComponents4; + NewProgramBean.components imageComponents5; + NewProgramBean.components imageComponents6; + NewProgramBean.components imageComponents7; + NewProgramBean.components imageComponents8; + NewProgramBean.components imageComponents9; + NewProgramBean.components imageComponents10; + NewProgramBean.components imageComponents11; + NewProgramBean.components imageComponents12; + NewProgramBean.components imageComponents13; + NewProgramBean.components imageComponents14; + NewProgramBean.components imageComponents15; + + List nomallImgList =new ArrayList<>();//普通图片 + public void initImage(NewProgramBean.components components,int position){ + //如果没有内容不创建 + if(components==null ||components.getMaterials()==null|| components.getMaterials().size()<=0){ + LoggerUtil.e("initImage添加图片","认为没有内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + if(position==0){ + + buildImgView( binding.layoutImg0,components,TYPE_HINT_IMG0,TYPE_UPDATE_IMAGE0); + imageComponents0 = components; + buildImgView( binding.otherImg0,components,TYPE_HINT_IMG0,TYPE_UPDATE_IMAGE0); + nomallImgList.add(binding.img0); + nomallImgList.add(binding.img0Behind); + }else if(position==1){ + + buildImgView( binding.layoutImg1,components,TYPE_HINT_IMG1,TYPE_UPDATE_IMAGE1); + imageComponents1 = components; + buildImgView( binding.otherImg1,components,TYPE_HINT_IMG1,TYPE_UPDATE_IMAGE1); + nomallImgList.add(binding.img1); + nomallImgList.add(binding.img1Behind); + }else if(position==2){ + + buildImgView( binding.layoutImg2,components, TYPE_HINT_IMG2, TYPE_UPDATE_IMAGE2); + imageComponents2 = components; + buildImgView( binding.otherImg2,components, TYPE_HINT_IMG2, TYPE_UPDATE_IMAGE2); + nomallImgList.add(binding.img2); + nomallImgList.add(binding.img2Behind); + }else if(position==3){ + + buildImgView( binding.layoutImg3, components, TYPE_HINT_IMG3, TYPE_UPDATE_IMAGE3); + imageComponents3 = components; + buildImgView( binding.otherImg3,components, TYPE_HINT_IMG3, TYPE_UPDATE_IMAGE3); + nomallImgList.add(binding.img3); + nomallImgList.add(binding.img3Behind); + }else if(position==4){ + + buildImgView( binding.layoutImg4, components, TYPE_HINT_IMG4, TYPE_UPDATE_IMAGE4); + imageComponents4 = components; + nomallImgList.add(binding.img4); + nomallImgList.add(binding.img4Behind); + }else if(position==5){ + + buildImgView( binding.layoutImg5, components, TYPE_HINT_IMG5, TYPE_UPDATE_IMAGE5); + imageComponents5 = components; + nomallImgList.add(binding.img5); + nomallImgList.add(binding.img5Behind); + }else if(position==6){ + + buildImgView( binding.layoutImg6, components, TYPE_HINT_IMG6, TYPE_UPDATE_IMAGE6); + imageComponents6 = components; + nomallImgList.add(binding.img6); + nomallImgList.add(binding.img6Behind); + }else if(position==7){ + + buildImgView( binding.layoutImg7, components, TYPE_HINT_IMG7, TYPE_UPDATE_IMAGE7); + imageComponents7 = components; + nomallImgList.add(binding.img7); + nomallImgList.add(binding.img7Behind); + }else if(position==8){ + + buildImgView( binding.layoutImg8, components, TYPE_HINT_IMG8, TYPE_UPDATE_IMAGE8); + imageComponents8 = components; + nomallImgList.add(binding.img8); + nomallImgList.add(binding.img8Behind); + }else if(position==9){ + + buildImgView( binding.layoutImg9, components, TYPE_HINT_IMG9, TYPE_UPDATE_IMAGE9); + imageComponents9 = components; + nomallImgList.add(binding.img9); + nomallImgList.add(binding.img9Behind); + }else if(position==10){ + + buildImgView( binding.layoutImg10, components, TYPE_HINT_IMG10, TYPE_UPDATE_IMAGE10); + imageComponents10 = components; + nomallImgList.add(binding.img10); + nomallImgList.add(binding.img10Behind); + }else if(position==11){ + + buildImgView( binding.layoutImg11, components, TYPE_HINT_IMG11, TYPE_UPDATE_IMAGE11); + imageComponents11 = components; + nomallImgList.add(binding.img11); + nomallImgList.add(binding.img11Behind); + }else if(position==12){ + + buildImgView( binding.layoutImg12, components, TYPE_HINT_IMG12, TYPE_UPDATE_IMAGE12); + imageComponents12 = components; + nomallImgList.add(binding.img12); + nomallImgList.add(binding.img12Behind); + }else if(position==13){ + + buildImgView( binding.layoutImg13, components, TYPE_HINT_IMG13, TYPE_UPDATE_IMAGE13); + imageComponents13 = components; + nomallImgList.add(binding.img13); + nomallImgList.add(binding.img13Behind); + }else if(position==14){ + + buildImgView( binding.layoutImg14, components, TYPE_HINT_IMG14, TYPE_UPDATE_IMAGE14); + imageComponents14 = components; + nomallImgList.add(binding.img14); + nomallImgList.add(binding.img14Behind); + }else if(position==15){ + + buildImgView( binding.layoutImg15, components, TYPE_HINT_IMG15, TYPE_UPDATE_IMAGE15); + imageComponents15 = components; + nomallImgList.add(binding.img15); + nomallImgList.add(binding.img15Behind); + } + } + + /** + * 创建更图片位置 + * */ + public void buildImgView(View view, NewProgramBean.components components,int TYPE_HINT_IMG , int TYPE_UPDATE_IMAGE){ + view.setVisibility(View.VISIBLE); + view.bringToFront(); + changeViewLocation(view,components); + handler.removeMessages(TYPE_HINT_IMG); + handler.sendEmptyMessageDelayed(TYPE_HINT_IMG,3000); + handler.removeMessages(TYPE_UPDATE_IMAGE); + handler.sendEmptyMessage(TYPE_UPDATE_IMAGE); + } + + /** + * 创建更改控件位置 + * */ + public void changeViewLocation(View view, NewProgramBean.components components){ + view.setX(components.getOffsetX()); + view.setY(components.getOffsetY()); + ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); + layoutParams.width = components.getWidth(); + layoutParams.height = components.getHeight(); + } + + /** + * 添加额外的图片(节目跟节目切换) + * */ + + public void addOtherImg( NewProgramBean.components components, int otherImgCount){ + if(components.getMaterials()==null||components.getMaterials().size()<=0){ + return; + } + if(otherImgCount==0){ + Log.e("TAG","隐藏额外图片"); + binding.otherImg0.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg0,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg0); + + }else if(otherImgCount==1){ + binding.otherImg1.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg1,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg1); + + }else if(otherImgCount==2){ + binding.otherImg2.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg2,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg2); + + }else if(otherImgCount==3){ + binding.otherImg3.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg3,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg3); + }else if(otherImgCount==4){ + binding.otherImg4.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg4,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg4); + }else if(otherImgCount==5){ + binding.otherImg5.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg5,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg5); + }else if(otherImgCount==6){ + binding.otherImg6.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg6,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg6); + }else if(otherImgCount==7){ + binding.otherImg7.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg7,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg7); + }else if(otherImgCount==8){ + binding.otherImg8.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg8,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg8); + }else if(otherImgCount==9){ + binding.otherImg9.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg9,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg9); + }else if(otherImgCount==10){ + binding.otherImg10.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg10,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg10); + }else if(otherImgCount==11){ + binding.otherImg11.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg11,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg11); + }else if(otherImgCount==12){ + binding.otherImg12.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg12,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg12); + }else if(otherImgCount==13){ + binding.otherImg13.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg13,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg13); + }else if(otherImgCount==14){ + binding.otherImg14.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg14,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg14); + }else if(otherImgCount==15){ + binding.otherImg15.setVisibility(View.INVISIBLE); + changeViewLocation( binding.otherImg15,components); + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl(), binding.otherImg15); + } + } + + /** + * 更新替换图片 + * */ + + public void updateImage( NewProgramBean.components imageComponents0, int imagePlayCount, boolean firstImagePlay , boolean imagePlay ,ImageView imageView0 ,ImageView imageView00 ,int TYPE_UPDATE ){ + Log.e("TAG","切换图片"+imagePlayCount); + if(imageComponents0.getMaterials()==null||imageComponents0.getMaterials().size()==0){ + return; + } + + //如果只有一张图就不切换图片 + if(imageComponents0.getMaterials().size()>1){ + handler.sendEmptyMessageDelayed(TYPE_UPDATE,imageComponents0.getConfig().getTransitionPeriod()*1000);//切换 + } + + Log.e("TAG","开始切换图片"+TYPE_UPDATE); + if(imagePlayCount >= imageComponents0.getMaterials().size()){ + imagePlayCount = 0; + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlayCount0=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlayCount1=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlayCount2=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlayCount3=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlayCount4=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlayCount5=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlayCount6=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlayCount7=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlayCount8=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlayCount9=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlayCount10=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlayCount11=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlayCount12=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlayCount13=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlayCount14=0; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlayCount15=0; + } + } + String fileurl1 = imageComponents0.getMaterials().get(imagePlayCount).getFileUrl(); + long fileLength = imageComponents0.getMaterials().get(imagePlayCount).getFileLength(); + + //上传播放记录 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + String playTime = format.format(System.currentTimeMillis()); +// ScreenSaverData.uploadPlayRecord(imageComponents0.getMaterials().get(imagePlayCount).getMaterialCode(), imageComponents0.getMaterials().get(imagePlayCount).getDuration(), playTime, null, null); + + String fileurl2; + if(imagePlayCount+1>=imageComponents0.getMaterials().size()){ + + fileurl2 = imageComponents0.getMaterials().get(0).getFileUrl(); + + }else { + + fileurl2 = imageComponents0.getMaterials().get(imagePlayCount+1).getFileUrl(); + } + + //第一张图显示 + if(firstImagePlay){ + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + firstImagePlay0=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + firstImagePlay1=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + firstImagePlay2=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + firstImagePlay3=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + firstImagePlay4=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + firstImagePlay5=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + firstImagePlay6=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + firstImagePlay7=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + firstImagePlay8=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + firstImagePlay9=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + firstImagePlay10=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + firstImagePlay11=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + firstImagePlay12=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + firstImagePlay13=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + firstImagePlay14=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + firstImagePlay15=false; + + } + + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH, fileurl1)); + if(Math.abs(file.length()-fileLength)>1){ + file.delete(); + }else { + } + BitmapUtil.loadImage(downloadaddress, Constant.CACHE_PATH, fileurl1, imageView00); + }else { + + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + binding.otherImg0.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + binding.otherImg1.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + binding.otherImg2.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + binding.otherImg3.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + binding.otherImg4.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + binding.otherImg5.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + binding.otherImg6.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + binding.otherImg7.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + binding.otherImg8.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + binding.otherImg9.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + binding.otherImg10.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + binding.otherImg11.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + binding.otherImg12.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + binding.otherImg13.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + binding.otherImg14.setVisibility(View.INVISIBLE); + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + binding.otherImg15.setVisibility(View.INVISIBLE); + } + } + + if(imagePlay){ + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlay0=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlay1=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlay2=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlay3=false; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlay4=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlay5=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlay6=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlay7=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlay8=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlay9=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlay10=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlay11=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlay12=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlay13=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlay14=false; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlay15=false; + + } + + //移动动画 + if(imageComponents0.getConfig().getTransition()!=null) { + if (imageComponents0.getConfig().getTransition().equals("上下滚动")) { + imgAnimation(imageView00, 0, 0, -imageComponents0.getHeight(), 0); + imgAnimation(imageView0, 0, 0, 0, imageComponents0.getHeight()); + } else if (imageComponents0.getConfig().getTransition().equals("左右滚动")) { + imgAnimation(imageView00, imageComponents0.getWidth(), 0, 0, 0); + imgAnimation(imageView0, 0, -imageComponents0.getWidth(), 0, 0); + } + } + + imageView00.setVisibility(View.VISIBLE); + imageView0.setVisibility(View.INVISIBLE); + }else { + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + imagePlay0=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + imagePlay1=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + imagePlay2=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + imagePlay3=true; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + imagePlay4=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + imagePlay5=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + imagePlay6=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + imagePlay7=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + imagePlay8=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + imagePlay9=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + imagePlay10=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + imagePlay11=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + imagePlay12=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + imagePlay13=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + imagePlay14=true; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + imagePlay15=true; + + } + + Log.e("TAG",""+TYPE_UPDATE); + //移动动画 + if(imageComponents0.getConfig().getTransition()!=null) { + if (imageComponents0.getConfig().getTransition().equals("上下滚动")) { + imgAnimation(imageView0, 0, 0, -imageComponents0.getHeight(), 0); + imgAnimation(imageView00, 0, 0, 0, imageComponents0.getHeight()); + } else if (imageComponents0.getConfig().getTransition().equals("左右滚动")) { + imgAnimation(imageView0, imageComponents0.getWidth(), 0, 0, 0); + imgAnimation(imageView00, 0, -imageComponents0.getWidth(), 0, 0); + } + } + + imageView00.setVisibility(View.INVISIBLE); + imageView0.setVisibility(View.VISIBLE); + } + + if(TYPE_UPDATE==TYPE_UPDATE_IMAGE0){ + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW0,fileurl2); + imagePlayCount0++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE1) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW1,fileurl2); + imagePlayCount1++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE2) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW2,fileurl2); + imagePlayCount2++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE3) { + //传参数 + sendMsg(TYPE_CHANGE_IMG_SHOW3,fileurl2); + imagePlayCount3++; + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE4) { + sendMsg(TYPE_CHANGE_IMG_SHOW4,fileurl2); + imagePlayCount4++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE5) { + sendMsg(TYPE_CHANGE_IMG_SHOW5,fileurl2); + imagePlayCount5++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE6) { + sendMsg(TYPE_CHANGE_IMG_SHOW6,fileurl2); + imagePlayCount6++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE7) { + sendMsg(TYPE_CHANGE_IMG_SHOW7,fileurl2); + imagePlayCount7++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE8) { + sendMsg(TYPE_CHANGE_IMG_SHOW8,fileurl2); + imagePlayCount8++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE9) { + sendMsg(TYPE_CHANGE_IMG_SHOW9,fileurl2); + imagePlayCount9++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE10) { + sendMsg(TYPE_CHANGE_IMG_SHOW10,fileurl2); + imagePlayCount10++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE11) { + sendMsg(TYPE_CHANGE_IMG_SHOW11,fileurl2); + imagePlayCount11++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE12) { + sendMsg(TYPE_CHANGE_IMG_SHOW12,fileurl2); + imagePlayCount12++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE13) { + sendMsg(TYPE_CHANGE_IMG_SHOW13,fileurl2); + imagePlayCount13++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE14) { + sendMsg(TYPE_CHANGE_IMG_SHOW14,fileurl2); + imagePlayCount14++; + + }else if(TYPE_UPDATE==TYPE_UPDATE_IMAGE15) { + sendMsg(TYPE_CHANGE_IMG_SHOW15,fileurl2); + imagePlayCount15++; + + } + } + + /** + *发送handler命令 + * */ + public void sendMsg(int TYPE_UPDATE_IMAGE, String url){ + handler.removeMessages(TYPE_UPDATE_IMAGE); + Message msg = new Message(); + msg.what = TYPE_UPDATE_IMAGE; + Bundle bundle = new Bundle(); + bundle.putString("url", url); + msg.setData(bundle); + handler.sendMessageDelayed(msg,1000); + } + + + /** + * 添加json动图 + * */ + List ltGiftList = new ArrayList(); + private void initLottie(NewProgramBean.components components){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, components.getMaterials().get(0).getFileUrl()); + + String url=FileUtil.readLocalJsonForStorage(context,localPath2); + LottieAnimationView ltGift = new LottieAnimationView(context); + binding.relativeLayoutMax.addView(ltGift, lParams); + ltGiftList.add(ltGift); + ltGift.setAnimationFromJson(url); + ltGift.loop(true); + ltGift.playAnimation(); + } + + /** + * 初始化文本 + * */ + + NewProgramBean.components textComponents0; + NewProgramBean.components textComponents1; + NewProgramBean.components textComponents2; + NewProgramBean.components textComponents3; + AutoScrollTextView AutoScrollText0; + AutoScrollTextView AutoScrollText1; + AutoScrollTextView AutoScrollText2; + AutoScrollTextView AutoScrollText3; + MarqueeTextView textView0; + MarqueeTextView textView1; + MarqueeTextView textView2; + MarqueeTextView textView3; + List MarqueeTextList = new ArrayList(); + List AutoScrollTextList = new ArrayList(); + List textList = new ArrayList(); + + public void initText(NewProgramBean.components components,int position){ + + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + NewProgramBean.materials textMaterials = components.getMaterials().get(0); + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, textMaterials.getFileUrl());//文本本地路径 + + if(components.getConfig().getAnimation().equals("自动")||components.getConfig().getAnimation().equals("固定")){ + MarqueeTextView textView = new MarqueeTextView(context); + setText2(components,textView); + binding.relativeLayoutMax.addView(textView, lParams); + textView.setText(components.getMaterials().get(0).getText()); +// if(!new File(localPath).exists()){ +// //不存在 +// TextBean textBean = new TextBean(); +// textBean.setText(textMaterials.getText()); +// textBean.setPosition(position); +// textBean.setMarqueeTextView(textView); +// textBean.setWidth(components.getWidth()); +// textList.add(textBean); +// handler.removeMessages(TYPE_UPDATE_TEXT4); +// handler.sendEmptyMessageDelayed(TYPE_UPDATE_TEXT4,5000); +// }else { +// textView.setText(FileUtil.loadFromSDFile(localPath).trim()); +// } + + + }else { + AutoScrollTextView AutoScrollText = new AutoScrollTextView(context); + setText(components, AutoScrollText); + binding.relativeLayoutMax.addView(AutoScrollText, lParams); + AutoScrollText.setText(components.getMaterials().get(0).getText()); + AutoScrollText.init(components.getWidth()); + AutoScrollText.startScroll(); + +// if(!new File(localPath).exists()){ +// //不存在 +// TextBean textBean = new TextBean(); +// textBean.setText(textMaterials.getText()); +// textBean.setPosition(position); +// textBean.setAutoScrollTextView(AutoScrollText); +// textBean.setWidth(components.getWidth()); +// textList.add(textBean); +// handler.removeMessages(TYPE_UPDATE_TEXT4); +// handler.sendEmptyMessageDelayed(TYPE_UPDATE_TEXT4,5000); +// }else { +// AutoScrollText.setText(FileUtil.loadFromSDFile(localPath)); +// AutoScrollText.init(components.getWidth()); +// AutoScrollText.startScroll(); +// } + + } + } + + /** + * 设置文字 + * */ + public void setText(NewProgramBean.components components, AutoScrollTextView text){ + AutoScrollTextList.add(text); + text.init(components.getWidth()); + text.setTextColor1(components.getConfig().getFontColor()); + if(components.getConfig().getAnimationSpeed().equals("慢")){ + text.setSpeed(1); + }else if(components.getConfig().getAnimationSpeed().equals("中等")){ + text.setSpeed(2); + }else if(components.getConfig().getAnimationSpeed().equals("快")){ + text.setSpeed(3); + }else if(components.getConfig().getAnimationSpeed().equals("很快")){ + text.setSpeed(4); + } + + String backgroundColor = components.getConfig().getBackgroundColor(); + String opacity = (String)colorMap.get(components.getConfig().getBackgroundOpacity()); + if(backgroundColor!=null&&!backgroundColor.isEmpty()){ + backgroundColor="#"+opacity+backgroundColor.substring(1); + text.setBackgroundColor(Color.parseColor(backgroundColor)); + } + text.setTextSize(components.getConfig().getFontSize()); + + if(components.getConfig().getFontStyle().equals("正常")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(components.getConfig().getFontStyle().equals("加粗")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(components.getConfig().getFontStyle().equals("斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(components.getConfig().getFontStyle().equals("加粗、斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + int top=(components.getHeight()-components.getConfig().getFontSize())/2; + text.setPadding(0,top,0,0); + } + + /** + * 设置文字 + * */ + public void setText2(NewProgramBean.components components, MarqueeTextView text){ + MarqueeTextList.add(text); + text.setTextColor(Color.parseColor(components.getConfig().getFontColor())); + String backgroundColor = components.getConfig().getBackgroundColor(); + String opacity = (String)colorMap.get(components.getConfig().getBackgroundOpacity()); + if(backgroundColor!=null&&!backgroundColor.isEmpty()){ + backgroundColor="#"+opacity+backgroundColor.substring(1); + text.setBackgroundColor(Color.parseColor(backgroundColor)); + } + + if(components.getConfig().getFontStyle().equals("正常")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + }else if(components.getConfig().getFontStyle().equals("加粗")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + }else if(components.getConfig().getFontStyle().equals("斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); + }else if(components.getConfig().getFontStyle().equals("加粗、斜体")){ + text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD_ITALIC)); + } + + text.setTextSize(components.getConfig().getFontSize()); + text.setSingleLine(); + if(components.getConfig().getAnimation().equals("自动")){ + text.setMarqueeRepeatLimit(Integer.MAX_VALUE); + text.setFocusable(true); + text.setEllipsize(TextUtils.TruncateAt.MARQUEE); + text.setHorizontallyScrolling(true); + } + text.setHeight(components.getHeight()); + text.setWidth(components.getWidth()); + text.setGravity(Gravity.CENTER_VERTICAL); + } + + /** + * 添加html + * */ + WebView onlineWebView0; + WebView onlineWebView1; + WebView onlineWebView2; + WebView onlineWebView3; + NewProgramBean.components webComponents0; + NewProgramBean.components webComponents1; + NewProgramBean.components webComponents2; + NewProgramBean.components webComponents3; + List webList=new ArrayList(); + public void initOnlineWeb(NewProgramBean.components components,int position){ + if(components==null||components.getMaterials().size()<=0){ + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + if(position==0){ + + onlineWebView0 = new WebView(context); + webList.add(onlineWebView0); + binding.relativeLayoutMax.addView(onlineWebView0, lParams); + setWebView(onlineWebView0,components.getMaterials().get(0).getOuterChain()); + webComponents0 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW0,refreshWebTime); + } + + } else if (position==1){ + + onlineWebView1 = new WebView(context); + webList.add(onlineWebView1); + binding.relativeLayoutMax.addView(onlineWebView1, lParams); + setWebView(onlineWebView1,components.getMaterials().get(0).getOuterChain()); + webComponents1 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW1,refreshWebTime); + } + } else if (position==2){ + + onlineWebView2 = new WebView(context); + webList.add(onlineWebView2); + binding.relativeLayoutMax.addView(onlineWebView2, lParams); + setWebView(onlineWebView2,components.getMaterials().get(0).getOuterChain()); + webComponents2 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW2,refreshWebTime); + } + } else if (position==3){ + + onlineWebView3 = new WebView(context); + webList.add(onlineWebView3); + binding.relativeLayoutMax.addView(onlineWebView3, lParams); + setWebView(onlineWebView3,components.getMaterials().get(0).getOuterChain()); + webComponents3 = components; + int refreshWebTime = getRefreshWebTime(components); + if(refreshWebTime>0){ + handler.sendEmptyMessageDelayed(TYPE_REFRESH_WEBVIEW3,refreshWebTime); + } + } + } + + public int getRefreshWebTime(NewProgramBean.components components){ + String refreshPeriod = components.getConfig().getRefreshPeriod(); + String[] split = refreshPeriod.split(":"); + int time=Integer.parseInt(split[0])*3600*1000+Integer.parseInt(split[1])*60*1000+Integer.parseInt(split[2])*1000; + return time; + } + + public void setWebView(WebView mWebView,String url){ +// mWebView.setBackgroundColor(Color.TRANSPARENT); + mWebView.setHorizontalScrollBarEnabled(false);//水平不显示 + mWebView.setVerticalScrollBarEnabled(false); //垂直不显示 + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 + webSettings.setSupportZoom(true);//调整图片至适合webview的大小 + webSettings.setUseWideViewPort(true);// 缩放至屏幕的大小 + webSettings.setLoadWithOverviewMode(true); + webSettings.setLoadsImagesAutomatically(true); +// webSettings.setAppCacheEnabled(true);//是否使用缓存 + webSettings.setDomStorageEnabled(true);//DOM Storage + webSettings.setDefaultTextEncodingName("utf-8"); + mWebView.setWebViewClient(new WebViewClient()); + mWebView.loadUrl(url); + } + + class MyWebViewClient extends WebViewClient { + + } + /** + * 添加水牌 + * */ + WebView spWebView; + public void intSuipai(NewProgramBean.components components){ + if(components==null||components.getMaterials().size()<=0){ + LoggerUtil.e("intSuipai","水牌暂无内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + //开启本地服务 + if(!Constant.isCoreService){ + context.startService(new Intent(context, CoreService.class)); + } + spWebView = new WebView(context); + webList.add(spWebView); + binding.relativeLayoutMax.addView(spWebView, lParams); + + if(new File(Constant.CACHE_PATH +components.getMaterials().get(0).getFileUrl()).exists()){ + //存在判断dist文件夹是否存在index + String shuipai_version = components.getMaterials().get(0).getFileUrl(); + Log.e("intSuipai","水牌版本:"+shuipai_version); + if(!shuipai_version.equals(DeviceData.getDeviceInfo(DeviceData.SHUIPAI_VERSION)) || !new File(Constant.CACHE_PATH2).exists()){ + LoggerUtil.e("intSuipai","版本号与本地不同,解压水牌zip"); + + if(new File(Constant.CACHE_PATH2).exists()){ + FileUtil.deleteDirectory(Constant.CACHE_PATH2); + } + FileUtil.makeRootDirectory(Constant.CACHE_PATH2); + boolean upZip = FileUtil.upZipFile(Constant.CACHE_PATH + components.getMaterials().get(0).getFileUrl(), Constant.CACHE_PATH2); + LoggerUtil.e("intSuipai","解压水牌zip结果:"+upZip); + if(upZip){ + + DeviceData.saveDeviceInfo(DeviceData.SHUIPAI_VERSION , shuipai_version); + readShuiPaiJson(); + } + }else { + LoggerUtil.e("intSuipai","水牌zip版本与本地相同,直接读取数据"); + readShuiPaiJson(); + } + + handler.sendEmptyMessageDelayed(TYPE_SHUIPAI,5000); + }else { + LoggerUtil.e("intSuipai","水牌zip本地不存在"); + } + } + + /** + * 读取水牌json离线数据 + * */ + int shuipaifacenumb = 0;//接口数量 + int shuipaifacenumb_finish = 0;//接口请求完成 + public void readShuiPaiJson(){ + try { + String url = Constant.CACHE_PATH+"dist/" +"/InterfaceList.json"; + if(!new File(url).exists()){ + LoggerUtil.e("redSuiPaiJson()","不存在水牌离线json"); + return; + } + String s = FileUtil.loadFromSDFile(url); + Log.e("TAG","水牌离线json:"+s); + ShuipaiDataListBean shuipaiDataListBean = GsonUtil.getGson().fromJson(s, new TypeToken() { + }.getType()); + List InterFaceList = shuipaiDataListBean.getData(); + shuipaifacenumb = InterFaceList.size(); + for(InterFaceBean interFacebean: InterFaceList ){ + if(interFacebean.getInterfaceName().equals("GetDevCoordinateByIP")){ + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + } + }else { + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + shuipaifacenumb_finish++; + } + }); + } + } + } + }catch (Throwable t){ + LoggerUtil.e("redShuiPaiJson()", StringUtil.getThrowableStr(t)); + } + } + + /** + * 添加水牌 + * */ + WebView mapWebView; + public void initMap(NewProgramBean.components components){ + if(components==null||components.getMaterials().size()<=0){ + LoggerUtil.e("initMap","地图组件暂无内容"); + return; + } + RelativeLayout.LayoutParams lParams = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + lParams.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); + + //开启本地服务 + if(!Constant.isCoreService){ + context.startService(new Intent(context, CoreService.class)); + } + mapWebView = new WebView(context); + webList.add(mapWebView); + binding.relativeLayoutMax.addView(mapWebView, lParams); + + if(new File(Constant.CACHE_PATH +components.getMaterials().get(0).getFileUrl()).exists()){ + //存在判断dist文件夹是否存在index + String shuipai_version = components.getMaterials().get(0).getFileUrl(); + Log.e("intSuipai","地图版本:"+shuipai_version); + if(!shuipai_version.equals(DeviceData.getDeviceInfo(DeviceData.SHUIPAI_VERSION)) || !new File(Constant.CACHE_PATH2).exists()){ + LoggerUtil.e("intSuipai","版本号与本地不同,解压地图zip"); + + if(new File(Constant.CACHE_PATH2).exists()){ + FileUtil.deleteDirectory(Constant.CACHE_PATH2); + } + FileUtil.makeRootDirectory(Constant.CACHE_PATH2); + boolean upZip = FileUtil.upZipFile(Constant.CACHE_PATH + components.getMaterials().get(0).getFileUrl(), Constant.CACHE_PATH2); + LoggerUtil.e("intSuipai","解压地图zip结果:"+upZip); + if(upZip){ + + DeviceData.saveDeviceInfo(DeviceData.SHUIPAI_VERSION , shuipai_version); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,2000); + } + }else { + LoggerUtil.e("intSuipai","地图zip版本与本地相同,直接读取数据"); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,2000); + } + + + }else { + LoggerUtil.e("intSuipai","地图zip本地不存在"); + } + } + + public void getApiFileResourceList(Context context, String url, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + + AsyncHttpClient client = new AsyncHttpClient(); + + client.get( context, url ,new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + + try { + if (responseBody!=null) { + String response = new String(responseBody).replace("\\\\", "/"); + Log.e("地图组件资源列表数据",response); + MapDataListBean mapDataListBean = GsonUtil.getGson().fromJson(response, new TypeToken() {}.getType()); + + for (ResourceFileBean bean : mapDataListBean.getData()){ + mapFiles.put(bean.getUrl(),bean.getUrl()) ; + } + mapDownloadCount=0; + downloadFiles(); + } + + } catch (Throwable t) { + + + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 开始批量下载图片 + * ishandler 是否需要通知更新 + */ + public void downloadFiles() { + Log.e("TAG","地图文件下载的数量"+mapFiles.size()+",下载地址前缀"+DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP)); + if(mapFiles.size()<=0 ){ + handler.sendEmptyMessageDelayed(TYPE_MAP,5000); + return; + } + for (String bigFile : mapFiles.keySet()) { + + Log.e("TAG",bigFile); + downloadFile(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), bigFile); + } + } + + + private void downloadFile(String imgPath, final String address) { + + File file = new File(StringUtil.strSplice(Constant.CACHE_PATH2, address)); + if (file.exists()) { + mapDownloadCount++ ; + mapDownCount(); + return; + } + + FileUtil.downloadFile2(StringUtil.strSplice(imgPath, address), StringUtil.strSplice(Constant.CACHE_PATH3, address), new QueryFinishListener() { + @Override + public void onFinish() { + mapDownloadCount++ ; + mapDownCount(); + } + }); + } + + /** + * 下载完成度 + * */ + public void mapDownCount(){ + if(mapFiles.size() == mapDownloadCount){ + LoggerUtil.e("mapDownCount()","地图资源下载完成"); + handler.removeMessages(TYPE_MAP); + handler.sendEmptyMessageDelayed(TYPE_MAP,6000); + } + } + + + /** + * 添加天气 + * */ + private WeatherAdapter0 weatherAdapter0; + private WeatherAdapter1 weatherAdapter00; + private RecyclerView recycle_weather0; + NewProgramBean.components weatherComponents0; + + public void initWeather(NewProgramBean.components components , int position){ + //没有城市名不显示天气 + if(components.getConfig().getCityName().isEmpty() && DeviceData.getDevice().getCity()==null){ + return; + } + //设置列表大小 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(components.getOffsetX(), components.getOffsetY(), 0, 0); +// Log.e("TAG","初始化天气"); + List weatherList = new ArrayList<>(); + for(int i=0;i<6;i++){ + weatherList.add(""); + } + LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); + + if(position==0){ + recycle_weather0 = new RecyclerView(context); + binding.relativeLayoutMax.addView(recycle_weather0, params); + + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + recycle_weather0.setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + recycle_weather0.setLayoutManager(layoutManager); + + ViewGroup.LayoutParams layoutParams = recycle_weather0.getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + recycle_weather0.setLayoutParams(layoutParams); + if(components.getConfig().getStyle()==0){ + weatherAdapter0 = new WeatherAdapter0(context,components); + weatherAdapter0.setData(weatherList); + recycle_weather0.setAdapter(weatherAdapter0); + }else { + weatherAdapter00 = new WeatherAdapter1(context,components); + weatherAdapter00.setData(weatherList); + recycle_weather0.setAdapter(weatherAdapter00); + } + } + + if(!components.getConfig().getCityName().isEmpty()){ + getWeather(components.getConfig().getCityName(),null,null); + }else { + getWeather(DeviceData.getDevice().getCity(),null,null); + } + } + + + NewProgramBean.components timeComponents0; + public void initTime(NewProgramBean.components components ,int position){ + timeComponents0=components; + showTimeStyle(components); + handler.sendEmptyMessageDelayed(TYPE_UPDATE_TIME0,10); + } + + /** + * 显示时间风格 + * */ + public void showTimeStyle(NewProgramBean.components components ){ +// Log.e("TAG","显示时间"); + int style = components.getConfig().getStyle(); + int offsetX = components.getOffsetX(); + int offsetY = components.getOffsetY(); + binding.layoutTime0.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime1.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime2.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime3.getRoot().setVisibility(View.INVISIBLE); + binding.layoutTime4.getRoot().setVisibility(View.INVISIBLE); + //得到变换比例 + int width = components.getWidth(); + float proportion = (float)width/(float) 320; + + String fontColor = components.getConfig().getFontColor(); + if(style==0){ + //改变大小 + ViewGroup.LayoutParams layoutParams = binding.layoutTime0.getRoot().getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + binding.layoutTime0.getRoot().setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + + binding.layoutTime0.getRoot().setLayoutParams(layoutParams); + binding.layoutTime0.tvTime0.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime0.tvWeek0.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime0.tvDay0.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime0.tvTime0.setTextSize((int)(proportion*24)); + binding.layoutTime0.tvWeek0.setTextSize((int)(proportion*24)); + binding.layoutTime0.tvDay0.setTextSize((int)(proportion*24)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + binding.layoutTime0.getRoot().setLayoutParams(params); + binding.layoutTime0.getRoot().setVisibility(View.VISIBLE); + }else if(style==1){ + + ViewGroup.LayoutParams layoutParams = binding.layoutTime1.getRoot().getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + binding.layoutTime1.getRoot().setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + binding.layoutTime1.getRoot().setLayoutParams(layoutParams); + binding.layoutTime1.tvTime1.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime1.tvWeek1.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime1.tvDay1.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime1.tvTime1.setTextSize((int)(proportion*24)); + binding.layoutTime1.tvWeek1.setTextSize((int)(proportion*24)); + binding.layoutTime1.tvDay1.setTextSize((int)(proportion*24)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + binding.layoutTime1.getRoot().setLayoutParams(params); + binding.layoutTime1.getRoot().setVisibility(View.VISIBLE); + }else if(style==2){ + ViewGroup.LayoutParams layoutParams = binding.layoutTime2.getRoot().getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + binding.layoutTime2.getRoot().setLayoutParams(layoutParams); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + binding.layoutTime2.getRoot().setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + binding.layoutTime2.tvTime2.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime2.tvWeek2.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime2.tvDay2.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime2.tvTime2.setTextSize((int)(proportion*24)); + binding.layoutTime2.tvWeek2.setTextSize((int)(proportion*18)); + binding.layoutTime2.tvDay2.setTextSize((int)(proportion*18)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + binding.layoutTime2.getRoot().setLayoutParams(params); + binding.layoutTime2.getRoot().setVisibility(View.VISIBLE); + }else if(style==3){ + ViewGroup.LayoutParams layoutParams = binding.layoutTime3.getRoot().getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + binding.layoutTime3.getRoot().setLayoutParams(layoutParams); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + binding.layoutTime3.getRoot().setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + binding.layoutTime3.tvTime3.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime3.tvWeek3.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime3.tvDay3.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime3.tvTime3.setTextSize((int)(proportion*24)); + binding.layoutTime3.tvWeek3.setTextSize((int)(proportion*14)); + binding.layoutTime3.tvDay3.setTextSize((int)(proportion*14)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + binding.layoutTime3.getRoot().setLayoutParams(params); + binding.layoutTime3.getRoot().setVisibility(View.VISIBLE); + }else if(style==4){ + ViewGroup.LayoutParams layoutParams = binding.layoutTime4.getRoot().getLayoutParams(); + layoutParams.height=components.getHeight(); + layoutParams.width=components.getWidth(); + if(components.getConfig().getBackgroundColor()!=null&&!components.getConfig().getBackgroundColor().isEmpty()){ + binding.layoutTime4.getRoot().setBackgroundColor(Color.parseColor(components.getConfig().getBackgroundColor())); + } + binding.layoutTime4.getRoot().setLayoutParams(layoutParams); + binding.layoutTime4.tvTime4.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime4.tvWeek4.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime4.tvDay4.setTextColor(Color.parseColor(fontColor)); + binding.layoutTime4.tvTime4.setTextSize((int)(proportion*36)); + binding.layoutTime4.tvWeek4.setTextSize((int)(proportion*14)); + binding.layoutTime4.tvDay4.setTextSize((int)(proportion*14)); + //改变位置 + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(components.getWidth(), components.getHeight()); + params.setMargins(offsetX,offsetY, 0,0); + binding.layoutTime4.getRoot().setLayoutParams(params); + binding.layoutTime4.getRoot().setVisibility(View.VISIBLE); + } + } + + /** + * 时间更新 + * */ + public void chooseTime(int style){ + long longtime = System.currentTimeMillis(); + String day = TimeUtil.stampToDate(longtime); + String time = TimeUtil.stampTotime(longtime); + String week = TimeUtil.getWeek2(day); + if(style==0){ + binding.layoutTime0.tvTime0.setText(time); + binding.layoutTime0.tvWeek0.setText(week); + binding.layoutTime0.tvDay0.setText(day); + }else if(style==1){ + binding.layoutTime1.tvTime1.setText(time); + binding.layoutTime1.tvWeek1.setText(week); + binding.layoutTime1.tvDay1.setText(day); + }else if(style==2){ + binding.layoutTime2.tvTime2.setText(time); + binding.layoutTime2.tvWeek2.setText(week); + binding.layoutTime2.tvDay2.setText(day); + }else if(style==3){ + binding.layoutTime3.tvTime3.setText(time); + binding.layoutTime3.tvWeek3.setText(week); + binding.layoutTime3.tvDay3.setText(day); + }else if(style==4){ + binding.layoutTime4.tvTime4.setText(time); + binding.layoutTime4.tvWeek4.setText(week); + binding.layoutTime4.tvDay4.setText(day); + } + } + + /** + * 获取天气 + * */ + public void getWeather(String city, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getBaseService().getWeather(city).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + + WeatherBean weatherbean = new Gson().fromJson(new Gson().toJson(response.body().getData()), new TypeToken() { + }.getType()); + + if(weatherAdapter0!=null){ + List weatherList = new ArrayList<>(); + weatherList.add(""+weatherbean.getTemperatureNow()); + weatherList.add(weatherbean.getHumidity().substring(0,weatherbean.getHumidity().length()-1)); + weatherList.add(weatherbean.getWindPower()); + weatherList.add(weatherbean.getAqi()+""); + weatherList.add(weatherbean.getPm()+""); + weatherList.add(weatherbean.getWeather()); + weatherAdapter0.setData(weatherList); + } + + if(weatherAdapter00!=null){ + List weatherList = new ArrayList<>(); + weatherList.add(""+weatherbean.getTemperatureNow()); + weatherList.add(weatherbean.getHumidity().substring(0,weatherbean.getHumidity().length()-1)); + weatherList.add(weatherbean.getWindPower()); + weatherList.add(weatherbean.getAqi()+""); + weatherList.add(weatherbean.getPm()+""); + weatherList.add(weatherbean.getWeather()); + weatherAdapter00.setData(weatherList); + + } + + } catch (Throwable t) { + LoggerUtil.e("getWeather()", StringUtil.getThrowableStr(t)); + } + //一小时更新一次天气 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_WEATHER0,3600*1000); + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("getWeather()", StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + //一小时更新一次天气 + handler.sendEmptyMessageDelayed(TYPE_UPDATE_WEATHER0,3600*1000); + + } + }); + } + + /** + * 修改成默认背景图 + * */ + public void changeOldBackground(){ + try { + binding.backgroundImage.setBackgroundColor(Color.TRANSPARENT); + binding.backgroundImage.setImageBitmap(null); + }catch (Exception e){ + LoggerUtil.e("修改成默认背景图",e.getMessage()); + } + } + + /** + * 图片移动动画 + * */ + public void imgAnimation(View view, int fromX ,int toX,int fromY,int toY){ + Animation translateAnimation = new TranslateAnimation(fromX, toX, fromY, toY);//设置平移的起点和终点 + translateAnimation.setDuration(1000);//动画持续的时间为10s + view.startAnimation(translateAnimation); + } + + +} diff --git a/app/src/main/java/qianmu/container/activity/program/ViewSubtitle.java b/app/src/main/java/qianmu/container/activity/program/ViewSubtitle.java new file mode 100644 index 0000000..7885824 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ViewSubtitle.java @@ -0,0 +1,40 @@ +package qianmu.container.activity.program; + +import android.content.Context; +import android.view.View; + +import qianmu.container.activity.ViewBase; +import qianmu.container.databinding.ViewSubtitleBinding; + +public class ViewSubtitle extends ViewBase { + + ViewSubtitle(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + } + + @Override + protected void setData() { + + } + + @Override + protected void setListener() { + + } + + + public void showSubtitle() { + if (binding.getRoot().getVisibility() == View.VISIBLE) return; + binding.getRoot().setVisibility(View.VISIBLE); + } + + + public void hideSubtitle() { + binding.getRoot().setVisibility(View.INVISIBLE); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/program/ViewTest.java b/app/src/main/java/qianmu/container/activity/program/ViewTest.java new file mode 100644 index 0000000..1721396 --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ViewTest.java @@ -0,0 +1,68 @@ +package qianmu.container.activity.program; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.view.View; + +import androidx.annotation.NonNull; + +import qianmu.container.activity.ViewBase; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.databinding.ViewTestBinding; +import qianmu.container.socket.manager.LocSocCliManager; +import qianmu.container.socket.manager.SocketServerManager; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.StringUtil; + +@SuppressWarnings("All") +public class ViewTest extends ViewBase { + + private static final int UPDATE_STATE = 0; + + Handler handler = new Handler() { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if (msg.what == UPDATE_STATE) { + updateState(); + sendEmptyMessageDelayed(UPDATE_STATE, 1000); + } + } + }; + + public ViewTest(Context context, View view) { + super(context, view); + } + + private void updateState() { + binding.serverState.setText(Constant.isMain ? "服务端状态:已连接" : "服务端状态:已断开"); + binding.serverIp.setText(StringUtil.strSplice("服务端地址:", DeviceData.getDeviceInfo(DeviceData.HINT_MAIN_DEVICE_IP))); + binding.clientQuantity.setText(StringUtil.strSplice("客户端数量:", SocketServerManager.getClientQuantity())); + binding.clientState.setText(Constant.isSecondary ? "客户端状态:已连接" : "客户端状态:已断开"); + binding.deviceIp.setText(StringUtil.strSplice("设备IP地址:", DeviceUtil.getLocalIP())); + String lastheartBeatTime; + if (LocSocCliManager.heartBeatResult == 0) { + lastheartBeatTime = "最近心跳时间:无"; + } else { + String time = MyApplication.getInstance().dateTimeFormat.format(LocSocCliManager.heartBeatResult); + lastheartBeatTime = StringUtil.strSplice("最近心跳时间:", time); + } + binding.heartBeatTime.setText(lastheartBeatTime); + } + + public void showViewTest() { + if (binding.getRoot().getVisibility() == View.VISIBLE) return; + binding.getRoot().setVisibility(View.VISIBLE); + if (handler != null) handler.sendEmptyMessageDelayed(UPDATE_STATE, 1000); + } + + public void hideViewTest() { + binding.getRoot().setVisibility(View.INVISIBLE); + if (handler == null) return; + handler.removeMessages(UPDATE_STATE); + } + +} diff --git a/app/src/main/java/qianmu/container/activity/program/ViewTouch.java b/app/src/main/java/qianmu/container/activity/program/ViewTouch.java new file mode 100644 index 0000000..e6c21df --- /dev/null +++ b/app/src/main/java/qianmu/container/activity/program/ViewTouch.java @@ -0,0 +1,398 @@ +package qianmu.container.activity.program; + +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.app.Activity; +import android.content.Context; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; +import android.widget.RelativeLayout; + +import java.io.File; + +import qianmu.container.R; +import qianmu.container.activity.ViewBase; +import qianmu.container.app.Constant; +import qianmu.container.data.AppData; +import qianmu.container.data.DeviceData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.databinding.ViewTouchBinding; +import qianmu.container.entity.App; +import qianmu.container.entity.ScreenSaverTime; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +@SuppressWarnings("All") +public class ViewTouch extends ViewBase { + + //所在屏幕边界位置:NAN:无, LEFT:左, TOP:上, RIGHT:右, BOTTOM:下 + enum Location {NAN, LEFT, TOP, RIGHT, BOTTOM} + + static final float speed = 10f; //速度 + float angle; //角度 + int viewWidth; //控件宽度 + int viewHeight; //控件高度 + int windowWidth; //屏幕宽度 + int windowHeight; //屏幕高度 + float currentX; //控件x值 + float currentY; //控件y值 + Location currentLocation; //当前所在边界 + boolean isCancel; + boolean isImag;//是否为图片 + ObjectAnimator animator; + AnimatorSet animatorSet; //组合动画 + + //更新touch图片 + + ViewTouch(Context context, View view) { + super(context, view); + } + + @Override + protected void initView() { + int width = DeviceUtil.screenWidth((Activity) context); + int height = DeviceUtil.screenHeight((Activity) context); + } + + @Override + protected void setListener() { + + } + + //显示touchme + public void showTouch() { + //不是触摸屏 不显示touch +// binding.touch.setBackgroundDrawable(null); + ScreenSaverTime screenSaverTime = ScreenSaverData.getScreenSaver(); + if (screenSaverTime == null) return; + if(screenSaverTime.getType()<5)return; + if(screenSaverTime.getType()>10 && screenSaverTime.getCustomUrl()!=null && !screenSaverTime.getCustomUrl().endsWith("json")){ + //图片 + isImag=true; + binding.touch.setVisibility(View.VISIBLE); + binding.lottie.setVisibility(View.GONE); + binding.touch.setBackgroundDrawable(null); + if(Constant.isScreen4K){ + ViewGroup.LayoutParams layoutParams = binding.touch.getLayoutParams(); + layoutParams.width = 600; + layoutParams.height = 600; + } + }else { + isImag=false; + if(Constant.isScreen4K){ + ViewGroup.LayoutParams layoutParams = binding.lottie.getLayoutParams(); + layoutParams.width = 600; + layoutParams.height = 600; + } + } + updateTouchUI(screenSaverTime.getType(),screenSaverTime.getCustomUrl()); + updateTouchLocation(screenSaverTime.getProtectionEffect(), screenSaverTime.getProtectionLocation()); + } + + //隐藏touchme + public void hideTouch() { + if (animator != null){ + animator.cancel(); + animator = null; + } + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } + if (binding.lottie.isAnimating()){ + binding.lottie.cancelAnimation(); + binding.lottie.destroyDrawingCache(); + } + binding.lottie.setVisibility(View.INVISIBLE); + binding.touch.setVisibility(View.INVISIBLE); + } + + //更新touch图片 + private void updateTouchUI(int screenType,String url) { + if(screenType==5){ + binding.lottie.setAnimation("touch01.json"); + binding.lottie.playAnimation(); + }else if(screenType==6){ + binding.lottie.setAnimation("touch02.json"); + binding.lottie.playAnimation(); + }else if(screenType==7){ + binding.lottie.setAnimation("touch03.json"); + binding.lottie.playAnimation(); + }else if(screenType==8){ + binding.lottie.setAnimation("touch04.json"); + binding.lottie.playAnimation(); + }else if(screenType==9){ + binding.lottie.setAnimation("touch05.json"); + binding.lottie.playAnimation(); + }else if(screenType==10){ + binding.lottie.setAnimation("touch06.json"); + binding.lottie.playAnimation(); + }else if(screenType>10){ + //自定义touch + String localPath2 = StringUtil.strSplice(Constant.CACHE_PATH, url); + if(url.endsWith("json")&&new File(localPath2).exists()){ + //lotte + String fileUrl= FileUtil.readLocalJsonForStorage(context,localPath2); + binding.lottie.setAnimationFromJson(fileUrl); + binding.lottie.loop(true); + binding.lottie.playAnimation(); + }else if(url.endsWith("json")&&!new File(localPath2).exists()){ + //lotte本地不存在 + FileUtil.downloadFile(StringUtil.strSplice(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), url), localPath2, new QueryFinishListener() { + @Override + public void onFinish() { + String fileUrl= FileUtil.readLocalJsonForStorage(context,localPath2); + binding.lottie.setAnimationFromJson(fileUrl); + binding.lottie.loop(true); + binding.lottie.playAnimation(); + } + }); + }else { + //图片 + BitmapUtil.loadImage(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP), Constant.CACHE_PATH, url, binding.touch); + } + + } + } + + // + private void updateTouchLocation(int screenEffect, int effectType) { + if (animator != null) animator.cancel(); + if (animatorSet != null) animatorSet.cancel(); + RelativeLayout.LayoutParams layoutParams; + if(isImag){ + layoutParams = (RelativeLayout.LayoutParams) binding.touch.getLayoutParams(); + }else { + layoutParams = (RelativeLayout.LayoutParams) binding.lottie.getLayoutParams(); + } + if (layoutParams == null) + if(Constant.isScreen4K){ + layoutParams = new RelativeLayout.LayoutParams(context.getResources().getDimensionPixelSize(R.dimen.dimens_600), context.getResources().getDimensionPixelSize(R.dimen.dimens_600)); + }else { + layoutParams = new RelativeLayout.LayoutParams(context.getResources().getDimensionPixelSize(R.dimen.dimens_300), context.getResources().getDimensionPixelSize(R.dimen.dimens_300)); + } + if (screenEffect == 0) {//固定位置 + if (effectType == 0) {//右下角显示 + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END); + if(isImag){ + binding.touch.setLayoutParams(layoutParams); + }else { + binding.lottie.setLayoutParams(layoutParams); + } + + } else if (effectType == 1) {//居中显示 + layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); + if(isImag){ + binding.touch.setLayoutParams(layoutParams); + }else { + binding.lottie.setLayoutParams(layoutParams); + } + + } + } else if (screenEffect == 1) {//自由运动 + if (effectType == 2) {//左右移动 + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); + layoutParams.addRule(RelativeLayout.CENTER_VERTICAL); + if(isImag){ + binding.touch.setLayoutParams(layoutParams); + if(Constant.isScreen4K){ + animator = ObjectAnimator.ofFloat(binding.touch, "translationX", context.getResources().getDimensionPixelSize(R.dimen.dimens__0), DeviceUtil.screenWidth((Activity) context) - context.getResources().getDimensionPixelSize(R.dimen.dimens_600), context.getResources().getDimensionPixelSize(R.dimen.dimens__0)); + }else { + animator = ObjectAnimator.ofFloat(binding.touch, "translationX", context.getResources().getDimensionPixelSize(R.dimen.dimens__0), DeviceUtil.screenWidth((Activity) context) - context.getResources().getDimensionPixelSize(R.dimen.dimens_300), context.getResources().getDimensionPixelSize(R.dimen.dimens__0)); + } + }else { + binding.lottie.setLayoutParams(layoutParams); + if(Constant.isScreen4K){ + animator = ObjectAnimator.ofFloat(binding.lottie, "translationX", context.getResources().getDimensionPixelSize(R.dimen.dimens__0), DeviceUtil.screenWidth((Activity) context) - context.getResources().getDimensionPixelSize(R.dimen.dimens_600), context.getResources().getDimensionPixelSize(R.dimen.dimens__0)); + }else { + animator = ObjectAnimator.ofFloat(binding.lottie, "translationX", context.getResources().getDimensionPixelSize(R.dimen.dimens__0), DeviceUtil.screenWidth((Activity) context) - context.getResources().getDimensionPixelSize(R.dimen.dimens_300), context.getResources().getDimensionPixelSize(R.dimen.dimens__0)); + } + } + animator.setDuration(10000); + animator.setRepeatMode(ValueAnimator.RESTART); + animator.setInterpolator(new LinearInterpolator()); + animator.setRepeatCount(-1); + animator.start(); + } else if (effectType == 3) {//随机移动 + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START); + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); + if(isImag){ + binding.touch.setLayoutParams(layoutParams); + }else { + binding.lottie.setLayoutParams(layoutParams); + } + DefaultLocation(); + initEndPoint(); + } + } + } + + private void DefaultLocation() { + //屏幕宽高 + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + windowWidth = dm.widthPixels; + windowHeight = dm.heightPixels; + //控件宽高 + if(Constant.isScreen4K){ + viewWidth = context.getResources().getDimensionPixelSize(R.dimen.dimens_600); + viewHeight = context.getResources().getDimensionPixelSize(R.dimen.dimens_600); + }else { + viewWidth = context.getResources().getDimensionPixelSize(R.dimen.dimens_300); + viewHeight = context.getResources().getDimensionPixelSize(R.dimen.dimens_300); + } + currentLocation = Location.NAN; //当前所在边界 + angle = 110f; //角度 + currentX = 0f; //控件x值 + currentY = 0f; //控件y值 + } + + private void initEndPoint() { + RelativeLayout.LayoutParams layoutParams; + if(isImag){ + layoutParams = (RelativeLayout.LayoutParams) binding.touch.getLayoutParams(); + }else { + layoutParams = (RelativeLayout.LayoutParams) binding.lottie.getLayoutParams(); + } + + if (layoutParams == null) + layoutParams = new RelativeLayout.LayoutParams(viewWidth, viewHeight); + layoutParams.topMargin = (int) currentY; + layoutParams.leftMargin = (int) currentX; + binding.lottie.setLayoutParams(layoutParams); + + angle = 180 - angle; + + double rightY = currentY - Math.tan(Math.toRadians(angle)) * (currentX - windowWidth + viewWidth); + double bottomX = currentX - (currentY - windowHeight + viewHeight) / Math.tan(Math.toRadians(angle)); + double topX = currentX - currentY / Math.tan(Math.toRadians(angle)); + double leftY = currentY - Math.tan(Math.toRadians(angle)) * (currentX); + + switch (currentLocation) { + case LEFT: + if (rightY < windowHeight - viewHeight && rightY > 0) { + currentLocation = Location.RIGHT; + anim(windowWidth - viewWidth - currentX, (float) (rightY - currentY)); + } else if (bottomX < windowWidth - viewWidth && bottomX > 0) { + currentLocation = Location.BOTTOM; + anim((float) (bottomX - currentX), windowHeight - viewHeight - currentY); + } else if (topX < windowWidth - viewWidth && topX > 0) { + currentLocation = Location.TOP; + anim((float) (topX - currentX), -currentY); + } + break; + + case TOP: + if (rightY < windowHeight - viewHeight && rightY > 0) { + currentLocation = Location.RIGHT; + anim(windowWidth - viewWidth - currentX, (float) (rightY - currentY)); + } else if (bottomX < windowWidth - viewWidth && bottomX > 0) { + currentLocation = Location.BOTTOM; + anim((float) (bottomX - currentX), windowHeight - viewHeight - currentY); + } else if (leftY < windowHeight - viewHeight && leftY > 0) { + currentLocation = Location.LEFT; + anim(-currentX, (float) (leftY - currentY)); + } + break; + + case RIGHT: + if (bottomX < windowWidth - viewWidth && bottomX > 0) { + currentLocation = Location.BOTTOM; + anim((float) (bottomX - currentX), windowHeight - viewHeight - currentY); + } else if (topX < windowWidth - viewWidth && topX > 0) { + currentLocation = Location.TOP; + anim((float) (topX - currentX), -currentY); + } else if (leftY < windowHeight - viewHeight && leftY > 0) { + currentLocation = Location.LEFT; + anim(-currentX, (float) (leftY - currentY)); + } + break; + + case BOTTOM: + if (rightY < windowHeight - viewHeight && rightY > 0) { + currentLocation = Location.RIGHT; + anim(windowWidth - viewWidth - currentX, (float) (rightY - currentY)); + } else if (topX < windowWidth - viewWidth && topX > 0) { + currentLocation = Location.TOP; + anim((float) (topX - currentX), -currentY); + } else if (leftY < windowHeight - viewHeight && leftY > 0) { + currentLocation = Location.LEFT; + anim(-currentX, (float) (leftY - currentY)); + } + break; + + case NAN: + if (rightY < windowHeight - viewHeight && rightY > 0) { + currentLocation = Location.RIGHT; + anim(windowWidth - viewWidth - currentX, (float) (rightY - currentY)); + } else if (bottomX < windowWidth - viewWidth && bottomX > 0) { + currentLocation = Location.BOTTOM; + anim((float) (bottomX - currentX), windowHeight - viewHeight - currentY); + } else if (topX < windowWidth - viewWidth && topX > 0) { + currentLocation = Location.TOP; + anim((float) (topX - currentX), -currentY); + } else if (leftY < windowHeight - viewHeight && leftY > 0) { + currentLocation = Location.LEFT; + anim(-currentX, (float) (leftY - currentY)); + } + break; + } + } + + //直线平移动画 + private void anim(final float x, final float y) { + ObjectAnimator translationX; + ObjectAnimator translationY; + if(isImag){ + translationX = new ObjectAnimator().ofFloat(binding.touch, "translationX", 0, x); + translationY = new ObjectAnimator().ofFloat(binding.touch, "translationY", 0, y); + }else { + translationX = new ObjectAnimator().ofFloat(binding.lottie, "translationX", 0, x); + translationY = new ObjectAnimator().ofFloat(binding.lottie, "translationY", 0, y); + } + + animatorSet = new AnimatorSet(); //组合动画 + animatorSet.setInterpolator(new LinearInterpolator()); + animatorSet.playTogether(translationX, translationY); //设置动画 + animatorSet.setDuration((long) (Math.sqrt(x * x + y * y) * 100 / speed)); //设置动画时间 + animatorSet.start(); + animatorSet.addListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + if (isCancel) { + isCancel = false; + return; + } + currentX = x + currentX; + currentY = y + currentY; + initEndPoint(); + + } + + @Override + public void onAnimationCancel(Animator animation) { + isCancel = true; + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }); + } + +} diff --git a/app/src/main/java/qianmu/container/adapter/BuildingAdapter.java b/app/src/main/java/qianmu/container/adapter/BuildingAdapter.java new file mode 100644 index 0000000..c1c339f --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/BuildingAdapter.java @@ -0,0 +1,46 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import qianmu.container.R; +import qianmu.container.entity.Building; +import qianmu.container.util.StringUtil; + + +/** + * Created by Administrator on 2018/4/9. + */ + +public class BuildingAdapter extends MyBaseAdapter { + /** + * 初始化adapter时初始化数据 防止空指针异常 + * + * @param context + */ + public BuildingAdapter(Context context) { + super(context); + } + + @Override + public View HasDataView(int position, View convertView, ViewGroup parent) { + + if (null == convertView) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_text_common, parent, false); + } + + TextView buildingNameTV = getAdapterView(convertView, R.id.tv_content); + + Building building = getData().get(position); + + if (building != null) { + String buildingNameStr = StringUtil.getString(building.getName()); + buildingNameTV.setText(buildingNameStr); + } + + return convertView; + } +} diff --git a/app/src/main/java/qianmu/container/adapter/ContainerTypeAdapter.java b/app/src/main/java/qianmu/container/adapter/ContainerTypeAdapter.java new file mode 100644 index 0000000..7ea6124 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/ContainerTypeAdapter.java @@ -0,0 +1,38 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import qianmu.container.R; +import qianmu.container.entity.Building; +import qianmu.container.util.StringUtil; + + +/** + * Created by Administrator on 2018/4/9. + */ + +public class ContainerTypeAdapter extends MyBaseAdapter { + /** + * 初始化adapter时初始化数据 防止空指针异常 + * + * @param context + */ + public ContainerTypeAdapter(Context context) { + super(context); + } + + @Override + public View HasDataView(int position, View convertView, ViewGroup parent) { + + if (null == convertView) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_text_common, parent, false); + } + TextView containerTypeTV = getAdapterView(convertView, R.id.tv_content); + containerTypeTV.setText(StringUtil.getString(getData().get(position))); + return convertView; + } +} diff --git a/app/src/main/java/qianmu/container/adapter/DeviceNameAdapter.java b/app/src/main/java/qianmu/container/adapter/DeviceNameAdapter.java new file mode 100644 index 0000000..50b9e15 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/DeviceNameAdapter.java @@ -0,0 +1,44 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import qianmu.container.R; +import qianmu.container.entity.Building; +import qianmu.container.util.StringUtil; + + +/** + * 设备选择 + */ +public class DeviceNameAdapter extends MyBaseAdapter { + /** + * 初始化adapter时初始化数据 防止空指针异常 + * + * @param context + */ + public DeviceNameAdapter(Context context) { + super(context); + } + + @Override + public View HasDataView(int position, View convertView, ViewGroup parent) { + + if (null == convertView) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_text_common, parent, false); + } + + TextView floorNameTV = getAdapterView(convertView, R.id.tv_content); + + Building.Machine machine = getData().get(position); + + if (machine != null) { + String floorNameStr = StringUtil.getString(machine.getName()); + floorNameTV.setText(floorNameStr); + } + return convertView; + } +} diff --git a/app/src/main/java/qianmu/container/adapter/DeviceTypeAdapter.java b/app/src/main/java/qianmu/container/adapter/DeviceTypeAdapter.java new file mode 100644 index 0000000..d317602 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/DeviceTypeAdapter.java @@ -0,0 +1,37 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import qianmu.container.R; +import qianmu.container.entity.Dict; +import qianmu.container.util.StringUtil; + +public class DeviceTypeAdapter extends MyBaseAdapter { + + public DeviceTypeAdapter(Context context) { + super(context); + } + + @Override + public View HasDataView(int position, View convertView, ViewGroup parent) { + + if (null == convertView) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_text_common, parent, false); + } + + TextView dictTV = getAdapterView(convertView, R.id.tv_content); + + Dict dict = getData().get(position); + + if (dict != null) { + String dictValueStr = StringUtil.getString(dict.getDictValue()); + dictTV.setText(dictValueStr); + } + + return convertView; + } +} diff --git a/app/src/main/java/qianmu/container/adapter/FloorAdapter.java b/app/src/main/java/qianmu/container/adapter/FloorAdapter.java new file mode 100644 index 0000000..4606dd6 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/FloorAdapter.java @@ -0,0 +1,44 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import qianmu.container.R; +import qianmu.container.entity.Building; +import qianmu.container.util.StringUtil; + + +/** + * Created by Administrator on 2018/4/9. + */ +public class FloorAdapter extends MyBaseAdapter { + /** + * 初始化adapter时初始化数据 防止空指针异常 + * + * @param context + */ + public FloorAdapter(Context context) { + super(context); + } + + @Override + public View HasDataView(int position, View convertView, ViewGroup parent) { + + if (null == convertView) { + convertView = LayoutInflater.from(mContext).inflate(R.layout.item_text_common, parent, false); + } + + TextView floorNameTV = getAdapterView(convertView, R.id.tv_content); + + Building.Floor floor = getData().get(position); + + if (floor != null) { + String floorNameStr = StringUtil.getString(floor.getName()); + floorNameTV.setText(floorNameStr); + } + return convertView; + } +} diff --git a/app/src/main/java/qianmu/container/adapter/KeyAdapter.java b/app/src/main/java/qianmu/container/adapter/KeyAdapter.java new file mode 100644 index 0000000..4cab298 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/KeyAdapter.java @@ -0,0 +1,115 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import androidx.recyclerview.widget.RecyclerView; + +import qianmu.container.R; + + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2019/6/11 + * Time: 13:32 + * + * 键盘 + */ +public class KeyAdapter extends RecyclerView.Adapter { + + String[] keylist= {"1","2","3","4","5","6","7","8","9","0","删除","清空","取消","确定"}; + private Context context; + private int selected = 0; + + private OnitemClick onitemClick; //定义点击事件接口 + + + + public KeyAdapter(Context context) { + this.context = context; + } + + //定义设置点击事件监听的方法 + public void setOnitemClickLintener (OnitemClick onitemClick) { + this.onitemClick = onitemClick; + } + + //定义一个点击事件的接口 + public interface OnitemClick { + void onItemClick(String position); + } + + public void resetSelected() { + selected = 0; + } + public void setSelected(int floor) { + selected = floor; + notifyDataSetChanged(); + } + + + public void setData(String data){ + + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.key_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder( final ViewHolder holder, final int position) { + + holder.bt.setText(keylist[position]); + + holder.bt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onitemClick.onItemClick(keylist[position]); + + } + }); + if(selected==140){ + if(position==0){ + holder.bt.requestFocus(); + selected=position; + } + } + holder.bt.setOnFocusChangeListener(new View.OnFocusChangeListener() { + + public void onFocusChange(View v, boolean hasFocus) { + + if (hasFocus) { + holder.bt.setBackgroundResource(R.drawable.shape_key2); + + }else { + holder.bt.setBackgroundResource(R.drawable.bt_keyboard); + + } + } + + }); + + } + + @Override + public int getItemCount() { + return keylist.length; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + private Button bt; + + public ViewHolder(View itemView) { + super(itemView); + bt = itemView.findViewById(R.id.bt); + } + } + +} diff --git a/app/src/main/java/qianmu/container/adapter/MyBaseAdapter.java b/app/src/main/java/qianmu/container/adapter/MyBaseAdapter.java new file mode 100644 index 0000000..839b939 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/MyBaseAdapter.java @@ -0,0 +1,117 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 适配器基类 + * Created by genglaixin on 16/9/13. + */ +public abstract class MyBaseAdapter extends BaseAdapter { + + protected Context mContext; + protected List mData = new ArrayList<>(); + /** + * 选中项位置 + */ + public int selected = -1; + + /** + * 初始化adapter时初始化数据 防止空指针异常 + * + * @param context + */ + public MyBaseAdapter(Context context) { + mContext = context; + } + + /** + * 设置显示数据 + * + * @param data + */ + public void setData(List data) { + if (data == null) return; + mData = data; + } + + /** + * 输出显示数据 + * + * @return + */ + public List getData() { + return mData; + } + + /** + * 数据长度大于零时返回真实长度 + * + * @return + */ + @Override + public int getCount() { + return mData.size(); + } + + @Override + public Object getItem(int position) { + return mData.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return HasDataView(position, convertView, parent); + } + + + /** + * 有数据时显示的视图 + * + * @param position + * @param convertView + * @param parent + * @return + */ + public abstract View HasDataView(int position, View convertView, ViewGroup parent); + + /** + * ListView使用ViewHolder极简写法 + * + * @param convertView + * @param id + * @param + * @return + */ + public static T getAdapterView(View convertView, int id) { + + + //获取视图中的viewholder + SparseArray viewHolder = (SparseArray) convertView.getTag(); + //如果为null 创建viewholder并存入视图 + if (null == viewHolder) { + viewHolder = new SparseArray<>(); + convertView.setTag(viewHolder); + } + //获取viewholder中的控件 + View childView = viewHolder.get(id); + //如果为null 查找到控件并存入viewholder + if (null == childView) { + childView = convertView.findViewById(id); + viewHolder.put(id, childView); + } + return (T) childView; + } + +} diff --git a/app/src/main/java/qianmu/container/adapter/WeatherAdapter0.java b/app/src/main/java/qianmu/container/adapter/WeatherAdapter0.java new file mode 100644 index 0000000..0c5cee9 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/WeatherAdapter0.java @@ -0,0 +1,184 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import qianmu.container.R; +import qianmu.container.entity.NewProgramBean; + + +/** + * + */ +public class WeatherAdapter0 extends RecyclerView.Adapter { + + private Context context; + List data = new ArrayList<>(); + private NewProgramBean.components components; + public WeatherAdapter0(Context context, NewProgramBean.components components) { + this.context = context; + this.components =components; + } + + public void setData(List data) { + if (data != null) this.data = data; + notifyDataSetChanged(); + } + + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.weather_item0, parent, false); + + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { + //整体item大小 + ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); + float proportion = (float)components.getWidth()/(float)500; + layoutParams.width = (int)(proportion*100); + layoutParams.height = (int)(proportion*80); + //前面图标大小 + ViewGroup.LayoutParams logParams = holder.img_logo.getLayoutParams(); + logParams.height= (int)(proportion*22); + logParams.width= (int)(proportion*22); + //后面图标大小 + ViewGroup.LayoutParams afterParams = holder.img_after.getLayoutParams(); + afterParams.height= (int)(proportion*15); + afterParams.width= (int)(proportion*15); + + //设置字体颜色 + String fontColor = components.getConfig().getFontColor(); + holder.tv_num0.setTextColor(Color.parseColor(fontColor)); + holder.tv_num0.setTextSize((int)(proportion*24)); + holder.tv_num0.setText(data.get(position)); + + int color = Color.parseColor(fontColor); + int r = Color.red(color); + int g = Color.green(color); + int b = Color.blue(color); + int a = Color.alpha(color); + + if(position==0){ + ViewGroup.LayoutParams afterParams1 = holder.img_after.getLayoutParams(); + afterParams1.height= (int)(proportion*15); + afterParams1.width= (int)(proportion*10); + String weather = data.get(5); + if(weather.contains("晴")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_sum); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("阴")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_yin); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("云")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_cloud); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("雨")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_rian); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("雪")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_snow); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else { + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_sum); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + } + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_weather); + holder.img_after.setImageBitmap(bitmap1); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==1){ + ViewGroup.LayoutParams afterParams2 = holder.img_after.getLayoutParams(); + afterParams2.height= (int)(proportion*15); + afterParams2.width= (int)(proportion*12); + + Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_humidity); + holder.img_logo.setImageBitmap(bitmap); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_hum); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==2){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_fen); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.GONE); + if(data.get(position).contains("转")){ + String[] result = data.get(position).split("转"); + holder.tv_num0.setText( result[0]); + } + + }else if(position==3){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_aqi); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_aqi); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==4){ + + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_pm25); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_pm25); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + } + } + + @Override + public int getItemCount() { + return 5; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + ImageView img_logo; + TextView tv_num0; + ImageView img_after; + public ViewHolder(View itemView) { + super(itemView); + img_logo = itemView.findViewById(R.id.img_logo); + tv_num0 = itemView.findViewById(R.id.tv_num0); + img_after = itemView.findViewById(R.id.img_after); + + } + } + + OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener listener) { + onItemClickListener = listener; + } + + public interface OnItemClickListener { + void onItemClick(String onlineGoods); + + } +} diff --git a/app/src/main/java/qianmu/container/adapter/WeatherAdapter1.java b/app/src/main/java/qianmu/container/adapter/WeatherAdapter1.java new file mode 100644 index 0000000..6a37ff6 --- /dev/null +++ b/app/src/main/java/qianmu/container/adapter/WeatherAdapter1.java @@ -0,0 +1,189 @@ +package qianmu.container.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import qianmu.container.R; +import qianmu.container.entity.NewProgramBean; + + +/** + * + */ +public class WeatherAdapter1 extends RecyclerView.Adapter { + + private Context context; + List data = new ArrayList<>(); + NewProgramBean.components components; + public WeatherAdapter1(Context context, NewProgramBean.components components) { + this.context = context; + this.components=components; + } + + public void setData(List data) { + if (data != null) this.data = data; + notifyDataSetChanged(); + } + + public void addData(List data) { + if (data != null) this.data.addAll(data); + } + + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.weather_item1, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { + //整体item大小 + ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); + float proportion = (float)components.getWidth()/(float)500; + layoutParams.width = (int)(proportion*100); + layoutParams.height = (int)(proportion*100); + //前面图标大小 + ViewGroup.LayoutParams logParams = holder.img_logo.getLayoutParams(); + logParams.height= (int)(proportion*22); + logParams.width= (int)(proportion*22); + //后面图标大小 + ViewGroup.LayoutParams afterParams = holder.img_after.getLayoutParams(); + afterParams.height= (int)(proportion*15); + afterParams.width= (int)(proportion*15); + + //设置字体颜色 + String fontColor = components.getConfig().getFontColor(); + holder.tv_num0.setTextColor(Color.parseColor(fontColor)); + holder.tv_num0.setTextSize((int)(proportion*24)); + holder.tv_num0.setText(data.get(position)); + + int color = Color.parseColor(fontColor); + int r = Color.red(color); + int g = Color.green(color); + int b = Color.blue(color); + int a = Color.alpha(color); + + Log.e("TAG","R:"+r+",g:"+g+",b:"+b+",a:"+a); + if(position==0){ + ViewGroup.LayoutParams afterParams1 = holder.img_after.getLayoutParams(); + afterParams1.height= (int)(proportion*15); + afterParams1.width= (int)(proportion*10); + String weather = data.get(5); + if(weather.contains("晴")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_sum); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("阴")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_yin); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("云")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_cloud); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("雨")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_rian); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else if(weather.contains("雪")){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_snow); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + }else { + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_sum); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + } + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_weather); + holder.img_after.setImageBitmap(bitmap1); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==1){ + ViewGroup.LayoutParams afterParams2 = holder.img_after.getLayoutParams(); + afterParams2.height= (int)(proportion*15); + afterParams2.width= (int)(proportion*12); + + Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_humidity); + holder.img_logo.setImageBitmap(bitmap); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_hum); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==2){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_fen); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.GONE); + if(data.get(position).contains("转")){ + String[] result = data.get(position).split("转"); + holder.tv_num0.setText( result[0]); + } + + }else if(position==3){ + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_aqi); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_aqi); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + + }else if(position==4){ + + Bitmap bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_pm25); + Bitmap bitmap2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.weather_after_pm25); + holder.img_logo.setImageBitmap(bitmap1); + holder.img_logo.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setImageBitmap(bitmap2); + holder.img_after.setColorFilter(Color.argb(255,r,g,b)); + holder.img_after.setVisibility(View.VISIBLE); + } + } + + @Override + public int getItemCount() { + return 5; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + + ImageView img_logo; + TextView tv_num0; + ImageView img_after; + public ViewHolder(View itemView) { + super(itemView); + img_logo = itemView.findViewById(R.id.img_logo); + tv_num0 = itemView.findViewById(R.id.tv_num0); + img_after = itemView.findViewById(R.id.img_after); + + } + } + + OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener listener) { + onItemClickListener = listener; + } + + public interface OnItemClickListener { + void onItemClick(String onlineGoods); + + } +} diff --git a/app/src/main/java/qianmu/container/app/Constant.java b/app/src/main/java/qianmu/container/app/Constant.java new file mode 100644 index 0000000..7073aad --- /dev/null +++ b/app/src/main/java/qianmu/container/app/Constant.java @@ -0,0 +1,120 @@ +package qianmu.container.app; + +import android.os.Environment; + +import qianmu.container.R; +import qianmu.container.data.DeviceData; +import qianmu.container.util.StringUtil; + +/** + * Created by genglaixin on 2018/5/7. + * 修改touch为lottie + */ +public class Constant { + public static boolean isMain = false; // 是否是主设备 + public static boolean isSecondary = false; // 是否是从设备 + public static boolean showScreenSaver = false; + public static boolean isCoreService = false; // 是否启动 + public static boolean isScreen4K = false; // 是否为4K屏 + public static boolean networkState = false; // 是否有网络 + public static boolean tywx = false; // 是否为太原万象 mqtt密码修改 + public static int rotate = 0; // T982截屏是否旋转角度 + public static String screenType = "HDMI"; // 欣威视通3399设备为假关机 HDMI连接:可以用来判断是否为关机状态 LVDS连接:只能用定时关机时间来判断 + public static boolean newGuide = false; // 指路机类型,true:新版指路机 false:老板指路机(流花) + public static String mqttState = ""; // 屏幕连接方式 + // public static String androidBoardType = ""; //设备板子型号 无固定版 + public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch + // public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399) + // public static String androidBoardType = "xwst2"; //设备板子型号 + // xwst2(欣威视通3588、T982、3576) + // public static String androidBoardType = "zc"; //设备板子型号 zc(卓策主板——王府井喜悦、杨浦中心医院) + // public static String androidBoardType = "sx"; //设备板子型号 sx(视想) + // public static String androidBoardType = "nova"; //设备板子型号 诺瓦盒子 华贸LED + // public static String androidBoardType = "huidu"; //设备板子型号 huidu(灰度主板) 罗湖寻车机 + public static String whoActivity = ""; // 哪个activity页面 + // 本地缓存地址 + public static final String CACHE_PATH = StringUtil.strSplice(Environment.getExternalStorageDirectory().getPath(), + "/", "QMContainer", "/"); + + public static final String CACHE_PATH2 = StringUtil.strSplice(CACHE_PATH, "dist/"); + public static final String CACHE_PATH3 = StringUtil.strSplice(CACHE_PATH, "dist/static/offline"); + + // 接口地址 + public static final String DEFAULT_SERVER_IP = "https://iot.1000my.com";// 默认服务器ip + + // 默认页面路径(注册、退出、更新、屏保) + public static final String ROUTE_DEVICE_INFO = "/library/deviceInfo"; + public static final String ROUTE_SCREEN_SAVER = "/library/screenSaver"; + public static final String ROUTE_WEB_VIEW = "/library/webView"; + public static final String ROUTE_UPDATE_FILE = "/library/updateFile"; + + public static final String ACTION_APP_CRASH = "action_app_crash"; + public static final String PACKAGE_NAME = "packageName"; + public static final String APP_CRASH_PACKAGE_NAME = "qianmu.appcrashserfstart"; + + public static final String KEY_LOAD_H5_URL = "key_load_h5_url"; + + public static final String ACTION_EXIT = "cation_exit"; // 退出程序 + public static final String ACTION_CAPTURE_SCREEN = "action_capture_screen"; // 截屏 + public static final String UPDATE_DEVICE_IP = "action_update_device_ip"; // 更新设备ip + public static final String ACTION_SHOW_MAIN = "action_show_main"; // 跳转主界面 + public static final String ACTION_SHOW_SPLASH = "action_show_splash"; // 跳转屏保界面 + public static final String ACTION_START_INTER_CUT = "action_start_inter_cut"; // 开始插播 + public static final String ACTION_STOP_INTER_CUT = "action_stop_inter_cut"; // 停止插播 + public static final String ACTION_PLAY_PROGRAM_BY_INDEX = "action_play_program_by_index"; // 立即播放指定下标的节目 + public static final String ACTION_PLAY_CUT_PROGRAM_BY_INDEX = "action_play_cut_program_by_index";// 立即播放指定下标的插播节目 + public static final String ACTION_PLAY_VIDEO_PROGRAM_BY_INDEX = "action_play_video_program_by_index";// 立即播放指定下标的插播节目 + public static final String ACTION_PLAY_IMG_PROGRAM_BY_INDEX = "action_play_img_program_by_index";// 立即播放指定下标的插播节目 + public static final String ACTION_PLAY_NEXT_PROGRAM_BY_INDEX = "action_play_next_program_by_index";// 立即播放指定下标的插播节目 + public static final String ACTION_MEDIA_UPDATE_COMPLETE = "action_media_complete"; // U盘更新完成 + public static final String INPUT_PASSWORD = "input_password"; // + + public static final String ACTION_CONNECT_WEB_SOCKET = "action_connect_web_socket"; // + public static final String ACTION_CLOSE_WEB_SOCKET = "action_close_web_socket"; + public static final String ACTION_CONNECT_LOCAL_SOCKET = "action_connect_local_web_socket"; // + public static final String ACTION_CLOSE_LOCAL_SOCKET = "action_close_local_web_socket"; + public static final String ACTION_START_SOCKET_SERVER = "action_start_socket_server"; + public static final String ACTION_STOP_SOCKET_SERVER = "action_stop_socket_server"; + public static final String ACTION_NETWORK = "action_network";// 网络通知 + public static final String ACTION_MQTT_STATE = "action_mqtt_state";// 通知mqtt检测连接状态,如果断开进行重连 + public static final String ACTION_MQTT_ALIVE = "action_mqtt_alive";// 通知mqtt检测连接状态,如果断开进行重连 + public static final String ACTION_SHOW_UPDATE_H5 = "action_show_update_h5";// H5更新完成,通知页面更新 + public static final String ACTION_SHOW_TOUCH_ME = "action_show_touch_me";// touch显示状态 + public static final String ACTION_UPDATE_WEBVIEW = "action_update_webview";// 更新webview显示 + public static final String ACTION_RESTART_CORESERVICE = "action_restart_coreService";// 重启导视服务 + public static final String ACTION_UPDATE_PROG = "action_update_prog";// mqtt通知更新节目 + public static final String ACTION_UPDATE_PROG2 = "action_update_prog2";// mqtt通知更新节目 + public static final String ACTION_RESTART_APP = "action_restart_app";// 重启app + public static final String ACTION_RESTART_MQTT = "action_restart_mqtt";// 重启mqtt服务 + public static final String ACTION_RESTART_MY_PRESENTATION = "action_restart_my_presentation";// 有新节目通知双面屏 + public static final String NOVA_REBOOT = "nova_reboot";// 诺瓦设备重启设备 + public static final String NOVA_INIT = "nova_init";// 诺瓦设备重启设备 + public static final String NOVA_UPDATE_APP = "nova_update_app";// 诺瓦设备跟新app + public static final String NOVA_SCREEN_SHOT = "nova_screen_shot";// 诺瓦设备截屏 + public static final String NOVA_SCREEN_POWER_ON = "nova_screen_power_on";// 诺瓦设备截屏 + public static final String NOVA_SCREEN_POWER_CLOSE = "nova_screen_power_close";// 诺瓦设备截屏 + + public static final String APP_SEND_PACKAGE_NAME = "action_send_packageName"; + + /** + * 后台服务器地址 + */ + public static String getBaseAddress() { // 获取大后台url + String serverIp = DeviceData.getDeviceInfo(DeviceData.HINT_SERVER_IP, DEFAULT_SERVER_IP); + if (serverIp.endsWith("/")) { + return StringUtil.strSplice(serverIp); + } else { + return StringUtil.strSplice(serverIp) + "/"; + } + } + + /** + * 同屏Socket + */ + public static String getLocalSocketAddress() { + String serverIp = DeviceData.getDeviceInfo(DeviceData.HINT_MAIN_DEVICE_IP, DEFAULT_SERVER_IP); + String socketPort = "8001"; + return StringUtil.strSplice("ws://", serverIp, ":", socketPort); + } + +} diff --git a/app/src/main/java/qianmu/container/app/MyApplication.java b/app/src/main/java/qianmu/container/app/MyApplication.java new file mode 100644 index 0000000..d4de5b4 --- /dev/null +++ b/app/src/main/java/qianmu/container/app/MyApplication.java @@ -0,0 +1,181 @@ +package qianmu.container.app; + +import android.app.Application; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.PowerManager; + +import com.alibaba.android.arouter.BuildConfig; +import com.alibaba.android.arouter.launcher.ARouter; +import com.jakewharton.processphoenix.ProcessPhoenix; +import com.lzy.okgo.OkGo; +import com.sdkapi.api.SdkApi; +import com.squareup.leakcanary.LeakCanary; +import com.squareup.leakcanary.RefWatcher; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import qianmu.container.activity.BaseActivity; +import qianmu.container.activity.H5.CoreService; +import qianmu.container.data.DeviceData; +import qianmu.container.mqtt.MQTTService; +import qianmu.container.service.ContainerService; +import qianmu.container.service.MessengerService; +import qianmu.container.service.MusicService; +import qianmu.container.socket.SocketServer; +import qianmu.container.socket.manager.SocketServerManager; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SSLSocketClient; +import qianmu.container.util.StringUtil; + +@SuppressWarnings("All") +public class MyApplication extends Application { + + private static MyApplication myApplication; + private SocketServer socketServer; + private PowerManager powerManager = null; + private PowerManager.WakeLock wakeLock = null; + + public static long lastClick = 0;//最后点击时间 + public static long lastClickTime = 0;//最后点击时间 + public static int clickTimes = 0;//累计点击次数 + + public SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + public SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + public SimpleDateFormat secondFormat = new SimpleDateFormat("ss"); + + public static MyApplication getInstance() { + return myApplication; + } + + @Override + public void onCreate() { + super.onCreate(); + myApplication = this; + initARouter(); + initOkGo(); + SocketServerManager.startSocketServer(); + initDefaultUncaughtExceptionHandler(); +// refWatcher = LeakCanary.install(this); + } + + //初始化页面路由框架 + private void initARouter() { + try { + if (BuildConfig.DEBUG) { + ARouter.openLog(); + ARouter.openDebug(); + } + ARouter.init(this); + } catch (Throwable t) { + LoggerUtil.e("initARouter", StringUtil.getThrowableStr(t)); + } + } + +// private RefWatcher refWatcher; +// public static RefWatcher getRefWatcher(Context context) { +// MyApplication application = (MyApplication) context.getApplicationContext(); +// return application.refWatcher; +// } + + + //初始化下载框架 + private void initOkGo() { + try { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.readTimeout(5, TimeUnit.SECONDS); + builder.writeTimeout(5, TimeUnit.SECONDS); + builder.connectTimeout(5, TimeUnit.SECONDS); + builder.sslSocketFactory(SSLSocketClient.getSSLSocketFactory());//过滤https证书 + builder.hostnameVerifier(SSLSocketClient.getHostnameVerifier());//过滤https证书 + OkGo.getInstance().init(this).setOkHttpClient(builder.build()).setRetryCount(0); + } catch (Throwable t) { + LoggerUtil.e("initOkGo", StringUtil.getThrowableStr(t)); + } + } + + //页面常亮 + private void initWakeLock() { + powerManager = (PowerManager) this.getSystemService(Service.POWER_SERVICE); + wakeLock = this.powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "App:My Lock"); + wakeLock.setReferenceCounted(false); + wakeLock.acquire(); + } + + //异常崩溃监听 + private void initDefaultUncaughtExceptionHandler() { + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + long timeMillis = System.currentTimeMillis(); + StringWriter sw = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sw)); + String errorLog = StringUtil.strSplice(MyApplication.getInstance().dateTimeFormat.format(new Date(timeMillis)), ":\n", throwable.getMessage(), "\n", sw.toString()); + LoggerUtil.e("errorLog", errorLog); + restartApp(); + Intent intent = new Intent(Constant.ACTION_APP_CRASH); + intent.putExtra(Constant.PACKAGE_NAME, DeviceUtil.getPackageName()); + sendStickyBroadcast(intent); + sendBroadcast(new Intent(Constant.ACTION_EXIT)); + try { + PackageManager packageManager = getPackageManager(); + Intent appIntent = packageManager.getLaunchIntentForPackage(Constant.APP_CRASH_PACKAGE_NAME); + startActivity(appIntent); + } catch (Throwable t) { + LoggerUtil.e("崩溃自启失败", StringUtil.getThrowableStr(t)); + restartApp(); + } + + }); + } + + /** + * 重启软件 + * */ + public void restartApp(){ + LoggerUtil.e("MyApplication", "重启软件"); + stopService(new Intent(this, ContainerService.class)); + stopService(new Intent(this, MessengerService.class)); + stopService(new Intent(this, CoreService.class)); + stopService(new Intent(this, MQTTService.class)); + + if("指路机".equals(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))){ + //开启背景音乐 + stopService(new Intent(this, MusicService.class));//背景音乐 + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + ProcessPhoenix.triggerRebirth(this); + } + + //点击进入配置界面 + public static boolean addClickTimes() { + if (System.currentTimeMillis() - lastClick > 5000) clickTimes = 0; + lastClick = System.currentTimeMillis(); + clickTimes++; + if (clickTimes < 20) return false; + clickTimes = 0; + return true; + } + + + //是否点击相差1秒 + public static boolean isClickTime() { + if (System.currentTimeMillis() - lastClickTime > 1000) { + lastClickTime = System.currentTimeMillis(); + return true; + }else { + return false; + } + } +} diff --git a/app/src/main/java/qianmu/container/data/AppData.java b/app/src/main/java/qianmu/container/data/AppData.java new file mode 100644 index 0000000..923d6a6 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/AppData.java @@ -0,0 +1,116 @@ +package qianmu.container.data; + +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.entity.App; +import qianmu.container.entity.AppListResult; +import qianmu.container.entity.AppTime; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.util.AesUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class AppData extends BaseData { + + public static final String NAME = "app_data"; + public static final String APP_LIST = "app_list"; + public static final String APP_TIME_LIST = "app_time_list"; + public static final String FRONT_APP = "front_app"; + + public static void saveAppList(Object data) { + String dataJson = new Gson().toJson(data); + AppListResult appListResult = new Gson().fromJson(dataJson, AppListResult.class); + if (appListResult == null) return; + List appList = appListResult.getApList(); + List appTimeList = appListResult.getAppTime(); + saveDataJson(NAME, APP_LIST, new Gson().toJson(appList)); + saveDataJson(NAME, APP_TIME_LIST, new Gson().toJson(appTimeList)); + } + + public static void saveFrontApp(String data) { + saveDataJson(NAME, FRONT_APP, data); + } + + public static List getAppList() { + try { + String dataJson = getDataJson(NAME, APP_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getAppList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static List getAppTimeList() { + try { + String dataJson = getDataJson(NAME, APP_TIME_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getAppList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static String getFrontApp() { + try { + return getDataJson(NAME, FRONT_APP, DeviceUtil.getPackageName()); + } catch (Throwable t) { + return DeviceUtil.getPackageName(); + } + } + + /** + * 软件下发 + * */ + public static void queryDevAppList(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("DevCode", DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE)); + params.put("MallCode", DeviceData.getDeviceInfo(DeviceData.HINT_MALL_CODE)); + params.put("Paging", "0"); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), AesUtil.encrypt(new Gson().toJson(params))); + RetrofitUtil.getBaseService().getDevAppList(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + Log.e("getDevAppList", new Gson().toJson(response.body().getData())); + saveAppList(response.body().getData()); + } else { + LoggerUtil.e("getDevAppList", StringUtil.getString(response.body().getMsg())); + } + } catch (Throwable t) { + LoggerUtil.e("getDevAppList", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("getDevAppList", StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + +} diff --git a/app/src/main/java/qianmu/container/data/BaseData.java b/app/src/main/java/qianmu/container/data/BaseData.java new file mode 100644 index 0000000..ded4664 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/BaseData.java @@ -0,0 +1,38 @@ +package qianmu.container.data; + +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SharedPreUtil; +import qianmu.container.util.StringUtil; + +public class BaseData { + + protected static void saveDataJson(String name, String key, String value) { + try { + value = StringUtil.getString(value).replaceAll("\\\\", "/").replaceAll("///", "/"); + SharedPreUtil.setParam(name, key, value); + } catch (Throwable t) { + LoggerUtil.e("saveDataJson", StringUtil.getThrowableStr(t)); + } + } + + protected static void saveDataJson(String name, String key, Object value) { + try { + SharedPreUtil.setParam(name, key, value); + } catch (Throwable t) { + LoggerUtil.e("saveDataJson", StringUtil.getThrowableStr(t)); + } + } + + protected static String getDataJson(String name, String key, String defaultValue) { + try { + return (String) SharedPreUtil.getParam(name, key, defaultValue); + } catch (Throwable t) { + LoggerUtil.e("getDataJson", StringUtil.getThrowableStr(t)); + } + return defaultValue; + } + + protected static String getDataJson(String name, String key) { + return getDataJson(name, key, ""); + } +} diff --git a/app/src/main/java/qianmu/container/data/DeviceData.java b/app/src/main/java/qianmu/container/data/DeviceData.java new file mode 100644 index 0000000..18f2d23 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/DeviceData.java @@ -0,0 +1,736 @@ +package qianmu.container.data; + +import android.app.Activity; +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; +import com.loopj.android.http.RequestParams; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cz.msebera.android.httpclient.Header; +import cz.msebera.android.httpclient.entity.StringEntity; +import cz.msebera.android.httpclient.protocol.HTTP; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.activity.H5.H5Data; +import qianmu.container.app.MyApplication; +import qianmu.container.entity.AppVersionBean; +import qianmu.container.entity.Device; +import qianmu.container.entity.Dict; +import qianmu.container.entity.JxbBean; +import qianmu.container.entity.MqttInfoBean; +import qianmu.container.entity.MqttTokenBean; +import qianmu.container.entity.MusicBean; +import qianmu.container.entity.Resp; +import qianmu.container.entity.RespJXB; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryErrorListener; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.listener.QuerySuccessListener; +import qianmu.container.mqtt.CloseMqttBean; +import qianmu.container.mqtt.MqttDataBean; +import qianmu.container.util.AesUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.MusicUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class DeviceData extends BaseData { + + public static final String NAME = "device_data"; + public static final String HINT_CONTAINER_TYPE = "hint_container_type"; + public static final String HINT_REG_KEY = "hint_reg_key"; + public static final String HINT_MALL_CODE = "hint_mall_code"; + public static final String HINT_DEVICE_CODE = "hint_device_code"; + public static final String HINT_DEFAULT_PICTURE = "hint_default_picture"; + public static final String HINT_MAIN_DEVICE_IP = "HINT_MAIN_DEVICE_IP"; + public static final String BUILDING_CODE = "building_code"; + public static final String BUILDING_NAME = "building_name"; + public static final String FLOOR_CODE = "floor_code"; + public static final String FLOOR_NAME = "floor_name"; + public static final String DOWNLOAD_IP = "download_ip";// 图片视频下载地址 + public static final String HINT_DEVICE_IP = "hint_device_ip"; + public static final String HINT_DEVICE_MAC = "hint_device_mac"; + public static final String HINT_DEVICE_TYPE = "hint_device_type"; + public static final String HINT_DEVICE_TOUCH = "hint_device_touch";//触摸属性 // 0触摸 1非触摸 + public static final String HINT_SYNC_TEST = "hint_sync_test"; + public static final String HINT_DEVICE_ROTATION = "hint_device_rotation"; + public static final String HINT_DEVICE_POSITION = "hint_device_position"; + public static final String HINT_DEVICE_NAME = "hint_device_name";//设备名称 + public static final String DICT_LIST = "dict_list"; + public static final String DEVICE = "device"; + public static final String SHUIPAI_VERSION = "shuipai_version";//水牌版本 + + public static final String DEVICE_RESTART_TIME = "device_restart_time";//亿晟主板重启2次(避免屏幕黑屏) + public static final String INTERFACE_REQUEST = "interface request";//h5 接口请求 + + public static final String HINT_SERVER_IP = "hint_server_ip"; + public static final String VERSION = "version";//版本号数据 + public static final String JXB_DATA = "jxb_data";//机械臂轮播数据 + + public static void saveDeviceInfo(String key, String data) { + saveDataJson(NAME, key, StringUtil.getString(data)); + } + + public static void saveDeviceName(String data) { + saveDeviceInfo(HINT_DEVICE_NAME, data); + } + + public static void saveDictList(Object data) { + saveDataJson(NAME, DICT_LIST, new Gson().toJson(data)); + } + + public static void saveDevice(Object data) { + saveDataJson(NAME, DEVICE, new Gson().toJson(data)); + } + + public static void saveVersion(Object data) { + saveDataJson(NAME, VERSION, new Gson().toJson(data)); + } + + public static void saveInterfaceRequest(String data) { + saveDataJson(NAME, INTERFACE_REQUEST, StringUtil.getString(data)); + } + + public static String getInterfaceRequestData() { + try { + return getDataJson(NAME, INTERFACE_REQUEST, ""); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return ""; + } + } + + public static String getDeviceInfo(String key) { + return getDeviceInfo(key, ""); + } + + public static String getDeviceInfo(String key, String defaultValue) { + try { + return getDataJson(NAME, key, defaultValue); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return ""; + } + } + + public static List getDictList() { + try { + String dataJson = getDataJson(NAME, DICT_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static Device getDevice() { + try { + String dataJson = getDataJson(NAME, DEVICE, "{}"); + return new Gson().fromJson(dataJson, Device.class); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return null; + } + } + + /** + * 机械臂轮播数据 + * */ + public static List getJxbData() { + try { + String dataJson = getDataJson(NAME, JXB_DATA, "[]"); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + /** + * 获取版本号 + * */ + public static AppVersionBean getAppVersionBean() { + try { + String dataJson = getDataJson(NAME, VERSION, "{}"); + return new Gson().fromJson(dataJson, AppVersionBean.class); + } catch (Throwable t) { + LoggerUtil.e("getAppVersionBean", StringUtil.getThrowableStr(t)); + return new AppVersionBean(); + } + } + + /** + * 更新设备信息 + */ + public static void addDevice(Activity activity, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if(!MyApplication.isClickTime()) return; + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("code", DeviceData.getDeviceInfo(HINT_DEVICE_CODE)); + params.put("ip", DeviceData.getDeviceInfo(HINT_DEVICE_IP)); + params.put("mac", DeviceData.getDeviceInfo(HINT_DEVICE_MAC, SignWayUtil.getEthMacAddress())); + params.put("resolution", DeviceUtil.screenType(activity)); + params.put("label", "android"); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), new Gson().toJson(params)); + RetrofitUtil.getBaseService().activeDevice(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + MqttData.saveMqttInfo(response.body().getData()); + + } else { + ToastUtils.showToast(StringUtil.getString(response.body().getMsg())); + } + } catch (Throwable t) { + LoggerUtil.e("addDevice", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("addDevice", StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 获取图片视频下载地址ip + */ + public static void getUploadUrl( QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + + RetrofitUtil.getBaseService().getUploadUrl().enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson= AesUtil.decrypt((String.valueOf(response.body().getData()))); + if(dataJson.equals("解密失败")){ + saveDeviceInfo(DOWNLOAD_IP,String.valueOf(response.body().getData())); + LoggerUtil.e("getUploadUrl",String.valueOf(response.body().getData())); + }else { + saveDeviceInfo(DOWNLOAD_IP,dataJson); + LoggerUtil.e("getUploadUrl",dataJson); + } + + } else { + ToastUtils.showToast(StringUtil.getString(response.body().getMsg())); + } + } catch (Throwable t) { + LoggerUtil.e("getUploadUrl", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("getUploadUrl",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 上传版本号 + * */ + public static void sendVersion(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("code", DeviceData.getDeviceInfo(HINT_DEVICE_CODE)); + params.put("appVersion", DeviceUtil.getVersionName());//app版本 + params.put("programVersion", H5Data.getH5Version());//应用版本 + params.put("ip", DeviceUtil.getLocalIP());//设备ip + params.put("hardwareFirmwareNum", SignWayUtil.getFirmwareVersion());//硬件固件号 + params.put("hardwareVersionModel", SignWayUtil.getAndroidModle());// 硬件版本型号 + + LoggerUtil.e("TAG","设备型号:"+SignWayUtil.getAndroidModle()); + LoggerUtil.e("TAG","固件:"+SignWayUtil.getFirmwareVersion()); + LoggerUtil.e("TAG","安卓版本:"+SignWayUtil.getAndroidVersion()); +// params.put("resolution", DeviceUtil.screenType(activity) );//分辨率 + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),new Gson().toJson(params)); + RetrofitUtil.getBaseService().sendVersion(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + + } else if (response.code() == 200 && "201".equals(response.body().getCode())) { + + } + } catch (Throwable t) { + LoggerUtil.e("sendVersion", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("sendVersion",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 获取定时开关机 + * */ + public static void getMachineOnOffTime(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + + RetrofitUtil.getBaseService().getMachineOnOffTime(DeviceData.getDeviceInfo(HINT_DEVICE_CODE)).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String decryptDataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + + if(decryptDataJson.equals("解密失败")){ + MqttDataBean mqttDataBean =new Gson().fromJson(GsonUtil.getGson().toJson(response.body().getData()), new TypeToken() {}.getType()); + PowerData.savePowerList(mqttDataBean.getTime()); + }else { + MqttDataBean mqttDataBean =new Gson().fromJson(decryptDataJson, new TypeToken() {}.getType()); + PowerData.savePowerList(mqttDataBean.getTime()); + } + } + } catch (Throwable t) { + + LoggerUtil.e("getMachineOnOffTime", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("getMachineOnOffTime",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 获取同屏主设备 + * */ + public static void getPrimaryMachine(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getBaseService().getPrimaryMachine(DeviceData.getDeviceInfo(HINT_DEVICE_CODE)).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String decryptDataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + + if(decryptDataJson.equals("解密失败")){ + String dataJson = new Gson().toJson(response.body().getData()); + Device device = new Gson().fromJson(dataJson, Device.class); + if (device == null) return; + String mainDevIP = StringUtil.getString(device.getIp()); + DeviceData.saveDeviceInfo(HINT_MAIN_DEVICE_IP, mainDevIP); + }else { + Device device = new Gson().fromJson(decryptDataJson, Device.class); + if (device == null) return; + String mainDevIP = StringUtil.getString(device.getIp()); + DeviceData.saveDeviceInfo(HINT_MAIN_DEVICE_IP, mainDevIP); + } + } else if (response.code() == 200 && "201".equals(response.body().getCode())) { + DeviceData.saveDeviceInfo(HINT_MAIN_DEVICE_IP, ""); + } + } catch (Throwable t) { + LoggerUtil.e("getPrimaryMachine", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("getPrimaryMachine",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 通过接口来判断网络是否正常 + * */ + public static void pingNet(QueryPreparedListener preparedListener, QueryFinishListener finishListener, QuerySuccessListener successListener , QueryErrorListener errorListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getBaseService().pingNet(DeviceData.getDeviceInfo(HINT_DEVICE_CODE)).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if(response.body()!=null){ + LoggerUtil.e("pingNet()", new Gson().toJson(response.body())); + }else { + LoggerUtil.e("pingNet()", "body()=null"); + + } + } catch (Throwable t) { + LoggerUtil.e("pingNet()", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + if (successListener!=null)successListener.onSuccess(); + + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("pingNet()", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + if (errorListener != null) errorListener.onError(); + } + }); + } + + /** + * 进入导视上传记录 + * + * */ + public static void guideClickDataUpload(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("deviceCode", DeviceData.getDeviceInfo(HINT_DEVICE_CODE)); + params.put("projectCode", FloorData.getMallCode()); + params.put("recordType", "3"); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),new Gson().toJson(params)); + RetrofitUtil.getBaseService().guideClickDataUpload(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + + } + } catch (Throwable t) { + LoggerUtil.e("guideClickDataUpload", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("guideClickDataUpload",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 机械臂重启 + * + * */ + public static void jxbReboot(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getJxbService().jxbReboot("shockman!_$2023").enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + /** + * 机械臂重启 + * + * */ + public static void jxbAutoBoot(String on,String off,QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getJxbService().jxbAutoBoot("shockman!_$2023",on,off).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + LoggerUtil.e("jxbAutoBoot()","机械臂重启:"+GsonUtil.getGson().toJson(response.body())); + if (StringUtil.respSuccess(response.body())) { + + } + } catch (Throwable t) { + LoggerUtil.e("jxbAutoBoot", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("jxbAutoBoot", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 机械臂过度文字 + * + * */ + public static void jxbSetTransText(String text,QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getJxbService().jxbSetTransText("shockman!_$2023",text).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + LoggerUtil.e("jxbSetTransText()","机械臂过度文字:"+GsonUtil.getGson().toJson(response.body())); + if (StringUtil.respSuccess(response.body())) { + + } + } catch (Throwable t) { + LoggerUtil.e("jxbSetTransText", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("jxbSetTransText", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 机械臂开机文字 + * + * */ + public static void jxbSetBootText(String text,QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getJxbService().jxbSetBootText("shockman!_$2023",text).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + LoggerUtil.e("jxbSetBootText()","机械臂开机文字:"+GsonUtil.getGson().toJson(response.body())); + if (StringUtil.respSuccess(response.body())) { + + } + } catch (Throwable t) { + LoggerUtil.e("jxbSetBootText", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("jxbSetBootText", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 设置机械臂逻辑零点 + * + * */ + public static void setLogicZero(int logicZero,QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + RetrofitUtil.getJxbService().setLogicZero("shockman!_$2023",logicZero).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + + LoggerUtil.e("setLogicZero()","设置机械臂逻辑零点:"+GsonUtil.getGson().toJson(response.body())); + if (StringUtil.respSuccess(response.body())) { + + } + } catch (Throwable t) { + LoggerUtil.e("setLogicZero", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("setLogicZero", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 机械臂轮播 + * + * */ + public static void setJxbPlay(String progText1, String progText2, String progDist, int progAngel, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + int masterArm=1; + int rotationTime=60; + if(H5Data.getKdxf().getData().getControlInfo()!=null){ + masterArm = H5Data.getKdxf().getData().getControlInfo().getMasterArm(); + rotationTime = H5Data.getKdxf().getData().getControlInfo().getRotationTime(); + } + String md5Data = md5(1 + progText1 + 6 + progText2 + 6 + progDist + 6 + "" + progAngel + "" + masterArm + "1" +"1"+ rotationTime+"shockman!_$2023"); + RetrofitUtil.getJxbService().jxbPlay("shockman!_$2023",1,progText1,6,progText2,6,progDist,6,progAngel,masterArm,1,1,rotationTime,md5Data,1).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + + LoggerUtil.e("setJxbPlay()","机械臂轮播:"+GsonUtil.getGson().toJson(response.body())); +// if (StringUtil.respSuccess(response.body())) { +// +// } + } catch (Throwable t) { + LoggerUtil.e("setJxbPlay", StringUtil.getThrowableStr(t)); + } + + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("setJxbPlay", "请求超时"); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 获取背景音乐 + */ + public static void getBackgroundMusic(QueryPreparedListener preparedListener, QueryFinishListener finishListener , Map bigFiles ) { + String mallCode = FloorData.getMallCode(); + RetrofitUtil.getBaseService().getSoundInfo(mallCode).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + Log.e("TAG","背景音乐"+GsonUtil.getGson().toJson(response.body())); + try { + if (StringUtil.respSuccess(response.body())) { + MusicUtil.saveData(response.body().getData()); + for(MusicBean.soundFiles bean: MusicUtil.getBackgroundMusicList()){ + String fileUrl = bean.getUrl(); + bigFiles.put(fileUrl,fileUrl); + } + } + if (finishListener != null) finishListener.onFinish(); + } catch (Throwable t) { + if (finishListener != null) finishListener.onFinish(); + LoggerUtil.e("getBackgroundMusic()", StringUtil.getThrowableStr(t)); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + if (finishListener != null) finishListener.onFinish(); + LoggerUtil.saveError("getBackgroundMusic",t); + } + }); + } + + //GET方式获取离线数据 + public static void queryOfflineDataByInterfaceToGet(String url,QueryFinishListener finishListener) { + AsyncHttpClient client; + if(url.contains("https")){ + client = new AsyncHttpClient(true, 80, 443); + }else { + client = new AsyncHttpClient(); + } + client.setTimeout(20000); + client.setMaxRetriesAndTimeout(0, 20000); + client.get(url, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + try { + String response = new String(responseBody).replace("\\\\", "/"); + saveInterfaceRequest(response); + } catch (Throwable t) { +// LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + //POST方式获取离线数据 多添加一个JSON请求体(参数必须是JSON格式) + public static void queryOfflineDataByInterfaceToPost(String url, String jsonData, QueryFinishListener finishListener) { + try { + AsyncHttpClient client; + if(url.contains("https")){ + client = new AsyncHttpClient(true, 80, 443); + }else { + client = new AsyncHttpClient(); + } + client.setTimeout(20000); + client.setMaxRetriesAndTimeout(0, 20000); +// StringEntity entity = new StringEntity(jsonData); + StringEntity entity = new StringEntity(jsonData, HTTP.UTF_8); + client.post(MyApplication.getInstance().getApplicationContext(), url, entity, RequestParams.APPLICATION_JSON, new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + try { + String response = new String(responseBody).replace("\\\\", "/"); +// Log.d("response", response); + saveInterfaceRequest(response); + } catch (Throwable t) { +// LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } catch (Throwable t) { + if (finishListener != null) finishListener.onFinish(); +// LoggerUtil.e("queryOfflineDataByInterface", StringUtil.getThrowableStr(t)); + } + } + + + public static String md5(String plainString) { + String cipherString = null; + try { + // 获取实例 + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + // 计算摘要 + byte[] cipherBytes = messageDigest.digest(plainString.getBytes(StandardCharsets.UTF_8)); + // 输出为16进制字符串 + StringBuilder sb = new StringBuilder(); + for (byte b : cipherBytes) { + sb.append(String.format("%02x", b)); + } + cipherString = sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + return cipherString; + } + +} diff --git a/app/src/main/java/qianmu/container/data/FloorData.java b/app/src/main/java/qianmu/container/data/FloorData.java new file mode 100644 index 0000000..a56a082 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/FloorData.java @@ -0,0 +1,248 @@ +package qianmu.container.data; + +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.entity.Building; +import qianmu.container.entity.DeviceOption; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.util.AesUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + + +/** + * Created by genglaixin on 2018/9/19. + */ +public class FloorData extends BaseData { + + public static final String NAME = "building_data"; + public static final String KEY = "building_list"; + public static final String MALL_CODE = "mall_code"; + public static final String MALL_NAME = "mall_name"; + public static final String CURRENT_DEVICE = "current_device";//当前设备信息 + public static final String CURRENT_FLOOR = "current_floor";//当前设备楼层 + + private static final String PARKING_LOTS_STRING = "";//停车场字符串 + + public static void saveBuildingList(Object data) { + saveDataJson(NAME, KEY, new Gson().toJson(data)); + } + + + public static void saveMallCode(String data) { + saveDataJson(NAME, MALL_CODE, data); + } + + public static void saveMallName(String data) { + saveDataJson(NAME, MALL_NAME, data); + } + + public static void saveCurrentDeviceInfo(Object data) { + saveDataJson(NAME, CURRENT_DEVICE, new Gson().toJson(data)); + } + + public static void saveCurrentFloorInfo(Object data) { + saveDataJson(NAME, CURRENT_FLOOR, new Gson().toJson(data)); + } + + //获取当前设备信息 + public static Building.Machine getCurrentDeviceInfo() { + try { + return new Gson().fromJson(getDataJson(NAME, CURRENT_DEVICE), new TypeToken() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getCurrentDevice", StringUtil.getThrowableStr(t)); + } + return new Building.Machine(); + } + + //获取当前设备所在楼层 + public static Building.Floor getCurrentFloorInfo() { + try { + return new Gson().fromJson(getDataJson(NAME, CURRENT_FLOOR), new TypeToken() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getCurrentDevice", StringUtil.getThrowableStr(t)); + } + return new Building.Floor(); + } + + //商场code + public static String getMallCode() { + return getDataJson(NAME, MALL_CODE,""); + } + //商场名称 + public static String getMallName() { + return getDataJson(NAME, MALL_NAME,""); + } + + //获取楼栋列表(包含楼层) + public static List getBuildingList() { + try { + return new Gson().fromJson(getDataJson(NAME, KEY), new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getBuildingList", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + + //获取楼层列表 + public static List getFloorList() { + return getFloorListByBuildingCode(DeviceData.getDeviceInfo(DeviceData.BUILDING_CODE)); + } + + //根据楼栋code获取楼层数据 + public static List getFloorListByBuildingCode(String buildingCode) { + List buildingList = getBuildingList(); + for (Building building : buildingList) { + if (building == null) continue; + String tempCode = StringUtil.getString(building.getCode()); + if (!tempCode.equals(buildingCode)) continue; + List floorList = building.getFloor(); + if (floorList == null) return new ArrayList<>(); + return floorList; + } + return new ArrayList<>(); + } + + //根据code获取楼层信息 + public static Building.Floor getFloorByCode(String floorCode) { + List floorList = getFloorList(); + for (Building.Floor floor : floorList) { + if (floor == null) continue; + String tempCode = StringUtil.getString(floor.getCode()); + if (tempCode.equals(floorCode)) return floor; + } + return null; + } + + //根据name获取楼层信息 + public static Building.Floor getFloorByName(String floorName) { + List floorList = getFloorList(); + for (Building.Floor floor : floorList) { + if (floor == null) continue; + String tempName = StringUtil.getString(floor.getName()); + if (tempName.equals(floorName)) return floor; + } + return null; + } + + + //根据order获取楼层信息 + public static Building.Floor getFloorByOrder(int floorOrder) { + List floorList = getFloorList(); + for (Building.Floor floor : floorList) { + if (floor == null) continue; + if (floorOrder == floor.getOrder()) return floor; + } + return null; + } + + //获取设备所在楼层信息 + public static Building.Floor getDeviceFloor() { + String floorCode = DeviceData.getDeviceInfo(DeviceData.FLOOR_CODE); + return getFloorByCode(floorCode); + } + + //获取设备楼层的具体信息 + public static String getDeviceFloorCode() { + Building.Floor floor = getDeviceFloor(); + if (floor == null) return ""; + return StringUtil.getString(floor.getCode()); + } + + public static int getDeviceFloorOrder() { + Building.Floor floor = getDeviceFloor(); + if (floor == null) return 0; + else return floor.getOrder(); + } + + public static String getDeviceFloorName() { + Building.Floor floor = getDeviceFloor(); + if (floor == null) return ""; + else return floor.getName(); + } + + public static String getFloorNameByCode(String floorCode) { + Building.Floor floor = getFloorByCode(floorCode); + if (floor == null) return ""; + return StringUtil.getString(floor.getName()); + } + + public static String getFloorNameByOrder(int floorOrder) { + Building.Floor floor = getFloorByOrder(floorOrder); + if (floor == null) return ""; + return StringUtil.getString(floor.getName()); + } + + /** + * 获取楼层和楼栋数据 + */ + public static void getDeviceOptionsNew(String mallCode, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + String code= mallCode; + RetrofitUtil.getBaseService().getRegisterInfo( code ).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + String dataJson = new Gson().toJson(response.body().getData()); + if(!dataJson.contains("projectCode")){ + //加密数据 + dataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + + } + DeviceOption deviceOption = new Gson().fromJson(dataJson, DeviceOption.class); + if (deviceOption == null) { + Log.e("deviceOption", "deviceOption数据异常"); + return; + } + List buildingList = deviceOption.getBuilding(); + if (buildingList == null) { + Log.e("buildingList", "楼层数据异常"); + return; + } + FloorData.saveBuildingList(buildingList); + FloorData.saveMallCode(deviceOption.getProjectCode()); + FloorData.saveMallName(deviceOption.getProjectName()); + + if (finishListener != null) finishListener.onFinish(); + } + if(response.body().getMsg()!=null){ + ToastUtils.showToast(response.body().getMsg()); + } + } catch (Throwable t) { + LoggerUtil.e("queryConstList", StringUtil.getThrowableStr(t)); + } + + } + + @Override + public void onFailure(Call call, Throwable t) { + ToastUtils.showToast("请求超时,获取楼栋楼层数据失败"); + LoggerUtil.e("queryConstList", StringUtil.getThrowableStr(t)); +// if (finishListener != null) finishListener.onFinish(); + } + }); + } + +} diff --git a/app/src/main/java/qianmu/container/data/MqttData.java b/app/src/main/java/qianmu/container/data/MqttData.java new file mode 100644 index 0000000..2d62eb1 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/MqttData.java @@ -0,0 +1,183 @@ +package qianmu.container.data; + +import android.app.Activity; +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.app.MyApplication; +import qianmu.container.entity.Device; +import qianmu.container.entity.Dict; +import qianmu.container.entity.MqttInfoBean; +import qianmu.container.entity.MqttTokenBean; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.util.AesUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ToastUtils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class MqttData extends BaseData { + + public static final String NAME = "mqtt_data"; + public static final String HINT_CONTAINER_TYPE = "hint_container_type"; + public static final String HINT_REG_KEY = "hint_reg_key"; + public static final String HINT_MALL_CODE = "hint_mall_code"; + public static final String HINT_DEVICE_CODE = "hint_device_code"; + public static final String MQTT_TOKEN = "mqtt_token"; + public static final String MQTT_INFO = "mqtt_info"; + public static final String DOWNLOAD_IP = "download_ip";// 图片视频下载地址 + public static final String ACTIVATE_STATE = "activate_state";//激活状态 + public static final String HINT_DEVICE_IP = "hint_device_ip"; + public static final String HINT_DEVICE_MAC = "hint_device_mac"; + public static final String HINT_DEVICE_TYPE = "hint_device_type"; + public static final String HINT_DEVICE_NAME = "hint_device_name";//设备名称 + public static final String DICT_LIST = "dict_list"; + public static final String DEVICE = "device"; + public static final String MQTT_TOPIC = "mqtt_topic"; // 除导视外其他url + + + public static void saveDeviceInfo(String key, String data) { + saveDataJson(NAME, key, StringUtil.getString(data)); + } + + //保存topic + public static void saveTopic(String data) { + saveDataJson(NAME,MQTT_TOPIC, data); + } + + public static void saveDictList(Object data) { + saveDataJson(NAME, DICT_LIST, new Gson().toJson(data)); + } + + public static void saveDevice(Object data) { + saveDataJson(NAME, DEVICE, new Gson().toJson(data)); + } + + public static void saveMqttToken(Object data) { + saveDataJson(NAME, MQTT_TOKEN, new Gson().toJson(data)); + } + public static void saveMqttInfo(Object data) { + saveDataJson(NAME, MQTT_INFO, new Gson().toJson(data)); + } + + + public static List getMqttTopicList() { + try { + String dataJson = getDataJson(NAME, MQTT_TOPIC, "[]"); + + Log.e("TAG","topic列表:"+dataJson); + char[] chars = dataJson.toCharArray(); + List strings = new ArrayList<>(); + for(char s: chars){ + strings.add(String.valueOf(s)); + } + return strings; +// return new Gson().fromJson(dataJson, new TypeToken>() { +// }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getMqttToken", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static MqttTokenBean getMqttToken() { + try { + String dataJson = getDataJson(NAME, MQTT_TOKEN, "{}"); + return new Gson().fromJson(dataJson, MqttTokenBean.class); + } catch (Throwable t) { + LoggerUtil.e("getMqttToken", StringUtil.getThrowableStr(t)); + return new MqttTokenBean(); + } + } + + public static MqttInfoBean getMqttInfo() { + try { + String dataJson = getDataJson(NAME, MQTT_INFO, "{}"); + return new Gson().fromJson(dataJson, MqttInfoBean.class); + } catch (Throwable t) { + LoggerUtil.e("getMqttInfo", StringUtil.getThrowableStr(t)); + return new MqttInfoBean(); + } + } + + public static String getDeviceInfo(String key) { + return getDeviceInfo(key, ""); + } + + public static String getDeviceInfo(String key, String defaultValue) { + try { + return getDataJson(NAME, key, defaultValue); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return ""; + } + } + + public static List getDictList() { + try { + String dataJson = getDataJson(NAME, DICT_LIST); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static Device getDevice() { + try { + String dataJson = getDataJson(NAME, DEVICE, "{}"); + return new Gson().fromJson(dataJson, Device.class); + } catch (Throwable t) { + LoggerUtil.e("getDeviceInfo", StringUtil.getThrowableStr(t)); + return null; + } + } + + /** + * 获取mqtt 连接密码 + */ + public static void getMQTTToken(String code, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("code", code); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), new Gson().toJson(params)); + RetrofitUtil.getBaseService().getTokenPass(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + saveMqttToken(response.body().getData()); + } + } catch (Throwable t) { + LoggerUtil.e("getMQTTToken", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("getMQTTToken", StringUtil.getThrowableStr(t)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + +} diff --git a/app/src/main/java/qianmu/container/data/PowerData.java b/app/src/main/java/qianmu/container/data/PowerData.java new file mode 100644 index 0000000..e482f27 --- /dev/null +++ b/app/src/main/java/qianmu/container/data/PowerData.java @@ -0,0 +1,316 @@ +package qianmu.container.data; + +import android.util.Log; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.sdkapi.api.SdkApi; +import com.zcapi; + +import org.greenrobot.eventbus.EventBus; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.entity.MessageEvent; +import qianmu.container.listener.QueryErrorListener; +import qianmu.container.listener.QuerySuccessListener; +import qianmu.container.mqtt.MqttDataBean; +import qianmu.container.util.CalendarUtils; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; +//定时开关机 +public class PowerData extends BaseData { + + public static final String NAME = "heart_beat_data"; + public static final String POWER_INFO = "power_info"; + public static String newTimeInfo =""; + + public static void savePowerList(Object value) { + saveDataJson(NAME, POWER_INFO, new Gson().toJson(value)); + } + + public static MqttDataBean.TimeData getPowerTime() { + try { + String dataJson = getDataJson(NAME, POWER_INFO, "{}"); + return new Gson().fromJson(dataJson, new TypeToken() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getPowerInfo", StringUtil.getThrowableStr(t)); + return null; + } + } + + public static void updatePowerOnOrOffTime() { + try { + String parameter = "";//关机 + String bootTime = "";//开机 + String bootTime2 = "";//第二天开机 + MqttDataBean.TimeData powerTime = getPowerTime(); + + if(powerTime!=null){ + if(powerTime.getOn()==null || !powerTime.getOn().isEmpty()){ + bootTime = powerTime.getOn(); + bootTime2 = powerTime.getOn(); + parameter = powerTime.getOff(); + }else if(powerTime.getWeekList()!=null && powerTime.getWeekList().size()>0){ + MqttDataBean.week week = powerTime.getWeekList().get(CalendarUtils.getWhatDay5(System.currentTimeMillis())); + MqttDataBean.week week2 = powerTime.getWeekList().get(CalendarUtils.getWhatDay5(System.currentTimeMillis())+1 >6 ? 0 : CalendarUtils.getWhatDay5(System.currentTimeMillis())+1); + bootTime=week.getOn(); + parameter=week.getOff(); + bootTime2=week2.getOn(); + + } + } + + if(!bootTime.isEmpty()){ + //避免设备定时失效,进行重新设置 + long currentLong = System.currentTimeMillis();//当前时间 + String s = TimeUtil.stampToDate(currentLong); + long bootLong = TimeUtil.pareTLong2(s + " " + bootTime);//开机时间 + if(Math.abs(currentLong-bootLong)<30000){ + LoggerUtil.e("PowerData","避免设备定时失效,进行重新设置定时开关机"); + newTimeInfo=""; + } + } + + //华贸设备设置开关屏 + if(Constant.androidBoardType.equals("nova") && !bootTime.isEmpty()){ + long currentTime = System.currentTimeMillis(); + String s = TimeUtil.stampToDate(currentTime); + long parameterLong = TimeUtil.pareTLong2(s + " " + parameter);//关机时间 + long bootLong = TimeUtil.pareTLong2(s + " " + bootTime);//开机时间 + if(Math.abs(currentTime-bootLong)<40000){ + //开机时间 + LoggerUtil.e("PowerData","诺瓦设备开屏"); + EventBus.getDefault().post(new MessageEvent(Constant.NOVA_SCREEN_POWER_ON)); + } + + if(Math.abs(currentTime-parameterLong)<40000){ + //关机时间 + LoggerUtil.e("PowerData","诺瓦设备关屏"); + EventBus.getDefault().post(new MessageEvent(Constant.NOVA_SCREEN_POWER_CLOSE)); + } + } + + if(Constant.androidBoardType.equals("huidu")){ + //罗湖寻车机 + long currentTime = System.currentTimeMillis(); + String s = TimeUtil.stampToDate(currentTime); + if(parameter.isEmpty()){ + return; + } + long parameterLong = TimeUtil.pareTLong2(s + " " + parameter);//关机时间 + if(Math.abs(currentTime-parameterLong)<40000){ + //关机时间 + SignWayUtil.shutDown(); + } + } + + String dataJson = getDataJson(NAME, POWER_INFO, "{}"); + // Log.e("tag","设置的定时开关机"+dataJson); + if(newTimeInfo.equals(dataJson)){ + Log.e("PowerData","定时开关机相同"); + return; + } + LoggerUtil.e("PowerData","定时开关机不同"); + newTimeInfo=dataJson; + + //天津K11亿晟3288重启2次设备避免黑屏 + Calendar cal= Calendar.getInstance(); + String format = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime()); + + if(!DeviceData.getDeviceInfo(DeviceData.DEVICE_RESTART_TIME).equals(format)){ + + DeviceData.pingNet(null, null, new QuerySuccessListener() { + @Override + public void onSuccess() { + LoggerUtil.e("pingNet()", "开机检测网络正常"); + } + },new QueryErrorListener() { + @Override + public void onError() { + LoggerUtil.e("pingNet()", "开机检测网络异常,重启设备"); + DeviceData.saveDeviceInfo((DeviceData.DEVICE_RESTART_TIME),format); + SignWayUtil.reboot(); + + } + } ); + } + + if (StringUtil.isEmpty(parameter)) { + //清除定时开关机时间 + SignWayUtil.clearPowerOnOffTime(); + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if(deviceType.equals("指路机")){ + DeviceData.jxbAutoBoot(" "," ",null,null); + } + + } else { + + long currentLong = System.currentTimeMillis();//当前时间 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String[] date = dateFormat.format(currentLong).split("-"); + String[] date2 = dateFormat.format(currentLong+24*60*60*1000).split("-"); + String[] on = bootTime.split(":"); + String[] on2 = bootTime2.split(":"); + String[] off = parameter.split(":"); + + String s = TimeUtil.stampToDate(currentLong); + String s2 = TimeUtil.stampToDate(currentLong+24*60*60*1000); + long parameterLong = TimeUtil.pareTLong2(s + " " + parameter);//关机时间 + long bootLong = TimeUtil.pareTLong2(s + " " + bootTime);//开机时间 + long bootLong2 = bootLong+24*60*60*1000;//第二天开机时间 + + if(Constant.androidBoardType.equals("xwst")){ + + if(parameterLong > bootLong) { + //当天关机,第二天开机 + SignWayUtil.setPowerOnTime("1", date2[0], date2[1], date2[2], on2[0], on2[1]); + SignWayUtil.setPowerOffTime("1", date[0], date[1], date[2], off[0], off[1]); + LoggerUtil.e("PowerData()", "关机时间:"+s + " " + parameter+",开机时间:"+dateFormat.format(currentLong+24*60*60*1000)+" "+bootTime2); + }else { + if(currentLong > bootLong){ + //第二天关机,第二天开机 + SignWayUtil.setPowerOnTime("1", date2[0], date2[1], date2[2], on[0], on[1]); + SignWayUtil.setPowerOffTime("1", date2[0], date2[1], date2[2], off[0], off[1]); + LoggerUtil.e("PowerData()", "关机时间:"+ s2 + " " + parameter+",开机时间:"+s2 + " " + bootTime); + }else { + //当天关机,当天开机 + SignWayUtil.setPowerOnTime("1", date[0], date[1], date[2], on[0], on[1]); + SignWayUtil.setPowerOffTime("1", date[0], date[1], date[2], off[0], off[1]); + LoggerUtil.e("PowerData()", "关机时间:"+s + " " + parameter+",开机时间:"+s + " " + bootTime); + } + } + + }else if (Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().TimerSwitch().setTimerSwitchOnoff(true); + SdkApi.getInstance().TimerSwitch().setTimerType(true); + if(parameterLong > bootLong) { + //当天关机,第二天开机 + SdkApi.getInstance().TimerSwitch().setTimerOnYmdTime(dateFormat.format(currentLong+24*60*60*1000)+" "+bootTime2); + SdkApi.getInstance().TimerSwitch().setTimerOffYmdTime(s+" "+parameter); + LoggerUtil.e("PowerData()", "关机时间:"+s + " " + parameter+",开机时间:"+dateFormat.format(currentLong+24*60*60*1000)+" "+bootTime2); + }else { + if(currentLong > bootLong){ + //第二天关机,第二天开机 + SdkApi.getInstance().TimerSwitch().setTimerOnYmdTime(s2+" "+bootTime); + SdkApi.getInstance().TimerSwitch().setTimerOffYmdTime(s2+" "+parameter); + LoggerUtil.e("PowerData()", "关机时间:"+ s2 + " " + parameter+",开机时间:"+s2 + " " + bootTime); + }else { + //当天关机,当天开机 + boolean b = SdkApi.getInstance().TimerSwitch().setTimerOnYmdTime(s + " " + bootTime); + boolean b1 = SdkApi.getInstance().TimerSwitch().setTimerOffYmdTime(s + " " + parameter); + Log.e("TAG","设置结果:"+b+","+b1); + LoggerUtil.e("PowerData()", "关机时间:"+s + " " + parameter+",开机时间:"+s + " " + bootTime); + } + } + + }else if(Constant.androidBoardType.equals("ys")){ + + //按周:关机时间要在开机时间之后 按天:关机时间在开机时间之前 +// int[] timeoffArray = { Integer.parseInt(off[0]), Integer.parseInt(off[1])}; +// int[] timeonArray = {Integer.parseInt(on[0]),Integer.parseInt(on[1])}; +// SignWayUtil.setPowerOnOffTimeWithWeekFort982(timeonArray,timeoffArray); + if(parameterLong > bootLong) { + //关机时间大于开机时间,第二天开机 + int[] timeoffArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(on2[0]),Integer.parseInt(on2[1])}; + SignWayUtil.setPowerOnOffTimeFortYs(timeoffArray,timeonArray); + + }else { + //关机时间小于开机时间,当天关机,当天开机。 + + if(currentLong >= bootLong){ + //当前时间大于开机时间,设置第二天关机,第二天开机 + + int[] timeoffArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(on[0]),Integer.parseInt(on[1])}; + SignWayUtil.setPowerOnOffTimeFortYs(timeoffArray,timeonArray); + + }else { + //当前时间在关机时间内 + int[] timeoffArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(on[0]),Integer.parseInt(on[1])}; + SignWayUtil.setPowerOnOffTimeFortYs(timeoffArray,timeonArray); + } + } + + }else if(Constant.androidBoardType.equals("sx")){ + //视想 + int[] timeoffArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(on2[0]),Integer.parseInt(on2[1])}; + SignWayUtil.setPowerOnOffTimeFortSx(timeonArray,timeoffArray); + }else if(Constant.androidBoardType.equals("zc")){ + + //并且设定的开机与关机时间必须超过当前时间,否则,会清除掉已设定的开机时间或关机时间,导致不能达到预想的要求。 + if(parameterLong > bootLong) { + //关机时间大于开机时间,第二天开机 + int[] timeoffArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(on2[0]),Integer.parseInt(on2[1])}; + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.setPowetOnOffTime(true,timeonArray,timeoffArray); + }else { + //关机时间小于开机时间,当天关机,当天开机。 + + if(currentLong < parameterLong){ + //当前时间在关机时间之前 + int[] timeoffArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date[0]), Integer.parseInt(date[1]), Integer.parseInt(date[2]), Integer.parseInt(on[0]),Integer.parseInt(on[1])}; + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.setPowetOnOffTime(true,timeonArray,timeoffArray); + }else{ + //当前时间在关机后,设置第二天开关机 + int[] timeoffArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(off[0]), Integer.parseInt(off[1])}; + int[] timeonArray = {Integer.parseInt(date2[0]), Integer.parseInt(date2[1]), Integer.parseInt(date2[2]), Integer.parseInt(on[0]),Integer.parseInt(on[1])}; + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.setPowetOnOffTime(true,timeonArray,timeoffArray); + } + } + + }else if(Constant.androidBoardType.equals("huidu")){ + + //并且设定的开机与关机时间必须超过当前时间,否则,会清除掉已设定的开机时间或关机时间,导致不能达到预想的要求。 + if(parameterLong > bootLong) { + //关机时间大于开机时间,第二天开机 + int second =(int)(bootLong2-currentLong)/1000; + SignWayUtil.setPowerOnOffTimeforHuidu(second); + + }else { + //关机时间小于开机时间,当天关机,当天开机。 + if(currentLong < parameterLong){ + //当前时间在关机时间之前 + int second =(int)(bootLong-currentLong)/1000; + SignWayUtil.setPowerOnOffTimeforHuidu(second); + + }else{ + //当前时间在关机后,设置第二天开关机 + int second =(int)(bootLong2-currentLong)/1000; + SignWayUtil.setPowerOnOffTimeforHuidu(second); + + } + } + + } + + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if(deviceType.equals("指路机")){ + DeviceData.jxbAutoBoot(bootTime2,parameter,null,null); + } + + } + } catch (Throwable t) { + LoggerUtil.e("updatePowerOnOrOffTime()", StringUtil.getThrowableStr(t)); + } + } +} diff --git a/app/src/main/java/qianmu/container/data/ScreenSaverData.java b/app/src/main/java/qianmu/container/data/ScreenSaverData.java new file mode 100644 index 0000000..9cacbbe --- /dev/null +++ b/app/src/main/java/qianmu/container/data/ScreenSaverData.java @@ -0,0 +1,657 @@ +package qianmu.container.data; + + +import android.app.AlarmManager; +import android.content.Context; +import android.os.Build; +import android.util.Log; + +import androidx.annotation.RequiresApi; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.AsyncHttpResponseHandler; + +import org.greenrobot.eventbus.EventBus; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import cz.msebera.android.httpclient.Header; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import qianmu.container.activity.H5.H5Data; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.entity.InterFaceBean; +import qianmu.container.entity.MapDataListBean; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.NewProgramBean; +import qianmu.container.entity.ResourceFileBean; +import qianmu.container.entity.Resp; +import qianmu.container.entity.ScreenSaver; +import qianmu.container.entity.ScreenSaverTime; +import qianmu.container.entity.ShuipaiDataListBean; +import qianmu.container.entity.Subtitle; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QueryPreparedListener; +import qianmu.container.util.AesUtil; +import qianmu.container.util.AesUtil2; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + + +public class ScreenSaverData extends BaseData { + + public static final String NAME = "screen_saver_data"; + public static final String SCREEN_SAVER_LIST = "screen_saver_list"; + public static final String SCREEN_NEW_SAVER_LIST = "screen_new_saver_list"; + public static final String SCREEN_NEW_SAVER_LIST2 = "screen_new_saver_list2";//用与判断是否有屏保 + public static final String SCREEN_SAVER = "screen_saver"; + public static final String SUBTITLE = "subtitle"; + + public static final int TOP = 1; + public static final int FOOT = 2; + + public static final int TYPE_SCREEN_SAVER = 1; + public static final int TYPE_INTER_CUT = 2; + + public static void saveScreenSaverList(Object data) { + String dataJson; + if (data instanceof String) dataJson = StringUtil.replace((String) data); + else { + dataJson = StringUtil.replace(new GsonBuilder().disableHtmlEscaping().create().toJson(data)); + } + saveDataJson(NAME, SCREEN_SAVER_LIST, dataJson); + } + + public static void saveScreenNewSaverList(Object data) { + String dataJson; + if (data instanceof String) dataJson = StringUtil.replace((String) data); + else { + dataJson = StringUtil.replace(new GsonBuilder().disableHtmlEscaping().create().toJson(data)); + } + saveDataJson(NAME, SCREEN_NEW_SAVER_LIST, dataJson); + } + + public static void saveScreenNewSaverList2(Object data) { + String dataJson; + if (data instanceof String) dataJson = StringUtil.replace((String) data); + else { + dataJson = StringUtil.replace(new GsonBuilder().disableHtmlEscaping().create().toJson(data)); + } + saveDataJson(NAME, SCREEN_NEW_SAVER_LIST2, dataJson); + } + + public static void saveScreenSaver(Object data) { + String dataJson; + if (data instanceof String) dataJson = StringUtil.replace((String) data); + else { + dataJson = StringUtil.replace(new GsonBuilder().disableHtmlEscaping().create().toJson(data)); + } + saveDataJson(NAME, SCREEN_SAVER, dataJson); + } + + public static void saveSubtitleList(Object data) { + String dataJson = new Gson().toJson(data); + saveDataJson(NAME, SUBTITLE, dataJson); + } + + + //获取屏保素材列表 + public static List getScreenSaverList() { + try { + String dataJson = getDataJson(NAME, SCREEN_SAVER_LIST); + List list = new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + return list; + } catch (Throwable t) { + LoggerUtil.e("getScreenSaverList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + //获取屏保素材列表 + public static List getScreenNewSaverList() { + try { + String dataJson = getDataJson(NAME, SCREEN_NEW_SAVER_LIST); + List list = new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + return list; + } catch (Throwable t) { + LoggerUtil.e("getScreenNewSaverList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + //获取屏保素材列表 + public static List getScreenNewSaverList2() { + try { + String dataJson = getDataJson(NAME, SCREEN_NEW_SAVER_LIST2); + List list = new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + return list; + } catch (Throwable t) { + LoggerUtil.e("getScreenNewSaverList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + //获取屏保素材列表 + public static List getScreenSaverList(int type) { + try { + List screenSaverList = getScreenSaverList(); + List result = new ArrayList<>(); +// for (ScreenSaver screenSaver : screenSaverList) { +// if (screenSaver == null || screenSaver.getProType() != type) continue; +// result.add(screenSaver); +// } + return screenSaverList; + } catch (Throwable t) { + LoggerUtil.e("getScreenSaverList", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static String getScreenSaverListJson() { + try { + String dataJson = getDataJson(NAME, SCREEN_SAVER_LIST); + return dataJson; + } catch (Throwable t) { + LoggerUtil.e("getScreenSaverList", StringUtil.getThrowableStr(t)); + return ""; + } + } + public static String getScreenNewSaverListJson() { + try { + String dataJson = getDataJson(NAME, SCREEN_NEW_SAVER_LIST); + return dataJson; + } catch (Throwable t) { + LoggerUtil.e("getScreenSaverList", StringUtil.getThrowableStr(t)); + return ""; + } + } + + //获取跳转屏保界面时间 + public static ScreenSaverTime getScreenSaver() { + try { + String dataJson = getDataJson(NAME, SCREEN_SAVER, "{}"); + return new Gson().fromJson(dataJson, ScreenSaverTime.class); + } catch (Throwable t) { + LoggerUtil.e("getScreenSaver", StringUtil.getThrowableStr(t)); + return null; + } + } + + //获取插播列表 + public static List getSubtitleList() { + try { + String dataJson = getDataJson(NAME, SUBTITLE); + return new Gson().fromJson(dataJson, new TypeToken>() { + }.getType()); + } catch (Throwable t) { + LoggerUtil.e("getSubtitle", StringUtil.getThrowableStr(t)); + return new ArrayList<>(); + } + } + + public static List getSubtitleList(int location) { + List result = new ArrayList<>(); + if(getSubtitleList()==null){ + return result; + } + for (Subtitle subtitle : getSubtitleList()) { + if (subtitle == null) continue; + if (location != subtitle.getNewsLoca()) continue; + result.add(subtitle); + } + return result; + } + + /** + * 判断是否有节目 + * */ + public static boolean isProgramList(){ + try { + List screenSaverList = getScreenSaverList(); + if(screenSaverList.size()<=0){ + return false; + } + if(screenSaverList.get(0).getSchedule().size()<=0){ + return false; + } + + return true; + }catch (Exception e){ + return false; + } + + } + + /** + * 判断是否有节目正在播放 + * */ + public static boolean isProgramPlay(){ + List screenSaverList = getScreenNewSaverList2(); + if(screenSaverList == null || screenSaverList.size()<=0){ + return false; + } + if(screenSaverList.get(0).getSchedule().size()<=0){ + return false; + } + + boolean isPlay = false; + for(NewProgramBean.schedule schedule : screenSaverList.get(0).getSchedule()){ + long currentlong = System.currentTimeMillis(); + String currentDate = TimeUtil.stampToDate(currentlong); + long beginTimeLong = TimeUtil.stringToLong(currentDate+" "+schedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + long endTimeLong = TimeUtil.stringToLong(currentDate+" "+schedule.getEndTime(), "yyyy-MM-dd HH:mm:ss");//结束时间 + + if(currentlong > beginTimeLong && currentlong < endTimeLong ){ + + //有日程正在播放 + isPlay = true; + + break; + + } + } + + return isPlay; + } + + /** + * 判断是否有节目正在播放 + * */ + public static boolean isProgramPlay2(){ + List screenSaverList = getScreenNewSaverList(); + if(screenSaverList == null || screenSaverList.size()<=0){ + return false; + } + if(screenSaverList.get(0).getSchedule().size()<=0){ + return false; + } + + boolean isPlay = false; + for(NewProgramBean.schedule schedule : screenSaverList.get(0).getSchedule()){ + long currentlong = System.currentTimeMillis(); + String currentDate = TimeUtil.stampToDate(currentlong); + long beginTimeLong = TimeUtil.stringToLong(currentDate+" "+schedule.getBeginTime(), "yyyy-MM-dd HH:mm:ss");//开始时间 + long endTimeLong = TimeUtil.stringToLong(currentDate+" "+schedule.getEndTime(), "yyyy-MM-dd HH:mm:ss");//结束时间 + + if(currentlong > beginTimeLong && currentlong < endTimeLong ){ + + //有日程正在播放 + isPlay = true; + + break; + + } + } + + return isPlay; + } + + //获取屏保 + public static void getProgramList(QueryPreparedListener preparedListener, QueryFinishListener finishListener, Map bigFiles) { + if (preparedListener != null) preparedListener.onPrepared(); + + RetrofitUtil.getBaseService().getprogram( DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE) ).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + + if (StringUtil.respSuccess(response.body())) { + + String decryptdataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); +// Log.e("TAG","信发解密:"+decryptdataJson); + if(decryptdataJson.equals("解密失败")){ + + ScreenSaverData.saveScreenSaverList(response.body().getData()); + String data = GsonUtil.getGson().toJson(response.body().getData()); + getImgUrl(bigFiles, data,"/iotFile"); + }else { + + ScreenSaverData.saveScreenSaverList(decryptdataJson); + String data = decryptdataJson; + getImgUrl(bigFiles, data,"/iotFile"); + } + + // ScreenSaverData.saveScreenSaverList(response.body().getData()); +// String data = GsonUtil.getGson().toJson(response.body().getData()); +// getImgUrl(bigFiles, data,"/iotFile"); + } + + } catch (Throwable t) { + LoggerUtil.e("queryScreenProgramList", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("queryScreenProgramList",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + + //获取屏保 + public static void getProgramList2(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + + RetrofitUtil.getBaseService().getprogram( DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE) ).enqueue(new Callback() { + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + + String decryptdataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); +// Log.e("TAG","信发解密:"+decryptdataJson); + if(decryptdataJson.equals("解密失败")){ + ScreenSaverData.saveScreenNewSaverList2(response.body().getData()); + + }else { + ScreenSaverData.saveScreenNewSaverList2(decryptdataJson); + } + } + + } catch (Throwable t) { + LoggerUtil.e("queryScreenProgramList", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("queryScreenProgramList",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * + * 获取图片路径 + * data 数据 + * params 条件 + * */ + public static void getImgUrl(Map bigFiles, String data, String params){ + + //判断是否字符串是否存在子字符,>0 存在的位置 -1不存在 + while (data.indexOf(params)>0){ + String substring1 = data.substring(data.indexOf(params)); + int i1 = substring1.indexOf("\"");//通过最后双引号判断结束点 + String substring2 = substring1.substring(0, i1); +// Log.e("TAG","截取:"+substring2); + bigFiles.put(substring2,substring2); + data=substring1.substring(i1); + } + } + + //获取屏保倒计时 + public static void queryScreensaver(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + String mallCode = FloorData.getMallCode(); + String code = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + RetrofitUtil.getBaseService().getProtection(mallCode,code).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + if (StringUtil.respSuccess(response.body())) { + Log.e("TAG","获取屏保倒计时"+ new Gson().toJson(response.body())); + String decryptDataJson =AesUtil.decrypt((String.valueOf(response.body().getData()))); + if(decryptDataJson.equals("解密失败")){ + Object data = response.body().getData(); + ScreenSaverData.saveScreenSaver(data); + }else { + ScreenSaverData.saveScreenSaver(decryptDataJson); + } + +// Object data = response.body().getData(); +// ScreenSaverData.saveScreenSaver(data); + } + } catch (Throwable t) { + LoggerUtil.e("queryScreensaver()", StringUtil.getThrowableStr(t)); + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("queryScreensaver",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 上传屏保素材播放记录 + * */ + public static void uploadPlayRecord(String performance, String duration , QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + + Map params = new HashMap<>(); + params.put("deviceCode", DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE)); + params.put("projectCode", FloorData.getMallCode()); + params.put("tag", "performance"); + params.put("performanceCode", performance);//节目编号 + params.put("duration", duration); + + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), new Gson().toJson(params)); + RetrofitUtil.getBaseService().programUpload(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public static void getGetData(Context context, String url, String fileName, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + +// AsyncHttpClient client = new AsyncHttpClient(); + AsyncHttpClient client; + if(url.contains("https")){ + client = new AsyncHttpClient(true, 80, 443); + }else { + client = new AsyncHttpClient(); + } + client.setTimeout(30000); + client.setMaxRetriesAndTimeout(0, 20000); + + client.get( context, url ,new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + + try { + if (responseBody!=null) { + String response = new String(responseBody).replace("\\\\", "/"); + Log.e("水牌数据",response); +// if(fileName.contains(".json")){ +// FileUtil.writeTxtToFile(response, Constant.CACHE_PATH+"dist/static/offline/JSON/", fileName); +// }else { +// FileUtil.writeTxtToFile(response, Constant.CACHE_PATH+"dist/static/offline/JSON/", fileName+".json"); +// } + + Resp resp = new Gson().fromJson(response, new TypeToken() {}.getType()); + if (resp.getCode() == 200) { + + String filePath = StringUtil.strSplice(Constant.CACHE_PATH, "dist/static/offline/JSON/", fileName, ".json"); + String decryptDataJson =AesUtil.decrypt((String.valueOf(resp.getData()))); + if(decryptDataJson.equals("解密失败")|| decryptDataJson.isEmpty()){ + FileUtil.writeDataToFile(response, filePath, false); + }else { + try { + JSONObject entries = JSONUtil.parseObj(decryptDataJson); + resp.setData(entries); + }catch (Exception e){ + JSONArray entries = JSONUtil.parseArray(decryptDataJson); + resp.setData(entries); + } + String s = GsonUtil.getGson().toJson(resp); + FileUtil.writeDataToFile(s, filePath, false); + + } + +// FileUtil.writeDataToFile(response, filePath, false); +// if(fileName.equals("getDevCoordinateByIP")){ +// +// LoggerUtil.e("getDevCoordinateByIP()",response); +// //保存科大讯飞地址 +// saveKDXFData(response); +// } + }else { + LoggerUtil.e("水牌接口报错:"+url, response); + } + + + } + + } catch (Throwable t) { + LoggerUtil.e("getGetData():"+fileName, StringUtil.getThrowableStr(t)); + + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + LoggerUtil.e("getGetData():"+fileName, StringUtil.getThrowableStr(error)); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + public static void getApiFileResourceList(Context context, String url, QueryPreparedListener preparedListener, QueryFinishListener finishListener, Map bigFiles) { + if (preparedListener != null) preparedListener.onPrepared(); + + AsyncHttpClient client = new AsyncHttpClient(); + + client.get( context, url ,new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + + try { + if (responseBody!=null) { + String response = new String(responseBody).replace("\\\\", "/"); + Log.e("地图组件资源列表数据",response); + MapDataListBean mapDataListBean = GsonUtil.getGson().fromJson(response, new TypeToken() {}.getType()); + + for (ResourceFileBean bean : mapDataListBean.getData()){ + bigFiles.put(bean.getUrl(),StringUtil.strSplice("dist", "/static/offline/", bean.getUrl())) ; + + } + + } + + } catch (Throwable t) { + + + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } + + /** + * 获取地图组件接口列表 + * */ + public static void getGetMapData(Context context, String url, QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + + AsyncHttpClient client = new AsyncHttpClient(); + + client.get( context, url ,new AsyncHttpResponseHandler() { + @Override + public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { + + try { + if (responseBody!=null) { + String response = new String(responseBody).replace("\\\\", "/"); + Log.e("地图组件列表数据",response); + ShuipaiDataListBean shuipaiDataListBean = GsonUtil.getGson().fromJson(response, new TypeToken() {}.getType()); + List InterFaceList = shuipaiDataListBean.getData(); + for(InterFaceBean interFacebean: InterFaceList ){ + if(interFacebean.getInterfaceName().equals("GetDevCoordinateByIP")){ + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null,new QueryFinishListener(){ + @Override + public void onFinish() { + + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl()+DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + + } + }); + } + }else { + if(interFacebean.getInterfaceUrl().contains("http")||interFacebean.getInterfaceUrl().contains("https")){ + ScreenSaverData.getGetData(context,interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + + } + }); + }else { + ScreenSaverData.getGetData(context,Constant.getBaseAddress()+interFacebean.getInterfaceUrl(),interFacebean.getInterfaceName(),null ,new QueryFinishListener(){ + @Override + public void onFinish() { + + } + }); + } + } + } + } + + } catch (Throwable t) { + + + } + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { + + if (finishListener != null) finishListener.onFinish(); + } + }); + } + +} diff --git a/app/src/main/java/qianmu/container/entity/App.java b/app/src/main/java/qianmu/container/entity/App.java new file mode 100644 index 0000000..d683b40 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/App.java @@ -0,0 +1,143 @@ +package qianmu.container.entity; + + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class App implements Serializable { + + String appID; //小程序AppID + int appType; //应用类型:1、H5 2、小程序 3、安卓 + String code; //唯一编号 + String logo; //应用图标 + String file; //应用安装包 + String name; //应用名称 + String nameEn; //应用英文名称 + String packageName; //应用包名 + String platformType; //平台类型:1、Windows 2、安卓 + String startup; //启动项 + @SerializedName("default") + boolean def; //前端默认软件 + String shelfTime; //下架时间 + String version; //版本号 + boolean frontApp; + + public App(String name, String packageName, String version) { + this.name = name; + this.packageName = packageName; + this.version = version; + } + + public String getAppID() { + return appID; + } + + public void setAppID(String appID) { + this.appID = appID; + } + + public int getAppType() { + return appType; + } + + public void setAppType(int appType) { + this.appType = appType; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLogo() { + return logo; + } + + public void setLogo(String logo) { + this.logo = logo; + } + + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNameEn() { + return nameEn; + } + + public void setNameEn(String nameEn) { + this.nameEn = nameEn; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getPlatformType() { + return platformType; + } + + public void setPlatformType(String platformType) { + this.platformType = platformType; + } + + public String getStartup() { + return startup; + } + + public void setStartup(String startup) { + this.startup = startup; + } + + public boolean isDef() { + return def; + } + + public void setDef(boolean def) { + this.def = def; + } + + public String getShelfTime() { + return shelfTime; + } + + public void setShelfTime(String shelfTime) { + this.shelfTime = shelfTime; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public boolean isFrontApp() { + return frontApp; + } + + public void setFrontApp(boolean frontApp) { + this.frontApp = frontApp; + } +} diff --git a/app/src/main/java/qianmu/container/entity/AppListResult.java b/app/src/main/java/qianmu/container/entity/AppListResult.java new file mode 100644 index 0000000..61cfc30 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/AppListResult.java @@ -0,0 +1,25 @@ +package qianmu.container.entity; + +import java.util.List; + +public class AppListResult { + + List appList; + List appTime; + + public List getApList() { + return appList; + } + + public void setApList(List appList) { + this.appList = appList; + } + + public List getAppTime() { + return appTime; + } + + public void setAppTime(List appTime) { + this.appTime = appTime; + } +} diff --git a/app/src/main/java/qianmu/container/entity/AppTime.java b/app/src/main/java/qianmu/container/entity/AppTime.java new file mode 100644 index 0000000..d840ab1 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/AppTime.java @@ -0,0 +1,38 @@ +package qianmu.container.entity; + +public class AppTime { + + /** + * appCode : 5f244bae-29b8-420b-ac09-84a8a5eca041 + * beginTimeSlot : 12:00 + * endTimeSlot : 13:00 + */ + + private String appCode; + private String beginTimeSlot; + private String endTimeSlot; + + public String getAppCode() { + return appCode; + } + + public void setAppCode(String appCode) { + this.appCode = appCode; + } + + public String getBeginTimeSlot() { + return beginTimeSlot; + } + + public void setBeginTimeSlot(String beginTimeSlot) { + this.beginTimeSlot = beginTimeSlot; + } + + public String getEndTimeSlot() { + return endTimeSlot; + } + + public void setEndTimeSlot(String endTimeSlot) { + this.endTimeSlot = endTimeSlot; + } +} diff --git a/app/src/main/java/qianmu/container/entity/AppVersion.java b/app/src/main/java/qianmu/container/entity/AppVersion.java new file mode 100644 index 0000000..6e597e6 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/AppVersion.java @@ -0,0 +1,25 @@ +package qianmu.container.entity; + +/** + * 软件版本实体类 + * Created by genglaixin on 2018/6/19. + */ +public class AppVersion { + String container; + String information; + public String getContainer() { + return container; + } + + public void setContainer(String container) { + this.container = container; + } + + public String getInformation() { + return information; + } + + public void setInformation(String information) { + this.information = information; + } +} diff --git a/app/src/main/java/qianmu/container/entity/AppVersionBean.java b/app/src/main/java/qianmu/container/entity/AppVersionBean.java new file mode 100644 index 0000000..06de11c --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/AppVersionBean.java @@ -0,0 +1,49 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2023/5/16 + * Time: 9:23 + */ +public class AppVersionBean implements Serializable { + + String appVersion;//app版本 + String appPackageUrl; + String programVersion;//应用版本 + String programPackageUrl; + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public String getAppPackageUrl() { + return appPackageUrl; + } + + public void setAppPackageUrl(String appPackageUrl) { + this.appPackageUrl = appPackageUrl; + } + + public String getProgramVersion() { + return programVersion; + } + + public void setProgramVersion(String programVersion) { + this.programVersion = programVersion; + } + + public String getProgramPackageUrl() { + return programPackageUrl; + } + + public void setProgramPackageUrl(String programPackageUrl) { + this.programPackageUrl = programPackageUrl; + } +} diff --git a/app/src/main/java/qianmu/container/entity/Building.java b/app/src/main/java/qianmu/container/entity/Building.java new file mode 100644 index 0000000..f982d8e --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Building.java @@ -0,0 +1,160 @@ +package qianmu.container.entity; + + +import androidx.annotation.NonNull; + +import java.io.Serializable; +import java.util.List; + +/** + * 楼栋实体 + * Created by Administrator on 2017/11/6. + */ +public class Building { + + private String code; + private String name; + private List floor; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public List getFloor() { + return floor; + } + + public void setFloor(List floor) { + this.floor = floor; + } + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * 楼层实体 + */ + public static class Floor implements Comparable { + +// code 楼层code +// floorName 楼层名称 +// order 楼层排序 + + private String name; + private String code; + private int order; + + private List machine;//机器属性 + + public Floor() { + + } + + public Floor(String code, String floorName) { + this.code = code; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(@NonNull Floor floorBean) { + return this.order - floorBean.order; + } + + public List getMachine() { + return machine; + } + + public void setMachine(List machine) { + this.machine = machine; + } + } + + + + /** + * 楼层实体 + */ + public static class Machine implements Serializable { + + private String name; + private String code; + private int order; + private String machineTypeName;//导视 信发 游戏 + private int attribute;// 0触摸 1非触摸 + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public String getMachineTypeName() { + return machineTypeName; + } + + public void setMachineTypeName(String machineTypeName) { + this.machineTypeName = machineTypeName; + } + + public int getAttribute() { + return attribute; + } + + public void setAttribute(int attribute) { + this.attribute = attribute; + } + } + + +} diff --git a/app/src/main/java/qianmu/container/entity/Device.java b/app/src/main/java/qianmu/container/entity/Device.java new file mode 100644 index 0000000..5882011 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Device.java @@ -0,0 +1,117 @@ +package qianmu.container.entity; + +import com.google.gson.annotations.SerializedName; + +public class Device { + + @SerializedName("devNum") + private String deviceName; + @SerializedName("yaxis") + private String position; + private String angle; + private String defaultPic; + + private String hostName; + private String password; + private int port; + private String userName; + private String code; + private String ip; + private Object shutdownTime; + private String city; + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getAngle() { + return angle; + } + + public void setAngle(String angle) { + this.angle = angle; + } + + public String getDefaultPic() { + return defaultPic; + } + + public void setDefaultPic(String defaultPic) { + this.defaultPic = defaultPic; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public Object getShutdownTime() { + return shutdownTime; + } + + public void setShutdownTime(Object shutdownTime) { + this.shutdownTime = shutdownTime; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } +} diff --git a/app/src/main/java/qianmu/container/entity/DeviceBean.java b/app/src/main/java/qianmu/container/entity/DeviceBean.java new file mode 100644 index 0000000..894a9e9 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/DeviceBean.java @@ -0,0 +1,158 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2025/3/31 + * Time: 11:15 + */ +public class DeviceBean implements Serializable { + + String hint_server_ip; + String hint_device_code; + String floor_name; + String hint_device_touch; + String hint_device_name; + String hint_reg_key; + String hint_device_ip; + String download_ip; + String hint_sync_test; + String building_name; + String hint_device_type; + String device_restart_time; + String building_code; + String floor_code; + //MQTT + String server; + String port; + + public String getHint_server_ip() { + return hint_server_ip; + } + + public void setHint_server_ip(String hint_server_ip) { + this.hint_server_ip = hint_server_ip; + } + + public String getHint_device_code() { + return hint_device_code; + } + + public void setHint_device_code(String hint_device_code) { + this.hint_device_code = hint_device_code; + } + + public String getFloor_name() { + return floor_name; + } + + public void setFloor_name(String floor_name) { + this.floor_name = floor_name; + } + + public String getHint_device_touch() { + return hint_device_touch; + } + + public void setHint_device_touch(String hint_device_touch) { + this.hint_device_touch = hint_device_touch; + } + + public String getHint_device_name() { + return hint_device_name; + } + + public void setHint_device_name(String hint_device_name) { + this.hint_device_name = hint_device_name; + } + + public String getHint_reg_key() { + return hint_reg_key; + } + + public void setHint_reg_key(String hint_reg_key) { + this.hint_reg_key = hint_reg_key; + } + + public String getHint_device_ip() { + return hint_device_ip; + } + + public void setHint_device_ip(String hint_device_ip) { + this.hint_device_ip = hint_device_ip; + } + + public String getDownload_ip() { + return download_ip; + } + + public void setDownload_ip(String download_ip) { + this.download_ip = download_ip; + } + + public String getHint_sync_test() { + return hint_sync_test; + } + + public void setHint_sync_test(String hint_sync_test) { + this.hint_sync_test = hint_sync_test; + } + + public String getBuilding_name() { + return building_name; + } + + public void setBuilding_name(String building_name) { + this.building_name = building_name; + } + + public String getHint_device_type() { + return hint_device_type; + } + + public void setHint_device_type(String hint_device_type) { + this.hint_device_type = hint_device_type; + } + + public String getDevice_restart_time() { + return device_restart_time; + } + + public void setDevice_restart_time(String device_restart_time) { + this.device_restart_time = device_restart_time; + } + + public String getBuilding_code() { + return building_code; + } + + public void setBuilding_code(String building_code) { + this.building_code = building_code; + } + + public String getFloor_code() { + return floor_code; + } + + public void setFloor_code(String floor_code) { + this.floor_code = floor_code; + } + + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } +} diff --git a/app/src/main/java/qianmu/container/entity/DeviceOption.java b/app/src/main/java/qianmu/container/entity/DeviceOption.java new file mode 100644 index 0000000..2bb62d1 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/DeviceOption.java @@ -0,0 +1,37 @@ +package qianmu.container.entity; + +import java.util.List; + +/** + * 楼层数据 + * */ +public class DeviceOption { + + String projectName;//商场名称 + String projectCode; + List building;//楼栋 + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getProjectCode() { + return projectCode; + } + + public void setProjectCode(String projectCode) { + this.projectCode = projectCode; + } + + public List getBuilding() { + return building; + } + + public void setBuilding(List building) { + this.building = building; + } +} diff --git a/app/src/main/java/qianmu/container/entity/Dict.java b/app/src/main/java/qianmu/container/entity/Dict.java new file mode 100644 index 0000000..cbc4bb6 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Dict.java @@ -0,0 +1,37 @@ +package qianmu.container.entity; + +/** + * 字典实体 + * Created by genglaixin on 2018/8/23. + */ + +public class Dict { + + int id; + String code; + String dictValue; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDictValue() { + return dictValue; + } + + public void setDictValue(String dictValue) { + this.dictValue = dictValue; + } +} diff --git a/app/src/main/java/qianmu/container/entity/FacilitiesBean.java b/app/src/main/java/qianmu/container/entity/FacilitiesBean.java new file mode 100644 index 0000000..f5c1027 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/FacilitiesBean.java @@ -0,0 +1,123 @@ +package qianmu.container.entity; + +import android.widget.ImageView; +import android.widget.TextView; + +import com.airbnb.lottie.LottieAnimationView; + +import java.io.Serializable; +import java.util.List; + +import qianmu.container.view.MarqueeTextView2; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/11/22 + * Time: 11:23 + *设施图标 + */ +public class FacilitiesBean implements Serializable { + int position; + String type; + ImageView imageView; + LottieAnimationView LottieView; + private int fontSize; + private int height; + private int width; + MarqueeTextView2 textView; + TextView textView2; + private int transitionPeriod;//图片切换时间间隔 + List materials; + + public int getFontSize() { + return fontSize; + } + + public void setFontSize(int fontSize) { + this.fontSize = fontSize; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getTransitionPeriod() { + return transitionPeriod; + } + + public void setTransitionPeriod(int transitionPeriod) { + this.transitionPeriod = transitionPeriod; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public MarqueeTextView2 getTextView() { + return textView; + } + + public void setTextView(MarqueeTextView2 textView) { + this.textView = textView; + } + + public TextView getTextView2() { + return textView2; + } + + public void setTextView2(TextView textView2) { + this.textView2 = textView2; + } + + public ImageView getImageView() { + return imageView; + } + + public void setImageView(ImageView imageView) { + this.imageView = imageView; + } + + public LottieAnimationView getLottieView() { + return LottieView; + } + + public void setLottieView(LottieAnimationView lottieView) { + LottieView = lottieView; + } + + public List getMaterials() { + return materials; + } + + public void setMaterials(List materials) { + this.materials = materials; + } + + + +} diff --git a/app/src/main/java/qianmu/container/entity/InterFaceBean.java b/app/src/main/java/qianmu/container/entity/InterFaceBean.java new file mode 100644 index 0000000..2b4ebc4 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/InterFaceBean.java @@ -0,0 +1,93 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2020/9/22 + * Time: 11:27 + */ +public class InterFaceBean implements Serializable { + private int interfaceID; + private String code; + private String interfaceName; + private String interfaceDescription;//介绍 + private String interfaceUrl;//地址 + private String interfaceParams;//参数 + private String interfaceMethod;//接口方式 Get Post + private String addTime; + private String fileName;//文件名称 + + public int getInterfaceID() { + return interfaceID; + } + + public void setInterfaceID(int interfaceID) { + this.interfaceID = interfaceID; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getInterfaceName() { + return interfaceName; + } + + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getInterfaceDescription() { + return interfaceDescription; + } + + public void setInterfaceDescription(String interfaceDescription) { + this.interfaceDescription = interfaceDescription; + } + + public String getInterfaceUrl() { + return interfaceUrl; + } + + public void setInterfaceUrl(String interfaceUrl) { + this.interfaceUrl = interfaceUrl; + } + + public String getInterfaceParams() { + return interfaceParams; + } + + public void setInterfaceParams(String interfaceParams) { + this.interfaceParams = interfaceParams; + } + + public String getInterfaceMethod() { + return interfaceMethod; + } + + public void setInterfaceMethod(String interfaceMethod) { + this.interfaceMethod = interfaceMethod; + } + + public String getAddTime() { + return addTime; + } + + public void setAddTime(String addTime) { + this.addTime = addTime; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } +} diff --git a/app/src/main/java/qianmu/container/entity/JxbBean.java b/app/src/main/java/qianmu/container/entity/JxbBean.java new file mode 100644 index 0000000..0a2d5d8 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/JxbBean.java @@ -0,0 +1,140 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2025/4/11 + * Time: 17:18 + * 机械臂 + */ +public class JxbBean implements Serializable { + int id; + String code; + int status; + int playWay; + String oneText; + String twoText; + String deviceCode; + String type; + String typeAbbreviation; + int floorOrder; + int buildingOrder; + String name; + int angle;//角度 + int cost;//距离 + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getPlayWay() { + return playWay; + } + + public void setPlayWay(int playWay) { + this.playWay = playWay; + } + + public String getOneText() { + return oneText; + } + + public void setOneText(String oneText) { + this.oneText = oneText; + } + + public String getTwoText() { + return twoText; + } + + public void setTwoText(String twoText) { + this.twoText = twoText; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTypeAbbreviation() { + return typeAbbreviation; + } + + public void setTypeAbbreviation(String typeAbbreviation) { + this.typeAbbreviation = typeAbbreviation; + } + + public int getFloorOrder() { + return floorOrder; + } + + public void setFloorOrder(int floorOrder) { + this.floorOrder = floorOrder; + } + + public int getBuildingOrder() { + return buildingOrder; + } + + public void setBuildingOrder(int buildingOrder) { + this.buildingOrder = buildingOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAngle() { + return angle; + } + + public void setAngle(int angle) { + this.angle = angle; + } + + public int getCost() { + return cost; + } + + public void setCost(int cost) { + this.cost = cost; + } + +} diff --git a/app/src/main/java/qianmu/container/entity/KdxfBean.java b/app/src/main/java/qianmu/container/entity/KdxfBean.java new file mode 100644 index 0000000..6312a80 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/KdxfBean.java @@ -0,0 +1,131 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2023/8/10 + * Time: 9:22 + * 科大讯飞地址 + */ +public class KdxfBean implements Serializable { + String code; + String msg; + data data; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public KdxfBean.data getData() { + return data; + } + + public void setData(KdxfBean.data data) { + this.data = data; + } + + public class data implements Serializable{ + + String deployType;//类型local , saas + String xfyunIp; + String xfyunPort; + controlInfo controlInfo;//机械臂信息 + + public String getDeployType() { + return deployType; + } + + public void setDeployType(String deployType) { + this.deployType = deployType; + } + + public String getXfyunIp() { + return xfyunIp; + } + + public void setXfyunIp(String xfyunIp) { + this.xfyunIp = xfyunIp; + } + + public String getXfyunPort() { + return xfyunPort; + } + + public void setXfyunPort(String xfyunPort) { + this.xfyunPort = xfyunPort; + } + + public KdxfBean.controlInfo getControlInfo() { + return controlInfo; + } + + public void setControlInfo(KdxfBean.controlInfo controlInfo) { + this.controlInfo = controlInfo; + } + } + + //机械臂信息 + public class controlInfo implements Serializable{ + + String interimText;//过度文字 + String openText;//开机文字 + int angle;//修正角度 + int masterArm;//机械臂1、2、3 + int rotationTime;//间隔时间 + + public String getInterimText() { + return interimText; + } + + public void setInterimText(String interimText) { + this.interimText = interimText; + } + + public String getOpenText() { + return openText; + } + + public void setOpenText(String openText) { + this.openText = openText; + } + + public int getAngle() { + return angle; + } + + public void setAngle(int angle) { + this.angle = angle; + } + + public int getMasterArm() { + return masterArm; + } + + public void setMasterArm(int masterArm) { + this.masterArm = masterArm; + } + + public int getRotationTime() { + return rotationTime; + } + + public void setRotationTime(int rotationTime) { + this.rotationTime = rotationTime; + } + } + +} diff --git a/app/src/main/java/qianmu/container/entity/MapDataListBean.java b/app/src/main/java/qianmu/container/entity/MapDataListBean.java new file mode 100644 index 0000000..0436136 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MapDataListBean.java @@ -0,0 +1,23 @@ +package qianmu.container.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/10/17 + * Time: 10:46 + */ +public class MapDataListBean implements Serializable { + + private List data; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/app/src/main/java/qianmu/container/entity/MaterialsBean.java b/app/src/main/java/qianmu/container/entity/MaterialsBean.java new file mode 100644 index 0000000..9f14678 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MaterialsBean.java @@ -0,0 +1,94 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/11/23 + * Time: 10:13 + */ +public class MaterialsBean implements Serializable { + + private int order; + private String materialCode; + private String fileUrl; + private String text;//文本组件使用,文本内容 + private int fileLength;//文件大小 + private String fileHash; + private int duration; //时长 + private String name; //格式 + + private NewProgramBean.mediaInfo mediaInfo; + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public int getFileLength() { + return fileLength; + } + + public void setFileLength(int fileLength) { + this.fileLength = fileLength; + } + + public String getFileHash() { + return fileHash; + } + + public void setFileHash(String fileHash) { + this.fileHash = fileHash; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public NewProgramBean.mediaInfo getMediaInfo() { + return mediaInfo; + } + + public void setMediaInfo(NewProgramBean.mediaInfo mediaInfo) { + this.mediaInfo = mediaInfo; + } +} diff --git a/app/src/main/java/qianmu/container/entity/MessageEvent.java b/app/src/main/java/qianmu/container/entity/MessageEvent.java new file mode 100644 index 0000000..1c4ead1 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MessageEvent.java @@ -0,0 +1,49 @@ +package qianmu.container.entity; + +/** + * eventBus实体类 + * Created by Administrator on 2018/4/8. + */ +public class MessageEvent { + + String code; + String data; + int integer; + + public MessageEvent() { + + } + + public MessageEvent(String code) { + this.code = code; + } + + public MessageEvent(String code, String data) { + this.code = code; + this.data = data; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public int getInteger() { + return integer; + } + + public void setInteger(int integer) { + this.integer = integer; + } +} diff --git a/app/src/main/java/qianmu/container/entity/MqttInfoBean.java b/app/src/main/java/qianmu/container/entity/MqttInfoBean.java new file mode 100644 index 0000000..7cab831 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MqttInfoBean.java @@ -0,0 +1,30 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/5/31 + * Time: 15:26 + */ +public class MqttInfoBean implements Serializable { + String server; + String port; + + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } +} diff --git a/app/src/main/java/qianmu/container/entity/MqttTokenBean.java b/app/src/main/java/qianmu/container/entity/MqttTokenBean.java new file mode 100644 index 0000000..3e4f685 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MqttTokenBean.java @@ -0,0 +1,22 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/5/31 + * Time: 15:26 + */ +public class MqttTokenBean implements Serializable { + + String password; + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/app/src/main/java/qianmu/container/entity/MusicBean.java b/app/src/main/java/qianmu/container/entity/MusicBean.java new file mode 100644 index 0000000..6bb352e --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/MusicBean.java @@ -0,0 +1,44 @@ +package qianmu.container.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/1/6 + * Time: 17:02 + */ +public class MusicBean implements Serializable { + + private List soundFiles; + + public List getSoundFiles() { + return soundFiles; + } + + public void setSoundFiles(List soundFiles) { + this.soundFiles = soundFiles; + } + + public class soundFiles{ + private String url; + private String musicName; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getMusicName() { + return musicName; + } + + public void setMusicName(String musicName) { + this.musicName = musicName; + } + } +} diff --git a/app/src/main/java/qianmu/container/entity/NewProgramBean.java b/app/src/main/java/qianmu/container/entity/NewProgramBean.java new file mode 100644 index 0000000..bf5b0b0 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/NewProgramBean.java @@ -0,0 +1,646 @@ +package qianmu.container.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/4/1 + * Time: 15:16 + */ +public class NewProgramBean implements Serializable { + + public String date; //2021-04-21 + public List schedule; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public List getSchedule() { + return schedule; + } + + public void setSchedule(List schedule) { + this.schedule = schedule; + } + + public class schedule{ + private String beginTime; + private String endTime; + private List programs;//节目单 + + public String getBeginTime() { + return beginTime; + } + + public void setBeginTime(String beginTime) { + this.beginTime = beginTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public List getPrograms() { + return programs; + } + + public void setPrograms(List programs) { + this.programs = programs; + } + } + + + public class programs implements Serializable{ + private String code; + private String name; + private String resolution;//屏幕信息 + private String duration;// 间隔时间 + private String backgroundColor; // rgba(64, 127, 228, 1) + private String backgroundMaterial; // 背景url路径 + private List components; //控件列表 + private int screenCount; //屏幕数量 + private List screenList; //双面屏 + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getResolution() { + return resolution; + } + + public void setResolution(String resolution) { + this.resolution = resolution; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public String getBackgroundColor() { + return backgroundColor; + } + + public void setBackgroundColor(String backgroundColor) { + this.backgroundColor = backgroundColor; + } + + public List getComponents() { + return components; + } + + public void setComponents(List components) { + this.components = components; + } + + public String getBackgroundMaterial() { + return backgroundMaterial; + } + + public void setBackgroundMaterial(String backgroundMaterial) { + this.backgroundMaterial = backgroundMaterial; + } + + public int getScreenCount() { + return screenCount; + } + + public void setScreenCount(int screenCount) { + this.screenCount = screenCount; + } + + public List getScreenList() { + return screenList; + } + + public void setScreenList(List screenList) { + this.screenList = screenList; + } + } + + + + public class backgroundMaterialInfo implements Serializable { + + String filePath; + String fileHash; + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileHash() { + return fileHash; + } + + public void setFileHash(String fileHash) { + this.fileHash = fileHash; + } + } + + + public class components implements Serializable{ + + private String code; + private String programmeCode; + private String addTime; + private int height; + private int width; + private int offsetX; + private int offsetY; + private int zIndex; + private String typeCode;//组件类型 video weather text image + private config config;// + private List materials;//节目列表 + private List subComponents; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getProgrammeCode() { + return programmeCode; + } + + public void setProgrammeCode(String programmeCode) { + this.programmeCode = programmeCode; + } + + public String getAddTime() { + return addTime; + } + + public void setAddTime(String addTime) { + this.addTime = addTime; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getOffsetX() { + return offsetX; + } + + public void setOffsetX(int offsetX) { + this.offsetX = offsetX; + } + + public int getOffsetY() { + return offsetY; + } + + public void setOffsetY(int offsetY) { + this.offsetY = offsetY; + } + + public int getzIndex() { + return zIndex; + } + + public void setzIndex(int zIndex) { + this.zIndex = zIndex; + } + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode(String typeCode) { + this.typeCode = typeCode; + } + + public config getConfig() { + return config; + } + + public void setConfig(config config) { + this.config = config; + } + + public List getMaterials() { + return materials; + } + + public void setMaterials(List materials) { + this.materials = materials; + } + + public List getSubComponents() { + return subComponents; + } + + public void setSubComponents(List subComponents) { + this.subComponents = subComponents; + } + } + + /** + * 子组件 + * */ + public class subComponents implements Serializable{ + + private String code; + private String programmeCode; + private String addTime; + private int height; + private int width; + private int offsetX; + private int offsetY; + private int zIndex; + private String typeCode;//组件类型 video weather text + private config config;// + private List materials;//节目列表 + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getProgrammeCode() { + return programmeCode; + } + + public void setProgrammeCode(String programmeCode) { + this.programmeCode = programmeCode; + } + + public String getAddTime() { + return addTime; + } + + public void setAddTime(String addTime) { + this.addTime = addTime; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getOffsetX() { + return offsetX; + } + + public void setOffsetX(int offsetX) { + this.offsetX = offsetX; + } + + public int getOffsetY() { + return offsetY; + } + + public void setOffsetY(int offsetY) { + this.offsetY = offsetY; + } + + public int getzIndex() { + return zIndex; + } + + public void setzIndex(int zIndex) { + this.zIndex = zIndex; + } + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode(String typeCode) { + this.typeCode = typeCode; + } + + public config getConfig() { + return config; + } + + public void setConfig(config config) { + this.config = config; + } + + public List getMaterials() { + return materials; + } + + public void setMaterials(List materials) { + this.materials = materials; + } + } + + public class config implements Serializable{ + private String cityName; + private String components; + private String fontColor; + private int fontSize; + private int style;//时钟跟天气风格 + private String backgroundColor; + private int backgroundOpacity; //透明度 + private String fontStyle;// 正常 + private String transition;//图片切换效果 + private String animation;//文本切换动画 : 从左往右 + private int transitionPeriod;//图片切换时间间隔 + private String animationSpeed;//文本切换速度 : 中等 + private String refreshPeriod;//在线网页刷新时间 00:12:00 + private boolean playAudio;//是否播放声音 + private String imageMove;//是否为动图 + + public String getCityName() { + return cityName; + } + + public void setCityName(String cityName) { + this.cityName = cityName; + } + + public String getComponents() { + return components; + } + + public void setComponents(String components) { + this.components = components; + } + + public String getFontColor() { + return fontColor; + } + + public void setFontColor(String fontColor) { + this.fontColor = fontColor; + } + + + public String getBackgroundColor() { + return backgroundColor; + } + + public void setBackgroundColor(String backgroundColor) { + this.backgroundColor = backgroundColor; + } + + public int getFontSize() { + return fontSize; + } + + public void setFontSize(int fontSize) { + this.fontSize = fontSize; + } + + public int getBackgroundOpacity() { + return backgroundOpacity; + } + + public void setBackgroundOpacity(int backgroundOpacity) { + this.backgroundOpacity = backgroundOpacity; + } + + public String getFontStyle() { + return fontStyle; + } + + public void setFontStyle(String fontStyle) { + this.fontStyle = fontStyle; + } + + public String getTransition() { + return transition; + } + + public void setTransition(String transition) { + this.transition = transition; + } + + public String getAnimation() { + return animation; + } + + public void setAnimation(String animation) { + this.animation = animation; + } + + public int getTransitionPeriod() { + return transitionPeriod; + } + + public void setTransitionPeriod(int transitionPeriod) { + this.transitionPeriod = transitionPeriod; + } + + public String getAnimationSpeed() { + return animationSpeed; + } + + public void setAnimationSpeed(String animationSpeed) { + this.animationSpeed = animationSpeed; + } + + public int getStyle() { + return style; + } + + public void setStyle(int style) { + this.style = style; + } + + public String getRefreshPeriod() { + return refreshPeriod; + } + + public void setRefreshPeriod(String refreshPeriod) { + this.refreshPeriod = refreshPeriod; + } + + public boolean isPlayAudio() { + return playAudio; + } + + public void setPlayAudio(boolean playAudio) { + this.playAudio = playAudio; + } + + public String getImageMove() { + return imageMove; + } + + public void setImageMove(String imageMove) { + this.imageMove = imageMove; + } + } + + + public class materials implements Serializable{ + private int order; + private String materialCode; + private String fileUrl; + private String text; + private String fileHash; + private long fileLength; + private int duration; //时长 + private String name; //格式 + private String outerChain; //在线网页地址 + private String previewUrl; //预览图(视频第一帧) + + private mediaInfo mediaInfo; + public int getOrder() { + return order; + } + + public void setOrder(int order) { + this.order = order; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getFileHash() { + return fileHash; + } + + public void setFileHash(String fileHash) { + this.fileHash = fileHash; + } + + public long getFileLength() { + return fileLength; + } + + public void setFileLength(long fileLength) { + this.fileLength = fileLength; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOuterChain() { + return outerChain; + } + + public void setOuterChain(String outerChain) { + this.outerChain = outerChain; + } + + public String getPreviewUrl() { + return previewUrl; + } + + public void setPreviewUrl(String previewUrl) { + this.previewUrl = previewUrl; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public mediaInfo getMediaInfo() { + return mediaInfo; + } + + public void setMediaInfo(mediaInfo mediaInfo) { + this.mediaInfo = mediaInfo; + } + } + + public class mediaInfo implements Serializable{ + + private String url;//直播地址, 在线网页 + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + +} diff --git a/app/src/main/java/qianmu/container/entity/NovaDeviceBean.java b/app/src/main/java/qianmu/container/entity/NovaDeviceBean.java new file mode 100644 index 0000000..632c84e --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/NovaDeviceBean.java @@ -0,0 +1,33 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2024/9/12 + * Time: 10:21 + * + * 诺瓦设备 + */ +public class NovaDeviceBean implements Serializable { + + String sn; + String ip; + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } +} diff --git a/app/src/main/java/qianmu/container/entity/ResourceFileBean.java b/app/src/main/java/qianmu/container/entity/ResourceFileBean.java new file mode 100644 index 0000000..0c38814 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/ResourceFileBean.java @@ -0,0 +1,30 @@ +package qianmu.container.entity; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/6/30 + * Time: 14:43 + * 资源文件列表 + */ +public class ResourceFileBean { + + String url; + int capacity; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } +} diff --git a/app/src/main/java/qianmu/container/entity/Resp.java b/app/src/main/java/qianmu/container/entity/Resp.java new file mode 100644 index 0000000..cc748ad --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Resp.java @@ -0,0 +1,48 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * 返回数据 + * Created by Administrator on 2017/11/6. + */ + +public class Resp implements Serializable { + + private int code; + private String msg; + private Object data; + private String resultCode; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } +} diff --git a/app/src/main/java/qianmu/container/entity/RespJXB.java b/app/src/main/java/qianmu/container/entity/RespJXB.java new file mode 100644 index 0000000..dbcfb33 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/RespJXB.java @@ -0,0 +1,31 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * 返回数据 + * Created by Administrator on 2017/11/6. + */ + +public class RespJXB implements Serializable { + + private String rtnCode; + private String rtnMsg; + + public String getRtnCode() { + return rtnCode; + } + + public void setRtnCode(String rtnCode) { + this.rtnCode = rtnCode; + } + + public String getRtnMsg() { + return rtnMsg; + } + + public void setRtnMsg(String rtnMsg) { + this.rtnMsg = rtnMsg; + } + +} diff --git a/app/src/main/java/qianmu/container/entity/ScreenSaver.java b/app/src/main/java/qianmu/container/entity/ScreenSaver.java new file mode 100644 index 0000000..b0ddde6 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/ScreenSaver.java @@ -0,0 +1,111 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * 广告屏保 + * Created by Administrator on 2017/11/30. + */ + +public class ScreenSaver implements Serializable { + + private String code; + private int duration; //播放时长 + private int effect;//切换效果 切换效果(1:随机,2:马赛克,3:上下滑动,4:左右滑动,5:渐入) + private int fileType;//文件类型1 图片 2 视频 + private int id;//屏保id + private String img;//图片地址 + private String expiryDate;//下架时间 + private String launchTime;//上架时间 + private int proType; //1:正常屏保 2:插播 + private int time;//切换间隔 + private int capacity;//文件大小 + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public int getDuration() { + return duration; + } + + public void setDuration(int duration) { + this.duration = duration; + } + + public int getEffect() { + return effect; + } + + public void setEffect(int effect) { + this.effect = effect; + } + + public String getExpiryDate() { + return expiryDate; + } + + public void setExpiryDate(String expiryDate) { + this.expiryDate = expiryDate; + } + + public int getFileType() { + return fileType; + } + + public void setFileType(int fileType) { + this.fileType = fileType; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getLaunchTime() { + return launchTime; + } + + public void setLaunchTime(String launchTime) { + this.launchTime = launchTime; + } + + public int getProType() { + return proType; + } + + public void setProType(int proType) { + this.proType = proType; + } + + public int getTime() { + return time; + } + + public void setTime(int time) { + this.time = time; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } +} diff --git a/app/src/main/java/qianmu/container/entity/ScreenSaverTime.java b/app/src/main/java/qianmu/container/entity/ScreenSaverTime.java new file mode 100644 index 0000000..2587bba --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/ScreenSaverTime.java @@ -0,0 +1,75 @@ +package qianmu.container.entity; + +public class ScreenSaverTime { + /** + * time : 30 + * screenType : 2 + * screenEffect : 0 + * screenFilePath : + * effectType : 0 + */ + + private String protectionTime; //跳回屏保时间 + private String jumpTime; //跳回首页时间 + private int type; //0:无提示图标,1:样式一,2:样式二,3:样式三,4:样式四 + private int protectionEffect; //图标效果(0:固定位置,1:自由运动) + private String url; //默认屏保图片地址 + private String customUrl; //自定义touch路径 + private int protectionLocation; //位置(0:右下角显示,1:居中显示,2:左右移动,3:随机移动) + + public String getProtectionTime() { + return protectionTime; + } + + public void setProtectionTime(String protectionTime) { + this.protectionTime = protectionTime; + } + + public String getJumpTime() { + return jumpTime; + } + + public void setJumpTime(String jumpTime) { + this.jumpTime = jumpTime; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getProtectionEffect() { + return protectionEffect; + } + + public void setProtectionEffect(int protectionEffect) { + this.protectionEffect = protectionEffect; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getCustomUrl() { + return customUrl; + } + + public void setCustomUrl(String customUrl) { + this.customUrl = customUrl; + } + + public int getProtectionLocation() { + return protectionLocation; + } + + public void setProtectionLocation(int protectionLocation) { + this.protectionLocation = protectionLocation; + } +} diff --git a/app/src/main/java/qianmu/container/entity/ShuipaiDataListBean.java b/app/src/main/java/qianmu/container/entity/ShuipaiDataListBean.java new file mode 100644 index 0000000..9d35179 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/ShuipaiDataListBean.java @@ -0,0 +1,23 @@ +package qianmu.container.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/10/17 + * Time: 10:46 + */ +public class ShuipaiDataListBean implements Serializable { + + private List data; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/app/src/main/java/qianmu/container/entity/SocketMessage.java b/app/src/main/java/qianmu/container/entity/SocketMessage.java new file mode 100644 index 0000000..838a088 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/SocketMessage.java @@ -0,0 +1,113 @@ +package qianmu.container.entity; + +/** + * 心跳包实体类 + * Created by Administrator on 2017/12/29. + */ + +public class SocketMessage { + + //{"SenderID":"http://192.168.0.128:8886/","ReceiverID":"10.0.3.15","MessageType":"json","Content":{"Parameter":"","Type":"Shutdown"}} + + String SenderID; + String ReceiverID; + String MessageType; + Content Content; + + + public String getSenderID() { + return SenderID; + } + + public void setSenderID(String senderID) { + SenderID = senderID; + } + + public String getReceiverID() { + return ReceiverID; + } + + public void setReceiverID(String receiverID) { + ReceiverID = receiverID; + } + + public String getMessageType() { + return MessageType; + } + + public void setMessageType(String messageType) { + MessageType = messageType; + } + + public Content getContent() { + return Content; + } + + public void setContent(Content content) { + Content = content; + } + + + public static class Content { + + String Parameter;//数据值 + String Type;//数据名称 + String DevNum;//数据名称 + Data Data;//插播图片数据 + + public String getParameter() { + return Parameter; + } + + public void setParameter(String parameter) { + Parameter = parameter; + } + + public String getType() { + return Type; + } + + public void setType(String type) { + Type = type; + } + + public Data getData() { + return Data; + } + + public void setData(Data data) { + Data = data; + } + + public String getDevNum() { + return DevNum; + } + + public void setDevNum(String devNum) { + DevNum = devNum; + } + + public static class Data { + + String FilePath; + int Duration; + + public String getFilePath() { + return FilePath; + } + + public void setFilePath(String filePath) { + FilePath = filePath; + } + + public int getDuration() { + return Duration; + } + + public void setDuration(int duration) { + Duration = duration; + } + } + } + +} diff --git a/app/src/main/java/qianmu/container/entity/Subtitle.java b/app/src/main/java/qianmu/container/entity/Subtitle.java new file mode 100644 index 0000000..bf9fa1a --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Subtitle.java @@ -0,0 +1,126 @@ +package qianmu.container.entity; + +public class Subtitle { + + /** + * code : 0820caf4-e64b-48b9-87c5-e78feab76197 + * beginTime : 2020-04-24 14:19:45 + * type : Regular + * location : foot + * text : 111111111111111111111111111111111111111111111111111111111111111字幕内容 + * name : 1111 + * endTime : 2020-05-01 14:19:45 + * fontColor : #8f5656 + * fontSize : 12 + * direction : left + * addTime : 2020-04-24 14:20:15 + */ + private String newsId; + private String code; + private String startTime; + private String tactics; + private int newsLoca; + private String newsText; + private String newsName; + private String endTime; + private String fontColor ; + private int fontSize; + private String direction; + private String addTime; + + public String getNewsId() { + return newsId; + } + + public void setNewsId(String newsId) { + this.newsId = newsId; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getTactics() { + return tactics; + } + + public void setTactics(String tactics) { + this.tactics = tactics; + } + + public int getNewsLoca() { + return newsLoca; + } + + public void setNewsLoca(int newsLoca) { + this.newsLoca = newsLoca; + } + + public String getNewsText() { + return newsText; + } + + public void setNewsText(String newsText) { + this.newsText = newsText; + } + + public String getNewsName() { + return newsName; + } + + public void setNewsName(String newsName) { + this.newsName = newsName; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getFontColor() { + return fontColor; + } + + public void setFontColor(String fontColor) { + this.fontColor = fontColor; + } + + public int getFontSize() { + return fontSize; + } + + public void setFontSize(int fontSize) { + this.fontSize = fontSize; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public String getAddTime() { + return addTime; + } + + public void setAddTime(String addTime) { + this.addTime = addTime; + } +} diff --git a/app/src/main/java/qianmu/container/entity/TextBean.java b/app/src/main/java/qianmu/container/entity/TextBean.java new file mode 100644 index 0000000..219d37c --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/TextBean.java @@ -0,0 +1,80 @@ +package qianmu.container.entity; + + + +import java.io.Serializable; + +import qianmu.container.view.AutoScrollTextView; +import qianmu.container.view.MarqueeTextView; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/8/23 + * Time: 16:12 + */ +public class TextBean implements Serializable { + + String url; + int position; + String viewType; + String text; + MarqueeTextView marqueeTextView; + AutoScrollTextView autoScrollTextView; + int width; + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public String getViewType() { + return viewType; + } + + public void setViewType(String viewType) { + this.viewType = viewType; + } + + public MarqueeTextView getMarqueeTextView() { + return marqueeTextView; + } + + public void setMarqueeTextView(MarqueeTextView marqueeTextView) { + this.marqueeTextView = marqueeTextView; + } + + public AutoScrollTextView getAutoScrollTextView() { + return autoScrollTextView; + } + + public void setAutoScrollTextView(AutoScrollTextView autoScrollTextView) { + this.autoScrollTextView = autoScrollTextView; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } +} diff --git a/app/src/main/java/qianmu/container/entity/Vocbean.java b/app/src/main/java/qianmu/container/entity/Vocbean.java new file mode 100644 index 0000000..a5be919 --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/Vocbean.java @@ -0,0 +1,31 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * 语音识别 + * Date: 2023/7/27 + * Time: 17:17 + */ +public class Vocbean implements Serializable { + String code;//200为识别成功 + String msg; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/app/src/main/java/qianmu/container/entity/WeatherBean.java b/app/src/main/java/qianmu/container/entity/WeatherBean.java new file mode 100644 index 0000000..cb0684d --- /dev/null +++ b/app/src/main/java/qianmu/container/entity/WeatherBean.java @@ -0,0 +1,121 @@ +package qianmu.container.entity; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/4/20 + * Time: 10:13 + */ +public class WeatherBean implements Serializable { + + private String prov;//省 + private String city;//市 + private String area;//区 + private String temperatureHigh;//最高 + private String temperatureLow;//最低 + private String temperatureNow;//现在 + private String windPower;//风力 + private String windDirection;//风向 + private String humidity;//湿度 72% + private String weather;// + private String aqi;//aqi + private String pm;//pm2.5 + + public String getProv() { + return prov; + } + + public void setProv(String prov) { + this.prov = prov; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getTemperatureHigh() { + return temperatureHigh; + } + + public void setTemperatureHigh(String temperatureHigh) { + this.temperatureHigh = temperatureHigh; + } + + public String getTemperatureLow() { + return temperatureLow; + } + + public void setTemperatureLow(String temperatureLow) { + this.temperatureLow = temperatureLow; + } + + public String getTemperatureNow() { + return temperatureNow; + } + + public void setTemperatureNow(String temperatureNow) { + this.temperatureNow = temperatureNow; + } + + public void setAqi(String aqi) { + this.aqi = aqi; + } + + public void setPm(String pm) { + this.pm = pm; + } + + public String getWindPower() { + return windPower; + } + + public void setWindPower(String windPower) { + this.windPower = windPower; + } + + public String getWindDirection() { + return windDirection; + } + + public void setWindDirection(String windDirection) { + this.windDirection = windDirection; + } + + public String getHumidity() { + return humidity; + } + + public void setHumidity(String humidity) { + this.humidity = humidity; + } + + public String getWeather() { + return weather; + } + + public void setWeather(String weather) { + this.weather = weather; + } + + public String getAqi() { + return aqi; + } + + public String getPm() { + return pm; + } +} diff --git a/app/src/main/java/qianmu/container/handler/ContainerHandler.java b/app/src/main/java/qianmu/container/handler/ContainerHandler.java new file mode 100644 index 0000000..f573b3f --- /dev/null +++ b/app/src/main/java/qianmu/container/handler/ContainerHandler.java @@ -0,0 +1,408 @@ +package qianmu.container.handler; + +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Debug; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.text.format.Formatter; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.google.gson.Gson; +import com.jakewharton.processphoenix.ProcessPhoenix; +import com.sdkapi.api.SdkApi; +import com.sun.jna.Native; + +import org.greenrobot.eventbus.EventBus; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.List; + +import qianmu.container.activity.BaseActivity; +import qianmu.container.activity.H5.CoreService; +import qianmu.container.activity.H5.H5Data; +import qianmu.container.activity.H5.UpdateFileActivity; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.AppData; +import qianmu.container.data.DeviceData; +import qianmu.container.data.PowerData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.entity.MessageEvent; +import qianmu.container.listener.QueryErrorListener; +import qianmu.container.listener.QueryFinishListener; +import qianmu.container.listener.QuerySuccessListener; +import qianmu.container.mqtt.MQTTService; +import qianmu.container.mqtt.MqttDataBean; +import qianmu.container.service.ContainerService; +import qianmu.container.service.MessengerService; +import qianmu.container.service.MusicService; +import qianmu.container.socket.manager.LocSocCliManager; +import qianmu.container.socket.manager.SocketServerManager; +import qianmu.container.util.CalendarUtils; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.RootCmdUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.TimeUtil; +import qianmu.container.util.ViplexCore; + +public class ContainerHandler extends Handler { + + public static final int HEART_BEAT_DELAY_TIME = 60 * 1000; //心跳包时间间隔 + public static final int DELAY_TIME = 1000; //handler延时时间 + public static final int CONNECT_LOCAL_SOCKET = 3; //连接本地socket + public static final int CLOSE_LOCAL_SOCKET = 4; //关闭本地socket + public static final int START_SOCKET_SERVER = 5; //启动socket服务 + public static final int STOP_SOCKET_SERVER = 6; //停止socket服务 + public static final int UPDATE_APP = 120 * 1000; //app更新包时间间隔 + public static final int MQTT_ALIVE = 7; //app更新包时间间隔 + public static final int GET_TIME_TAMP = 8; //获取时间戳 + public static final int INIT_NOVA = 9; //获取时间戳 + public static final int INIT_JXB = 10; //设置机械臂 + public static final int INIT_JXB2 = 11; //设置机械臂 + public long goNavTime =0; + + private WeakReference weakReference; + + public ContainerHandler(ContainerService service) { + super(Looper.getMainLooper()); + this.weakReference = new WeakReference<>(service); + sendEmptyMessageDelayed(HEART_BEAT_DELAY_TIME, UPDATE_APP); + sendEmptyMessageDelayed(DELAY_TIME, DELAY_TIME); + sendEmptyMessageDelayed(UPDATE_APP, UPDATE_APP);//app更新 + sendEmptyMessageDelayed(GET_TIME_TAMP, 100000);//获取时间戳 + sendEmptyMessageDelayed(INIT_NOVA,1000);//获取时间戳 + sendEmptyMessageDelayed(INIT_JXB,182000);//设置机械臂 + sendEmptyMessageDelayed(INIT_JXB2,186000);//设置机械臂 + } + + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + try { + if (msg.what == DELAY_TIME) delayTime(); + else if (msg.what == HEART_BEAT_DELAY_TIME) heartBeatDelayTime(); + else if (msg.what == UPDATE_APP) updateApp(); + else if (msg.what == GET_TIME_TAMP) setSystemTime(); + else if (msg.what == MQTT_ALIVE) EventBus.getDefault().post(new MessageEvent(Constant.ACTION_MQTT_ALIVE)); + else if (msg.what == CLOSE_LOCAL_SOCKET) LocSocCliManager.destroyLocalSocketClient(); + else if (msg.what == CONNECT_LOCAL_SOCKET) LocSocCliManager.connectLocalSocket(); + else if (msg.what == START_SOCKET_SERVER) SocketServerManager.startSocketServer(); + else if (msg.what == STOP_SOCKET_SERVER) SocketServerManager.destroySocketServer(); + else if (msg.what == INIT_NOVA) EventBus.getDefault().post(new MessageEvent(Constant.NOVA_INIT)); + else if (msg.what == INIT_JXB) setJXB(); + else if (msg.what == INIT_JXB2) setJXB2(); + } catch (Throwable t) { + LoggerUtil.e("HeartBeatHandler", StringUtil.getThrowableStr(t)); + } + } + + private void heartBeatDelayTime() { + try { + sendEmptyMessageDelayed(HEART_BEAT_DELAY_TIME, HEART_BEAT_DELAY_TIME); + + if(Constant.androidBoardType.contains("xwst") && Constant.screenType.equals("HDMI")){ + if(RootCmdUtil.HDMIEnabled()){ + PowerData.updatePowerOnOrOffTime(); + } + }else { + PowerData.updatePowerOnOrOffTime(); + } + if(!DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("信发")&&!DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("双面屏")){ + ScreenSaverData.getProgramList2(null,null); + } + DeviceData.pingNet(null, null, new QuerySuccessListener() { + @Override + public void onSuccess() { + //检查,MQTT状态 + mqttState(); + sendEmptyMessageDelayed(MQTT_ALIVE,15000); + sendEmptyMessageDelayed(MQTT_ALIVE,35000); + sendEmptyMessageDelayed(MQTT_ALIVE,55000); + Constant.networkState=true; + } + },new QueryErrorListener() { + @Override + public void onError() { + Constant.networkState = false; + } + } ); + + getMemory(); +// watchDog(); + getCoreServiceState(); +// DeviceData.getPrimaryMachine(null, this::updateClientStateByIP); + //设备同屏 +// updateClientStateByIP(); + } catch (Throwable t) { + LoggerUtil.e("heartBeatDelayTime", StringUtil.getThrowableStr(t)); + } + } + + /*** + * 看门狗功能(新版欣威视通) + * */ + private void watchDog(){ + if(Constant.androidBoardType.equals("xwst2")){ + boolean ret= SdkApi.getInstance().Watchdog().getWatchdogOnoff(); + if(ret){ + SdkApi.getInstance().Watchdog().feedWatchdog(); + }else { + SdkApi.getInstance().Watchdog().setWatchdogOnoff(true); + } + } + } + + /** + * 导视容器,判断服务是否正常 + * */ + private void getCoreServiceState(){ + if(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("信发")||DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("双面屏"))return; + if(!Constant.isCoreService || !DeviceUtil.isServiceRunning( MyApplication.getInstance(),"CoreService")){ + LoggerUtil.e("getCoreServiceState","CoreService服务被关闭,通知重启启动"); + //通知重启导视页面 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_CORESERVICE)); + } + } + + public void getMemory(){ + //安卓P以上限制频率,需要隔约5分钟(不同手机间隔不同)才能获取到新的值。而且获取的 PSS 不包括 Graphics。 + // 获取 ActivityManager 服务 + ActivityManager activityManager = (ActivityManager) MyApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE); + + final Debug.MemoryInfo[] memInfo = activityManager.getProcessMemoryInfo(new int[]{android.os.Process.myPid()}); + final int totalPss = memInfo[0].getTotalPss(); + + LoggerUtil.e("getMemory()","运行内存:"+totalPss/1024); + +// Long cpuUsage = getCpuUsage(); +// if(cpuUsage>50){ +// LoggerUtil.e("ContainerHandler","cpu使用率:"+cpuUsage+"%"); +// } +// + if(totalPss/1024>1000 && DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE).equals("导视") && !Constant.whoActivity.equals(Constant.ROUTE_WEB_VIEW)){ + //内存超过了1G会出现卡顿 + long currentTime = System.currentTimeMillis(); + if(currentTime-goNavTime>360000){ + LoggerUtil.e("getMemory()","内存超过1000 进入导视释放内存"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + goNavTime = currentTime; + } + } + if(totalPss/1024>1400){ + //内存超过了1G会出现卡顿,内存溢出问题。重启设备。 + LoggerUtil.e("getMemory()","内存溢出重启软件"); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_APP)); + } + } + + private long mLastCpuTime; + private long mLastAppCpuTime; + + private long getCpuUsage() { + try { + long cpuTime = readSystemCpuTime(); + long appCpuTime = readProcessCpuTime(); + + long cpuTimeDiff = cpuTime - mLastCpuTime; + long appCpuTimeDiff = appCpuTime - mLastAppCpuTime; + + mLastCpuTime = cpuTime; + mLastAppCpuTime = appCpuTime; + + return 100* appCpuTimeDiff / cpuTimeDiff; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + private long readSystemCpuTime() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader("/proc/stat")); + String[] tokens = reader.readLine().split(" "); + reader.close(); + + long idleTime = Long.parseLong(tokens[4]); + long totalTime = 0; + for (int i = 2; i < tokens.length; i++) { + totalTime += Long.parseLong(tokens[i]); + } + + return totalTime - idleTime; + } + + private long readProcessCpuTime() throws IOException { + int pid = android.os.Process.myPid(); + BufferedReader reader = new BufferedReader(new FileReader("/proc/" + pid + "/stat")); + String[] tokens = reader.readLine().split(" "); + reader.close(); + + long utime = Long.parseLong(tokens[13]); + long stime = Long.parseLong(tokens[14]); + long cutime = Long.parseLong(tokens[15]); + long cstime = Long.parseLong(tokens[16]); + + return utime + stime + cutime + cstime; + } + + /** + * 判断设备是否关闭HDMI和处于关机状态,用于判断是否需要关闭MQTT连接 + * */ + private void mqttState(){ + try { + if(Constant.androidBoardType.contains("xwst") && Constant.screenType.equals("HDMI")){ + //欣威视通假关机 + LoggerUtil.e("mqttState","HDMI结果:"+RootCmdUtil.HDMIEnabled()+",mqttState结果:"+Constant.mqttState); + if(!RootCmdUtil.HDMIEnabled()){ + //HDMI无信号 + if(Constant.mqttState.equals("on")){ + LoggerUtil.e("mqttState","HDMI无信号关闭MQTTService"); + MyApplication.getInstance().stopService(new Intent(MyApplication.getInstance(),MQTTService.class)); + } + + }else { + //HDMI有信号 + boolean isService = DeviceUtil.isServiceRunning(MyApplication.getInstance(), "MQTTService"); + LoggerUtil.e("mqttState","MQTTService:"+isService); + if(Constant.mqttState.equals("off") || !isService){ + LoggerUtil.e("mqttState","HDMI有信号开启MQTTService"); + MyApplication.getInstance().startService(new Intent(MyApplication.getInstance(),MQTTService.class)); + }else { + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_MQTT_STATE));//通知mqtt状态判断 + } + } + }else { + + if(Constant.mqttState.equals("off")){ + LoggerUtil.e("mqttState","MQTT被关闭了,开启MQTTService"); + MyApplication.getInstance().startService(new Intent(MyApplication.getInstance(),MQTTService.class)); + }else { + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_MQTT_STATE));//通知mqtt状态判断 + } + } + + }catch (Exception e){ + + } + } + + private void setJXB(){ + try { + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if(deviceType.equals("指路机")){ + if(H5Data.getKdxf().getData().getControlInfo()!=null){ + //设置偏振角度 + DeviceData.setLogicZero(H5Data.getKdxf().getData().getControlInfo().getAngle(),null,null); + } + } + }catch (Throwable t){ + LoggerUtil.e("setJXB", StringUtil.getThrowableStr(t)); + } + + } + + private void setJXB2(){ + try { + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if(deviceType.equals("指路机")){ + if(H5Data.getKdxf().getData().getControlInfo()!=null){ + String interimText = H5Data.getKdxf().getData().getControlInfo().getInterimText(); + if(interimText!=null&& !interimText.isEmpty()){ + DeviceData.jxbSetTransText(interimText,null,null); + } + + String openText = H5Data.getKdxf().getData().getControlInfo().getOpenText(); + if(openText!=null && !openText.isEmpty()){ + DeviceData.jxbSetBootText(openText,null,null); + } + + //设置偏振角度 +// DeviceData.setLogicZero(H5Data.getKdxf().getData().getControlInfo().getAngle(),null,null); + } + } + }catch (Throwable t){ + LoggerUtil.e("setJXB2", StringUtil.getThrowableStr(t)); + } + } + + //30分钟定时定时拉取更新APP + private void updateApp(){ + sendEmptyMessageDelayed(UPDATE_APP, 1800*1000);//app更新 + weakReference.get().appUpdate(); + //同屏接口 + DeviceData.getPrimaryMachine(null, this::updateClientStateByIP); + } + + /** + * 获取时间戳设置系统时间 + * */ + private void setSystemTime(){ + weakReference.get().getCurrentTimestamp(); + + if("指路机".equals(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))){ + //开启背景音乐 + MyApplication.getInstance().startService(new Intent(MyApplication.getInstance(), MusicService.class)); + } + } + + private void delayTime() { + try { + sendEmptyMessageDelayed(DELAY_TIME, DELAY_TIME); +// weakReference.get().showSplashActivity();//改为前端通知容器是否进入屏保 + //每5秒钟发送一次socket心跳 + String second = MyApplication.getInstance().secondFormat.format(System.currentTimeMillis()); + if (Integer.valueOf(second) % 5 == 0){ + weakReference.get().detectionAppState(); + LocSocCliManager.sendHeartBeatToServer(); + } + } catch (Throwable t) { + LoggerUtil.e("delayTime", StringUtil.getThrowableStr(t)); + } + } + + /** + * 同屏 + * */ + private void updateClientStateByIP() { + String serverIP = DeviceData.getDeviceInfo(DeviceData.HINT_MAIN_DEVICE_IP); + if (Constant.isSecondary && StringUtil.isEmpty(serverIP)) { + //设备已经是连接状态的从设备 并且 当前服务ip为空 表示已经从设备组中移除 需要断开连接 + LocSocCliManager.closeConnect(); + } else if (Constant.isSecondary && !StringUtil.isEmpty(serverIP)) { + //设备已经是连接状态的从设备 并且 当前服务ip不为空但是主设备IP与获取到的不一致 需要重新连接 + if(serverIP.equals( DeviceUtil.getLocalIP()))return;//主设备,不进行连接服务端 + if (LocSocCliManager.sameUrl()) return; + LocSocCliManager.connectLocalSocket(); + } else if (!Constant.isSecondary && !StringUtil.isEmpty(serverIP)) { + //设备不是从设备 并且 当前服务ip不为空 表示添加到同屏设备组中 连接服务器 + if(serverIP.equals( DeviceUtil.getLocalIP()))return;//主设备,不进行连接服务端 + LocSocCliManager.connectLocalSocket(); + } + } + + public void removeMessages() { + removeMessages(DELAY_TIME); + removeMessages(STOP_SOCKET_SERVER); + removeMessages(START_SOCKET_SERVER); + removeMessages(CLOSE_LOCAL_SOCKET); + removeMessages(CONNECT_LOCAL_SOCKET); + removeMessages(HEART_BEAT_DELAY_TIME); + removeMessages(UPDATE_APP); + removeMessages(MQTT_ALIVE); + removeMessages(GET_TIME_TAMP); + removeMessages(INIT_JXB); + removeMessages(INIT_JXB2); + } +} diff --git a/app/src/main/java/qianmu/container/http/okgo/QMFileCallback.java b/app/src/main/java/qianmu/container/http/okgo/QMFileCallback.java new file mode 100644 index 0000000..160f8d4 --- /dev/null +++ b/app/src/main/java/qianmu/container/http/okgo/QMFileCallback.java @@ -0,0 +1,37 @@ +package qianmu.container.http.okgo; + +import com.lzy.okgo.callback.AbsCallback; + +import java.io.File; + +import okhttp3.Response; + + +/** + * 修改文件保存机制 + * Created by Administrator on 2019/2/15. + */ +public abstract class QMFileCallback extends AbsCallback { + + private QMFileConvert convert; //文件转换类 + + public QMFileCallback() { + this(null); + } + + public QMFileCallback(String destFileName) { + this(null, destFileName); + } + + public QMFileCallback(String destFileDir, String destFileName) { + convert = new QMFileConvert(destFileDir, destFileName); + convert.setCallback(this); + } + + @Override + public File convertResponse(Response response) throws Throwable { + File file = convert.convertResponse(response); + response.close(); + return file; + } +} diff --git a/app/src/main/java/qianmu/container/http/okgo/QMFileConvert.java b/app/src/main/java/qianmu/container/http/okgo/QMFileConvert.java new file mode 100644 index 0000000..9f7da25 --- /dev/null +++ b/app/src/main/java/qianmu/container/http/okgo/QMFileConvert.java @@ -0,0 +1,105 @@ +package qianmu.container.http.okgo; + +import android.os.Environment; +import android.text.TextUtils; + +import com.lzy.okgo.callback.Callback; +import com.lzy.okgo.convert.Converter; +import com.lzy.okgo.model.Progress; +import com.lzy.okgo.utils.HttpUtils; +import com.lzy.okgo.utils.IOUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; + +import okhttp3.Response; +import okhttp3.ResponseBody; + +/** + * 取消每次保存文件数据时的 清空以前文件的操作 + * Created by Administrator on 2019/2/15. + */ +public class QMFileConvert implements Converter { + + public static final String DM_TARGET_FOLDER = File.separator + "download" + File.separator; //下载目标文件夹 + + private String folder; //目标文件存储的文件夹路径 + private String fileName; //目标文件存储的文件名 + private Callback callback; //下载回调 + + public QMFileConvert() { + this(null); + } + + public QMFileConvert(String fileName) { + this(Environment.getExternalStorageDirectory() + DM_TARGET_FOLDER, fileName); + } + + public QMFileConvert(String folder, String fileName) { + this.folder = folder; + this.fileName = fileName; + } + + public void setCallback(Callback callback) { + this.callback = callback; + } + + @Override + public File convertResponse(Response response) throws Throwable { + String url = response.request().url().toString(); + if (TextUtils.isEmpty(folder)) + folder = Environment.getExternalStorageDirectory() + DM_TARGET_FOLDER; + if (TextUtils.isEmpty(fileName)) fileName = HttpUtils.getNetFileName(response, url); + + File dir = new File(folder); + IOUtils.createFolder(dir); + File file = new File(dir, fileName); +// IOUtils.delFileOrFolder(file); + + InputStream bodyStream = null; + byte[] buffer = new byte[8192]; + FileOutputStream fileOutputStream = null; + try { + ResponseBody body = response.body(); + if (body == null) return null; + + bodyStream = body.byteStream(); + Progress progress = new Progress(); + progress.totalSize = body.contentLength(); + progress.fileName = fileName; + progress.filePath = file.getAbsolutePath(); + progress.status = Progress.LOADING; + progress.url = url; + progress.tag = url; + + int len; + fileOutputStream = new FileOutputStream(file, true); + while ((len = bodyStream.read(buffer)) != -1) { + fileOutputStream.write(buffer, 0, len); + + if (callback == null) continue; + Progress.changeProgress(progress, len, new Progress.Action() { + @Override + public void call(Progress progress) { + onProgress(progress); + } + }); + } + fileOutputStream.flush(); + return file; + } finally { + IOUtils.closeQuietly(bodyStream); + IOUtils.closeQuietly(fileOutputStream); + } + } + + private void onProgress(final Progress progress) { + HttpUtils.runOnUiThread(new Runnable() { + @Override + public void run() { + callback.downloadProgress(progress); //进度回调的方法 + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/http/retrofit/BaseInterceptor.java b/app/src/main/java/qianmu/container/http/retrofit/BaseInterceptor.java new file mode 100644 index 0000000..dc539db --- /dev/null +++ b/app/src/main/java/qianmu/container/http/retrofit/BaseInterceptor.java @@ -0,0 +1,33 @@ +package qianmu.container.http.retrofit; + + +import java.io.IOException; + +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; +import qianmu.container.app.Constant; +import qianmu.container.util.AesUtil; +import qianmu.container.util.StringUtil; + +public class BaseInterceptor implements Interceptor { + @Override + public Response intercept(okhttp3.Interceptor.Chain chain) throws IOException { + + Request original = chain.request(); + + String method = original.url().toString().replace(Constant.getBaseAddress(), "") + .replace("http://192.168.1.194:8012", ""); + String time = String.valueOf(System.currentTimeMillis() / 1000); + String token = AesUtil.encrypt(StringUtil.strSplice(method, time)); + + HttpUrl url = original.url().newBuilder().addQueryParameter("token", token) + .addQueryParameter("time", time).build(); + + Request request = original.newBuilder().addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .method(original.method(), original.body()).url(url).build(); + return chain.proceed(request); + } +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/http/retrofit/BaseService.java b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java new file mode 100644 index 0000000..57f3a50 --- /dev/null +++ b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java @@ -0,0 +1,319 @@ +package qianmu.container.http.retrofit; + + +import java.io.File; + +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import qianmu.container.entity.Resp; +import qianmu.container.entity.RespJXB; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.Part; +import retrofit2.http.Query; + +/** + * 接口服务 + * Created by Administrator on 2017/11/6. + */ + +public interface BaseService { + + /** + * 获取应用列表 + * + * @return + */ + @POST("/API/Dev/GetDevAppList") + Call getDevAppList(@Body RequestBody route); + + /** + * 获取主设备ip + * + * @return + */ + @POST("/Api/Dev/GetSyncDev") + Call getSyncDev(@Body RequestBody route); + + /** + * 新版容器接口 + * */ + + /** + * 获取注册设备信息 + * + * @return + */ + @GET("api/device/v1/client/register") + Call getRegisterInfo( @Query("code") String code ); + + /** + * 激活设备 + * + * @return + */ + @POST("api/device/v1/client/active") + Call activeDevice(@Body RequestBody route); + + /** + * 上传截屏 + * + * @return + */ + @POST("api/device/v1/client/screenShort") + Call upScreenShort(@Body RequestBody route); + + /** + * 获取Mqtt密码 + * + * @return + */ + @POST("api/device/v1/client/token") + Call getTokenPass(@Body RequestBody route); + + /** + * 上传日志文件 + * + * @return + */ + + @POST("api/device/v1/client/log") + Call upLogFile(@Body RequestBody body); + + /** + * 获取节目列表 + * + * @return + */ + @GET("api/msg/v1/web/getScheduleByMachineCode") + Call getprogram( @Query("code") String code ); + +// /** +// * 获取图片视频下载ip地址 +// * +// * @return +// */ +// @GET("api/info/v1/web/getUploadUrl") +// Call getUploadUrl(); + + /** + * 获取图片视频下载ip地址 + * + * @return + */ + @GET("api/data/v1/web/getUploadUrl") + Call getUploadUrl(); + + /** + * 获取滚动字幕 + * + * @return + */ + @GET("api/info/v1/web/getSubtitlesByDeviceCode") + Call getSubtitles(@Query("code") String code); + + /** + * 获取离线接口列表 + * + * @return + */ + @GET("api/device/v1/deviceWeb/getInterfaceApi") + Call getInterfaceApi(@Query("projectCode") String code); + + /** + * 获取资源文件列表 + * + * @return + */ + @GET("api/guide/v1/web/getFileResource") + Call getFileResourceList(@Query("projectCode") String code); + + /** + * 获取资源文件列表(新版) + * + * @return + */ + @GET("api/data/v1/web/getFileResource") + Call getFileResourceList2(@Query("projectCode") String code); + + /** + * 获取模型资源文件列表(水牌) + * + * @return + */ + @GET("api/guidance/v1/web/getModelFileResource") + Call getModelFileResource(@Query("projectCode") String code); + + /** + * 获取设备信息 + * + * @return + */ + @GET("api/device/v1/client/getMachine") + Call getMachine(@Query("code") String code); + + /** + * 上传版本信息 + * + * @return + */ + @POST("api/device/v1/client/version") + Call sendVersion(@Body RequestBody body); + + /** + * 获取设备屏保信息,默认图,跳转时间等 + * + * @return + */ + @GET("api/device/v1/client/getProtection") + Call getProtection (@Query("projectCode") String projectCode, @Query("code") String code); + + + /** + * 节目上传记录 + * + * @return + */ + @POST("api/analysis/v1/web/deviceUseClickDataUpload") + Call programUpload(@Body RequestBody body); + + /** + * 获取同屏组主设备 + * + * @return + */ + @GET("api/device/v1/client/getPrimaryMachine") + Call getPrimaryMachine ( @Query("code") String code); + + /** + * 检测网络 + * + * @return + */ + @GET("api/mqtt/v1/client/ping") + Call pingNet ( @Query("machineCode") String code); + + /** + * 获取app版本及应用版本号,设备启动时调用 + * + * @return + */ + @GET("api/device/v1/deviceWeb/getMachineAppProgramMsg") + Call getMachineAppProgramMsg ( @Query("code") String code); + + /** + * 定时开关机时间 + * + * @return + */ + @GET("api/device/v1/deviceWeb/getMachineOnOffTime") + Call getMachineOnOffTime ( @Query("code") String code); + + /** + * 天气 + * + * @return + */ + @GET("api/data/v1/web/getWeather") + Call getWeather(@Query("city") String cityName); + + /** + * 获取服务器时间戳 + * + * @return + */ + @GET("api/data/v1/util/getCurrentTimestamp") + Call getCurrentTimestamp(); + + /** + * 进入导视数据上报 + * + * @return + */ + @POST("api/analysis/v1/web/guideClickDataUpload") + Call guideClickDataUpload(@Body RequestBody body); + + + /** + * 获取播放背景音乐列表(流花中心) + * + * @return + */ + @GET("api/device/v1/deviceWeb/getSoundInfo") + Call getSoundInfo(@Query("projectCode") String projectCode); + + /** + * 机械臂重启 + * + * @return + */ + @FormUrlEncoded + @POST("/device/reboot") + Call jxbReboot(@Field("deviceKey") String deviceKey); + + /** + * 机械臂定时开关机 + * + * @return + */ + @FormUrlEncoded + @POST("device/setAutoBoot") + Call jxbAutoBoot(@Field("deviceKey") String deviceKey,@Field("autoPowerOn") String autoPowerOn,@Field("autoPowerOff") String autoPowerOff); + + /** + * 机械臂过渡文字内容 + * + * @return + */ + @FormUrlEncoded + @POST("device/setTransText") + Call jxbSetTransText(@Field("deviceKey") String deviceKey,@Field("transText") String transText); + + /** + * 机械臂开机文字 + * + * @return + */ + @FormUrlEncoded + @POST("device/setBootText") + Call jxbSetBootText(@Field("deviceKey") String deviceKey,@Field("bootText") String bootText); + + + /** + * 设置机械臂逻辑零点 + * + * @return + */ + @FormUrlEncoded + @POST("device/setLogicZero") + Call setLogicZero(@Field("deviceKey") String deviceKey,@Field("logicZero") int logicZero); + + /** + * 控制机械臂 + * + * @return + */ + @FormUrlEncoded + @POST("program/play") + Call jxbPlay(@Field("deviceKey") String deviceKey, @Field("progMode") int progMode, @Field("progText1") String progText1, @Field("progTextColor") int progTextColor, + @Field("progText2") String progText2, @Field("progText2Color") int progText2Color, @Field("progDist") String progDist, @Field("progDistColor") int progDistColor, + @Field("progAngel") int progAngel, @Field("progArmNo") int progArmNo, @Field("progRota") int progRota , @Field("progTrans") int progTrans, + @Field("progDuration") int progDuration , @Field("progMd5") String progMd5, @Field("progStat") int progStat); + + + /** + * 机械臂开机关机 + * + * 0=关机,1=开机 + * @return + */ + @FormUrlEncoded + @POST("device/turnOnOff") + Call jxbTurnOnOff(@Field("deviceKey") String deviceKey,@Field("onOff") int onOff); + +} diff --git a/app/src/main/java/qianmu/container/http/retrofit/QMConverterFactory.java b/app/src/main/java/qianmu/container/http/retrofit/QMConverterFactory.java new file mode 100644 index 0000000..097a58c --- /dev/null +++ b/app/src/main/java/qianmu/container/http/retrofit/QMConverterFactory.java @@ -0,0 +1,28 @@ +package qianmu.container.http.retrofit; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import okhttp3.ResponseBody; +import qianmu.container.entity.Resp; +import qianmu.container.util.StringUtil; +import retrofit2.Converter; +import retrofit2.Retrofit; + +public class QMConverterFactory extends Converter.Factory { + + @Override + public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { + if (Resp.class.equals(type)) { + String method = (annotations == null || annotations.length == 0 || annotations[annotations.length - 1] == null) + ? "Converter" : StringUtil.getString("Converter", annotations[annotations.length - 1].toString()); + method = method.replace("@retrofit2.http.POST(value=/0", "") + .replace("@retrofit2.http.POST(value=", "") + .replace("@retrofit2.http.GET(value=/", "") + .replace("@retrofit2.http.GET(value=", "") + .replace(")", ""); + return new RespConvert(method); + } + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/http/retrofit/RespConvert.java b/app/src/main/java/qianmu/container/http/retrofit/RespConvert.java new file mode 100644 index 0000000..723201a --- /dev/null +++ b/app/src/main/java/qianmu/container/http/retrofit/RespConvert.java @@ -0,0 +1,35 @@ +package qianmu.container.http.retrofit; + +import android.util.Log; + +import com.google.gson.Gson; + +import java.io.IOException; + +import okhttp3.ResponseBody; +import qianmu.container.entity.Resp; +import qianmu.container.util.AesUtil; +import retrofit2.Converter; + +public class RespConvert implements Converter { + + String method; + + public RespConvert(String method) { + this.method = method; + } + + public Resp convert(ResponseBody value) throws IOException { + String valueData = value.string(); + String result = AesUtil.decrypt(valueData); + if (AesUtil.FIELD.equals(result)) { + Log.e(method, valueData); + return new Gson().fromJson(valueData, Resp.class); + } else { + Log.e(method, result); + return new Gson().fromJson(result, Resp.class); + } + } +} + + diff --git a/app/src/main/java/qianmu/container/http/retrofit/RetrofitUtil.java b/app/src/main/java/qianmu/container/http/retrofit/RetrofitUtil.java new file mode 100644 index 0000000..535ed3d --- /dev/null +++ b/app/src/main/java/qianmu/container/http/retrofit/RetrofitUtil.java @@ -0,0 +1,141 @@ +package qianmu.container.http.retrofit; + + +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import okhttp3.OkHttpClient; +import qianmu.container.app.Constant; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * 网络请求 + * Created by Administrator on 2017/11/6. + */ +public class RetrofitUtil { + + private static BaseService baseService;//大后台 + private static BaseService jxbService;//机械臂后台 + private static BaseService testService;//大后台 + + + private static OkHttpClient initOkHttpClient() { + return initOkHttpClient(20); + } + + private static OkHttpClient initOkHttpClient(int timeout) { + + try { + final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }}; + final SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustAllCerts, new SecureRandom()); + final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + return new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory) + .retryOnConnectionFailure(true) +// .addInterceptor(new BaseInterceptor()) + .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER) + .connectTimeout(timeout, TimeUnit.SECONDS).readTimeout(timeout, TimeUnit.SECONDS) + .writeTimeout(timeout, TimeUnit.SECONDS).build(); + } catch (Throwable t) { + LoggerUtil.e("initOkHttpClient", StringUtil.getThrowableStr(t)); + return new OkHttpClient.Builder().connectTimeout(timeout, TimeUnit.SECONDS) + .retryOnConnectionFailure(true).addInterceptor(new BaseInterceptor()) + .readTimeout(timeout, TimeUnit.SECONDS).writeTimeout(timeout, TimeUnit.SECONDS).build(); + } + } + + /** + * 初始化对象 + */ + private static void initBaseRetrofit() { + try { + Retrofit retrofit = new Retrofit.Builder() //获取Retrofit对象 + .baseUrl(Constant.getBaseAddress()) //采用链式结构绑定Base url + .addConverterFactory(new QMConverterFactory()) + .client(initOkHttpClient()) + .build();//执行操作 + baseService = retrofit.create(BaseService.class);//获取API接口的实现类的实例对象 + } catch (Throwable t) { + LoggerUtil.e("initBaseRetrofit", StringUtil.getThrowableStr(t)); + } + + } + + /** + * 初始化对象 + */ + private static void initTestRetrofit() { + try { + Retrofit retrofit = new Retrofit.Builder() //获取Retrofit对象 + .baseUrl("http://192.168.1.194:8012") //采用链式结构绑定Base url + .addConverterFactory(new QMConverterFactory()) + .client(initOkHttpClient()) + .build();//执行操作 + testService = retrofit.create(BaseService.class);//获取API接口的实现类的实例对象 + } catch (Throwable t) { + LoggerUtil.e("initBaseRetrofit", StringUtil.getThrowableStr(t)); + } + + } + + + /** + * 初始化机械臂对象 + */ + private static void initJxb() { + try { + Retrofit retrofit = new Retrofit.Builder() //获取Retrofit对象 + .baseUrl("http://192.168.2.124:8100") //采用链式结构绑定Base url + .addConverterFactory(new QMConverterFactory()) + .client(initOkHttpClient()) + .build();//执行操作 + jxbService = retrofit.create(BaseService.class);//获取API接口的实现类的实例对象 + } catch (Throwable t) { + LoggerUtil.e("initBaseRetrofit", StringUtil.getThrowableStr(t)); + } + + } + + public static BaseService getBaseService() { + if (null == baseService) initBaseRetrofit(); + return baseService; + } + + public static BaseService getJxbService() { + if (null == jxbService) initJxb(); + return jxbService; + } + + public static BaseService getTestService() { + if (null == jxbService) initTestRetrofit(); + return jxbService; + } + + + public static void removeService() { + baseService = null; + } +} diff --git a/app/src/main/java/qianmu/container/listener/ActionModeCallbackInterceptor.java b/app/src/main/java/qianmu/container/listener/ActionModeCallbackInterceptor.java new file mode 100644 index 0000000..93beb2b --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/ActionModeCallbackInterceptor.java @@ -0,0 +1,26 @@ +package qianmu.container.listener; + +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuItem; + +public class ActionModeCallbackInterceptor implements ActionMode.Callback { + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return false; + } + + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + + + public void onDestroyActionMode(ActionMode mode) { + } +} diff --git a/app/src/main/java/qianmu/container/listener/ItemSelectedListener.java b/app/src/main/java/qianmu/container/listener/ItemSelectedListener.java new file mode 100644 index 0000000..b5742b1 --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/ItemSelectedListener.java @@ -0,0 +1,17 @@ +package qianmu.container.listener; + +import android.view.View; +import android.widget.AdapterView; + +public class ItemSelectedListener implements AdapterView.OnItemSelectedListener { + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } +} diff --git a/app/src/main/java/qianmu/container/listener/QueryErrorListener.java b/app/src/main/java/qianmu/container/listener/QueryErrorListener.java new file mode 100644 index 0000000..aaa8d81 --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/QueryErrorListener.java @@ -0,0 +1,6 @@ +package qianmu.container.listener; + +public interface QueryErrorListener { + + void onError(); +} diff --git a/app/src/main/java/qianmu/container/listener/QueryFinishListener.java b/app/src/main/java/qianmu/container/listener/QueryFinishListener.java new file mode 100644 index 0000000..8165f61 --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/QueryFinishListener.java @@ -0,0 +1,6 @@ +package qianmu.container.listener; + +public interface QueryFinishListener { + + void onFinish(); +} diff --git a/app/src/main/java/qianmu/container/listener/QueryPreparedListener.java b/app/src/main/java/qianmu/container/listener/QueryPreparedListener.java new file mode 100644 index 0000000..a1d3ff5 --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/QueryPreparedListener.java @@ -0,0 +1,6 @@ +package qianmu.container.listener; + +public interface QueryPreparedListener { + + void onPrepared(); +} diff --git a/app/src/main/java/qianmu/container/listener/QuerySuccessListener.java b/app/src/main/java/qianmu/container/listener/QuerySuccessListener.java new file mode 100644 index 0000000..50ac55d --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/QuerySuccessListener.java @@ -0,0 +1,12 @@ +package qianmu.container.listener; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2023/12/11 + * Time: 9:10 + */ +public interface QuerySuccessListener { + + void onSuccess(); +} diff --git a/app/src/main/java/qianmu/container/listener/ViewClickListener.java b/app/src/main/java/qianmu/container/listener/ViewClickListener.java new file mode 100644 index 0000000..9472fdd --- /dev/null +++ b/app/src/main/java/qianmu/container/listener/ViewClickListener.java @@ -0,0 +1,5 @@ +package qianmu.container.listener; + +public interface ViewClickListener { + void onClick(int action); +} diff --git a/app/src/main/java/qianmu/container/manager/AppListAdapter.java b/app/src/main/java/qianmu/container/manager/AppListAdapter.java new file mode 100644 index 0000000..26b9357 --- /dev/null +++ b/app/src/main/java/qianmu/container/manager/AppListAdapter.java @@ -0,0 +1,86 @@ +package qianmu.container.manager; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +import jp.wasabeef.glide.transformations.RoundedCornersTransformation; +import qianmu.container.R; +import qianmu.container.app.Constant; +import qianmu.container.databinding.ItemAppListBinding; +import qianmu.container.entity.App; +import qianmu.container.service.ContainerService; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.view.ViewHolder; + +public class AppListAdapter extends RecyclerView.Adapter { + + private Context context; + private List data = new ArrayList<>(); + private OnItemClickListener listener; + + public AppListAdapter(Context context) { + this.context = context; + } + + public void setData(List data) { + if (data == null) return; + this.data = data; + } + + public List getData() { + return data; + } + + + public interface OnItemClickListener { + void onItemClick(String packageName); + } + + public void setOnItemClickListener(OnItemClickListener listener) { + this.listener = listener; + } + + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context), + R.layout.item_app_list, parent, false).getRoot()); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { + ItemAppListBinding binding = DataBindingUtil.getBinding(holder.itemView); + App app = data.get(position); + if (app == null || binding == null) return; + + String packageName = StringUtil.getString(app.getPackageName()); + String appName = StringUtil.getString(app.getName()); + String appNameEn = StringUtil.getString(app.getNameEn()); + String filePath = StringUtil.getString(app.getLogo()); + String[] result = FileUtil.getServerAndPath(filePath); + BitmapUtil.loadImage(result[0], Constant.CACHE_PATH, result[1], binding.icon, + RoundedCornersTransformation.CornerType.ALL, context.getResources().getDimensionPixelSize(R.dimen.dimens_50)); + binding.nameCn.setText(appName); + binding.nameEn.setText(appNameEn); + binding.getRoot().setOnClickListener((view) -> { + ContainerService.initFirstTime(); + ContainerService.initTempTime(); + if (listener != null) listener.onItemClick(packageName); + }); + } + + @Override + public int getItemCount() { + return data.size(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/manager/AppListView.java b/app/src/main/java/qianmu/container/manager/AppListView.java new file mode 100644 index 0000000..2f45a50 --- /dev/null +++ b/app/src/main/java/qianmu/container/manager/AppListView.java @@ -0,0 +1,62 @@ +package qianmu.container.manager; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.RelativeLayout; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import qianmu.container.R; +import qianmu.container.data.AppData; +import qianmu.container.service.ContainerService; +import qianmu.container.util.AppUtil; + +@SuppressWarnings("All") +public class AppListView extends RelativeLayout { + + Context context; + View layout, back; + RecyclerView appList; + AppListAdapter appListAdapter; + public static int viewWidth; //记录小悬浮窗的宽度 + public static int viewHeight; //记录小悬浮窗的高度 + + public AppListView(Context context) { + super(context); + this.context = context; + initView(); + setData(); + setListener(); + } + + private void initView() { + LayoutInflater.from(context).inflate(R.layout.view_app_list, this); + layout = findViewById(R.id.layout); + back = findViewById(R.id.back); + appList = findViewById(R.id.app_list); + } + + private void setData() { + viewWidth = layout.getLayoutParams().width; + viewHeight = layout.getLayoutParams().height; + appList.setLayoutManager(new GridLayoutManager(context, 1, RecyclerView.VERTICAL, false)); + appListAdapter = new AppListAdapter(context); + appListAdapter.setData(AppData.getAppList()); + appList.setAdapter(appListAdapter); + } + + private void setListener() { + back.setOnClickListener((v) -> QMWindowManager.showMenu()); + appListAdapter.setOnItemClickListener((packageName) -> AppUtil.startApp(context, packageName)); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + ContainerService.initFirstTime(); + ContainerService.initTempTime(); + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/qianmu/container/manager/MenuView.java b/app/src/main/java/qianmu/container/manager/MenuView.java new file mode 100644 index 0000000..9caf820 --- /dev/null +++ b/app/src/main/java/qianmu/container/manager/MenuView.java @@ -0,0 +1,76 @@ +package qianmu.container.manager; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.RelativeLayout; + +import qianmu.container.R; +import qianmu.container.service.ContainerService; + +/** + * Created by Administrator on 2018/1/31. + */ + +public class MenuView extends RelativeLayout { + + public static int viewWidth; //记录小悬浮窗的宽度 + public static int viewHeight; //记录小悬浮窗的高度 + private WindowManager windowManager; //用于更新小悬浮窗的位置 + private WindowManager.LayoutParams mParams; //小悬浮窗的参数 + private float xInScreen; //记录当前手指位置在屏幕上的横坐标值 + private float yInScreen; //记录当前手指位置在屏幕上的纵坐标值 + private float xDownInScreen; //记录手指按下时在屏幕上的横坐标的值 + private float yDownInScreen; //记录手指按下时在屏幕上的纵坐标的值 + private float xInView; //记录手指按下时在小悬浮窗的View上的横坐标的值 + private float yInView; //记录手指按下时在小悬浮窗的View上的纵坐标的值 + + public MenuView(Context context) { + super(context); + windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + LayoutInflater.from(context).inflate(R.layout.view_menu, this); + View view = findViewById(R.id.menu); + viewWidth = view.getLayoutParams().width; + viewHeight = view.getLayoutParams().height; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + ContainerService.initFirstTime(); + ContainerService.initTempTime(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + xInView = event.getX(); + yInView = event.getY(); + xDownInScreen = event.getRawX(); + yDownInScreen = event.getRawY(); + xInScreen = event.getRawX(); + yInScreen = event.getRawY(); + break; + case MotionEvent.ACTION_MOVE: + xInScreen = event.getRawX(); + yInScreen = event.getRawY(); + updateViewPosition(); + break; + case MotionEvent.ACTION_UP: // 抬起时位置和按下时一致 表示点击 + if (xDownInScreen != xInScreen || yDownInScreen != yInScreen) break; + QMWindowManager.showAppList(); + break; + default: + break; + } + return true; + } + + public void setParams(WindowManager.LayoutParams params) { + mParams = params; + } + + private void updateViewPosition() { + mParams.x = (int) (xInScreen - xInView); + mParams.y = (int) (yInScreen - yInView); + if (windowManager != null) windowManager.updateViewLayout(this, mParams); + } +} diff --git a/app/src/main/java/qianmu/container/manager/QMWindowManager.java b/app/src/main/java/qianmu/container/manager/QMWindowManager.java new file mode 100644 index 0000000..1542a2d --- /dev/null +++ b/app/src/main/java/qianmu/container/manager/QMWindowManager.java @@ -0,0 +1,113 @@ +package qianmu.container.manager; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.util.DisplayMetrics; +import android.view.Gravity; + +import qianmu.container.R; +import qianmu.container.app.MyApplication; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + + +/** + * Created by genglaixin on 2018/4/19. + */ + +public class QMWindowManager { + + private static MenuView menuView; //窗口View的实例 + private static AppListView appListView; //窗口View的实例 + private static android.view.WindowManager.LayoutParams menuViewParams; //窗口View的参数 + private static android.view.WindowManager.LayoutParams appListViewParams; //窗口View的参数 + private static android.view.WindowManager mWindowManager; //用于在屏幕上添加或移除悬浮窗 + + public static void createMenuWindow() { + Context context = MyApplication.getInstance(); + android.view.WindowManager windowManager = getWindowManager(); + if (menuView == null) { + menuView = new MenuView(context); + if (menuViewParams == null) { + DisplayMetrics dm = new DisplayMetrics(); + windowManager.getDefaultDisplay().getRealMetrics(dm); + int screenWidth = dm.widthPixels; + int screenHeight = dm.heightPixels; + menuViewParams = new android.view.WindowManager.LayoutParams(); + menuViewParams.type = android.view.WindowManager.LayoutParams.TYPE_PHONE; + menuViewParams.format = PixelFormat.RGBA_8888; + menuViewParams.flags = android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + menuViewParams.gravity = Gravity.START | Gravity.TOP; + menuViewParams.width = MenuView.viewWidth; + menuViewParams.height = MenuView.viewHeight; + menuViewParams.x = screenWidth - MenuView.viewWidth - context.getResources().getDimensionPixelSize(R.dimen.dimens_68); + menuViewParams.y = screenHeight - MenuView.viewHeight - context.getResources().getDimensionPixelSize(R.dimen.dimens_46); + } + menuView.setParams(menuViewParams); + windowManager.addView(menuView, menuViewParams); + } + } + + public static void createAppListWindow() { + Context context = MyApplication.getInstance(); + android.view.WindowManager windowManager = getWindowManager(); + int screenWidth = windowManager.getDefaultDisplay().getWidth(); + int screenHeight = windowManager.getDefaultDisplay().getHeight(); + if (appListView == null) { + appListView = new AppListView(context); + if (appListViewParams == null) { + appListViewParams = new android.view.WindowManager.LayoutParams(); + appListViewParams.type = android.view.WindowManager.LayoutParams.TYPE_PHONE; + appListViewParams.format = PixelFormat.RGBA_8888; + appListViewParams.flags = android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + appListViewParams.gravity = Gravity.START | Gravity.TOP; + appListViewParams.width = AppListView.viewWidth; + appListViewParams.height = AppListView.viewHeight; + appListViewParams.x = screenWidth; + appListViewParams.y = screenHeight; + } + windowManager.addView(appListView, appListViewParams); + } + } + + //将窗口从屏幕上移除 + public static void removeMenuWindow() { + try { + if (menuView == null) return; + android.view.WindowManager windowManager = getWindowManager(); + windowManager.removeView(menuView); + menuView = null; + } catch (Throwable t) { + LoggerUtil.e("removeMenuWindow", StringUtil.getThrowableStr(t)); + } + + } + + public static void removeAppListView() { + try { + if (appListView == null) return; + android.view.WindowManager windowManager = getWindowManager(); + windowManager.removeView(appListView); + appListView = null; + } catch (Throwable t) { + LoggerUtil.e("removeAppListView", StringUtil.getThrowableStr(t)); + } + } + + public static void showMenu() { + QMWindowManager.removeAppListView(); + if (menuView == null) QMWindowManager.createMenuWindow(); + } + + public static void showAppList() { + QMWindowManager.removeMenuWindow(); + if (appListView == null) QMWindowManager.createAppListWindow(); + } + + //如果windowManager还未创建,则创建一个新的WindowManager返回 否则返回已经创建的WindowManager + private static android.view.WindowManager getWindowManager() { + if (mWindowManager == null) + mWindowManager = (android.view.WindowManager) MyApplication.getInstance().getSystemService(Context.WINDOW_SERVICE); + return mWindowManager; + } +} diff --git a/app/src/main/java/qianmu/container/mqtt/CloseMqttBean.java b/app/src/main/java/qianmu/container/mqtt/CloseMqttBean.java new file mode 100644 index 0000000..a334ac4 --- /dev/null +++ b/app/src/main/java/qianmu/container/mqtt/CloseMqttBean.java @@ -0,0 +1,40 @@ +package qianmu.container.mqtt; + +import java.io.Serializable; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/5/23 + * Time: 15:53 + * Mqtt遗嘱 + */ +public class CloseMqttBean implements Serializable { + private String type; + public long timestamp; + public MqttDataBean data; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public MqttDataBean getData() { + return data; + } + + public void setData(MqttDataBean data) { + this.data = data; + } +} diff --git a/app/src/main/java/qianmu/container/mqtt/MQTTService.java b/app/src/main/java/qianmu/container/mqtt/MQTTService.java new file mode 100644 index 0000000..8311d06 --- /dev/null +++ b/app/src/main/java/qianmu/container/mqtt/MQTTService.java @@ -0,0 +1,782 @@ +package qianmu.container.mqtt; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Binder; +import android.os.Environment; +import android.os.IBinder; +import android.util.Log; + +import androidx.core.app.NotificationCompat; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.FileCallback; +import com.ys.rkapi.MyManager; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; +import org.eclipse.paho.android.service.MqttAndroidClient; +import org.eclipse.paho.client.mqttv3.IMqttActionListener; +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.IMqttToken; +import org.eclipse.paho.client.mqttv3.MqttCallback; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.security.KeyManagementException; +import java.security.KeyPair; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.Security; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executors; + + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import qianmu.container.activity.BaseActivity; +import qianmu.container.activity.H5.H5Data; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.data.FloorData; +import qianmu.container.data.MqttData; +import qianmu.container.data.PowerData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.util.AesUtil; +import qianmu.container.util.AppUtil; +import qianmu.container.util.BitmapUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import static qianmu.container.util.LoggerUtil.SAVE_LOG_DIR_PATH; +import static qianmu.container.util.LoggerUtil.e; + + +public class MQTTService extends Service { + + + public static final String TAG = "MQTTService"; + + private static MqttAndroidClient client; + private MqttConnectOptions conOpt; + static boolean isDownloadFile = false; + private long programTime =0;//防止短时间接收多条信息 + private String host; + private String userName ; + private String passWord ; + private static String myTopic ; //要订阅的主题 + private String clientId ;//客户端标识 + private IGetMessageCallBack IGetMessageCallBack; + private boolean isConnected = false;//mqtt状态 + private int connectionLostNumb = 0;//失去连接次数 + private long connectionLostTime = 0;//失去连接时间 + private long connectTime = 0;//连接时间 + + public MQTTService() { + } + + @Override + public IBinder onBind(Intent intent) { + LoggerUtil.e("MQTTService","onBind"); + return new CustomBinder(); + } + + @Override + public void onCreate() { + super.onCreate(); + Constant.mqttState="on"; + LoggerUtil.e("MQTTService","onCreate"); +// host = StringUtil.strSplice("tcp://",MqttData.getMqttInfo().getServer(), ":", MqttData.getMqttInfo().getPort()); + host = StringUtil.strSplice("ssl://",MqttData.getMqttInfo().getServer(), ":", MqttData.getMqttInfo().getPort()); + myTopic= StringUtil.strSplice("/",FloorData.getMallCode(), "/", DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE)); + userName= DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + if(Constant.tywx){ + passWord= AesUtil.md5(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_MAC, SignWayUtil.getEthMacAddress())); + Log.e("MQTTService","passWord:"+passWord); + }else { + passWord= MqttData.getMqttToken().getPassword(); + } + clientId= DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + EventBus.getDefault().register(this); + init(); + + } + + public static void publish(String msg){ + try { + String topic = myTopic; + Integer qos = 0; + Boolean retained = false; + if (client != null){ + client.publish(topic, msg.getBytes(), qos.intValue(), retained.booleanValue()); + } + } catch (MqttException e) { + e.printStackTrace(); + } + } + + private void init() { + // 服务器地址(协议+地址+端口号) + String uri = host; + client = new MqttAndroidClient(this, uri, clientId); + // 设置MQTT监听并且接受消息 + client.setCallback(mqttCallback); + + conOpt = new MqttConnectOptions(); + // 忽略证书 + setFactory(conOpt); + // 清除缓存 + conOpt.setCleanSession(true); + // 设置超时时间,单位:秒 + conOpt.setConnectionTimeout(10); + // 心跳包发送间隔,单位:秒 + conOpt.setKeepAliveInterval(20); + // 用户名 + conOpt.setUserName(userName); + // 密码 + conOpt.setPassword(passWord.toCharArray()); //将字符串转换为字符串数组 + +// conOpt.setAutomaticReconnect(true); + + // last will message + boolean doConnect = true; + + CloseMqttBean closeMqttBean = new CloseMqttBean(); + closeMqttBean.setTimestamp(System.currentTimeMillis()); + closeMqttBean.setType("app-offline"); + MqttDataBean mqttDataBean = new MqttDataBean(); + mqttDataBean.setClientid(clientId); + closeMqttBean.setData(mqttDataBean); + String message = new Gson().toJson(closeMqttBean); + + Log.e(getClass().getName(), "message是:" + message); + + String topic = myTopic; + Integer qos = 0; + Boolean retained = false; + if ((!message.equals("")) || (!topic.equals(""))) { + // 最后的遗嘱 + // MQTT本身就是为信号不稳定的网络设计的,所以难免一些客户端会无故的和Broker断开连接。 + //当客户端连接到Broker时,可以指定LWT,Broker会定期检测客户端是否有异常。 + //当客户端异常掉线时,Broker就往连接时指定的topic里推送当时指定的LWT消息。 + + try { + conOpt.setWill(topic, message.getBytes(), qos.intValue(), retained.booleanValue()); + } catch (Exception e) { + Log.e(TAG, "Exception Occured", e); + doConnect = false; + iMqttActionListener.onFailure(null, e); + } + } + + if (doConnect) { + doClientConnection(); + } + + } + + @Override + public void onDestroy() { + LoggerUtil.e("MQTTService","onDestroy"); + Constant.mqttState="off"; + isConnected = false; + sendOffline(); + disconnectMqtt(); + stopSelf(); +// try { +// client.disconnect(); +// } catch (MqttException e) { +// e.printStackTrace(); +// } + EventBus.getDefault().unregister(this); + super.onDestroy(); + } + + /** 连接MQTT服务器 */ + public void doClientConnection() { + try { + if(connectionLostNumb>10){ + LoggerUtil.e(TAG,"出现多次断线重连,通知重启mqtt服务"); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_MQTT)); + return; + } + if (!isConnected) { + LoggerUtil.e(TAG,"MQTT尝试重连"); + client.connect(conOpt, null, iMqttActionListener); + } + } catch (MqttException e) { + e.printStackTrace(); + } + + } + + // MQTT是否连接成功 + private IMqttActionListener iMqttActionListener = new IMqttActionListener() { + + @Override + public void onSuccess(IMqttToken arg0) { + LoggerUtil.e(TAG, "连接成功 "); + isConnected = true; + try { + // 订阅myTopic话题 + client.subscribe(myTopic,2); + sendOnline(); + + connectTime = System.currentTimeMillis(); + if(Math.abs(connectTime-connectionLostTime)>3600000){ + //连接时间与连接失败时间相差60分钟,连接上时自动拉取最新节目 + LoggerUtil.e("MQTTService","连接成功与连接失败时间相差60分钟,连接成功主动拉取最新节目"); + programPublish(); + } + + } catch (MqttException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(IMqttToken arg0, Throwable arg1) { + arg1.printStackTrace(); + // 连接失败,重连 + isConnected = false; + connectionLostTime = System.currentTimeMillis(); + LoggerUtil.e(TAG, "连接失败 "); + } + }; + + // MQTT监听并且接受消息 + private MqttCallback mqttCallback = new MqttCallback() { + + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + + String str1 = new String(message.getPayload()); + if (IGetMessageCallBack != null){ + IGetMessageCallBack.setMessage(str1); + } + String str2 = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained(); + Log.i(TAG, "messageArrived:" + str1); + Log.i(TAG, str2); + if(!str1.contains("app-alive")){ + LoggerUtil.e(TAG,"MQTT消息:"+str1); + } + sendCommand(str1); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken arg0) { + + } + + @Override + public void connectionLost(Throwable arg0) { + // 失去连接,重连 + isConnected = false; + long time = System.currentTimeMillis(); + if(time-connectionLostTime<80000){ + connectionLostNumb++; + }else{ + connectionLostNumb=0; + } + connectionLostTime = time; + LoggerUtil.e(TAG, " 失去连接: 时间:"+connectionLostTime+",次数:"+connectionLostNumb); +// LoggerUtil.e(TAG, " 失去连接 "); + + } + }; + + public void setIGetMessageCallBack(IGetMessageCallBack IGetMessageCallBack){ + this.IGetMessageCallBack = IGetMessageCallBack; + } + + public class CustomBinder extends Binder { + public MQTTService getService(){ + return MQTTService.this; + } + } + + + public interface IGetMessageCallBack { + public void setMessage(String message); + } + + + public static class MyServiceConnection implements ServiceConnection { + + private MQTTService mqttService; + private IGetMessageCallBack IGetMessageCallBack; + + @Override + public void onServiceConnected(ComponentName componentName, IBinder iBinder) { + mqttService = ((MQTTService.CustomBinder)iBinder).getService(); + mqttService.setIGetMessageCallBack(IGetMessageCallBack); + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + + } + + public MQTTService getMqttService(){ + return mqttService; + } + + public void setIGetMessageCallBack(IGetMessageCallBack IGetMessageCallBack){ + this.IGetMessageCallBack = IGetMessageCallBack; + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(MessageEvent message) { + + if(message.getCode().equals(Constant.ACTION_MQTT_STATE)){ + doClientConnection(); + }else if(message.getCode().equals(Constant.ACTION_MQTT_ALIVE)){ + sendAlive(); + } + + } + + //发送在线消息 + public void sendOnline(){ + try { + CloseMqttBean closeMqttBean = new CloseMqttBean(); + closeMqttBean.setTimestamp(System.currentTimeMillis()); + closeMqttBean.setType("app-online"); + MqttDataBean mqttDataBean = new MqttDataBean(); + mqttDataBean.setClientid(clientId); + closeMqttBean.setData(mqttDataBean); + String message = new Gson().toJson(closeMqttBean); + publish(message); + }catch (Exception e){ + + } + } + + //发送在线消息 + public void sendAlive(){ + try { + if (isConnected) { + CloseMqttBean closeMqttBean = new CloseMqttBean(); + closeMqttBean.setTimestamp(System.currentTimeMillis()); + closeMqttBean.setType("app-alive"); + MqttDataBean mqttDataBean = new MqttDataBean(); + mqttDataBean.setClientid(clientId); + closeMqttBean.setData(mqttDataBean); + String message = new Gson().toJson(closeMqttBean); + publish(message); + } + }catch (Exception e){ + + } + } + + //发送离线消息 + public void sendOffline(){ + try { + CloseMqttBean closeMqttBean = new CloseMqttBean(); + closeMqttBean.setTimestamp(System.currentTimeMillis()); + closeMqttBean.setType("app-offline"); + MqttDataBean mqttDataBean = new MqttDataBean(); + mqttDataBean.setClientid(clientId); + closeMqttBean.setData(mqttDataBean); + String message = new Gson().toJson(closeMqttBean); + publish(message); + }catch (Exception e){ + + } + + } + + //断开连接 + public void disconnectMqtt(){ + try { + if(client!=null){ + client.unsubscribe(myTopic); + IMqttToken disconnectToken = client.disconnect(); +// disconnectToken.waitForCompletion(); + } + } catch (MqttException e) { + e.printStackTrace(); + } + + } + + public void sendCommand(String msg){ + + CloseMqttBean closeMqttBean =new Gson().fromJson(msg, new TypeToken() { + }.getType()); + + if(closeMqttBean.getType().equals("app-update")){ + //APP下发 + appUpdate(closeMqttBean); + }else if(closeMqttBean.getType().equals("h5-update")){ + //h5下发 + h5Update(closeMqttBean); + }else if(closeMqttBean.getType().equals("device-restart")){ + //重启 + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE);//设备类型,导视,信发等 + if(deviceType.equals("指路机")){ + DeviceData.jxbReboot(null,null); + } + SignWayUtil.reboot(); + }else if(closeMqttBean.getType().equals("applicationProgram-restart")){ + //软件重启 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_RESTART_APP)); + }else if(closeMqttBean.getType().equals("device-shutdown")){ + //关机 + SignWayUtil.shutDown(); + }else if(closeMqttBean.getType().equals("device-time-update")){ + //定时开关机 + PowerData.savePowerList(closeMqttBean.getData().getTime()); + + }else if(closeMqttBean.getType().equals("device-time-clear")){ + //清除定时开关机 + MqttDataBean.TimeData time= new MqttDataBean.TimeData(); + time.setOff(""); + time.setOn(""); + time.setWeekList(new ArrayList<>()); + PowerData.savePowerList(time); + }else if(closeMqttBean.getType().equals("device-screenshot")){ + //截屏 + screenShot(closeMqttBean.timestamp); + }else if(closeMqttBean.getType().equals("device-group-update")){ + //分组 + deviceGroup(closeMqttBean); + + }else if(closeMqttBean.getType().equals("program-publish")){ + //节目发布 + programPublish(); + + }else if(closeMqttBean.getType().equals("generate-log")){ + //手动上传日志 + try { + String initiator = closeMqttBean.getData().getInitiator(); + if(initiator!=null){ + sendLog(initiator); + }else{ + sendLog(""); + } + }catch (Exception e){ + + } + }else if(closeMqttBean.getType().equals("device-edit")){ + //设备信息编辑 + MqttDataBean.deviceData device = closeMqttBean.getData().getDevice(); + DeviceData.saveDeviceName(device.getName()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TOUCH, String.valueOf(device.getTouch()));//设备触摸 + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE, device.getMachineTypeName());//设备类型 + + if(!DeviceData.getDeviceInfo(DeviceData.BUILDING_NAME).equals(device.getBuilding())||!DeviceData.getDeviceInfo(DeviceData.FLOOR_NAME).equals(device.getFloor())){ + DeviceData.saveDeviceInfo(DeviceData.BUILDING_NAME, device.getBuilding());//楼栋名称 + if(device.getBuildingCode()!=null){ + DeviceData.saveDeviceInfo(DeviceData.BUILDING_CODE, device.getBuildingCode());//楼栋code + } + DeviceData.saveDeviceInfo(DeviceData.FLOOR_NAME, device.getFloor());//楼层名称 + if(device.getFloorCode()!=null){ + DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE, device.getFloorCode());//楼层code + + } + FloorData.getDeviceOptionsNew(DeviceData.getDeviceInfo(DeviceData.HINT_REG_KEY),null, null); + } + + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_SHOW_TOUCH_ME)); + }else if(closeMqttBean.getType().equals("protection-update")){ + //屏保信息修改 + ScreenSaverData.queryScreensaver(null, null); + } + } + + /** + * 更新app + * */ + public void appUpdate(CloseMqttBean closeMqttBean){ + String url = closeMqttBean.getData().getUpdate().getUrl(); + String version = closeMqttBean.getData().getUpdate().getVersion(); + if(!version.equals(DeviceUtil.getVersionName())){ + downloadAppFile(url,StringUtil.strSplice(version,".apk")); + } + } + + /** + * 更新H5 + * */ + public void h5Update( CloseMqttBean closeMqttBean){ + String url = closeMqttBean.getData().getUpdate().getUrl(); + if(url.contains(".zip")||url.contains(".ZIP")||url.contains(".rar")){ + if(closeMqttBean.getData().getUpdate().version.equals(H5Data.getH5Version())){ + LoggerUtil.e("h5Update","下发H5包版本号相同:"+closeMqttBean.getData().getUpdate().version); + return; + }; + //导视zip + H5Data.saveH5Url(""); + //下载导视dist包 + H5Data.downloadH5AppFile(url,"dist",closeMqttBean.getData().getUpdate().version,"zip",null); + }else{ + //单独url地址 + H5Data.saveH5Url(url); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_UPDATE_WEBVIEW));//通知webview刷新 + } + } + + /** + * 订阅分组 + * */ + public void deviceGroup( CloseMqttBean closeMqttBean ){ + List groupList = closeMqttBean.getData().getGroup(); + List mqttTopicList = MqttData.getMqttTopicList(); + //移除之前订阅从新订阅 + try { + client.unsubscribe(mqttTopicList.toArray(new String[mqttTopicList.size()])); + } catch (MqttException e) { + e.printStackTrace(); + } + subscribeTopic(groupList); + MqttData.saveTopic(groupList.toString()); + } + + /** + * 节目发布 + * */ + public void programPublish(){ + long currentTime = System.currentTimeMillis(); + //防止相同时间接收到多条信息 + if(currentTime-programTime>500){ + programTime = currentTime; + if (Constant.whoActivity.equals(Constant.ROUTE_SCREEN_SAVER)) { + Log.e(TAG,"屏保页面,进行通知更新数据"); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_UPDATE_PROG)); + }else if(Constant.whoActivity.equals(Constant.ROUTE_WEB_VIEW)) { + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_UPDATE_PROG2)); + } + } + programTime = currentTime; + } + + /** + * 手动上传日志 + * */ + public void sendLog(String initiator){ + String deviceCode = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE); + String fileName = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis()); + String path= StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/", fileName, ".txt"); + LoggerUtil.uploadLogFile(path,deviceCode,initiator,"1"); + } + + /** + * 订阅topic + * */ + public static void subscribeTopic(List groupList){ + + if(groupList==null||groupList.size()<=0){ + return; + } + try { + for(String group : groupList ) { + client.subscribe( StringUtil.strSplice("/",FloorData.getMallCode(), "/", group), 2); + + } + } catch (MqttException e) { + e.printStackTrace(); + } + } + + /** + * 截屏 + * */ + public static void screenShot(long time) { + + if(Constant.androidBoardType.equals("nova")){ + MessageEvent messageEvent = new MessageEvent(Constant.NOVA_SCREEN_SHOT); + messageEvent.setData(""+time); + EventBus.getDefault().post(messageEvent); + return; + } + String path = StringUtil.strSplice(BitmapUtil.SAVE_SCREEN_SHOT_PATH, "/screenShot.png"); + File file = new File(path); + File parent = file.getParentFile(); + if (!parent.exists()) parent.mkdirs(); + + if(SignWayUtil.getgetAndroidModle().equals("t982")){ + //亿晟主板t982特殊处理上传 + boolean b = SignWayUtil.ysTakeScreenshot(path); + if(!b){ + return; + } + Executors.newSingleThreadExecutor().execute(() -> { + try { + + uploadScreenShot(path,DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),String.valueOf(time)); + + } catch (Exception e) { + e.printStackTrace(); + } + }); + return; + } + + String cmd = "screencap -p " + path; + Executors.newSingleThreadExecutor().execute(() -> { + try { + Process process = Runtime.getRuntime().exec("su");//不同的设备权限不一样 + PrintWriter pw = new PrintWriter(process.getOutputStream()); + pw.println(cmd); + pw.flush(); + pw.println("exit"); + pw.flush(); + try { + process.waitFor(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + pw.close(); + process.destroy(); + + if(!new File(path).exists()){ + LoggerUtil.e("screenShot","截屏失败"); + return; + } + uploadScreenShot(path,DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE),String.valueOf(time)); + + } catch (IOException e) { + e.printStackTrace(); + } + }); + + } + + //上传截屏 + public static void uploadScreenShot(String filePath,String code,String timestamp) { + + File file = new File(filePath); + if (!file.exists()||code.isEmpty()) return; + if(SignWayUtil.getgetAndroidModle().equals("t982")){ + BitmapUtil.postRotateImg(filePath); + } + RequestBody fileRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); + MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("code",code) + .addFormDataPart("timestamp",timestamp); + + builder.addFormDataPart("file", file.getName(),fileRequestBody); + RequestBody requestBody = builder.build(); + + RetrofitUtil.getBaseService().upScreenShort(requestBody ).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + LoggerUtil.e("uploadScreenShot", new Gson().toJson(response.body())); + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("uploadScreenShot", StringUtil.getThrowableStr(t)); + } + }); + + } + + /** + * 下载app并安装 + */ + private void downloadAppFile(String url,final String appName) { + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/", appName); + FileUtil.downloadFile(url, localPath, () -> { + isDownloadFile = false; + AppUtil.installApp(localPath, DeviceUtil.getPackageName(), DeviceUtil.getPackageName(), true); + }); + } + + /** + * 忽略证书 + * */ + private void setFactory(MqttConnectOptions conOpt){ + TrustManager[] trustAllCerts= new TrustManager[1]; + miTM tm = new miTM(); + trustAllCerts[0]=tm; + try { + SSLContext sc = SSLContext.getInstance("SSL"); + try { + sc.init(null,trustAllCerts,null); + SSLSocketFactory factory = sc.getSocketFactory(); + conOpt.setSocketFactory(factory); + } catch (KeyManagementException e) { + Log.e("TAG","KeyManagementException:"+e.getMessage()); + e.printStackTrace(); + } + } catch (NoSuchAlgorithmException e) { + Log.e("TAG","NoSuchAlgorithmException:"+e.getMessage()); + e.printStackTrace(); + } + } + + static class miTM implements TrustManager, X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + + return; + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + return; + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + } + + +} + diff --git a/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java b/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java new file mode 100644 index 0000000..8c6fbd9 --- /dev/null +++ b/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java @@ -0,0 +1,259 @@ +package qianmu.container.mqtt; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/5/23 + * Time: 16:26 + * Mqtt遗嘱 + */ +public class MqttDataBean implements Serializable { + private String clientid; + + UpdateData update; + TimeData time; + deviceData device; + String initiator;//发起人 + List group;//设备组 + + + public String getClientid() { + return clientid; + } + + public void setClientid(String clientid) { + this.clientid = clientid; + } + + public UpdateData getUpdate() { + return update; + } + + public void setUpdate(UpdateData update) { + this.update = update; + } + + public TimeData getTime() { + return time; + } + + public void setTime(TimeData time) { + this.time = time; + } + + public deviceData getDevice() { + return device; + } + + public void setDevice(deviceData device) { + this.device = device; + } + + public String getInitiator() { + return initiator; + } + + public void setInitiator(String initiator) { + this.initiator = initiator; + } + + public List getGroup() { + return group; + } + + public void setGroup(List group) { + this.group = group; + } + + /** + * 更新App + * */ + public class UpdateData implements Serializable{ + String version; + String url; + String size; + String name; + String description;//备注 + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } + + /** + * 定时开关机 + * */ + public static class TimeData implements Serializable { + + String on; + String off; + List weekList;//按周 + + public String getOn() { + return on; + } + + public void setOn(String on) { + this.on = on; + } + + public String getOff() { + return off; + } + + public void setOff(String off) { + this.off = off; + } + + public List getWeekList() { + return weekList; + } + + public void setWeekList(List weekList) { + this.weekList = weekList; + } + } + + /** + * 周定时开关机 + * */ + public static class week implements Serializable { + + String on; + String off; + + public String getOn() { + return on; + } + + public void setOn(String on) { + this.on = on; + } + + public String getOff() { + return off; + } + + public void setOff(String off) { + this.off = off; + } + } + + /** + * 设备信息 + * */ + public class deviceData implements Serializable{ + String name; + String machineTypeName;// 类型名称 如:导视 + String touch;// 状态 0触摸 1非触摸 + String building;// 楼栋 + String buildingCode;// 楼栋code + String floor; // 楼层 + String floorCode; // 楼层code + String description;//备注 + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getMachineTypeName() { + return machineTypeName; + } + + public void setMachineTypeName(String machineTypeName) { + this.machineTypeName = machineTypeName; + } + + public String getTouch() { + return touch; + } + + public void setTouch(String touch) { + this.touch = touch; + } + + public String getBuilding() { + return building; + } + + public void setBuilding(String building) { + this.building = building; + } + + public String getBuildingCode() { + return buildingCode; + } + + public void setBuildingCode(String buildingCode) { + this.buildingCode = buildingCode; + } + + public String getFloorCode() { + return floorCode; + } + + public void setFloorCode(String floorCode) { + this.floorCode = floorCode; + } + + public String getFloor() { + return floor; + } + + public void setFloor(String floor) { + this.floor = floor; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } + +} diff --git a/app/src/main/java/qianmu/container/mqtt/MqttMessageBean.java b/app/src/main/java/qianmu/container/mqtt/MqttMessageBean.java new file mode 100644 index 0000000..d725bc4 --- /dev/null +++ b/app/src/main/java/qianmu/container/mqtt/MqttMessageBean.java @@ -0,0 +1,204 @@ +package qianmu.container.mqtt; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/5/25 + * Time: 10:39 + * MQtt接收信息 + */ +public class MqttMessageBean implements Serializable { + + String type;//类型 + long timestamp;//时间戳 + data data; + List group;//所在组 + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public MqttMessageBean.data getData() { + return data; + } + + public void setData(MqttMessageBean.data data) { + this.data = data; + } + + public List getGroup() { + return group; + } + + public void setGroup(List group) { + this.group = group; + } + + class data implements Serializable { + + UpdateBean update;//更新 + TimeBean time;//定时开关机 + DeviceBean device;//设备信息 + + public UpdateBean getUpdate() { + return update; + } + + public void setUpdate(UpdateBean update) { + this.update = update; + } + + public TimeBean getTime() { + return time; + } + + public void setTime(TimeBean time) { + this.time = time; + } + + public DeviceBean getDevice() { + return device; + } + + public void setDevice(DeviceBean device) { + this.device = device; + } + } + + class UpdateBean implements Serializable { + + + String version;//版本 + String url;//路径 + int size;//文件大小 + String description; //备注 + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } + + class TimeBean implements Serializable { + + String on;//开机 + String off;//关机 + + public String getOn() { + return on; + } + + public void setOn(String on) { + this.on = on; + } + + public String getOff() { + return off; + } + + public void setOff(String off) { + this.off = off; + } + } + + class DeviceBean implements Serializable { + + String name; + int machineTypeId;//1导视 2信发 3游戏 + int touch;//0触摸 1非触摸 + String building;//楼栋 + String floor;//楼层 + String description;//备注 + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getMachineTypeId() { + return machineTypeId; + } + + public void setMachineTypeId(int machineTypeId) { + this.machineTypeId = machineTypeId; + } + + public int getTouch() { + return touch; + } + + public void setTouch(int touch) { + this.touch = touch; + } + + public String getBuilding() { + return building; + } + + public void setBuilding(String building) { + this.building = building; + } + + public String getFloor() { + return floor; + } + + public void setFloor(String floor) { + this.floor = floor; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } + +} diff --git a/app/src/main/java/qianmu/container/receiver/SystemEventReceiver.java b/app/src/main/java/qianmu/container/receiver/SystemEventReceiver.java new file mode 100644 index 0000000..1a37562 --- /dev/null +++ b/app/src/main/java/qianmu/container/receiver/SystemEventReceiver.java @@ -0,0 +1,48 @@ +package qianmu.container.receiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import org.greenrobot.eventbus.EventBus; + +import qianmu.container.activity.H5.UpdateFileActivity; +import qianmu.container.activity.program.ScreenSaverActivity; +import qianmu.container.entity.MessageEvent; +import qianmu.container.util.LoggerUtil; + + +/** + * 开机广播监听器 + * Created by Administrator on 2017/11/13. + */ + +public class SystemEventReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + + switch (intent.getAction()) { + case Intent.ACTION_BOOT_COMPLETED://系统启动 + intent.setClass(context, UpdateFileActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + break; + + case Intent.ACTION_MEDIA_MOUNTED://挂载外部存储 + Uri uri = intent.getData(); + if (uri == null) { + LoggerUtil.e("MEDIA", "获取U盘挂载路径失败"); + return; + } +// EventBus.getDefault().post(new MessageEvent(Intent.ACTION_MEDIA_MOUNTED, uri.getPath())); + break; + + case Intent.ACTION_MEDIA_UNMOUNTED://卸载外部存储 + EventBus.getDefault().post(new MessageEvent(Intent.ACTION_MEDIA_UNMOUNTED)); + break; + } + + } +} diff --git a/app/src/main/java/qianmu/container/service/ContainerService.java b/app/src/main/java/qianmu/container/service/ContainerService.java new file mode 100644 index 0000000..f8a72dc --- /dev/null +++ b/app/src/main/java/qianmu/container/service/ContainerService.java @@ -0,0 +1,407 @@ +package qianmu.container.service; + +import android.app.ActivityManager; +import android.app.AlarmManager; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.google.gson.Gson; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.callback.FileCallback; +import com.sun.jna.Native; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.math.BigInteger; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; + +import qianmu.container.R; +import qianmu.container.activity.H5.H5Data; +import qianmu.container.activity.program.ScreenSaverActivity; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.AppData; +import qianmu.container.data.PowerData; +import qianmu.container.entity.AppVersionBean; +import qianmu.container.handler.ContainerHandler; +import qianmu.container.data.DeviceData; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.entity.AppVersion; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.Resp; +import qianmu.container.entity.ScreenSaver; +import qianmu.container.entity.ScreenSaverTime; +import qianmu.container.http.retrofit.RetrofitUtil; +import qianmu.container.mqtt.CloseMqttBean; +import qianmu.container.socket.SocketClient; +import qianmu.container.util.AesUtil; +import qianmu.container.util.AppUtil; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.FileUtil; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.RootCmdUtil; +import qianmu.container.util.SignWayUtil; +import qianmu.container.util.StringUtil; +import qianmu.container.util.ViplexCore; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +import static qianmu.container.data.DeviceData.HINT_DEVICE_CODE; + +public class ContainerService extends Service { + + String TAG = "ContainerService"; + ContainerHandler handler; + + static final int SCREEN_SAVER_TIME = 10; //默认恢复屏保时间间隔(S) + static long lastClickTime = 0; //最后一次点击屏幕的时间 + static long tempTime = SCREEN_SAVER_TIME * 1000; //时间间隔 超过后打开屏保界面 + + static boolean isDownloadFile = false; + + + @Override + public void onCreate() { + super.onCreate(); + initFirstTime(); + initTempTime(); + EventBus.getDefault().register(this); + handler = new ContainerHandler(this); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMessageEvent(MessageEvent message) { + if (Constant.ACTION_CONNECT_LOCAL_SOCKET.equals(message.getCode())) { + handler.sendEmptyMessageDelayed(ContainerHandler.CONNECT_LOCAL_SOCKET, SocketClient.CONNECT_TIME_OUT); + } else if (Constant.ACTION_CLOSE_LOCAL_SOCKET.equals(message.getCode())) { + handler.sendEmptyMessageDelayed(ContainerHandler.CLOSE_LOCAL_SOCKET, SocketClient.CONNECT_TIME_OUT); + } else if (Constant.ACTION_START_SOCKET_SERVER.equals(message.getCode())) { + handler.sendEmptyMessageDelayed(ContainerHandler.START_SOCKET_SERVER, SocketClient.CONNECT_TIME_OUT); + } else if (Constant.ACTION_STOP_SOCKET_SERVER.equals(message.getCode())) { + handler.sendEmptyMessageDelayed(ContainerHandler.STOP_SOCKET_SERVER, SocketClient.CONNECT_TIME_OUT); + } + } + + //设置恢复屏保时间间隔 + public static void initTempTime() { + ScreenSaverTime screenSaverTime = ScreenSaverData.getScreenSaver(); + if (screenSaverTime == null) return; + if(screenSaverTime.getProtectionTime()==null||screenSaverTime.getProtectionTime().isEmpty())return; + if(screenSaverTime.getProtectionTime().length()>9){ + screenSaverTime.setProtectionTime("999999999"); + } + if(screenSaverTime.getJumpTime()==null || screenSaverTime.getJumpTime().isEmpty()){ + screenSaverTime.setJumpTime("0"); + } + if(screenSaverTime.getJumpTime().length()>9){ + screenSaverTime.setJumpTime("999999999"); + } + try { + int time = Integer.parseInt(screenSaverTime.getProtectionTime()) + Integer.parseInt(screenSaverTime.getJumpTime())+30;//增加30秒,减少与H5的倒计时误差 + if (SCREEN_SAVER_TIME > time) tempTime = SCREEN_SAVER_TIME * 1000; + else tempTime = time * 1000; + }catch (Throwable t){ + + } + } + + public static void initFirstTime() { + lastClickTime = System.currentTimeMillis(); + } + + //显示屏保 + public void showSplashActivity() { + try { + long currTime = System.currentTimeMillis(); + if (tempTime >= currTime - lastClickTime) return; + initFirstTime(); + AppUtil.updateMenuWindowState(); + if (!ScreenSaverData.isProgramPlay()) return;//没有节目 + if (AppData.getFrontApp().equals(DeviceUtil.getPackageName())) { //信发处于系统前端时 显示屏保页面 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_SHOW_SPLASH)); + } else { //重新启动信发软件并打开屏保页面 + ARouter.getInstance().build(Constant.ROUTE_SCREEN_SAVER).navigation(); + } + } catch (Throwable t) { + LoggerUtil.e("showSplashActivity()", StringUtil.getThrowableStr(t)); + } + } + + private boolean isFrontApp() { + try { + ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); + List appProcesses = am.getRunningAppProcesses(); + if (appProcesses == null) return false; + for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { + if (!appProcess.processName.equals(DeviceUtil.getPackageName())) continue; + if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) + continue; + return true; + } + return false; + } catch (Throwable t) { + LoggerUtil.e("isFrontApp", StringUtil.getThrowableStr(t)); + return false; + } + } + + /** + * 检测应用状态 如果在后台 唤醒到前台 + */ + public void detectionAppState() { + final ActivityManager manager = (ActivityManager) MyApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE); + // 获得手机进程列表 + List infoList = manager.getRunningAppProcesses(); + String packageName = DeviceUtil.getPackageName(); + for (ActivityManager.RunningAppProcessInfo info : infoList) { + if (packageName.equals(info.processName) + || "com.android.packageinstaller".equals(info.processName) + || "com.google.android.packageinstaller".equals(info.processName) + || "com.frogshealth.qianmu".equals(info.processName) + || "com.tencent.wmpf".equals(info.processName)) { + if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { + return; + } + } + } + LoggerUtil.e("detectionAppState","检测应用被退到后台,重新唤醒到前台"); + if("信发".equals( DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))||"双面屏".equals( DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE))){ + //信发 + Intent intent = new Intent(MyApplication.getInstance(), ScreenSaverActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MyApplication.getInstance().startActivity(intent); + }else { + LoggerUtil.e("detectionAppState","跳转到导视"); + ARouter.getInstance().build(Constant.ROUTE_WEB_VIEW).withBoolean(Constant.KEY_LOAD_H5_URL, true).navigation(); + } + + } + + /** + * 软件更新检测 + */ + public void downloadUpdateFile() { + final String fileName = "android_version.txt"; + final String fileUrl = StringUtil.strSplice(Constant.getBaseAddress(), "/update/", fileName); + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/"); + + OkGo.get(fileUrl).tag(this).execute(new FileCallback(localPath, fileName) { + @Override + public void onSuccess(com.lzy.okgo.model.Response response) { + StringBuilder result = new StringBuilder(); + try { + File localFile = new File(StringUtil.strSplice(localPath, fileName)); + if (!localFile.exists()) return; + BufferedReader br = new BufferedReader(new FileReader(localFile)); + String s; + while ((s = br.readLine()) != null) result.append("\n").append(s); + br.close(); + AppVersion versionBean = new Gson().fromJson(result.toString(), AppVersion.class); + String deviceVersion = DeviceUtil.getVersionName(); + if (deviceVersion.equals(versionBean.getInformation()) || isDownloadFile) + return; + isDownloadFile = true; + downloadAppFile(StringUtil.strSplice("container_", versionBean.getInformation())); + + } catch (Throwable t) { + LoggerUtil.e("downloadUpdateFile", StringUtil.getThrowableStr(t)); + } + } + + @Override + public void onError(com.lzy.okgo.model.Response response) { + super.onError(response); + File file = new File(StringUtil.strSplice(localPath, fileName)); + if (file.exists()) file.delete(); + } + }); + } + + /** + * 下载app并安装 + */ + private void downloadAppFile(final String appName) { + final String fileName = StringUtil.strSplice(appName, ".apk"); + final String fileUrl = StringUtil.strSplice(Constant.getBaseAddress(), "/update/", fileName); + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/", fileName); + FileUtil.downloadFile(fileUrl, localPath, () -> { + isDownloadFile = false; + AppUtil.installApp(localPath, DeviceUtil.getPackageName(), DeviceUtil.getPackageName(), true); + }); + } + + /** + * 更新app + * */ + public void appUpdate(){ + + RetrofitUtil.getBaseService().getMachineAppProgramMsg(DeviceData.getDeviceInfo(HINT_DEVICE_CODE)).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + LoggerUtil.e("getMachineAppProgramMsg()", GsonUtil.getGson().toJson(response.body())); + if (StringUtil.respSuccess(response.body())) { + + String decryptDataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + + if(decryptDataJson.equals("解密失败")){ + AppVersionBean appVersionBean= new Gson().fromJson(GsonUtil.getGson().toJson(response.body().getData()), AppVersionBean.class); + if(appVersionBean==null) return; + String appVersion = appVersionBean.getAppVersion(); + String appPackageUrl = appVersionBean.getAppPackageUrl(); + if(appVersion!=null && !appVersion.isEmpty() && !appVersion.toUpperCase().equals(DeviceUtil.getVersionName()) && appVersion.contains("V")){ + LoggerUtil.e("appUpdate()","app版本号:"+DeviceUtil.getVersionName()+",下发版本号:"+appVersion); + downloadAppFile(appPackageUrl,StringUtil.strSplice(appVersion,".apk")); + }else { + //app版本相同,则开始更新H5 + h5Update( appVersionBean ); + } + }else { + AppVersionBean appVersionBean= new Gson().fromJson(decryptDataJson, AppVersionBean.class); + if(appVersionBean==null) return; + String appVersion = appVersionBean.getAppVersion(); + String appPackageUrl = appVersionBean.getAppPackageUrl(); + if(appVersion!=null && !appVersion.isEmpty() && !appVersion.toUpperCase().equals(DeviceUtil.getVersionName()) && appVersion.contains("V")){ + LoggerUtil.e("appUpdate()","app版本号:"+DeviceUtil.getVersionName()+",下发版本号:"+appVersion); + downloadAppFile(appPackageUrl,StringUtil.strSplice(appVersion,".apk")); + }else { + //app版本相同,则开始更新H5 + h5Update( appVersionBean ); + } + } + } + + } catch (Throwable t) { + LoggerUtil.e("getMachineAppProgramMsg()", StringUtil.getThrowableStr(t)); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("getMachineAppProgramMsg()", "接口请求超时"); + + } + }); + } + + /** + * 获取服务器时间戳 + * */ + public static void getCurrentTimestamp(){ + + RetrofitUtil.getBaseService().getCurrentTimestamp().enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + LoggerUtil.e("getCurrentTimestamp()", GsonUtil.getGson().toJson(response.body())); + String decryptDataJson = AesUtil.decrypt((String.valueOf(response.body().getData()))); + if(decryptDataJson.equals("解密失败")){ + long time = new BigInteger((String) response.body().getData()).longValue(); + if(Math.abs(time-System.currentTimeMillis())>60000){ + LoggerUtil.e("getCurrentTimestamp()","进行校验时间"); + Date date = new Date(time); + SignWayUtil.setDeviceTime(date); + } + }else { + long time = new BigInteger(decryptDataJson).longValue(); + if(Math.abs(time-System.currentTimeMillis())>60000){ + LoggerUtil.e("getCurrentTimestamp()","进行校验时间"); + Date date = new Date(time); + SignWayUtil.setDeviceTime(date); + } + } + } catch (Throwable t) { + LoggerUtil.e("getCurrentTimestamp()", StringUtil.getThrowableStr(t)); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.e("getCurrentTimestamp()", "接口请求超时"); + } + }); + } + + /** + * 下载app并安装 + */ + private void downloadAppFile(String url,final String appName) { + LoggerUtil.e("appUpdate","开始下载app"); + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/", appName); + FileUtil.downloadFile(url, localPath, () -> { + isDownloadFile = false; + LoggerUtil.e("appUpdate","下载完成,开始安装"); + AppUtil.installApp(localPath, DeviceUtil.getPackageName(), DeviceUtil.getPackageName(), true); + }); + } + + /** + * 更新H5 + * */ + public void h5Update(AppVersionBean appVersionBean){ + try { + String programVersion = appVersionBean.getProgramVersion(); + String url = appVersionBean.getProgramPackageUrl(); + if(programVersion==null || programVersion.isEmpty()) return; + if(url==null||url.isEmpty()) return; + if(url.contains(".zip")||url.contains(".ZIP")||url.contains(".rar")){ + //导视zip + if(programVersion.equals(H5Data.getH5Version())) return; + LoggerUtil.e("h5Update","本地应用版本:"+H5Data.getH5Version()+",下发应用版本:"+programVersion); + H5Data.saveH5Url(""); + //下载导视dist包 + H5Data.downloadH5AppFile(url,"dist",programVersion,"zip",null); + }else{ + //单独url地址 + if(programVersion.equals(H5Data.getH5Version())) return; + H5Data.saveH5Url(url); + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_UPDATE_WEBVIEW));//通知webview刷新 + } + }catch (Exception e){ + + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return super.onStartCommand(intent, flags, startId); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onDestroy() { + super.onDestroy(); + EventBus.getDefault().unregister(this); + if (handler == null) return; + handler.removeMessages(); + handler = null; + } +} diff --git a/app/src/main/java/qianmu/container/service/MessengerService.java b/app/src/main/java/qianmu/container/service/MessengerService.java new file mode 100644 index 0000000..1867cf2 --- /dev/null +++ b/app/src/main/java/qianmu/container/service/MessengerService.java @@ -0,0 +1,66 @@ +package qianmu.container.service; + +import android.app.Service; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import qianmu.container.data.AppData; + +@SuppressWarnings("All") +public class MessengerService extends Service { + + private static final int CLIENT_MESSAGE = 0x10001; + private static final int SERVER_MESSAGE = 0x10002; + + private static final String CLIENT_KEY = "client_key"; + + static final String UPDATE_FRONT_APP = "update_front_app"; + static final String CLICK_SCREEN = "click_screen"; + + Messenger messenger = new Messenger(new Handler()); + + @Override + public void onCreate() { + super.onCreate(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return messenger.getBinder(); + } + + public class Handler extends android.os.Handler { + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + if (msg.what == CLIENT_MESSAGE) analysisData(msg.getData()); + } + } + + private void analysisData(Bundle bundle) { + String clientKey = bundle.getString(CLIENT_KEY); + if (clientKey == null) return; + + switch (clientKey) { + case UPDATE_FRONT_APP: + if (bundle == null) return; + Log.e(UPDATE_FRONT_APP, bundle.getString(UPDATE_FRONT_APP)); + AppData.saveFrontApp(bundle.getString(UPDATE_FRONT_APP)); + break; + + case CLICK_SCREEN: + ContainerService.initFirstTime(); + ContainerService.initTempTime(); + break; + } + + } +} diff --git a/app/src/main/java/qianmu/container/service/MusicService.java b/app/src/main/java/qianmu/container/service/MusicService.java new file mode 100644 index 0000000..a83fed2 --- /dev/null +++ b/app/src/main/java/qianmu/container/service/MusicService.java @@ -0,0 +1,115 @@ +package qianmu.container.service; + +import android.app.Service; +import android.content.Intent; +import android.media.MediaPlayer; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; + +import java.io.File; +import java.util.List; + +import qianmu.container.app.Constant; +import qianmu.container.entity.MusicBean; +import qianmu.container.util.MusicUtil; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2022/1/7 + * Time: 9:22 + */ +public class MusicService extends Service { + + MediaPlayer mPlayer; + int musicPosition= 0 ; + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + + if (mPlayer==null) { + mPlayer = new MediaPlayer(); + } + + //装载音频完成监听 + mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + // 装载完毕回调 + mPlayer.start(); + musicPosition++; + } + }); + mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mediaPlayer) { + //播放完毕 + Log.e("TAG","音乐播放完毕"); + playMusic(); + } + }); + + mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { + //播放出错 + return false; + } + }); + } + + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + + playMusic(); + + return super.onStartCommand(intent, flags, startId); + + } + + + public void playMusic() { + List backgroundMusicList = MusicUtil.getBackgroundMusicList(); + if(backgroundMusicList==null||backgroundMusicList.size()==0){ + return; + } + + if(musicPosition>=backgroundMusicList.size()){ + musicPosition=0; + } + try { + if (mPlayer==null) { + mPlayer = new MediaPlayer(); + } + mPlayer.reset(); + File file = new File(Constant.CACHE_PATH+backgroundMusicList.get(musicPosition).getUrl()); + mPlayer.setDataSource(file.getPath()); //指定音频文件的路径 + mPlayer.prepareAsync(); //让MediaPlayer进入到准备状态 + }catch (Exception e){ + + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + //释放播放 + if(mPlayer!=null||mPlayer.isPlaying()){ + mPlayer.stop(); + mPlayer.release(); + mPlayer=null; + } + } + + +} diff --git a/app/src/main/java/qianmu/container/socket/SocketClient.java b/app/src/main/java/qianmu/container/socket/SocketClient.java new file mode 100644 index 0000000..e0f43c6 --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/SocketClient.java @@ -0,0 +1,72 @@ +package qianmu.container.socket; + +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft; +import org.java_websocket.handshake.ServerHandshake; + +import java.net.URI; + +import qianmu.container.socket.listener.OnClientOpenListener; +import qianmu.container.socket.listener.OnCloseListener; +import qianmu.container.socket.listener.OnErrorListener; +import qianmu.container.socket.listener.OnMessageListener; +import qianmu.container.util.LoggerUtil; + +/** + * socket客户端 + */ +public class SocketClient extends WebSocketClient { + + public static final int CONNECT_TIME_OUT = 10000; + + //socket回调监听 + OnClientOpenListener openListener; //已连接 + OnMessageListener messageListener; //接收数据 + OnCloseListener closeListener; //已关闭 + OnErrorListener errorListener; //发生异常 + + public SocketClient(URI uri, Draft protocolDraft) { + super(uri, protocolDraft, null, CONNECT_TIME_OUT); + } + + @Override + public void onOpen(ServerHandshake handshakeData) { + LoggerUtil.e("onOpen", handshakeData.getHttpStatusMessage()); + if (openListener != null) openListener.onClientOpen(handshakeData); + } + + @Override + public void onMessage(String message) { + if (messageListener != null) messageListener.onMessage(null, message); + } + + @Override + public void onClose(int code, String reason, boolean remote) { + if (closeListener != null) closeListener.onClose(code, reason, remote); + } + + @Override + public void onError(Exception ex) { + if (errorListener != null) errorListener.onError(ex); + } + + + public void setOnOpenListener(OnClientOpenListener openListener) { + this.openListener = openListener; + } + + public void setOnMessageListener(OnMessageListener messageListener) { + this.messageListener = messageListener; + + } + + public void setOnCloseListener(OnCloseListener closeListener) { + this.closeListener = closeListener; + + } + + public void setOnErrorListener(OnErrorListener errorListener) { + this.errorListener = errorListener; + } + +} diff --git a/app/src/main/java/qianmu/container/socket/SocketServer.java b/app/src/main/java/qianmu/container/socket/SocketServer.java new file mode 100644 index 0000000..7c06752 --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/SocketServer.java @@ -0,0 +1,86 @@ +package qianmu.container.socket; + +import org.java_websocket.WebSocket; +import org.java_websocket.handshake.ClientHandshake; +import org.java_websocket.server.WebSocketServer; + +import java.net.InetSocketAddress; +import java.util.Collection; + +import qianmu.container.app.Constant; +import qianmu.container.socket.listener.OnCloseListener; +import qianmu.container.socket.listener.OnErrorListener; +import qianmu.container.socket.listener.OnMessageListener; +import qianmu.container.socket.listener.OnServerOpenListener; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +/** + * socket服务端 + */ +public class SocketServer extends WebSocketServer { + + + OnServerOpenListener serverOpenListener; + OnMessageListener messageListener; + OnCloseListener closeListener; + OnErrorListener errorListener; + + public SocketServer(InetSocketAddress address) { + super(address); + setReuseAddr(true); + } + + @Override + public void onOpen(WebSocket conn, ClientHandshake handshake) { + Collection collectionList = getConnections(); + if (collectionList == null || collectionList.size() == 0) Constant.isMain = false; + else Constant.isMain = true; + if (serverOpenListener != null) serverOpenListener.onServerOpen(handshake); + LoggerUtil.e("SocketServer_onOpen", handshake.getResourceDescriptor()); + } + + @Override + public void onClose(WebSocket conn, int code, String reason, boolean remote) { + Collection collectionList = getConnections(); + if (collectionList == null || collectionList.size() == 0) Constant.isMain = false; + else Constant.isMain = true; + if (closeListener != null) closeListener.onClose(code, reason, remote); + LoggerUtil.e("SocketServer_onClose", StringUtil.strSplice("code:", code, " reason:", reason, " remote:", remote)); + } + + @Override + public void onMessage(WebSocket conn, String message) { + if (messageListener != null) messageListener.onMessage(conn, message); + } + + @Override + public void onError(WebSocket conn, Exception ex) { + Constant.isMain = false; + if (errorListener != null) errorListener.onError(ex); + LoggerUtil.e("SocketServer_onError", ex.getMessage()); + } + + @Override + public void onStart() { + LoggerUtil.e("SocketServer_onStart", "onStart"); + } + + public void setOnOpenListener(OnServerOpenListener serverOpenListener) { + this.serverOpenListener = serverOpenListener; + } + + public void setOnMessageListener(OnMessageListener messageListener) { + this.messageListener = messageListener; + + } + + public void setOnCloseListener(OnCloseListener closeListener) { + this.closeListener = closeListener; + + } + + public void setOnErrorListener(OnErrorListener errorListener) { + this.errorListener = errorListener; + } +} diff --git a/app/src/main/java/qianmu/container/socket/listener/OnClientOpenListener.java b/app/src/main/java/qianmu/container/socket/listener/OnClientOpenListener.java new file mode 100644 index 0000000..c20bda7 --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/listener/OnClientOpenListener.java @@ -0,0 +1,9 @@ +package qianmu.container.socket.listener; + +import org.java_websocket.handshake.ServerHandshake; + +public interface OnClientOpenListener { + + public void onClientOpen(ServerHandshake handshakeData); + +} diff --git a/app/src/main/java/qianmu/container/socket/listener/OnCloseListener.java b/app/src/main/java/qianmu/container/socket/listener/OnCloseListener.java new file mode 100644 index 0000000..1c4f6fa --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/listener/OnCloseListener.java @@ -0,0 +1,9 @@ +package qianmu.container.socket.listener; + +import org.java_websocket.handshake.ServerHandshake; + +public interface OnCloseListener { + + public void onClose(int code, String reason, boolean remote); + +} diff --git a/app/src/main/java/qianmu/container/socket/listener/OnErrorListener.java b/app/src/main/java/qianmu/container/socket/listener/OnErrorListener.java new file mode 100644 index 0000000..8c00fdf --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/listener/OnErrorListener.java @@ -0,0 +1,5 @@ +package qianmu.container.socket.listener; + +public interface OnErrorListener { + public void onError(Exception ex); +} diff --git a/app/src/main/java/qianmu/container/socket/listener/OnMessageListener.java b/app/src/main/java/qianmu/container/socket/listener/OnMessageListener.java new file mode 100644 index 0000000..35c4c4d --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/listener/OnMessageListener.java @@ -0,0 +1,8 @@ +package qianmu.container.socket.listener; + +import org.java_websocket.WebSocket; + +public interface OnMessageListener { + + public void onMessage(WebSocket conn, String message); +} diff --git a/app/src/main/java/qianmu/container/socket/listener/OnServerOpenListener.java b/app/src/main/java/qianmu/container/socket/listener/OnServerOpenListener.java new file mode 100644 index 0000000..551ae31 --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/listener/OnServerOpenListener.java @@ -0,0 +1,9 @@ +package qianmu.container.socket.listener; + +import org.java_websocket.handshake.ClientHandshake; + +public interface OnServerOpenListener { + + public void onServerOpen(ClientHandshake handshakeData); + +} diff --git a/app/src/main/java/qianmu/container/socket/manager/LocSocCliManager.java b/app/src/main/java/qianmu/container/socket/manager/LocSocCliManager.java new file mode 100644 index 0000000..0f6a1ef --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/manager/LocSocCliManager.java @@ -0,0 +1,169 @@ +package qianmu.container.socket.manager; + +import android.util.Log; + +import com.google.gson.Gson; + +import org.greenrobot.eventbus.EventBus; +import org.java_websocket.drafts.Draft_6455; +import org.java_websocket.enums.ReadyState; + +import java.net.URI; + +import qianmu.container.app.Constant; +import qianmu.container.data.DeviceData; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.SocketMessage; +import qianmu.container.socket.SocketClient; +import qianmu.container.util.GsonUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +public class LocSocCliManager { + + public static final String PROGRAM_INDEX = "program_index"; //播放节目下标 + public static final String CUT_PROGRAM_INDEX = "cut_program_index"; //播放插播节目下标 + public static final String PROGRAM_VIDEO_INDEX = "program_video_index"; //播放视频节目下标 + public static final String PROGRAM_IMG_INDEX = "program_img_index"; //播放图片节目下标 + public static final String NEXT_PROGRAM_INDEX = "next_program_index"; //播放节目下标 + private static SocketClient localSocketClient; + public static long heartBeatResult = 0; + + + private static void initLocalSocketClient() { + try { + URI localUri = new URI(StringUtil.strSplice(Constant.getLocalSocketAddress())); + LoggerUtil.e("同屏SocketUri", localUri.toString()); + localSocketClient = new SocketClient(localUri, new Draft_6455()); + setLocalSocketListener(); + } catch (Throwable t) { + LoggerUtil.e("initSocketClient", StringUtil.getThrowableStr(t)); + } + } + + public static void connectLocalSocket() { + try { + //客户端不存在时 创建客户端设置监听事件 + if (localSocketClient == null) initLocalSocketClient(); + URI oldURI = localSocketClient.getURI(); + String serverIP = DeviceData.getDeviceInfo(DeviceData.HINT_MAIN_DEVICE_IP); + //客户端获取到的最新uri和之前的已经连接服务器不一致时 销毁重新创建 + if (oldURI == null || !oldURI.toString().contains(serverIP)) { + destroyLocalSocketClient(); + initLocalSocketClient(); + } + //获取客户端当前的连接状态 + ReadyState state = localSocketClient.getReadyState(); + LoggerUtil.e("connectLocalSocket", "同屏客户端连接状态:"+ GsonUtil.getGson().toJson(state)); + boolean open = localSocketClient.isOpen(); + LoggerUtil.e("connectLocalSocket", "同屏客户端连接状态:open="+open); + if (open) return; + //获取客户端当前的连接状态 + if (localSocketClient.isOpen()) return; + //未连接状态时 连接服务器 + if (state.equals(ReadyState.NOT_YET_CONNECTED)) localSocketClient.connect(); + else if (state.equals(ReadyState.CLOSING) || state.equals(ReadyState.CLOSED)) { + //正在关闭或者关闭状态时 重新连接服务器 + localSocketClient.reconnect(); + } + } catch (Throwable t) { + LoggerUtil.e("connectLocalSocket", StringUtil.getThrowableStr(t)); + destroyLocalSocketClient(); + } + } + + public static boolean sameUrl() { + if (localSocketClient == null) return false; + URI urI = localSocketClient.getURI(); + if (urI == null) return false; + String host = StringUtil.getString(urI.getHost()); + String mainDevIP = DeviceData.getDeviceInfo(DeviceData.HINT_MAIN_DEVICE_IP); + if (!mainDevIP.equals(host)) return false; + return true; + } + + public static void closeConnect() { + if (localSocketClient == null) return; + //获取客户端当前的连接状态 + ReadyState state = localSocketClient.getReadyState(); + if (state.equals(ReadyState.OPEN)) localSocketClient.close(); + } + + //销毁当前的客户端 + public static void destroyLocalSocketClient() { + if (localSocketClient == null) return; + localSocketClient.close(); + localSocketClient = null; + } + + //发送心跳包给服务端 + public static void sendHeartBeatToServer() { + try { + if (localSocketClient == null) return; + //获取客户端当前的连接状态 + ReadyState state = localSocketClient.getReadyState(); + if (!state.equals(ReadyState.OPEN)) return; + localSocketClient.send(SocketServerManager.HEART_BEAT); + //上一次心跳回复时间 和 当前时间 的差值 + long difference = System.currentTimeMillis() - heartBeatResult; + //时间长于一个阈值时 表示与服务端连接已经异常断开 关闭此次连接 + if (heartBeatResult == 0 || difference < 20000) return; + heartBeatResult = 0; + localSocketClient.close(); + //socket断开会有延时 这里直接默认已经断开 客户端离开同步状态 + Constant.isSecondary = false; + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_PROGRAM_BY_INDEX, "0")); + } catch (Throwable t) { + LoggerUtil.e("sendMessageToClient", StringUtil.getThrowableStr(t)); + } + } + + + private static void setLocalSocketListener() { + localSocketClient.setOnOpenListener((handshakeData) -> { + Constant.isSecondary = true; + heartBeatResult = System.currentTimeMillis(); + }); + + localSocketClient.setOnMessageListener((conn, message) -> { + try { + if (SocketServerManager.HEART_BEAT.equals(message)) { + heartBeatResult = System.currentTimeMillis(); + return; + } + + SocketMessage messageBean = new Gson().fromJson(message, SocketMessage.class); + SocketMessage.Content content = messageBean.getContent(); + if (content == null) return; + if (PROGRAM_INDEX.equals(content.getType())) {//同步播放节目 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_PROGRAM_BY_INDEX, content.getParameter())); + } else if (CUT_PROGRAM_INDEX.equals(content.getType())) { + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_CUT_PROGRAM_BY_INDEX, content.getParameter())); + }else if (PROGRAM_VIDEO_INDEX.equals(content.getType())) { + //视频下标 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_VIDEO_PROGRAM_BY_INDEX, content.getParameter())); + }else if (PROGRAM_IMG_INDEX.equals(content.getType())) { + //图片下标 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_IMG_PROGRAM_BY_INDEX, content.getParameter())); + }else if (NEXT_PROGRAM_INDEX.equals(content.getType())) { + //节目下标 + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_NEXT_PROGRAM_BY_INDEX, content.getParameter())); + } + + } catch (Throwable t) { + LoggerUtil.e("setOnMessageListener", StringUtil.getThrowableStr(t)); + } + }); + + localSocketClient.setOnCloseListener((code, reason, remote) -> { + LoggerUtil.e("LocSocCliManager", "onClose:code="+code); + //停止同步时 从第一条节目开始播放 + if (Constant.isSecondary) { + Constant.isSecondary = false; + heartBeatResult = 0; + EventBus.getDefault().post(new MessageEvent(Constant.ACTION_PLAY_PROGRAM_BY_INDEX, "0")); + } + }); + localSocketClient.setOnErrorListener((ex) -> EventBus.getDefault().post(new MessageEvent(Constant.ACTION_CLOSE_LOCAL_SOCKET))); + } +} diff --git a/app/src/main/java/qianmu/container/socket/manager/SocketServerManager.java b/app/src/main/java/qianmu/container/socket/manager/SocketServerManager.java new file mode 100644 index 0000000..b978c30 --- /dev/null +++ b/app/src/main/java/qianmu/container/socket/manager/SocketServerManager.java @@ -0,0 +1,93 @@ +package qianmu.container.socket.manager; + +import com.google.gson.Gson; + +import org.greenrobot.eventbus.EventBus; +import org.java_websocket.WebSocket; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.Collection; + +import qianmu.container.app.Constant; +import qianmu.container.entity.MessageEvent; +import qianmu.container.entity.SocketMessage; +import qianmu.container.socket.SocketServer; +import qianmu.container.util.DeviceUtil; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +public class SocketServerManager { + public static final String HEART_BEAT = "heartBeat"; + + private static SocketServer socketServer; + + //创建服务端并设置监听事件 + private static void initSocketServer() { + socketServer = new SocketServer(new InetSocketAddress(DeviceUtil.getLocalIP(), 8001)); + initListener(); + } + + //启动服务端 + public static void startSocketServer() { + if (socketServer == null) initSocketServer(); + //服务端地址 + String hostString = StringUtil.getString(socketServer.getAddress().getHostString()); + //本机地址 + String serverIP = DeviceUtil.getLocalIP(); + //服务端地址和本地地址不一致 销毁服务端重新创建 + if (hostString == null || !hostString.equals(serverIP)) { + destroySocketServer(); + initSocketServer(); + } + socketServer.start(); + } + + //销毁服务端 + public static void destroySocketServer() { + try { + if (socketServer == null) return; + socketServer.stop(); + socketServer = null; + } catch (Throwable t) { + LoggerUtil.e("stopSocketServer", StringUtil.getThrowableStr(t)); + } + } + + //获取客户端数量 + public static int getClientQuantity() { + if (socketServer == null) return 0; + Collection webSocketList = socketServer.getConnections(); + if (webSocketList == null) return 0; + return webSocketList.size(); + } + + //像客户端发送消息 + public static void sendMessageToClient(String type, String message) { + if (socketServer == null) return; + //获取客户端连接列表 + Collection webSockets = socketServer.getConnections(); + if (webSockets == null || webSockets.size() == 0) return; + //创建消息 + SocketMessage socketMessage = new SocketMessage(); + SocketMessage.Content content = new SocketMessage.Content(); + content.setType(type);//类型 + content.setParameter(message);//值 + socketMessage.setContent(content); + //循环列表发送消息 + for (WebSocket webSocket : webSockets) webSocket.send(new Gson().toJson(socketMessage)); + } + + private static void initListener() { + if (socketServer == null) return; + socketServer.setOnOpenListener((handshake) -> { + + }); + socketServer.setOnMessageListener((conn, message) -> { + if (HEART_BEAT.equals(message)) conn.send(HEART_BEAT); + }); +// socketServer.setOnCloseListener((code, reason, remote) -> EventBus.getDefault().post(new MessageEvent(Constant.ACTION_START_SOCKET_SERVER))); + socketServer.setOnErrorListener((ex) -> EventBus.getDefault().post(new MessageEvent(Constant.ACTION_STOP_SOCKET_SERVER))); + } + +} diff --git a/app/src/main/java/qianmu/container/util/AesUtil.java b/app/src/main/java/qianmu/container/util/AesUtil.java new file mode 100644 index 0000000..fb0e2f1 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/AesUtil.java @@ -0,0 +1,127 @@ +package qianmu.container.util; + +import android.util.Base64; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +public class AesUtil { + + //aes加密密钥 + public static final String AES_KEY = "cqmyg#hdhxt!saas"; + //字符编码 + public static final String CHARSET_NAME = "UTF-8"; + + public static final String MODE = "AES/ECB/PKCS7Padding"; +// public static final String MODE = "AES/ECB/PKCS5Padding"; + + public static final String FIELD = "解密失败"; + + /** + * 用秘钥进行加密 + * + * @param content 明文 + * @return byte数组的密文 + * @throws Exception + */ + public static String encrypt(String content) { + try { + SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(CHARSET_NAME), "AES"); + byte[] enCodeFormat = secretKey.getEncoded(); + return encrypt(content, enCodeFormat); + } catch (Throwable t) { +// LoggerUtil.e("encrypt", StringUtil.getThrowableStr(t)); + return ""; + } + + } + + /** + * 用秘钥进行加密 + * + * @param content 明文 + * @param secretKeyEncoded 秘钥Encoded + * @return byte数组的密文 + * @throws Exception + */ + public static String encrypt(String content, byte[] secretKeyEncoded) throws Exception { + // 创建AES秘钥 + SecretKeySpec key = new SecretKeySpec(secretKeyEncoded, "AES"); + // 创建密码器 + Cipher cipher = Cipher.getInstance(MODE); + // 初始化加密器 + cipher.init(Cipher.ENCRYPT_MODE, key); + // 加密 + return Base64.encodeToString(cipher.doFinal(content.getBytes(CHARSET_NAME)), Base64.NO_WRAP); + } + + + /** + * 解密 + * + * @param content 密文 + * @return 解密后的明文 + * @throws Exception + */ + public static String decrypt(String content) { + try { + SecretKeySpec secretKey = new SecretKeySpec(AES_KEY.getBytes(CHARSET_NAME), "AES"); + byte[] enCodeFormat = secretKey.getEncoded(); + return decrypt(content, enCodeFormat); + } catch (Throwable t) { +// LoggerUtil.e("decryptError", StringUtil.strSplice(content, "$$", t.getMessage())); + return FIELD; + } + + } + + /** + * 解密 + * + * @param content 密文 + * @param secretKeyEncoded 秘钥 + * @return 解密后的明文 + * @throws Exception + */ + public static String decrypt(String content, byte[] secretKeyEncoded) throws Exception { + // 创建AES秘钥 + SecretKeySpec key = new SecretKeySpec(secretKeyEncoded, "AES"); + // 创建密码器 + Cipher cipher = Cipher.getInstance(MODE); + // 初始化解密器 + cipher.init(Cipher.DECRYPT_MODE, key); + // 解密 + return new String(cipher.doFinal(Base64.decode(content, Base64.NO_WRAP)), CHARSET_NAME); + } + + + /* + * md5 + * */ + public static String md5(String input) { + try { + // 创建 MessageDigest 实例,指定使用 MD5 算法 + MessageDigest digest = MessageDigest.getInstance("MD5"); + // 将输入字符串转换为字节数组并计算哈希值 + byte[] hashBytes = digest.digest(input.getBytes()); + + // 将字节数组转换为十六进制字符串 + StringBuilder hexString = new StringBuilder(); + for (byte b : hashBytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/app/src/main/java/qianmu/container/util/AesUtil2.java b/app/src/main/java/qianmu/container/util/AesUtil2.java new file mode 100644 index 0000000..bc0eed9 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/AesUtil2.java @@ -0,0 +1,43 @@ +package qianmu.container.util; + +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; + +public class AesUtil2 { + + static String key="cqmyg#hdhxt!saas"; + + @RequiresApi(api = Build.VERSION_CODES.O) + public static String AesEncrypt (String encryptStr) { + try { + byte[] keyByte = key.getBytes(StandardCharsets.UTF_8); + AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, keyByte); + byte[] encryptByte = aes.encrypt(encryptStr); + return Base64.getEncoder().encodeToString(encryptByte); + } catch (Exception e) { + // TODO: handle exception + throw new RuntimeException(e); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + public static String AesDecrypt (String decryptStr) { + try { + byte[] keyByte = key.getBytes(StandardCharsets.UTF_8); + AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, keyByte); + byte[] decryptByte = Base64.getDecoder().decode(decryptStr); + return aes.decryptStr(decryptByte); + } catch (Exception e) { + // TODO: handle exception + throw new RuntimeException(e); + } + } +} diff --git a/app/src/main/java/qianmu/container/util/AppUtil.java b/app/src/main/java/qianmu/container/util/AppUtil.java new file mode 100644 index 0000000..ada4a37 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/AppUtil.java @@ -0,0 +1,136 @@ +package qianmu.container.util; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.util.Log; + +import java.io.File; +import java.util.List; + +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.manager.QMWindowManager; +import qianmu.container.data.AppData; +import qianmu.container.entity.App; + +public class AppUtil { + + //根据设备类型 判断应用列表按钮是否显示(触摸屏才能展示应用列表按钮) + public static void updateMenuWindowState() { + String deviceType = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE); + List appList = AppData.getAppList(); + if ("触摸屏".equals(deviceType)) { + //前端应用数量大于1时 显示列表按钮 + if (appList.size() > 1) QMWindowManager.showMenu(); + else QMWindowManager.removeMenuWindow(); + } else if ("标准型".equals(deviceType)) QMWindowManager.removeMenuWindow(); + } + + public static App getInfoByPackageName(String packageName) { + try { + Context context = MyApplication.getInstance(); + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, 0); + if (packageInfo == null) return null; + String appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString(); + Drawable appIcon = packageInfo.applicationInfo.loadIcon(context.getPackageManager()); + App app = new App(appName, packageInfo.packageName, packageInfo.versionName); + return app; + } catch (Throwable t) { + return null; + } + } + + public static void startApp(Context context, String packageName) { + App result = AppUtil.getInfoByPackageName(packageName); + if (result == null) { + ToastUtils.showToast("尚未安装此应用"); + } else { + PackageManager packageManager = context.getPackageManager(); + Intent intent = packageManager.getLaunchIntentForPackage(packageName); + context.startActivity(intent); + QMWindowManager.showMenu(); + } + } + + /** + * 更新应用列表软件版本 + */ + public static void updateAppVersion() { + List appList = AppData.getAppList(); + for (App app : appList) {//遍历应用列表 根据版本号下载更新软件 + if (app == null) continue; + String packageName = StringUtil.getString(app.getPackageName());//软件包名 + String versionName = StringUtil.getString(app.getVersion());//网络版本号 + String filePath = StringUtil.getString(app.getLogo());//网络路径 + String[] result = FileUtil.getServerAndPath(filePath);//解析获取文件相对路径 + String localPath = StringUtil.strSplice(Constant.CACHE_PATH, result[1]);//本地路径 + App currentApp = getInfoByPackageName(packageName);//本地应用 + if (currentApp == null) {//本地应用不存在时 下载安装 + FileUtil.downloadFile(filePath, localPath, () -> installApp(localPath, packageName, versionName, app.isFrontApp())); + return; + } + String currentVersion = StringUtil.getString(currentApp.getVersion());//本地版本号 + if (currentVersion.equals(versionName)) return; + //本地应用版本号和网络应用不一致时 下载安装 + FileUtil.downloadFile(filePath, localPath, () -> installApp(localPath, packageName, versionName, app.isFrontApp())); + } + } + + /** + * 静默安装应用 + * + * @param filePath 安装包路径 + * @param packageName 软件包名 + * @param versionName 最新版本号 + * @param startApp 是否在安装完成后启动应用 + */ + public static void installApp(String filePath, String packageName, String versionName, boolean startApp) { + try { + File file = new File(filePath); + if (!file.exists()) { + Log.e("installApp", "未查找到安装软件包"); + return; + } + App currentApp = getInfoByPackageName(packageName);//本地应用 + if (currentApp != null && versionName.equals(currentApp.getVersion())) { + Log.e("installApp", "本地软件已经是最新版,不需要更新"); + return; + } + Context context = MyApplication.getInstance(); + if(Constant.androidBoardType.equals("")){ + installApk(filePath); + }else { + SignWayUtil.silentInstallApk(filePath, packageName); + } + if (!startApp) return; + Intent intent = new Intent(Constant.ACTION_APP_CRASH); + intent.putExtra(Constant.PACKAGE_NAME, DeviceUtil.getPackageName()); + context.sendStickyBroadcast(intent); + PackageManager packageManager = context.getPackageManager(); + Intent appIntent = packageManager.getLaunchIntentForPackage(Constant.APP_CRASH_PACKAGE_NAME); + if (appIntent != null) context.startActivity(appIntent); + } catch (Throwable t) { + LoggerUtil.e("installApp", StringUtil.getThrowableStr(t)); + } + } + + /** + * 安装apk + * + * @param filePath + */ + public static void installApk(String filePath) { + //安装apk + File apkFile = new File(filePath); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); + MyApplication.getInstance().startActivity(intent); + } + +} diff --git a/app/src/main/java/qianmu/container/util/BitmapUtil.java b/app/src/main/java/qianmu/container/util/BitmapUtil.java new file mode 100644 index 0000000..554ab92 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/BitmapUtil.java @@ -0,0 +1,332 @@ +package qianmu.container.util; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.os.Build; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicBlur; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +import jp.wasabeef.glide.transformations.RoundedCornersTransformation; +import qianmu.container.R; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; + +import jp.wasabeef.glide.transformations.RoundedCornersTransformation.*; +import qianmu.container.view.QMImageView; + + +/** + * Created by Administrator on 2018/2/7. + */ +public class BitmapUtil { + + // 图片缩放比例(即模糊度) + private static final float BITMAP_SCALE = 0.2f; + + //软件截图保存路径 + public static final String SAVE_SCREEN_SHOT_PATH = StringUtil.strSplice(Constant.CACHE_PATH, "ScreenShot"); + + public static void loadImage(String internetParentPath, String localParentPath, String path, ImageView imageView) { + loadImage(internetParentPath, localParentPath, path, imageView, null); + } + + public static void loadImage(String internetParentPath, String localParentPath, String path, ImageView imageView, CornerType type) { + loadImage(internetParentPath, localParentPath, path, imageView, type, MyApplication.getInstance().getResources().getDimensionPixelSize(R.dimen.dimens_20), false); + } + + public static void loadImage(String internetParentPath, String localParentPath, String path, ImageView imageView, CornerType type, float radius) { + loadImage(internetParentPath, localParentPath, path, imageView, type, radius, false); + } + + public static void loadImage(String internetParentPath, String localParentPath, String path, ImageView imageView, CornerType type, float radius, boolean noCache) { + try { + if (StringUtil.isEmpty(path)) return; + + final String localPath = StringUtil.strSplice(localParentPath, StringUtil.getString(path)); + String internetPath = StringUtil.strSplice(internetParentPath, StringUtil.getString(path)); + File pictureFile = new File(localPath); + if (pictureFile.exists()) loadLocalImage(localPath, imageView, type, radius, noCache); + else loadInternetImage(internetPath, localPath, imageView); + } catch (Throwable t) { + LoggerUtil.e("loadImage", StringUtil.getThrowableStr(t)); + } + } + + //本地图片 + private static void loadLocalImage(String localPath, ImageView image, CornerType type, float radius, boolean noCache) throws Throwable { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeFile(localPath, opts); + if (type == null) loadNormalImage(localPath, image, opts, noCache); + else loadRoundImage(localPath, image, opts, type, radius, noCache); + } + + //正常图片 + private static void loadNormalImage(String localPath, ImageView image, BitmapFactory.Options opts, boolean noCache) throws Throwable { + + int width = image.getLayoutParams().width; + int height = image.getLayoutParams().height; + + if (localPath.toLowerCase().endsWith(".gif")) { + RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE); + Glide.with(MyApplication.getInstance()).asGif().load(localPath).apply(options).into(image); + } else { + RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE); + Glide.with(MyApplication.getInstance()).load(localPath).apply(options).into(image); +// if ((opts.outWidth * opts.outHeight <= width * height * 1.1 || noCache)) { +// opts.inJustDecodeBounds = false; +// Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(localPath), null, opts); +// image.setImageBitmap(bitmap); +// } else { +// if (image instanceof QMImageView) ((QMImageView) image).setFrontBitmap(null); +// RequestOptions options = new RequestOptions().dontAnimate().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE); +// Glide.with(MyApplication.getInstance()).load(localPath).apply(options).into(image); +// } + } + } + + //圆角图片 + private static void loadRoundImage(String localPath, ImageView image, BitmapFactory.Options opts, CornerType type, float radius, boolean noCache) throws Throwable { + + int width = image.getLayoutParams().width; + int height = image.getLayoutParams().height; + + if (!localPath.toLowerCase().endsWith(".gif") && opts.outWidth * opts.outHeight <= width * height * 1.1 || noCache) { + opts.inJustDecodeBounds = false; + Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(localPath), null, opts); + image.setImageBitmap(bitmapRound(bitmap, type, radius)); + } else { + RoundedCornersTransformation transformation = new RoundedCornersTransformation((int) radius, 0, type); + RequestOptions options = RequestOptions.bitmapTransform(transformation).override(width, height).dontAnimate().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE); + Glide.with(MyApplication.getInstance()).load(localPath).apply(options).into(image); + } + } + + //图片不存在 使用网络路径进行下载 + private static void loadInternetImage(String internetPath, String localPath, ImageView view) { + if (localPath.toLowerCase().endsWith(".gif")) { + Glide.with(MyApplication.getInstance()).asGif().load(internetPath).into(view); + } else { + Glide.with(MyApplication.getInstance()).load(internetPath).into(view); + } + FileUtil.downloadFile(internetPath, localPath); + } + + /** + * 生成圆角图片 + * + * @param mBitmap 初始位图 + * @param type 圆角类型 + * @return 圆角位图 + */ + public static Bitmap bitmapRound(Bitmap mBitmap, RoundedCornersTransformation.CornerType type, float radius) { + Bitmap bitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888); + float right = bitmap.getWidth(); + float bottom = bitmap.getHeight(); + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setAntiAlias(true); + //设置矩形大小 + Rect rect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); + canvas.drawARGB(0, 0, 0, 0); + + if (type == CornerType.ALL) { + canvas.drawRoundRect(new RectF(0, 0, right, bottom), radius, radius, paint); + } else if (type == CornerType.TOP) { + canvas.drawRoundRect(new RectF(0, 0, right, radius * 2f), radius, radius, paint); + canvas.drawRect(new RectF(0, radius, right, bottom), paint); + } + + // 取两层绘制,显示上层 + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + // 把原生的图片放到这个画布上,使之带有画布的效果 + canvas.drawBitmap(mBitmap, rect, rect, paint); + return bitmap; + + } + + + public static Bitmap revertBitmap(Bitmap mSourceBitmap) { + //1.倒立图 + Matrix matrix = new Matrix(); + matrix.preScale(1, -1); //以X轴向下翻转 + int width = mSourceBitmap.getWidth(); + int height = mSourceBitmap.getHeight(); + //生成倒立图,宽度和原图一致,高度为原图的一半 + Bitmap mRevertBitmap = Bitmap.createBitmap(mSourceBitmap, 0, (int) (height * 0.72f), width, (int) (height * 0.28f), matrix, false); + + //2.要生成原图加上倒立图,先生成一个可变空的Bitmap, 高度为原图高度的1.5倍(包括原图和倒立图的高度) + int gap = 0; //间隙空白 + Bitmap bitmap = Bitmap.createBitmap(width, (int) (height * 0.28f), Bitmap.Config.ARGB_8888); + Paint paint = new Paint(); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(mRevertBitmap, 0, gap, paint); //绘制倒立图 + //0xffffffff, + //3.画笔使用LinearGradient 线性渐变渲染 + LinearGradient lg = new LinearGradient(0, gap, 0, bitmap.getHeight(), 0xabcbc9c8, 0x00e5e5e5, Shader.TileMode.MIRROR); + paint.setShader(lg); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); //4.指定画笔的Xfermode 即绘制的模式(不同的模式,绘制的区域不同) + canvas.drawRect(0, gap, width, bitmap.getHeight(), paint); //5.在倒立图区,绘制矩形渲染图层 + paint.setXfermode(null); + return bitmap; + } + + + /** + * @param context 上下文对象 + * @param image 需要模糊的图片 + * @return 模糊处理后的Bitmap + */ + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) + public static Bitmap blurBitmap(Context context, Bitmap image, float blurRadius) { + // 计算图片缩小后的长宽 + int width = Math.round(image.getWidth() * BITMAP_SCALE); + int height = Math.round(image.getHeight() * BITMAP_SCALE); + // 将缩小后的图片做为预渲染的图片 + Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); + Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); // 创建一张渲染后的输出图片 + RenderScript rs = RenderScript.create(context); // 创建RenderScript内核对象 + ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 创建一个模糊效果的RenderScript的工具对象 + // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间 + // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去 + Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); + Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); + blurScript.setRadius(blurRadius);// 设置渲染的模糊程度, 25f是最大模糊度 + blurScript.setInput(tmpIn);// 设置blurScript对象的输入内存 + blurScript.forEach(tmpOut);// 将输出数据保存到输出内存中 + tmpOut.copyTo(outputBitmap);// 将数据填充到Allocation中 + return outputBitmap; + } + + public static void deletePicture(String fileName) { + FileUtil.deleteFile(StringUtil.strSplice(SAVE_SCREEN_SHOT_PATH, "/img/", fileName, ".jpg")); + } + + /** + * 文件转为byte数组 + * + * @param filePath 文件路径 + * @return + */ + public static byte[] file2byte(String filePath) { + byte[] buffer = null; + try { + File file = new File(filePath); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) bos.write(b, 0, n); + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + } catch (Throwable t) { + LoggerUtil.e("file2byte", StringUtil.getThrowableStr(t)); + } + return buffer; + } + + /** + * 将bitmap对象保存成图片到sd卡中 + */ + public static String saveBitmapToSDCard(Bitmap bitmap) { + return saveBitmapToSDCard(bitmap, String.valueOf(System.currentTimeMillis())); + } + + + /** + * 将bitmap对象保存成图片到sd卡中 + */ + public static String saveBitmapToSDCard(Bitmap bitmap, String fileName) { + try { + File fileDir = new File(StringUtil.strSplice(SAVE_SCREEN_SHOT_PATH, "/img/")); + // 判断目录是否已经存在 + if (!fileDir.exists()) fileDir.mkdirs(); + String path = StringUtil.strSplice(SAVE_SCREEN_SHOT_PATH, "/img/", fileName, ".jpg"); + File file = new File(path); + if (file.exists()) file.delete(); + else file.createNewFile(); + + FileOutputStream fileOutputStream = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); + fileOutputStream.close(); + return path; + } catch (Throwable t) { + LoggerUtil.e("saveBitmapToSDCard", StringUtil.getThrowableStr(t)); + } + return null; + } + + + //压缩图片质量 + public static Bitmap compressImage(Bitmap image) { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 + int options = 100; + while ( baos.toByteArray().length / 1024>3000) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 + baos.reset();//重置baos即清空baos + image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 + options -= 10;//每次都减少10 + } + ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 + Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 + return bitmap; + } + + //图片路径转成bitmap + + public static Bitmap imgToBitmap(String path) { + Bitmap bitmap = BitmapFactory.decodeFile(path); + return bitmap; + } + + /** + * 旋转角度 + * */ + public static void postRotateImg(String filePath){ + Bitmap bitmap = BitmapFactory.decodeFile(filePath); + Matrix matrix = new Matrix(); + matrix.postRotate(Constant.rotate); + Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + saveBitmapFile(rotatedBitmap,filePath); + } + + public static void saveBitmapFile(Bitmap bitmap,String filePath){ + File file=new File(filePath);//将要保存图片的路径 + try { + BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); + bos.flush(); + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/qianmu/container/util/CalendarUtils.java b/app/src/main/java/qianmu/container/util/CalendarUtils.java new file mode 100644 index 0000000..5171ef7 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/CalendarUtils.java @@ -0,0 +1,229 @@ +package qianmu.container.util; + +import java.util.Calendar; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2019/6/10 + * Time: 17:40 + */ +public class CalendarUtils { + + /** + * 将时间戳转换成当天零点的时间戳 + * + * @param milliseconds + * @return + */ + private static Calendar zeroFromHour(long milliseconds) { + Calendar calendar = Calendar.getInstance(); // 获得一个日历 + + calendar.setTimeInMillis(milliseconds); + zeroFromHour(calendar); + return calendar; + } + /** + * 将时,分,秒,以及毫秒值设置为0 + * + * @param calendar + */ + private static void zeroFromHour(Calendar calendar) { + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + } + /** + * 由于服务器返回的是10位,手机端使用需要补全3位 + * + * @param milliseconds + * @return + */ + private static long completMilliseconds(long milliseconds) { + String milStr = Long.toString(milliseconds); + if (milStr.length() == 10) { + milliseconds = milliseconds * 1000; + } + return milliseconds; + } + + + /** + * 最终调用方法 + * @param timeStamp + * @return + */ + + public static String getWhatDay (long timeStamp) { + Calendar cal = CalendarUtils.zeroFromHour(timeStamp); + String whatDay=""; + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SATURDAY){ +// whatDay="星期六"; + whatDay="SATUR"; + } + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY){ +// whatDay="星期日"; + whatDay="SUND"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ +// whatDay = "星期一"; + whatDay = "MOND"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY){ +// whatDay = "星期二"; + whatDay = "TUES"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY){ +// whatDay = "星期三"; + whatDay = "WEDNES"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY){ +// whatDay = "星期四"; + whatDay = "THURS"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){ +// whatDay = "星期五"; + whatDay = "FRI"; + } + return whatDay; + } + + /** + * 最终调用方法 + * @param timeStamp + * @return + */ + + public static String getWhatDay2 (long timeStamp) { + Calendar cal = CalendarUtils.zeroFromHour(timeStamp); + String whatDay=""; + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SATURDAY){ +// whatDay="星期六"; + whatDay="Saturday"; + } + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY){ +// whatDay="星期日"; + whatDay="Sunday"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ +// whatDay = "星期一"; + whatDay = "Monday"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY){ +// whatDay = "星期二"; + whatDay = "Tuesday"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY){ +// whatDay = "星期三"; + whatDay = "Wednesday"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY){ +// whatDay = "星期四"; + whatDay = "Thursday"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){ +// whatDay = "星期五"; + whatDay = "Friday"; + } + return whatDay; + } + /** + * 最终调用方法 + * @param timeStamp + * @return + */ + + public static String getWhatDay3 (long timeStamp) { + Calendar cal = CalendarUtils.zeroFromHour(timeStamp); + String whatDay=""; + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SATURDAY){ + whatDay="星期六"; + } + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY){ + whatDay="星期日"; + + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ + whatDay = "星期一"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY){ + whatDay = "星期二"; + + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY){ + whatDay = "星期三"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY){ + whatDay = "星期四"; + + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){ + whatDay = "星期五"; + } + return whatDay; + } + + /** + * 最终调用方法 + * @param timeStamp + * @return + */ + + public static String getWhatDay4 (long timeStamp) { + Calendar cal = CalendarUtils.zeroFromHour(timeStamp); + String whatDay=""; + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SATURDAY){ + whatDay = "06"; + } + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY){ + whatDay = "07"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ + whatDay = "01"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY){ + whatDay = "02"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY){ + whatDay = "03"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY){ + whatDay = "04"; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){ + whatDay = "05"; + } + return whatDay; + } + + public static int getWhatDay5 (long timeStamp) { + + Calendar cal = CalendarUtils.zeroFromHour(timeStamp); + + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SATURDAY){ + return 5; + } + if(cal.get(Calendar.DAY_OF_WEEK)== Calendar.SUNDAY){ + return 6; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ + return 0; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY){ + return 1; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY){ + return 2; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY){ + return 3; + } + if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY){ + return 4; + }else { + return 0; + } + + } +} diff --git a/app/src/main/java/qianmu/container/util/ColorUtil.java b/app/src/main/java/qianmu/container/util/ColorUtil.java new file mode 100644 index 0000000..05f6ca3 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/ColorUtil.java @@ -0,0 +1,143 @@ +package qianmu.container.util; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/4/30 + * Time: 10:29 + */ +public class ColorUtil { + + /** + * 设置透明度 + * */ + public static Map getColorTransparent(){ + Map colorMap = new HashMap(); + colorMap.put(100,"FF"); + colorMap.put(99,"FC"); + colorMap.put(98,"FA"); + colorMap.put(97,"F7"); + colorMap.put(96,"F5"); + colorMap.put(95,"F2"); + colorMap.put(94,"F0"); + colorMap.put(93,"ED"); + colorMap.put(92,"EB"); + colorMap.put(91,"E8"); + colorMap.put(90,"E6"); + colorMap.put(89,"E3"); + colorMap.put(88,"E0"); + colorMap.put(87,"DE"); + colorMap.put(86,"DB"); + colorMap.put(85,"D9"); + colorMap.put(84,"D6"); + colorMap.put(83,"D4"); + colorMap.put(82,"D1"); + colorMap.put(81,"CF"); + colorMap.put(80,"CC"); + colorMap.put(79,"C9"); + colorMap.put(78,"C7"); + colorMap.put(77,"C4"); + colorMap.put(76,"C2"); + colorMap.put(75,"BF"); + colorMap.put(74,"BD"); + colorMap.put(73,"BA"); + colorMap.put(72,"B8"); + colorMap.put(71,"B5"); + colorMap.put(70,"B3"); + colorMap.put(69,"B0"); + colorMap.put(68,"AD"); + colorMap.put(67,"AB"); + colorMap.put(66,"A8"); + colorMap.put(65,"A6"); + colorMap.put(64,"A3"); + colorMap.put(63,"A1"); + colorMap.put(62,"9E"); + colorMap.put(61,"9C"); + colorMap.put(60,"99"); + colorMap.put(59,"96"); + colorMap.put(58,"94"); + colorMap.put(57,"91"); + colorMap.put(56,"8F"); + colorMap.put(55,"8C"); + colorMap.put(54,"8A"); + colorMap.put(53,"87"); + colorMap.put(52,"85"); + colorMap.put(51,"82"); + colorMap.put(50,"80"); + colorMap.put(49,"7D"); + colorMap.put(48,"7A"); + colorMap.put(47,"78"); + colorMap.put(46,"75"); + colorMap.put(45,"73"); + colorMap.put(44,"70"); + colorMap.put(43,"6E"); + colorMap.put(42,"6B"); + colorMap.put(41,"69"); + colorMap.put(40,"66"); + colorMap.put(39,"63"); + colorMap.put(38,"61"); + colorMap.put(37,"5E"); + colorMap.put(36,"5C"); + colorMap.put(35,"59"); + colorMap.put(34,"57"); + colorMap.put(33,"54"); + colorMap.put(32,"52"); + colorMap.put(31,"4F"); + colorMap.put(30,"4D"); + colorMap.put(29,"4A"); + colorMap.put(28,"47"); + colorMap.put(27,"45"); + colorMap.put(26,"42"); + colorMap.put(25,"40"); + colorMap.put(24,"3D"); + colorMap.put(23,"3B"); + colorMap.put(22,"38"); + colorMap.put(21,"36"); + colorMap.put(20,"33"); + colorMap.put(19,"30"); + colorMap.put(18,"2E"); + colorMap.put(17,"2B"); + colorMap.put(16,"29"); + colorMap.put(15,"26"); + colorMap.put(14,"24"); + colorMap.put(13,"21"); + colorMap.put(12,"1F"); + colorMap.put(11,"1C"); + colorMap.put(10,"1A"); + colorMap.put(9,"17"); + colorMap.put(8,"14"); + colorMap.put(7,"12"); + colorMap.put(6,"0F"); + colorMap.put(5,"0D"); + colorMap.put(4,"0A"); + colorMap.put(3,"08"); + colorMap.put(2,"05"); + colorMap.put(1,"03"); + colorMap.put(0,"00"); + return colorMap; + } + + + /** + * 颜色rgb转换成16进制 + * */ + public static String getColor16Code(String color){ + + color=color.substring(5, color.length()-1);// + String[] uColor=color.split(","); + int r=Integer.parseInt(uColor[0]); + int g=Integer.parseInt(uColor[1]); + int b=Integer.parseInt(uColor[2]); + Double a=1.0; + if(color.split(",").length==4){ + a=Double.parseDouble(uColor[3]); + } + String result=Integer.toHexString(r<<16|g<<8|b).toString(); + return result; + } + + +} diff --git a/app/src/main/java/qianmu/container/util/DeviceDataUtil.java b/app/src/main/java/qianmu/container/util/DeviceDataUtil.java new file mode 100644 index 0000000..f254c05 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/DeviceDataUtil.java @@ -0,0 +1,121 @@ +package qianmu.container.util; + +import android.os.Environment; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.util.concurrent.Executors; + +import qianmu.container.app.Constant; +import qianmu.container.data.DeviceData; +import qianmu.container.entity.DeviceBean; + +//日志的功能操作类 可将日志保存至SD卡 +public class DeviceDataUtil { + + //保存LOG日志的目录 + public static final String SAVE_LOG_DIR_PATH = StringUtil.strSplice(Constant.CACHE_PATH, "/DeviceData"); + + //用于打印error级的日志信息 + public static void e(String data) { + File file = new File(StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/device", ".txt")); + if (file.exists())return; + else storeData(data); + } + + //将日志信息保存至SD卡 + public static synchronized void storeData(String data) { + + Executors.newSingleThreadExecutor().execute(() -> { + if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) return; + + File file = new File(StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/device", ".txt")); + if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); + try { + if (!file.exists()) file.createNewFile(); // 判断日志文件是否已经存在 + FileOutputStream fos = new FileOutputStream(file, true); + OutputStreamWriter write = new OutputStreamWriter(fos, "UTF-8"); + BufferedWriter writer = new BufferedWriter(write); + writer.write(data); + writer.close(); + write.close(); + fos.close(); + } catch (Throwable t) { + LoggerUtil.e("storeLog", StringUtil.getThrowableStr(t)); + } + }); + } + + + public static String getDeviceData(){ + try { + String path = StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/device", ".txt"); + File file = new File(path); + if(file.exists()){ + return FileUtil.loadFromSDFile(path); + }else { + LoggerUtil.e("DeviceDataUtil","txt文件不存在"); + return null; + } + }catch (Exception e){ + return null; + } + } + + /** + * 保存device数据到txt文本 + * */ + public static void setDeviceDataToTXT(){ + File file = new File(StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/device", ".txt")); + if(!file.exists()){ + DeviceBean deviceBean = new DeviceBean(); + deviceBean.setHint_server_ip(DeviceData.getDeviceInfo(DeviceData.HINT_SERVER_IP)); + deviceBean.setHint_device_ip(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_IP)); + deviceBean.setHint_device_code(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_CODE)); + deviceBean.setHint_device_name(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_NAME)); + deviceBean.setHint_device_touch(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TOUCH)); + deviceBean.setHint_device_type(DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_TYPE)); + deviceBean.setBuilding_code(DeviceData.getDeviceInfo(DeviceData.BUILDING_CODE)); + deviceBean.setBuilding_name(DeviceData.getDeviceInfo(DeviceData.BUILDING_NAME)); + deviceBean.setFloor_name(DeviceData.getDeviceInfo(DeviceData.FLOOR_NAME)); + deviceBean.setFloor_code(DeviceData.getDeviceInfo(DeviceData.FLOOR_CODE)); + deviceBean.setHint_reg_key(DeviceData.getDeviceInfo(DeviceData.HINT_REG_KEY)); + deviceBean.setHint_sync_test(DeviceData.getDeviceInfo(DeviceData.HINT_SYNC_TEST)); + deviceBean.setDownload_ip(DeviceData.getDeviceInfo(DeviceData.DOWNLOAD_IP)); + String data = GsonUtil.getGson().toJson(deviceBean); + DeviceDataUtil.storeData(data); + } + } + + /** + * 读取txt文本device数据 + * */ + public static void getDeviceDataForTXT(){ + try { + String deviceData = DeviceDataUtil.getDeviceData(); + if(deviceData!=null) { + DeviceBean deviceBean = new Gson().fromJson(deviceData, new TypeToken() { + }.getType()); + DeviceData.saveDeviceInfo(DeviceData.HINT_SERVER_IP,deviceBean.getHint_server_ip()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_IP,deviceBean.getHint_device_ip()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_CODE,deviceBean.getHint_device_code()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_NAME,deviceBean.getHint_device_name()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TOUCH,deviceBean.getHint_device_touch()); + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE,deviceBean.getHint_device_type()); + DeviceData.saveDeviceInfo(DeviceData.BUILDING_CODE,deviceBean.getBuilding_code()); + DeviceData.saveDeviceInfo(DeviceData.BUILDING_NAME,deviceBean.getBuilding_name()); + DeviceData.saveDeviceInfo(DeviceData.FLOOR_NAME,deviceBean.getFloor_name()); + DeviceData.saveDeviceInfo(DeviceData.FLOOR_CODE,deviceBean.getFloor_code()); + DeviceData.saveDeviceInfo(DeviceData.HINT_REG_KEY,deviceBean.getHint_reg_key()); + DeviceData.saveDeviceInfo(DeviceData.HINT_SYNC_TEST,deviceBean.getHint_sync_test()); + DeviceData.saveDeviceInfo(DeviceData.DOWNLOAD_IP,deviceBean.getDownload_ip()); + } + }catch (Exception e){ + } + } +} diff --git a/app/src/main/java/qianmu/container/util/DeviceUtil.java b/app/src/main/java/qianmu/container/util/DeviceUtil.java new file mode 100644 index 0000000..cd173a0 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/DeviceUtil.java @@ -0,0 +1,410 @@ +package qianmu.container.util; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.Service; +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Environment; +import android.os.StatFs; +import android.util.DisplayMetrics; +import android.util.Log; + +import java.io.File; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; +import java.util.List; + +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; + +/** + * 设备工具类 + * Created by Administrator on 2017/11/7. + */ + +public class DeviceUtil { + + static String TAG = "DeviceUtil"; + + /** + * 获取ip地址 + * + * @return + */ + public static String getLocalIP() { + try { + if(Constant.androidBoardType.equals("nova")){ + //诺瓦 + return getEthIpAddress(); + }else { + String allIP = ""; + for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { + NetworkInterface intf = en.nextElement(); + for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { + InetAddress inetAddress = enumIpAddr.nextElement(); + allIP += inetAddress.getHostAddress() + "\n"; + if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) + return inetAddress.getHostAddress(); + } + } + } + } catch (Throwable t) { + LoggerUtil.e("getLocalIP", StringUtil.getThrowableStr(t)); + } + + return getLocalIPByWIFI(); + } + +// public static String getLocalIP() { +// try { +// String allIP = ""; +// for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { +// NetworkInterface intf = en.nextElement(); +// for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { +// InetAddress inetAddress = enumIpAddr.nextElement(); +// allIP += inetAddress.getHostAddress() + "\n"; +// if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress()) +// return inetAddress.getHostAddress(); +// } +// } +// } catch (Throwable t) { +// LoggerUtil.e("getLocalIP", StringUtil.getThrowableStr(t)); +// } +// +// return getLocalIPByWIFI(); +// } + + //有线网口ip +// public static String getLocalIP() { +// return getEthIpAddress(); +// } + + //获取有线网络ip + public static String getEthIpAddress() { + String infaceName = "eth0"; + String ip = "0.0.0.0"; + try { + Enumeration netInterface = NetworkInterface.getNetworkInterfaces(); + while (netInterface.hasMoreElements()) { + NetworkInterface inface = netInterface.nextElement(); + if (!inface.isUp()) { + continue; + } + + // eth0 有线网络判断 + if (!infaceName.equals(inface.getDisplayName())) { + continue; + } + + Enumeration netAddressList = inface.getInetAddresses(); + while (netAddressList.hasMoreElements()) { + InetAddress inetAddress = netAddressList.nextElement(); + // 获取IP4地址 + if (inetAddress instanceof Inet4Address) { + return inetAddress.getHostAddress(); + } + } + } + } catch (Exception e) { + + } + return ip; + } + + //获取有线网络mac + public static String getLanMac(){ + + ConnectivityManager cm = (ConnectivityManager) MyApplication.getInstance().getApplicationContext().getSystemService(Service.CONNECTIVITY_SERVICE); + NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo(); + String extraInfo = activeNetworkInfo.getExtraInfo(); + return extraInfo; + } + + /** + * 从wifi连接中获取ip地址 + * + * @return + */ + public static String getLocalIPByWIFI() { + try { + //获取wifi服务 + WifiManager wifiManager = (WifiManager) MyApplication.getInstance().getApplicationContext().getSystemService(Context.WIFI_SERVICE); + //判断wifi是否开启 + if (!wifiManager.isWifiEnabled()) wifiManager.setWifiEnabled(true); + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + int ipAddress = wifiInfo.getIpAddress(); + return intToIp(ipAddress); + } catch (Throwable t) { + LoggerUtil.e("getLocalIPByWIFI", StringUtil.getThrowableStr(t)); + return ""; + } + } + + private static String intToIp(int i) { + + String first = String.valueOf((i & 0xFF)); + String second = String.valueOf(((i >> 8) & 0xFF)); + String third = String.valueOf(((i >> 16) & 0xFF)); + String fourth = String.valueOf((i >> 24 & 0xFF)); + + return StringUtil.strSplice(first, ".", second, ".", third, ".", fourth); + } + + /** + * 更新设备ip + * */ + public static void updateDeviceIP(Activity activity) { + String deviceIP = DeviceData.getDeviceInfo(DeviceData.HINT_DEVICE_IP); + String localIP = DeviceUtil.getLocalIP(); + if (!StringUtil.isEmpty(localIP) && !deviceIP.equals(localIP) && !"0.0.0.0".equals(localIP)) { + DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_IP, localIP); + } + } + + /** + * 获取mac + * */ + public static String getMacFromHardware() { + String mac= ""; + try { + String Localmac = getLocalMacAddressFromIp(); + if(Localmac!= null && !Localmac.equals("")){ + mac = Localmac.toLowerCase(); + } + LoggerUtil.e("mac获取","mac:"+mac); + } catch (Exception e) { + mac=""; + LoggerUtil.e("mac获取","mac获取失败"+e.getMessage()); + + } + return mac; + } + + /** + * 根据IP地址获取MAC地址 + * @return + */ + public static String getLocalMacAddressFromIp() { + String strMacAddr = null; + try { + //获得IpD地址 + InetAddress ip = getLocalInetAddress(); + byte[] b = NetworkInterface.getByInetAddress(ip).getHardwareAddress(); + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + if (i != 0) { + buffer.append(':'); + } + String str = Integer.toHexString(b[i] & 0xFF); + buffer.append(str.length() == 1 ? 0 + str : str); + } + strMacAddr = buffer.toString().toUpperCase(); + } catch (Exception e) { + } + return strMacAddr; + } + /** + * 获取移动设备本地IP + * @return + */ + public static InetAddress getLocalInetAddress() { + InetAddress ip = null; + try { + //列举 + Enumeration en_netInterface = NetworkInterface.getNetworkInterfaces(); + while (en_netInterface.hasMoreElements()) {//是否还有元素 + NetworkInterface ni = (NetworkInterface) en_netInterface.nextElement();//得到下一个元素 + Enumeration en_ip = ni.getInetAddresses();//得到一个ip地址的列举 + while (en_ip.hasMoreElements()) { + ip = en_ip.nextElement(); + if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) + break; + else + ip = null; + } + if (ip != null) { + break; + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + return ip; + } + + /** + * 获取版本号 + * + * @return 当前应用的版本号 + */ + public static String getVersionName() { + try { + PackageManager manager = MyApplication.getInstance().getPackageManager(); + PackageInfo info = manager.getPackageInfo(MyApplication.getInstance().getPackageName(), 0); + return StringUtil.getString(info.versionName); + } catch (Throwable t) { + LoggerUtil.e("getVersionName", StringUtil.getThrowableStr(t)); + return "版本号获取失败"; + } + } + + + /** + * [获取应用程序版本名称信息] + * + * @return 当前应用的版本名称 + */ + public static synchronized String getPackageName() { + try { + PackageManager packageManager = MyApplication.getInstance().getPackageManager(); + PackageInfo packageInfo = packageManager.getPackageInfo(MyApplication.getInstance().getPackageName(), 0); + return packageInfo.packageName; + } catch (Throwable t) { + LoggerUtil.e("getPackageName", StringUtil.getThrowableStr(t)); + return ""; + } + } + + /** + * 判断服务是否启动 + * */ + public static boolean isServiceRunning(Context mContext, String className) { + + boolean isRunning = false; + ActivityManager activityManager = (ActivityManager) mContext + .getSystemService(Context.ACTIVITY_SERVICE); + List serviceList = activityManager + .getRunningServices(30); + + if (!(serviceList.size() > 0)) { + return false; + } + Log.e("OnlineService:",className); + for (int i = 0; i < serviceList.size(); i++) { + Log.e("serviceName:",serviceList.get(i).service.getClassName()); + if (serviceList.get(i).service.getClassName().contains(className) == true) { + isRunning = true; + break; + } + } + return isRunning; + } + + public static int screenWidth(Activity activity) { + DisplayMetrics metrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); + return metrics.widthPixels; + } + + public static int screenHeight(Activity activity) { + DisplayMetrics metrics = new DisplayMetrics(); + activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); + return metrics.heightPixels; + } + + public static String screenType(Activity activity) { + int width = screenWidth(activity); + int height = screenHeight(activity); + String screenType = (width > height) ? "横屏" : "竖屏"; + return StringUtil.strSplice(String.valueOf(width), "*", String.valueOf(height), screenType); + } + + public static boolean screenIs4K(Activity activity) { + int width = screenWidth(activity); + int height = screenHeight(activity); + if(width>2000||height>2000){ + return true; + }else { + return false; + } + } + + //监测设备是否有麦克风 + public static boolean hasMicrophone() { + try { + return new File("/proc/asound/card3").exists(); + } catch (Throwable t) { + LoggerUtil.e("hasMicrophone", StringUtil.getThrowableStr(t)); + return false; + } + } + + //监测设备是否有摄像头 + public static boolean hasCamera() { + try { + boolean video0 = new File("/dev/video0").exists(); + boolean video1 = new File("/dev/video1").exists(); + return video0 || video1; + } catch (Throwable t) { + LoggerUtil.e("hasCamera", StringUtil.getThrowableStr(t)); + return false; + } + } + + //获取设备外设列表 + public static String getDeviceFeature() { + String camera = DeviceUtil.hasCamera() ? "摄像头;" : ""; + String microphone = DeviceUtil.hasMicrophone() ? "麦克风;" : ""; + return StringUtil.strSplice(camera, microphone); + } + + /** + * 获得SD卡总大小 + * + * @return + */ + public static long getSDTotalSize() { + File path = Environment.getExternalStorageDirectory(); + StatFs stat = new StatFs(path.getPath()); + long blockSize = stat.getBlockSize(); + long totalBlocks = stat.getBlockCount(); + return blockSize * totalBlocks; + } + + /** + * 获得sd卡剩余容量,即可用大小 + * + * @return + */ + public static long getSDAvailableSize() { + File path = Environment.getExternalStorageDirectory(); + StatFs stat = new StatFs(path.getPath()); + long blockSize = stat.getBlockSize(); + long availableBlocks = stat.getAvailableBlocks(); + return blockSize * availableBlocks; + } + + /** + * 递归删除文件和文件夹 + * + * @param file 要删除的根目录 + */ + public static void recursionDeleteFile(File file) { + if (file.isFile()) { + file.delete(); + return; + } + if (file.isDirectory()) { + File[] childFile = file.listFiles(); + if (childFile == null || childFile.length == 0) { + file.delete(); + return; + } + for (File f : childFile) { + recursionDeleteFile(f); + } + file.delete(); + } + } + +} diff --git a/app/src/main/java/qianmu/container/util/FileUtil.java b/app/src/main/java/qianmu/container/util/FileUtil.java new file mode 100644 index 0000000..bbe0402 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/FileUtil.java @@ -0,0 +1,572 @@ +package qianmu.container.util; + +import android.content.Context; +import android.util.Log; + +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import qianmu.container.app.Constant; +import qianmu.container.http.okgo.QMFileCallback; +import qianmu.container.listener.QueryFinishListener; + +/** + * 解压zip文件到指定目录 + * Created by Administrator on 2018/3/1. + */ + +public class FileUtil { + + public static Map downloadFiles = new HashMap<>();//正在下载的文件列表 + + public static void downloadFile(final String internetPath, final String localPath) { + downloadFile(internetPath.replaceAll("//", "/"), localPath, null); + } + + /** + * * 下载网络文件 支持断点下载 + * 下载逻辑: + * 1、判断文件是否正在下载中 正在下载就跳过当前 + * 2、判断本地指定文件夹是否有当前文件(以名称判断) 有则跳过 否则下载 + * 3、在目标文件名称后追加“.temp”作为临时文件 判断本地指定文件夹是否存在 有则取出文件大小 + * 作为Range参数上传(否则传 0) 作为文件断点位置。 + * 4、下载完成时 读取本地文件大小和接口返回文件实际大小比对 一致时重命名文件 去除“.temp” + * + * @param internetPath 云端文件路径 + * @param localPath 本地文件路径 + */ + public static void downloadFile(final String internetPath, String localPath, final QueryFinishListener finishListener) { + + try { + localPath = localPath.replace(Constant.getBaseAddress(), "/"); + if (StringUtil.isEmpty(localPath)) { + if (finishListener != null) finishListener.onFinish(); + return; + } + final String targetPath = localPath; + //文件在下载列表中 + if (downloadFiles.get(localPath) != null) { + if (finishListener != null) finishListener.onFinish(); + return; + } + //添加下载记录 + downloadFiles.put(localPath, localPath); + final int index = localPath.lastIndexOf("/"); + //临时文件路径 + final String tempFilePath = StringUtil.strSplice(localPath, ".temp"); + File tempFile = new File(tempFilePath); + long tempFileLength = 0; + //临时文件存在时获取文件大小 + if (tempFile.exists()) tempFileLength = tempFile.length(); + OkGo.get(internetPath).tag(localPath).headers("Range", StringUtil.strSplice("bytes=", + String.valueOf(tempFileLength), "-")).execute(new QMFileCallback(localPath.substring(0, index + 1), + StringUtil.strSplice(localPath.substring(index + 1), ".temp")) { + @Override + public void onSuccess(com.lzy.okgo.model.Response response) { + downloadSuccess(response, tempFilePath); + } + + @Override + public void onError(Response response) { + super.onError(response); + } + + @Override + public void onFinish() { + super.onFinish(); + downloadFiles.remove(targetPath); + if (finishListener != null) finishListener.onFinish(); + } + }); + } catch (Throwable t) { + if (finishListener != null) finishListener.onFinish(); + LoggerUtil.e("downloadFile", StringUtil.getThrowableStr(t)); + } + } + + public static void downloadFile2(final String internetPath, String localPath, final QueryFinishListener finishListener) { + + try { + localPath = localPath.replace(Constant.getBaseAddress(), "/"); + if (StringUtil.isEmpty(localPath)) { + if (finishListener != null) finishListener.onFinish(); + return; + } + final String targetPath = localPath; + //文件在下载列表中 + if (downloadFiles.get(localPath) != null) { + if (finishListener != null) finishListener.onFinish(); + return; + } + //添加下载记录 + downloadFiles.put(localPath, localPath); + final int index = localPath.lastIndexOf("/"); + //临时文件路径 + final String tempFilePath = StringUtil.strSplice(localPath, ".temp"); + File tempFile = new File(tempFilePath); + long tempFileLength = 0; + //临时文件存在时获取文件大小 + if (tempFile.exists()) tempFileLength = tempFile.length(); + OkGo.get(internetPath).tag(localPath).headers("Range", StringUtil.strSplice("bytes=", + String.valueOf(tempFileLength), "-")).execute(new QMFileCallback(localPath.substring(0, index + 1), + StringUtil.strSplice(localPath.substring(index + 1), ".temp")) { + @Override + public void onSuccess(com.lzy.okgo.model.Response response) { + downloadSuccess(response, tempFilePath); + if (finishListener != null) finishListener.onFinish(); + } + + @Override + public void onError(Response response) { + super.onError(response); + LoggerUtil.e("素材下载失败", "文件:"+tempFilePath+","+response.message()); + } + + @Override + public void onFinish() { + super.onFinish(); + downloadFiles.remove(targetPath); + + } + }); + } catch (Throwable t) { + if (finishListener != null) finishListener.onFinish(); + LoggerUtil.e("downloadFile", StringUtil.getThrowableStr(t)); + } + } + + /** + * 文件下载成功回调 + * + * @param response + * @param localPath + */ + private static void downloadSuccess(com.lzy.okgo.model.Response response, String localPath) { + + try { + String fileTotalLength = response.headers().get("Content-Range"); + //获取请求数据的总大小 + fileTotalLength = fileTotalLength.substring(fileTotalLength.lastIndexOf("/") + 1); + File tempFile = new File(localPath); + //读取本地保存文件大小 + String tempFileLength = String.valueOf(tempFile.length()); + //二者大小一致时 修改文件后缀名 + if (tempFile.length()!=0 &&fileTotalLength.equals(tempFileLength)) { + String targetPath = localPath.substring(0, localPath.lastIndexOf(".")); + if(targetPath.contains("?")){ + String[] split = targetPath.split("[?]"); + targetPath=split[0]; + } + File targetFile = new File(targetPath); + tempFile.renameTo(targetFile); + } else if (Integer.valueOf(tempFileLength) > Integer.valueOf(fileTotalLength) || tempFile.length()==0) { + Log.e("下载失败", localPath); + //本地文件大于待下载文件时 表示断点下载异常 删除已下载文件 + tempFile.delete(); + } + } catch (Throwable t) { + LoggerUtil.e("downloadSuccess", StringUtil.getThrowableStr(t)); + } + } + + /** + * Android上传文件到服务端 + * + * @param RequestURL 请求的rul + * @return 返回响应的内容 + */ + public static String uploadFile(byte[] stringByte, byte[] imageByte, String RequestURL) { + String result = null; + String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成 + String PREFIX = "--", LINE_END = "\r\n"; + String CONTENT_TYPE = "application/otcet-stream"; // 内容类型 + String ENCODING_RESPONSE = "utf-8"; + + HttpURLConnection httpURLConnection; + try { + //建立链接 + URL gatewayUrl = new URL(RequestURL); + httpURLConnection = (HttpURLConnection) gatewayUrl.openConnection(); + //设置连接属性 + httpURLConnection.setDoOutput(true); + httpURLConnection.setDoInput(true); + httpURLConnection.setUseCaches(false); + //设置请求属性 + httpURLConnection.setRequestProperty("Content-Type", "application/octet-stream"); + //建立输出流,并写入数据 + OutputStream outputStream = httpURLConnection.getOutputStream(); + outputStream.write(stringByte); + outputStream.write(imageByte); + outputStream.close(); + //获得响应状态 + int responseCode = httpURLConnection.getResponseCode(); + if (HttpURLConnection.HTTP_OK == responseCode) { + //当正确响应时处理数据 + StringBuffer responseBuffer = new StringBuffer(); + String readLine; + BufferedReader responseReader; + //处理响应流,必须与服务器响应流输出的编码一致 + responseReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), ENCODING_RESPONSE)); + while ((readLine = responseReader.readLine()) != null) { + responseBuffer.append(readLine).append("\n"); + } + LoggerUtil.e("uploadFile", responseBuffer.toString()); + responseReader.close(); + } + } catch (Throwable t) { + LoggerUtil.e("uploadFile", StringUtil.getThrowableStr(t)); + } + + return result; + } + + /** + * 分离url中的服务器地址和文件相对路径 + * url--http://192.168.1.194:8044/Files/ca08dfe1-8a4e-4f4c-8956-4a2dce1fc916/lg18_maje.jpg + * 服务器地址--http://192.168.1.194:8044 + * 文件相对路径--/Files/ca08dfe1-8a4e-4f4c-8956-4a2dce1fc916/lg18_maje.jpg + * + * @param filePath + * @return + */ + public static String[] getServerAndPath(String filePath) { + try { + int position = 0; + int times = 0; + while (times < 3) { + position = filePath.indexOf("/", position + 1); + if (position == -1) break; + else times++; + } + return new String[]{filePath.substring(0, position), filePath.substring(position)}; + } catch (Throwable t) { + LoggerUtil.e("getServerAndPath", StringUtil.getThrowableStr(t)); + return new String[2]; + } + } + + /** + * 文件转为byte数组 + * + * @param filePath 文件路径 + * @return + */ + public static byte[] file2byte(String filePath) { + byte[] buffer = null; + try { + File file = new File(filePath); + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) { + bos.write(b, 0, n); + } + fis.close(); + bos.close(); + buffer = bos.toByteArray(); + } catch (Throwable t) { + LoggerUtil.e("file2byte", StringUtil.getThrowableStr(t)); + } + return buffer; + } + + + /** + * 删除单个文件 + * + * @param filePath 被删除文件的文件名 + * @return 文件删除成功返回true,否则返回false + */ + public static boolean deleteFile(String filePath) { + File file = new File(filePath); + if (file.isFile() && file.exists()) { + return file.delete(); + } + return false; + } + + + public static boolean upZipFile(String filePath, String folderPath) { + try { + ZipFile zipFile = new ZipFile(new File(filePath), Charset.forName("GBK")); + Enumeration zList = zipFile.entries(); + ZipEntry ze; + byte[] buf = new byte[1024]; + while (zList.hasMoreElements()) { + ze = (ZipEntry) zList.nextElement(); + if (ze.isDirectory()) { + new File(StringUtil.strSplice(folderPath, ze.getName()).trim()).mkdir(); + continue; + } + File realFile = getRealFileName(folderPath, ze.getName()); + FileOutputStream fos = new FileOutputStream(realFile); + OutputStream os = new BufferedOutputStream(fos); + InputStream is = new BufferedInputStream(zipFile.getInputStream(ze)); + int readLen; + while ((readLen = is.read(buf, 0, 1024)) != -1) os.write(buf, 0, readLen); + is.close(); + os.close(); + } + zipFile.close(); + } catch (Throwable t) { + LoggerUtil.e("upZipFile", StringUtil.getThrowableStr(t)); + return false; + } + return true; + } + + + /** + * 给定根目录,返回一个相对路径所对应的实际文件名. + * + * @param baseDir 指定根目录 + * @param absFileName 相对路径名,来自于ZipEntry中的name + * @return java.io.File 实际的文件 + */ + public static File getRealFileName(String baseDir, String absFileName) { + absFileName = absFileName.replace("\\", "/"); + String[] dirs = absFileName.split("/"); + File ret = new File(baseDir); + if (dirs.length <= 1) return new File(ret, absFileName); + for (int i = 0; i < dirs.length - 1; i++) ret = new File(ret, dirs[i]); + if (!ret.exists()) ret.mkdirs(); + return new File(ret, dirs[dirs.length - 1]); + } + + + public static String getFileContent(String filePath) { + try { + StringBuilder result = new StringBuilder(); + File localFile = new File(filePath); + if (!localFile.exists()) return ""; + BufferedReader reader = new BufferedReader(new FileReader(localFile)); + String s; + while ((s = reader.readLine()) != null) result.append(s); + reader.close(); + return result.toString(); + } catch (Throwable t) { + LoggerUtil.e("getFileContent", StringUtil.getThrowableStr(t)); + return ""; + } + } + + + public static void writeDataToFile(String content, String filePath, boolean append) { + try { + File file = new File(filePath); + if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); + if (!file.exists()) file.createNewFile(); + FileWriter fileWriter = new FileWriter(filePath, append); + fileWriter.write(content); + if (fileWriter == null) return; + fileWriter.flush(); + fileWriter.close(); + } catch (Throwable t) { + LoggerUtil.e("writeDataToFile", StringUtil.getThrowableStr(t)); + } + } + + + //删除文件夹 + public static void delFolder(File file) { + try { + delFolder(file.getAbsolutePath()); + } catch (Throwable t) { + LoggerUtil.e("delFolder", StringUtil.getThrowableStr(t)); + } + } + + //删除文件夹 + public static void delFolder(String folderPath) { + try { + delAllFile(folderPath); + File dir = new File(folderPath); + if (dir.exists()) dir.delete(); + } catch (Throwable t) { + LoggerUtil.e("delFolder", StringUtil.getThrowableStr(t)); + } + } + + + public static boolean delAllFile(String path) { + boolean flag = false; + File file = new File(path); + if (!file.exists() || !file.isDirectory()) return flag; + String[] tempList = file.list(); + File temp; + for (int i = 0; i < tempList.length; i++) { + if (path.endsWith(File.separator)) { + temp = new File(StringUtil.strSplice(path, tempList[i])); + } else { + temp = new File(StringUtil.strSplice(path, File.separator, tempList[i])); + } + if (temp.isFile()) temp.delete(); + if (temp.isDirectory()) { + delAllFile(StringUtil.strSplice(path, "/", tempList[i]));//先删除文件夹里面的文件 + delFolder(StringUtil.strSplice(path, "/", tempList[i]));//再删除空文件夹 + flag = true; + } + } + return flag; + } + + + + // 将字符串写入到文本文件中 + public static void writeTxtToFile(String strcontent, String filePath, String fileName) { + //生成文件夹之后,再生成文件,不然会出错 + makeFilePath(filePath, fileName); + + String strFilePath = filePath + fileName; + // 每次写入时,都换行写 + String strContent = strcontent + "\r\n"; + try { + File file = new File(strFilePath); + if (!file.exists()) { + Log.d("TestFile", "Create the file:" + strFilePath); + file.getParentFile().mkdirs(); + file.createNewFile(); + } + RandomAccessFile raf = new RandomAccessFile(file, "rwd"); + raf.seek(file.length()); + raf.write(strContent.getBytes()); + raf.close(); + } catch (Exception e) { + Log.e("TestFile", "Error on write File:" + e); + } + } + + //生成文件 + public static File makeFilePath(String filePath, String fileName) { + File file = null; + makeRootDirectory(filePath); + try { + file = new File(filePath + fileName); + if (!file.exists()) { + file.createNewFile(); + }else { + file.delete(); + file.createNewFile(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return file; + } + + //生成文件夹 + public static void makeRootDirectory(String filePath) { + File file = null; + try { + file = new File(filePath); + if (!file.exists()) { + file.mkdir(); + } + } catch (Exception e) { + Log.i("error:", e + ""); + } + } + + /** + * 加载本地txt文件 + * */ + public static String loadFromSDFile(String path) { + String result=null; + try { + File f=new File(path); + int length=(int)f.length(); + byte[] buff=new byte[length]; + FileInputStream fin=new FileInputStream(f); + fin.read(buff); + fin.close(); + result=new String(buff,"UTF-8"); + }catch (Exception e){ + e.printStackTrace(); + Log.e("TAG","没有找到指定文件"); + } + return result; + } + + /** + * 删除文件夹以及目录下的文件 + * @param filePath 被删除目录的文件路径 + * @return 目录删除成功返回true,否则返回false + */ + public static boolean deleteDirectory(String filePath) { + boolean flag = false; + //如果filePath不以文件分隔符结尾,自动添加文件分隔符 + if (!filePath.endsWith(File.separator)) { + filePath = filePath + File.separator; + } + File dirFile = new File(filePath); + if (!dirFile.exists() || !dirFile.isDirectory()) { + return false; + } + flag = true; + File[] files = dirFile.listFiles(); + //遍历删除文件夹下的所有文件(包括子目录) + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + //删除子文件 + flag = deleteFile(files[i].getAbsolutePath()); + if (!flag) break; + } else { + //删除子目录 + flag = deleteDirectory(files[i].getAbsolutePath()); + if (!flag) break; + } + } + if (!flag) return false; + //删除当前空目录 + return dirFile.delete(); + } + + /** + * 读取本地JSON,显示汉字正确,txt文件设置时UTF-8,UNIX + * */ + public static String readLocalJsonForStorage(Context context, String fileName){ + + String resultString=""; + + try { + + File file = new File(fileName); + InputStream inputStream=new FileInputStream(file); + byte[] buffer=new byte[inputStream.available()]; + inputStream.read(buffer); + resultString=new String(buffer,"GB2312"); + + } catch (Exception e) { + + // TODO: handle exception + + } + + return resultString; + + } +} diff --git a/app/src/main/java/qianmu/container/util/GsonUtil.java b/app/src/main/java/qianmu/container/util/GsonUtil.java new file mode 100644 index 0000000..d77615a --- /dev/null +++ b/app/src/main/java/qianmu/container/util/GsonUtil.java @@ -0,0 +1,28 @@ +package qianmu.container.util; + +import com.google.gson.Gson; + +/** + * Created by Administrator on 2017/11/8. + */ + +public class GsonUtil { + + private static Gson gson; + + public static void init() { + gson = new Gson(); + } + + public static Gson getGson() { + if (null == gson) { + init(); + } + + return gson; + } + + + + +} diff --git a/app/src/main/java/qianmu/container/util/KeyboardUtil.java b/app/src/main/java/qianmu/container/util/KeyboardUtil.java new file mode 100644 index 0000000..6effd4b --- /dev/null +++ b/app/src/main/java/qianmu/container/util/KeyboardUtil.java @@ -0,0 +1,39 @@ +package qianmu.container.util; + +import android.content.Context; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +public class KeyboardUtil { + + //隐藏设备软键盘 + public static void hideKeyboard(View view) { + try { + InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm == null) { + LoggerUtil.e("hideKeyboard", "InputMethodManager is NULL"); + return; + } + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } catch (Throwable t) { + LoggerUtil.e("hideKeyboard", StringUtil.getThrowableStr(t)); + } + } + + //显示设备软键盘 + public static void showKeyboard(View view) { + try { + InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm == null) { + LoggerUtil.e("showKeyboard", "InputMethodManager is NULL"); + return; + } + view.requestFocus(); + imm.showSoftInput(view, 0); + } catch (Throwable t) { + LoggerUtil.e("showKeyboard", StringUtil.getThrowableStr(t)); + } + } + + +} diff --git a/app/src/main/java/qianmu/container/util/LanguageUtil.java b/app/src/main/java/qianmu/container/util/LanguageUtil.java new file mode 100644 index 0000000..533fecd --- /dev/null +++ b/app/src/main/java/qianmu/container/util/LanguageUtil.java @@ -0,0 +1,100 @@ +package qianmu.container.util; + + +/** + * 应用语言 + * Created by Administrator on 2018/8/27. + */ +public class LanguageUtil { + + public static final String SYSTEM_LANGUAGE = "设备语言"; + public static final String LANGUAGE_CN = "中"; + public static final String LANGUAGE_EN = "EN"; + public static final String LANGUAGE_FAN = "繁"; + public static String currLanguage = ""; + + /** + * 保存系统语言为中文 + */ + public static void setLanguageCN() { + currLanguage = LANGUAGE_CN; + SharedPreUtil.setParam(SYSTEM_LANGUAGE, currLanguage); + } + + /** + * 保存系统语言为英文 + */ + public static void setLanguageEN() { + currLanguage = LANGUAGE_EN; + SharedPreUtil.setParam(SYSTEM_LANGUAGE, currLanguage); + } + + /** + * 保存系统语言为英文 + */ + public static void setLanguageFAN() { + currLanguage = LANGUAGE_FAN; + SharedPreUtil.setParam(SYSTEM_LANGUAGE, currLanguage); + } + + /** + * 获取当前系统语言 + * + * @return + */ + public static String getLanguage() { + if (StringUtil.isEmpty(currLanguage)) + currLanguage = (String) SharedPreUtil.getParam(SYSTEM_LANGUAGE, LANGUAGE_CN); + return currLanguage; + } + + + /** + * 系统语言是否为中文 + * + * @return + */ + public static boolean isCN() { + return LANGUAGE_CN.equals(getLanguage()); + } + + /** + * 系统语言是否为英文 + * + * @return + */ + public static boolean isEN() { + return LANGUAGE_EN.equals(getLanguage()); + } + + /** + * 系统语言是否为英文 + * + * @return + */ + public static boolean isFAN() { + return LANGUAGE_FAN.equals(getLanguage()); + } + + +// public static String fan2Jan(String content) { +// try { +// JChineseConvertor jChineseConvertor = JChineseConvertor.getInstance(); +// return jChineseConvertor.t2s(content); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// return content; +// } +// +// public static String jan2Fan(String content) { +// try { +// JChineseConvertor jChineseConvertor = JChineseConvertor.getInstance(); +// return jChineseConvertor.s2t(content); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// return content; +// } + +} diff --git a/app/src/main/java/qianmu/container/util/LoggerUtil.java b/app/src/main/java/qianmu/container/util/LoggerUtil.java new file mode 100644 index 0000000..42aa317 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/LoggerUtil.java @@ -0,0 +1,234 @@ +package qianmu.container.util; + +import android.os.Environment; +import android.util.Log; + +import com.google.gson.Gson; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.Executors; + +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import qianmu.container.R; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.data.DeviceData; +import qianmu.container.entity.Resp; +import qianmu.container.http.retrofit.RetrofitUtil; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +//日志的功能操作类 可将日志保存至SD卡 +public class LoggerUtil { + + private static final int VERBOSE = 1; + private static final int DEBUG = 2; + private static final int INFO = 3; + private static final int WARNING = 4; + private static final int ERROR = 5; + + //定义当前日志打印级别 + private static int logLevel = VERBOSE; + + private static boolean isPrintLog = true;//日志打印控制开关 + private static boolean SAVE_TO_SD = true;//是否保存至SD卡 + private static boolean isPrintStackInfo = true;//异常日志打印控制开关 + + //保存LOG日志的目录 + public static final String SAVE_LOG_DIR_PATH = StringUtil.strSplice(Constant.CACHE_PATH, "/LogDir"); + //日志打印时间Format + private static final SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private static final SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd"); + + //用于打印error级的日志信息 + public static void e(String strModule, String strErrMsg) { + if (ERROR < logLevel) return; + if (isPrintLog) Log.e(strModule, StringUtil.strSplice(">>", strErrMsg, "<<")); + if (SAVE_TO_SD) storeLog(strModule, strErrMsg); + } + + //用于打印debug级的日志信息 + public static void d(String strModule, String strErrMsg) { + if (DEBUG < logLevel) return; + if (isPrintLog) Log.d(strModule, strErrMsg); + if (SAVE_TO_SD) storeLog(strModule, strErrMsg); + + } + + //用于打印info级别的日志信息 + public static void i(String strModule, String strErrMsg) { + if (INFO < logLevel) return; + Log.i(strModule, strErrMsg); + if (SAVE_TO_SD) storeLog(strModule, strErrMsg); + + } + + //用于打印warning级别的日志信息 + public static void w(String strModule, String strErrMsg) { + if (WARNING < logLevel) return; + if (isPrintLog) Log.w(strModule, strErrMsg); + if (SAVE_TO_SD) storeLog(strModule, strErrMsg); + } + + //用于打印verbose级别的日志信息 + public static void v(String strModule, String strErrMsg) { + if (VERBOSE < logLevel) return; + if (isPrintLog) Log.v(strModule, strErrMsg); + if (SAVE_TO_SD) storeLog(strModule, strErrMsg); + } + + //打印异常栈信息 + public static void e(String strModule, Exception e) { + if (ERROR < logLevel) return; + if (isPrintStackInfo) if (e != null) e.printStackTrace(); + if (SAVE_TO_SD) storeLog(strModule, e.getMessage()); + } + + //打印异常栈信息 + public static void e(String strModule, String strErrMsg, Exception e) { + if (ERROR < logLevel) return; + Log.e(strModule, strErrMsg); + if (isPrintStackInfo) if (e != null) e.printStackTrace(); + if (SAVE_TO_SD) storeLog(strModule, e.getMessage()); + + } + + + //将日志信息保存至SD卡 + public static synchronized void storeLog(String strModule, String strErrMsg) { + + Executors.newSingleThreadExecutor().execute(() -> { + if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) return; + File fileDir = new File(SAVE_LOG_DIR_PATH); + // 目录是否已经存在 + if (!fileDir.exists() && !fileDir.mkdirs()) { + Log.e(strModule, StringUtil.strSplice("Failed to create directory ", SAVE_LOG_DIR_PATH)); + return; + } + String fileName = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis()); + File file = new File(StringUtil.strSplice(SAVE_LOG_DIR_PATH, "/", fileName, ".txt")); + if(5120000L >", strModule, "<< ", strErrMsg, "\r"); + OutputStreamWriter write = new OutputStreamWriter(fos, "UTF-8"); + BufferedWriter writer = new BufferedWriter(write); + writer.write(data); + writer.close(); + write.close(); + fos.close(); + } catch (Throwable t) { + LoggerUtil.e("storeLog", StringUtil.getThrowableStr(t)); + } + }); + } + + + /** + * 删除10天以外的log文件 + * */ + public static void deleteLogFiles(){ + try { + File file = new File(SAVE_LOG_DIR_PATH); + //判断文件不为null或文件目录存在 + if (file == null || !file.exists()){ + return; + } + //取得这个目录下的所有子文件对象 + File[] files = file.listFiles(); + long currenttime = System.currentTimeMillis(); + //遍历该目录下的文件对象 + for (File f: files){ + //打印文件名 + String name = f.getName(); + try { + long fileTime = TimeUtil.stringToLong(name, "yyyy-MM-dd"); + if(fileTime<(currenttime-(10*24*60*60*1000))){ + f.delete(); + } + }catch (Exception e){ + LoggerUtil.e("删除log报错",e.getMessage()); + } + } + }catch (Exception e){ + LoggerUtil.e("删除log报错",e.getMessage()); + } + } + + /** + * 保存接口请求报错 + * */ + public static void saveError(String name, Throwable t){ + if(StringUtil.getThrowableStr(t).contains("java.net.ConnectException: Failed to connect to")){ + e(name, "接口超时"); + }else if(StringUtil.getThrowableStr(t).contains("java.net.UnknownHostException: Unable to resolve host")){ + e(name, "接口超时,无法解析域名"); + }else { + e(name, StringUtil.getThrowableStr(t)); + } + } + + /** + * 上传日志 + * */ + public static void uploadLogFile(String filePath,String code,String initiator,String type ) { + + File file = new File(filePath); + if (!file.exists()||code.isEmpty()) return; + SAVE_TO_SD=false; + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + RequestBody fileRequestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); + MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("code",code) + .addFormDataPart("initiator",initiator) + .addFormDataPart("type",type); + + builder.addFormDataPart("file", file.getName(),fileRequestBody); + RequestBody requestBody = builder.build(); + + MultipartBody.Part requestImgPart = MultipartBody.Part.createFormData("file", file.getName(), fileRequestBody); + RetrofitUtil.getBaseService().upLogFile(requestBody ).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + SAVE_TO_SD=true; + try { + LoggerUtil.e("uploadLogFile", new Gson().toJson(response.body())); + }catch (Exception e){ + LoggerUtil.e("uploadLogFile报错1:", new Gson().toJson(response.body())); + } + + } + + @Override + public void onFailure(Call call, Throwable t) { + SAVE_TO_SD=true; + if(StringUtil.getThrowableStr(t).contains("java.net.ConnectException: Failed to connect to")){ + LoggerUtil.e("uploadLogFile", "接口超时"); + }else if(StringUtil.getThrowableStr(t).contains("java.net.UnknownHostException: Unable to resolve host")){ + LoggerUtil.e("uploadLogFile", "接口超时,无法解析域名"); + }else { + LoggerUtil.e("uploadLogFile", StringUtil.getThrowableStr(t)); + } + } + }); + + } + + +} diff --git a/app/src/main/java/qianmu/container/util/MusicUtil.java b/app/src/main/java/qianmu/container/util/MusicUtil.java new file mode 100644 index 0000000..e848d10 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/MusicUtil.java @@ -0,0 +1,59 @@ +package qianmu.container.util; + + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; + +import qianmu.container.entity.Dict; +import qianmu.container.entity.MusicBean; + + +/** + * Created by genglaixin on 2018/9/19. + */ + +public class MusicUtil { + /** + * 本地文件名称 + */ + public static final String NAME = "music_data"; + /** + * 本地数据键值 + */ + public static final String KEY = "music_list"; + + public static String getDataJson() { + return (String) SharedPreUtil.getParam(NAME, KEY, "{}"); + } + + public static void saveDataJson(String dataJson) { + SharedPreUtil.setParam(NAME, KEY, dataJson); + } + + public static void saveData(Object data) { + + saveDataJson(GsonUtil.getGson().toJson(data)); + + } + + /** + * 获取列表 + * + * @return + */ + public static List getBackgroundMusicList() { + try { + String DataStr = getDataJson(); + MusicBean msicBean =new Gson().fromJson(DataStr, new TypeToken() {}.getType()); + return msicBean.getSoundFiles(); + } catch (Throwable t) { + LoggerUtil.e("getBackgroundMusicList", StringUtil.getThrowableStr(t)); + } + return new ArrayList<>(); + } + + +} diff --git a/app/src/main/java/qianmu/container/util/RootCmdUtil.java b/app/src/main/java/qianmu/container/util/RootCmdUtil.java new file mode 100644 index 0000000..196473b --- /dev/null +++ b/app/src/main/java/qianmu/container/util/RootCmdUtil.java @@ -0,0 +1,70 @@ +package qianmu.container.util; + +import android.util.Log; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Scanner; + + +/** + * Android运行linux命令 + */ +public final class RootCmdUtil { + + //HDMI使能状态(enabled/disabled) +// public static final String HDMI_ENABLED = "cat /sys/class/drm/card0-HDMI-A-1/enabled"; + public static final String HDMI_ENABLED = "cat /sys/class/drm/card0-HDMI-A-1/status";//打开是connected,关闭是disconnected + + /** + * 读取HDMI状态 判断设备是否关机 + */ + public static boolean HDMIEnabled() { + String enabled = execRootCmd(HDMI_ENABLED); +// if ("disabled".equals(enabled)) return false; + if ("disconnected".equals(enabled)) return false; + else return true; + } + + + /** + * 执行命令并且输出结果 + */ + private static String execRootCmd(String cmd) { + String result = ""; + DataOutputStream dos = null; + DataInputStream dis = null; + try { + Process p = Runtime.getRuntime().exec("su"); + dos = new DataOutputStream(p.getOutputStream()); + dis = new DataInputStream(p.getInputStream()); + dos.writeBytes(cmd + "\n"); + dos.flush(); + dos.writeBytes("exit\n"); + dos.flush(); + String line = null; + while ((line = dis.readLine()) != null) result += line; + p.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (dos != null) { + try { + dos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (dis != null) { + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } +} \ No newline at end of file diff --git a/app/src/main/java/qianmu/container/util/SSLSocketClient.java b/app/src/main/java/qianmu/container/util/SSLSocketClient.java new file mode 100644 index 0000000..92d5038 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/SSLSocketClient.java @@ -0,0 +1,64 @@ +package qianmu.container.util; + +import java.security.SecureRandom; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2024/1/11 + * Time: 17:30 + */ +public class SSLSocketClient { + + //获取这个SSLSocketFactory + public static SSLSocketFactory getSSLSocketFactory() { + try { + SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, getTrustManager(), new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + //获取TrustManager + private static TrustManager[] getTrustManager() { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + }; + return trustAllCerts; + } + + //获取HostnameVerifier + public static HostnameVerifier getHostnameVerifier() { + HostnameVerifier hostnameVerifier = new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }; + return hostnameVerifier; + } + +} diff --git a/app/src/main/java/qianmu/container/util/SharedPreUtil.java b/app/src/main/java/qianmu/container/util/SharedPreUtil.java new file mode 100644 index 0000000..1e2daed --- /dev/null +++ b/app/src/main/java/qianmu/container/util/SharedPreUtil.java @@ -0,0 +1,159 @@ +package qianmu.container.util; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.SharedPreferences; + +import java.io.File; +import java.lang.reflect.Field; + +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; + +public class SharedPreUtil { + + //保存在手机里面的文件名 + static final String FILE_NAME = "register_info"; + //保存在手机里面的目录位置 + public static final String FILE_LOCATION = StringUtil.strSplice(Constant.CACHE_PATH, "SharedLocation"); + + /** + * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 + * + * @param key 键 + * @param object 值 + */ + public static void setParam(String key, Object object) { + + Context context = MyApplication.getInstance(); + String type = object.getClass().getSimpleName(); + changeSPLocation(context); + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + + if ("String".equals(type)) { + editor.putString(key, (String) object); + } else if ("Integer".equals(type)) { + editor.putInt(key, (Integer) object); + } else if ("Boolean".equals(type)) { + editor.putBoolean(key, (Boolean) object); + } else if ("Float".equals(type)) { + editor.putFloat(key, (Float) object); + } else if ("Long".equals(type)) { + editor.putLong(key, (Long) object); + } + + editor.commit(); + } + + /** + * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 + * + * @param key 键 + * @param object 值 + */ + public static void setParam(String fileName, String key, Object object) { + + Context context = MyApplication.getInstance(); + String type = object.getClass().getSimpleName(); + changeSPLocation(context); + SharedPreferences sp = context.getSharedPreferences(fileName, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + + if ("String".equals(type)) { + editor.putString(key, (String) object); + } else if ("Integer".equals(type)) { + editor.putInt(key, (Integer) object); + } else if ("Boolean".equals(type)) { + editor.putBoolean(key, (Boolean) object); + } else if ("Float".equals(type)) { + editor.putFloat(key, (Float) object); + } else if ("Long".equals(type)) { + editor.putLong(key, (Long) object); + } + + editor.commit(); + } + + + /** + * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 + * + * @param key 键 + * @param defaultObject 默认值 + * @return + */ + public static Object getParam(String key, Object defaultObject) { + + Context context = MyApplication.getInstance(); + String type = defaultObject.getClass().getSimpleName(); + changeSPLocation(context); + SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); + + if ("String".equals(type)) { + return sp.getString(key, (String) defaultObject); + } else if ("Integer".equals(type)) { + return sp.getInt(key, (Integer) defaultObject); + } else if ("Boolean".equals(type)) { + return sp.getBoolean(key, (Boolean) defaultObject); + } else if ("Float".equals(type)) { + return sp.getFloat(key, (Float) defaultObject); + } else if ("Long".equals(type)) { + return sp.getLong(key, (Long) defaultObject); + } + + return null; + } + + + /** + * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 + * + * @param key 键 + * @param defaultObject 默认值 + * @return + */ + public static Object getParam(String fileName, String key, Object defaultObject) { + + Context context = MyApplication.getInstance(); + String type = defaultObject.getClass().getSimpleName(); + changeSPLocation(context); + SharedPreferences sp = context.getSharedPreferences(fileName, Context.MODE_PRIVATE); + + if ("String".equals(type)) { + return sp.getString(key, (String) defaultObject); + } else if ("Integer".equals(type)) { + return sp.getInt(key, (Integer) defaultObject); + } else if ("Boolean".equals(type)) { + return sp.getBoolean(key, (Boolean) defaultObject); + } else if ("Float".equals(type)) { + return sp.getFloat(key, (Float) defaultObject); + } else if ("Long".equals(type)) { + return sp.getLong(key, (Long) defaultObject); + } + + return null; + } + + + /** + * 修改sharePreference的存储路径 + */ + public static void changeSPLocation(Context context) { + try { + // 获取ContextWrapper对象中的mBase变量。该变量保存了ContextImpl对象 + Field field = ContextWrapper.class.getDeclaredField("mBase"); + field.setAccessible(true); + Object obj = field.get(context);// 获取mBase变量 + // 获取ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径 + field = obj.getClass().getDeclaredField("mPreferencesDir"); + field.setAccessible(true); + File file = new File(FILE_LOCATION); // 创建自定义路径 + if (!file.exists()) file.mkdirs(); + field.set(obj, file);// 修改mPreferencesDir变量的值 + } catch (Throwable t) { + LoggerUtil.e("changeSPLocation", StringUtil.getThrowableStr(t)); + } + } + +} diff --git a/app/src/main/java/qianmu/container/util/SignWayUtil.java b/app/src/main/java/qianmu/container/util/SignWayUtil.java new file mode 100644 index 0000000..3b5537a --- /dev/null +++ b/app/src/main/java/qianmu/container/util/SignWayUtil.java @@ -0,0 +1,555 @@ +package qianmu.container.util; + +import android.content.Intent; +import android.os.Build; +import android.os.signwaymanager.SignwayManager; +import android.util.Log; + +import com.sdkapi.api.SdkApi; +import com.sdkapi.common.ResultCallback; +import com.sdkapi.common.ResultInfo; +import com.ys.rkapi.MyManager; +import com.zcapi; + +import org.greenrobot.eventbus.EventBus; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import cn.huidu.toolkit.HuiduTech; +import qianmu.container.app.Constant; +import qianmu.container.app.MyApplication; +import qianmu.container.entity.MessageEvent; + +@SuppressWarnings("All") +public class SignWayUtil { + + //关机 + public static void shutDown() { + try { + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + if (signwayManager != null) signwayManager.shutDown(); + }if(Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().SystemCtrl().setDeviceShallowOnoff(false); + }else if(Constant.androidBoardType.equals("ys")){ + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager.shutdown(); + }else if(Constant.androidBoardType.equals("sx")){ + Intent intent = new Intent("android.intent.action.shutdown"); + MyApplication.getInstance().sendBroadcast(intent); + + }else if(Constant.androidBoardType.equals("zc")){ + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.shutDown(); + + }else if(Constant.androidBoardType.equals("nova")){ + EventBus.getDefault().post(new MessageEvent(Constant.NOVA_SCREEN_POWER_CLOSE)); + }else if(Constant.androidBoardType.equals("huidu")){ + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); + helper.shutdown(); + } + } catch (Throwable t) { + LoggerUtil.e("shutDown", StringUtil.getThrowableStr(t)); + } + } + + //重启 + public static void reboot() { + try { + if(Constant.androidBoardType.equals("xwst")){ + + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + if (signwayManager != null) signwayManager.reboot(); + + }if(Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().SystemCtrl().deviceReboot(); + + }else if(Constant.androidBoardType.equals("ys")){ + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager.reboot(); + }else if(Constant.androidBoardType.equals("sx")){ + Intent intent = new Intent("android.intent.action.reboot"); + MyApplication.getInstance().sendBroadcast(intent); + }else if(Constant.androidBoardType.equals("zc")){ + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.reboot(); + }else if(Constant.androidBoardType.equals("nova")){ + EventBus.getDefault().post(new MessageEvent(Constant.NOVA_REBOOT)); + }else if(Constant.androidBoardType.equals("huidu")){ + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); + helper.reboot(); + } + } catch (Throwable t) { + LoggerUtil.e("reboot", StringUtil.getThrowableStr(t)); + } + } + + //静默安装apk + public static void silentInstallApk(String path, String name) { + try { + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + if (signwayManager != null) signwayManager.silentInstallApk(path,name); + }if(Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().SystemCtrl().silentInstallApk(path, true, + new ResultCallback>() { + @Override + public void onMsg(ResultInfo booleanResultInfo) { + Boolean val = booleanResultInfo.getVal(); + LoggerUtil.e("SignwayUtil", "app安装结果:"+val); + } + } + ); + }else if(Constant.androidBoardType.equals("ys")){ + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + boolean success = manager.silentInstallApk(path,true); + LoggerUtil.e("SignwayUtil", "app安装结果:"+success); + }else if(Constant.androidBoardType.equals("sx")){ + Intent intent = new Intent("android.intent.action.apkinstall"); + intent.putExtra("path",path); + intent.putExtra("commit_start", true); + MyApplication.getInstance().sendBroadcast(intent); + }else if(Constant.androidBoardType.equals("zc")){ + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.InstallApk(path,true); + }else if(Constant.androidBoardType.equals("nova")){ + MessageEvent messageEvent = new MessageEvent(Constant.NOVA_UPDATE_APP); + messageEvent.setData(path); + EventBus.getDefault().post(messageEvent); + }else if(Constant.androidBoardType.equals("huidu")){ + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); +// helper.install(path); + helper.installAndStart(path,"qianmu.container","qianmu.container.activity.H5.UpdateFileActivity"); + } + } catch (Throwable t) { + LoggerUtil.e("silentInstallApk", StringUtil.getThrowableStr(t)); + } + + } + + //静默卸载apk + public static void silentUninstallApk(String packageName) { + try { + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); +// signwayManager.unInstallClientapk(packageName); + } catch (Throwable t) { + LoggerUtil.e("silentUninstallApk", StringUtil.getThrowableStr(t)); + } + } + + //关闭第三方应用 + public static void killbackgroundapk(String packageName) { + execSuCmd(StringUtil.strSplice("am force-stop ", packageName)); + } + + + //设置定时关机时间 + public static void setPowerOffTime(String index, String year, String month, String day, String hourOfDay, String minute) { + try { + SignwayManager manager = SignwayManager.getInstance(MyApplication.getInstance()); + manager.setPowerOffTime(Integer.valueOf(index), Integer.valueOf(year), Integer.valueOf(month), + Integer.valueOf(day), Integer.valueOf(hourOfDay), Integer.valueOf(minute)); + } catch (Throwable t) { + LoggerUtil.e("setPowerOffTime", StringUtil.getThrowableStr(t)); + } + } + + //设置定时开机时间 + public static void setPowerOnTime(String index, String year, String month, String day, String hourOfDay, String minute) { + try { + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + signwayManager.setPowerOnTime(Integer.valueOf(index), Integer.valueOf(year), Integer.valueOf(month), + Integer.valueOf(day), Integer.valueOf(hourOfDay), Integer.valueOf(minute)); + } catch (Throwable t) { + LoggerUtil.e("setPowerOnTime", StringUtil.getThrowableStr(t)); + } + } + + + + /** + * 3588时间开机关机 + */ + public static void setPowerOnOffTimeWithWeekFor3588(int[] timeonArray,int[] timeoffArray) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); +// int[] timeoffArray = {2018, 1, 10, 20, 38}; +// int[] timeonArray = {2018, 1, 10, 20, 48}; + int[] weekdays = {1,1,1,1,1,1,1}; + clearPowerOnOffTime(); + manager.setPowerOnOffWithWeekly(timeonArray,timeoffArray,weekdays); + + } + + /** + * 3588时间开机关机 + */ + public static void setPowerOnOffTimeFor3588(int[] timeonArray,int[] timeoffArray) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); +// int[] timeoffArray = {2018, 1, 10, 20, 38}; +// int[] timeonArray = {2018, 1, 10, 20, 48}; + clearPowerOnOffTime(); + manager.setPowerOnOff(timeonArray,timeoffArray); + + } + + /** + * 3588时间开机关机 + */ + public static void setPowerOnOffTimeWithWeekFort982(int[] timeonArray,int[] timeoffArray) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); +// int[] timeoffArray = {2018, 1, 10, 20, 38}; +// int[] timeonArray = {2018, 1, 10, 20, 48}; + int[] weekdays = {1,1,1,1,1,1,1}; + clearPowerOnOffTime(); + manager.setPowerOnOffWithWeekly(timeonArray,timeoffArray,weekdays); + + } + + /** + * 按天设置定时开关机 + */ + public static void setPowerOnOffTimeFortYs(int[] timeoffArray , int[] timeonArray) { + try { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + LoggerUtil.e("TAG","设置了定时开关机:关机:"+GsonUtil.getGson().toJson(timeoffArray)+",开机:"+GsonUtil.getGson().toJson(timeonArray)); + clearPowerOnOffTime(); + manager.setPowerOnOff(timeonArray,timeoffArray); + }catch (Throwable t) { + LoggerUtil.e("setPowerOnOffTimeFortYs", StringUtil.getThrowableStr(t)); + } + } + + /** + * 视想 + * */ + public static void setPowerOnOffTimeFortSx(int[] timeonArray,int[] timeoffArray){ + try { + Intent intent = new Intent("android.intent.action.setpoweronoff"); +// int[] timeonArray = {2014,10,1, 8,30}; // +// int[] timeoffArray = {2014,9,1, 8,25}; // 下次开机具体日期时间,即在 2014/9/1 8:25 + intent.putExtra("timeon",timeonArray); + intent.putExtra("timeoff",timeoffArray); + intent.putExtra( "enable" ,true); // false, + MyApplication.getInstance().sendBroadcast(intent); + }catch (Throwable t){ + LoggerUtil.e("setPowerOnOffTimeFortSx", StringUtil.getThrowableStr(t)); + } + } + + /** + * 罗湖寻车机 + * 先调用此接口设置下一次开机时间 + * 然后调用关机接口,系统会关机并在指定的时间后自动开机(时间最小为60秒) + * */ + public static void setPowerOnOffTimeforHuidu(int seconds){ + try { + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); + helper.alarmPowerOn(seconds); + }catch (Throwable t){ + LoggerUtil.e("setPowerOnOffTimeforLHXCJ", StringUtil.getThrowableStr(t)); + } + } + + + /** + *清除定时开关机 + */ + public static void clearPowerOnOffTime() { + try{ + + if(Constant.androidBoardType.equals("xwst")){ + setPowerOffTime("1","1970","1","1","0","0"); + setPowerOnTime("1","1970","1","1","0","0"); + + }if(Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().TimerSwitch().clearTimerOnTime(); + SdkApi.getInstance().TimerSwitch().clearTimerOffTime(); + }else if(Constant.androidBoardType.equals("ys")){ + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager.clearPowerOnOffTime(); + }else if(Constant.androidBoardType.equals("sx")){ + Intent intent1 = new Intent("android.poweron.cancel"); + Intent intent2 = new Intent("android.poweroff.cancel"); + MyApplication.getInstance().sendBroadcast(intent1); + MyApplication.getInstance().sendBroadcast(intent2); + }else if(Constant.androidBoardType.equals("zc")){ + int[] timeoffArray = {1970, 1, 1, 0, 0}; + int[] timeonArray = {1970, 1, 1, 0, 0}; + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.setPowetOnOffTime(false,timeonArray,timeoffArray); + } + + }catch (Exception e){} + } + + //截屏 + public static void takeScreenshot(String path) { + try { + File file = new File(path); + File parent = file.getParentFile(); + if (!parent.exists()) parent.mkdirs(); + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + signwayManager.takeScreenshot(path, 0); + }else if(Constant.androidBoardType.equals("ys")){ + Log.e("TAG","开始截屏"); + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + boolean b = manager.takeScreenshot(path); + Log.e("TAG","截屏结果"+b); + } + + } catch (Throwable t) { + LoggerUtil.e("takeScreenshot", StringUtil.getThrowableStr(t)); + } + } + + //亿晟主板截屏 + public static boolean ysTakeScreenshot(String path) { + try { + File file = new File(path); + File parent = file.getParentFile(); + if (!parent.exists()) parent.mkdirs(); + Log.e("TAG","开始截屏"); + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + boolean b =manager.takeScreenshot(path); + Log.e("TAG","截屏结果:"+b); + return b; + } catch (Throwable t) { + LoggerUtil.e("takeScreenshot", StringUtil.getThrowableStr(t)); + return false; + } + } + + //显示或隐藏导航栏 + public static void hideStatusBar(boolean type) { + try { + if(Constant.androidBoardType.equals("xwst")){ + //true:显示 false:隐藏 + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + if (signwayManager != null) signwayManager.hideStatusBar(type); + + }if(Constant.androidBoardType.equals("xwst2")){ + //true:显示 false:隐藏 + SdkApi.getInstance().SystemCtrl().setStatusBarDisplay(type); + } else if(Constant.androidBoardType.equals("ys")){ + //true:隐藏 false:显示 + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager.hideNavBar(!type); + manager.hideStatusBar(type); + }else if(Constant.androidBoardType.equals("sx")){ + + Intent intent = new Intent("rk.android.remove_navigationbar"); + MyApplication.getInstance().sendBroadcast(intent); + }else if(Constant.androidBoardType.equals("zc")){ + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + zcApi.setStatusBar(type); + zcApi.setGestureStatusBar(type); + }else if(Constant.androidBoardType.equals("huidu")){ + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); +// helper.showNavigationBar(!type); + } + + } catch (Throwable t) { + LoggerUtil.e("hideStatusBar", StringUtil.getThrowableStr(t)); + } + } + + + //获取以太网MAC地址 + public static String getEthMacAddress() { + + try { + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + if (signwayManager != null) { + return signwayManager.getEthMacAddress(); + }else { + return ""; + } + }if(Constant.androidBoardType.equals("xwst2")){ + return SdkApi.getInstance().DeviceInfo().getEthMac(); + }else if(Constant.androidBoardType.equals("ys")){ + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + return manager.getEthMacAddress (); + }else if(Constant.androidBoardType.equals("sx")){ + return readEthMacAddress(); + }else if(Constant.androidBoardType.equals("zc")){ + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + return zcApi.getEthMacAddress("eth0"); + }if(Constant.androidBoardType.equals("nova")){ + return DeviceUtil.getLanMac(); +// return DeviceUtil.getMacFromHardware(); + } + else if(Constant.androidBoardType.equals("huidu")){ + + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); + if(!helper.getEthMac().isEmpty()){ + String ethMac = helper.getEthMac(); + LoggerUtil.e("getEthMacAddress", "mac:"+ethMac); + return helper.getEthMac(); + }else { + LoggerUtil.e("getEthMacAddress", "wifimac:" + helper.getWifiMac()); + return helper.getWifiMac(); + } + + } + else { + return DeviceUtil.getMacFromHardware(); + } + + } catch (Throwable t) { + LoggerUtil.e("getEthMacAddress", StringUtil.getThrowableStr(t)); + return ""; + } + } + + //视想设备,安卓12获取mac地址 + public static String readEthMacAddress() { + try { + return ParseFileAsString("/sys/class/net/eth0/address") + .toUpperCase().substring(0, 17); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + private static String ParseFileAsString(String filePath) + throws java.io.IOException { + StringBuffer fileData = new StringBuffer(1000); + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + char[] buf = new char[1024]; + int numRead = 0; + while ((numRead = reader.read(buf)) != -1) { + String readData = String.valueOf(buf, 0, numRead); + fileData.append(readData); + } + reader.close(); + return fileData.toString(); + } + + //获取设备型号 + public static String getgetAndroidModle() { + + try { + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + return signwayManager.getAndroidModel(); + }else if(Constant.androidBoardType.equals("ys")){ + String modle = MyManager.getInstance(MyApplication.getInstance()).getAndroidModle(); + return modle; + }else { + return ""; + } + + } catch (Throwable t) { + LoggerUtil.e("getgetAndroidModle", StringUtil.getThrowableStr(t)); + return ""; + } + } + + //获取设备型号 + public static String getAndroidModle() { + try { + if(Constant.androidBoardType.equals("xwst")){ + return "欣威视通"+Build.MODEL+",Android"+getAndroidVersion(); + }else if(Constant.androidBoardType.equals("ys")){ + return "亿晟"+Build.MODEL+",Android"+getAndroidVersion(); + }else if(Constant.androidBoardType.equals("sx")){ + return "视想"+Build.MODEL+",Android"+getAndroidVersion(); + }else if(Constant.androidBoardType.equals("zc")){ + return "卓策"+Build.MODEL+",Android"+getAndroidVersion(); + }else if(Constant.androidBoardType.equals("nova")){ + return "诺瓦"+Build.MODEL+",Android"+getAndroidVersion(); + }else if(Constant.androidBoardType.equals("huidu")){ + return "灰度"+Build.MODEL+",Android"+getAndroidVersion(); + }else { + return Build.MODEL+",Android"+getAndroidVersion(); + } + + } catch (Throwable t) { + LoggerUtil.e("getAndroidModle", StringUtil.getThrowableStr(t)); + return ""; + } + } + + //获取设备固件号 + public static String getFirmwareVersion() { + try { + return Build.VERSION.INCREMENTAL; + } catch (Throwable t) { + LoggerUtil.e("getFirmwareVersion", StringUtil.getThrowableStr(t)); + return ""; + } + } + + //获取设备固件号 + public static String getAndroidVersion() { + try { + return Build.VERSION.RELEASE; + } catch (Throwable t) { + LoggerUtil.e("getFirmwareVersion", StringUtil.getThrowableStr(t)); + return ""; + } + } + + /** + *设置系统时间 + */ + public static void setDeviceTime(Date date) { + try { + SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd:HH:mm:ss"); + String time = format.format(date); + String[] timesplit = time.split(":"); + if(Constant.androidBoardType.equals("xwst")){ + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + signwayManager.setTime(Integer.parseInt(timesplit[0]),Integer.parseInt(timesplit[1]),Integer.parseInt(timesplit[2]),Integer.parseInt(timesplit[3]),Integer.parseInt(timesplit[4])); + + }if(Constant.androidBoardType.equals("xwst2")){ + SdkApi.getInstance().SystemTime().setSystemTime(date.getTime()); + + }else if(Constant.androidBoardType.equals("ys")) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager. setTime (Integer.parseInt(timesplit[0]),Integer.parseInt(timesplit[1]),Integer.parseInt(timesplit[2]),Integer.parseInt(timesplit[3]),Integer.parseInt(timesplit[4]),Integer.parseInt(timesplit[5])); + }else if(Constant.androidBoardType.equals("zc")) { + zcapi zcApi=new zcapi(); + zcApi.getContext(MyApplication.getInstance()); + int[] newtime = {Integer.parseInt(timesplit[0]),Integer.parseInt(timesplit[1]),Integer.parseInt(timesplit[2]),Integer.parseInt(timesplit[3]),Integer.parseInt(timesplit[4]),Integer.parseInt(timesplit[5])}; + zcApi.setSystemTime(newtime); + }else if(Constant.androidBoardType.equals("sx")){ + Intent intent = new Intent("android.intent.action.settime"); +// int[] timeArray = {2014,10,1,8,30,0}; + int[] timeArray = {Integer.parseInt(timesplit[0]),Integer.parseInt(timesplit[1]),Integer.parseInt(timesplit[2]),Integer.parseInt(timesplit[3]),Integer.parseInt(timesplit[4]),Integer.parseInt(timesplit[5])}; + intent.putExtra("settime",timeArray); + intent.putExtra("enable" ,true); // + MyApplication.getInstance().sendBroadcast(intent); + }else if(Constant.androidBoardType.equals("huidu")){ + HuiduTech helper = new HuiduTech(MyApplication.getInstance()); + helper.setSystemTime(date.getTime()); + } + }catch (Exception e){} + + } + + //以Shell命令 + public static void execSuCmd(String cmd) { + try { + SignwayManager signwayManager = SignwayManager.getInstance(MyApplication.getInstance()); + signwayManager.execSuCmd(cmd); + } catch (Throwable t) { + LoggerUtil.e("execSuCmd", StringUtil.getThrowableStr(t)); + } + } + +} diff --git a/app/src/main/java/qianmu/container/util/StringUtil.java b/app/src/main/java/qianmu/container/util/StringUtil.java new file mode 100644 index 0000000..50ae023 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/StringUtil.java @@ -0,0 +1,66 @@ +package qianmu.container.util; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import qianmu.container.entity.Resp; + + +/** + * 字符串工具类 + * Created by genglaixin on 16/11/3. + */ +public class StringUtil { + + + //获取字符串 不存在返回"" + public static String getString(String str) { + return getString("", str); + } + + //获取字符串 不存在返回指定字符串 + public static String getString(String def, String str) { + return null == str ? def : str; + } + + //拼接字符串 + public static String strSplice(Object... strList) { + StringBuilder buffer = new StringBuilder(); + for (Object object : strList) buffer.append(object == null ? "" : String.valueOf(object)); + return buffer.toString(); + } + + public static boolean isEmpty(String str) { + if (null == str || "".equals(str)) return true; + return false; + } + + + public static String replace(String srt) { + return replace(srt, "\\\\", "/"); + } + + public static String replace(String source, String str, String target) { + return getString(source).replace(str, target) + .replace(str, target) + .replace(str, target); + } + + public static String getThrowableStr(Throwable t) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + return sw.toString(); + } + + public static boolean respIsEmpty(Resp resp) { + if (resp == null || "".equals(resp)) return true; + else return false; + } + + public static boolean respSuccess(Resp resp) { + if (respIsEmpty(resp)) return false; + if (resp.getCode()!=200) return false; + return true; + } +} diff --git a/app/src/main/java/qianmu/container/util/TimeUtil.java b/app/src/main/java/qianmu/container/util/TimeUtil.java new file mode 100644 index 0000000..960f8ba --- /dev/null +++ b/app/src/main/java/qianmu/container/util/TimeUtil.java @@ -0,0 +1,146 @@ +package qianmu.container.util; + +import android.net.ParseException; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2019/6/11 + * Time: 9:43 + */ +public class TimeUtil { + + public static String stampToDate(long s){ + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(s); + res = simpleDateFormat.format(date); + return res; + } + + public static String stampToDate2(long s){ + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd"); + Date date = new Date(s); + res = simpleDateFormat.format(date); + return res; + } + + public static String stampTotime(long s){ + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm"); + Date date = new Date(s); + res = simpleDateFormat.format(date); + return res; + } + + public static String getWeek2(String pTime){ + String week=""; + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + try { + c.setTime(format.parse(pTime)); + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + if (c.get(Calendar.DAY_OF_WEEK) == 1) { + week += "星期日"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 2) { + week += "星期一"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 3) { + week += "星期二"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 4) { + week += "星期三"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 5) { + week += "星期四"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 6) { + week += "星期五"; + } + if (c.get(Calendar.DAY_OF_WEEK) == 7) { + week += "星期六"; + } + return week; + } + + // string类型转换为long类型 + // strTime要转换的String类型的时间 + // formatType时间格式 + // strTime的时间格式和formatType的时间格式必须相同 + public static long stringToLong(String strTime, String formatType) + throws ParseException { + Date date = stringToDate(strTime, formatType); // String类型转成date类型 + if (date == null) { + return 0; + } else { + long currentTime = dateToLong(date); // date类型转成long类型 + return currentTime; + } + } + + + // string类型转换为date类型 + // strTime要转换的string类型的时间,formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 + // HH时mm分ss秒, + // strTime的时间格式必须要与formatType的时间格式相同 + public static Date stringToDate(String strTime, String formatType) + throws ParseException { + SimpleDateFormat formatter = new SimpleDateFormat(formatType); + Date date = null; + try { + date = formatter.parse(strTime); + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + return date; + } + + // date类型转换为long类型 + // date要转换的date类型的时间 + public static long dateToLong(Date date) { + return date.getTime(); + } + + + /** + * 字符串转成long + * */ + public static long pareTLong2(String time){ + SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd hh:mm"); + long s=0; + try { + s=sim.parse(time).getTime(); + } catch (java.text.ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return s; + } + + + /** + * 字符串转成long + * */ + public static long pareTLong(String time){ + SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + long s=0; + try { + s=sim.parse(time).getTime(); + } catch (java.text.ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return s; + } + + + +} diff --git a/app/src/main/java/qianmu/container/util/ToastUtils.java b/app/src/main/java/qianmu/container/util/ToastUtils.java new file mode 100644 index 0000000..4c27fad --- /dev/null +++ b/app/src/main/java/qianmu/container/util/ToastUtils.java @@ -0,0 +1,37 @@ +package qianmu.container.util; + +import android.view.Gravity; +import android.widget.Toast; + +import qianmu.container.app.MyApplication; + +public class ToastUtils { + + private static String oldMsg; + protected static Toast toast = null; + private static long oneTime = 0; + private static long twoTime = 0; + + public static void showToast(int resId) { + showToast(MyApplication.getInstance().getString(resId)); + } + + public static void showToast(String s) { + if (toast == null) { + toast = Toast.makeText(MyApplication.getInstance(), s, Toast.LENGTH_SHORT); + toast.setGravity(Gravity.CENTER, 0, 0); + toast.show(); + oneTime = System.currentTimeMillis(); + } else { + twoTime = System.currentTimeMillis(); + if (s.equals(oldMsg)) { + if (twoTime - oneTime > Toast.LENGTH_SHORT) toast.show(); + } else { + oldMsg = s; + toast.setText(s); + toast.show(); + } + } + oneTime = twoTime; + } +} diff --git a/app/src/main/java/qianmu/container/util/ViewUtil.java b/app/src/main/java/qianmu/container/util/ViewUtil.java new file mode 100644 index 0000000..d5baa62 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/ViewUtil.java @@ -0,0 +1,54 @@ +package qianmu.container.util; + +import android.util.Log; +import android.view.View; +import android.widget.RelativeLayout; + +import java.util.List; + +public class ViewUtil { + + public static void updateViewSize(View view, int width, int height) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); + if (params == null) params = new RelativeLayout.LayoutParams(width, height); + params.width = width; + params.height = height; + view.setLayoutParams(params); + } + + + public static void updateViewMargin(View view, int left, int top, int right, int bottom) { + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); + params.leftMargin = left; + params.topMargin = top; + params.rightMargin = right; + params.bottomMargin = bottom; + view.setLayoutParams(params); + } + + public static int[] getViewMargin(View view) { + int[] viewMargin = new int[4]; + RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams(); + if (params != null) viewMargin[0] = params.leftMargin; + if (params != null) viewMargin[1] = params.topMargin; + if (params != null) viewMargin[2] = params.rightMargin; + if (params != null) viewMargin[3] = params.bottomMargin; + return viewMargin; + } + + public static void updateViewListSize(List viewList, int width, int height) { + if (viewList == null) { + Log.e("updateViewSize", "viewList is null"); + return; + } + for (View view : viewList) updateViewSize(view, width, height); + } + + public static void updateViewListMargin(List viewList, int left, int top, int right, int bottom) { + if (viewList == null) { + Log.e("updateViewSize", "viewList is null"); + return; + } + for (View view : viewList) updateViewMargin(view, left, top, right, bottom); + } +} diff --git a/app/src/main/java/qianmu/container/util/ViplexCore.java b/app/src/main/java/qianmu/container/util/ViplexCore.java new file mode 100644 index 0000000..74876a0 --- /dev/null +++ b/app/src/main/java/qianmu/container/util/ViplexCore.java @@ -0,0 +1,272 @@ +package qianmu.container.util; + +import com.sun.jna.Callback; +import com.sun.jna.Library; + +public interface ViplexCore extends Library { + public interface CallBack extends Callback { + void dataCallBack(int code, String data); + } + + void nvSetDevLang(String devLang); + int nvInit(String sdkRootDir, String data); + void nvSearchTerminalAsync(CallBack callBack); + void nvSetPlatform(String platform); + void nvPingAsync(CallBack callBack); + void nvStopPublicNetAsync(CallBack callBack); + void nvFindAllTerminalsAsync(CallBack callBack); + void nvInitPublicNetAsync(String data, CallBack connectCallback, CallBack disconnectCallback); + void nvGetOnlineDevicesAsync(CallBack callback); + void nvPublicModuleUpdateOSUseOSSAsync(String data, CallBack callBack); + void nvStopUpdateFiterProgramAsync(String data, CallBack callBack); + void nvStopInterProgramAsync(String data, CallBack callBack); + void nvGetInterProgramInfoAsync(String data, CallBack callBack); + void nvStartTransferInterProgramAsync(String data, CallBack callBack); + void nvRsaDecodeAsync(String data, CallBack callBack); + void nvRsaEncodeAsync(String data, CallBack callBack); + void nvNewSetBindPlayerAsync(String data, CallBack callBack); + void nvSetScreenShotAsync(String data, CallBack callBack); + void nvGetWifiCurrentStatusAsync(String data, CallBack callBack); + void nvStartUploadApkAsync(String data, CallBack callBack); + void nvRebootAsync(String data, CallBack callBack); + void nvGetManualBrightnessFor0x99Async(String data, CallBack callBack); + void nvGetEnvironmentBrightnessParameterAsync(String data, CallBack callBack); + void nvSetEnvironmentBrightnessParameterAsync(String data, CallBack callBack); + void nvRegisterVnnox(String data, CallBack callBack); + void nvGetVerifyCode(String data, CallBack callBack); + void nvLoginVnnox(String data, CallBack callBack); + void nvGetScreenDeviceInfoAsync(String data, CallBack callBack); + void nvCancelFunctionAsync(String data, CallBack callBack); + void nvDownloadTerminalPlayLogAsync(String data, CallBack callBack); + void nvDownloadTerminalPlayLogNetAsync(String data, CallBack callBack); + void nvDownloadTerminalLogNetAsync(String data, CallBack callBack); + void nvDownloadTerminalAllLogAsync(String data, CallBack callBack); + void nvCheckNetworkAsync(String data, CallBack callBack); + void nvUploadTerminalLogAsync(String data, CallBack callBack); + void nvDownloadTerminalLogAsync(String data, CallBack callBack); + void nvGetTimeZoneAsync(String data, CallBack callBack); + void nvGetTokenAsync(String data, CallBack callBack); + void nvIsExistPlayerNameAsync(String data, CallBack callBack); + void nvGetPlayerIdentiferAsync(String data, CallBack callBack); + void nvIsCommonCloudAsync(String data, CallBack callBack); + void nvFinishDataAsync(String data, CallBack callBack); + void nvStartGetAvailableMemoryDataAsync(String data, CallBack callBack); + void nvUploadFeedBackFileStateAsync(String data, CallBack callBack); + void nvUploadFeedbackInfoAsync(String data, CallBack callBack); + void nvAddNodeServerInfoListAsync(String data, CallBack callBack); + void nvChangeNodeServerListAsync(String data, CallBack callBack); + void nvDeleteNodeServerListAsync(String data, CallBack callBack); + void nvAddNodeServerListAsync(String data, CallBack callBack); + void nvGetNodeServerListAsync(String data, CallBack callBack); + void nvSetAudioMedioProgramAsync(String data, CallBack callBack); + void nvGetFileMD5Async(String data, CallBack callBack); + void nvGetCustomerTplAsync(String data, CallBack callBack); + void nvStopProgramTransferAsync(String data, CallBack callBack); + void nvStartTransferProgramUseOSSAsync(String data, CallBack callBack); + void nvStartTransferProgramAsync(String data, CallBack callBack); + void nvDeleteProgramAsync(String data, CallBack callBack); + void nvGetProgramAsync(String data, CallBack callBack); + void nvDeleteTplAsync(String data, CallBack callBack); + void nvEditTplAsync(String data, CallBack callBack); + void nvAddTplAsync(String data, CallBack callBack); + void nvSetSystemTplInfoAsync(String data, CallBack callBack); + void nvMakeProgramToZipAsync(String data, CallBack callBack); + void nvMakeProgramAsync(String data, CallBack callBack); + void nvSetPageProgramsAsync(String data, CallBack callBack); + void nvSetPageProgramAsync(String data, CallBack callBack); + void nvCreateInterProgramAsync(String data, CallBack callBack); + void nvCreateProgramAsync(String data, CallBack callBack); + void nvQueryFileByTypeAsync(String data, CallBack callBack); + void nvDownLoadFilesAsync(String data, CallBack callBack); + void nvDataBaseMigrationAsync(String data, CallBack callBack); + void nvGetScreenUnitTempAsync(String data, CallBack callBack); + void nvSetTimeAndZoneAsync(String data, CallBack callBack); + void nvGetDisplayInfoAsync(String data, CallBack callBack); + void nvGetRotationAsync(String data, CallBack callBack); + void nvSetRotationAsync(String data, CallBack callBack); + void nvDownLoadScreenshotNetAsync(String data, CallBack callBack); + void nvDownLoadScreenshotAsync(String data, CallBack callBack); + void nvGetIsUseDayLightTimeAsync(String data, CallBack callBack); + void nvAddNetTimingInfoListAsync(String data, CallBack callBack); + void nvUpdateNetTimingInfoAsync(String data, CallBack callBack); + void nvDeleteNetTimingInfoAsync(String data, CallBack callBack); + void nvAddNetTimingInfoAsync(String data, CallBack callBack); + void nvGetNetTimingListInfoAsync(String data, CallBack callBack); + void nvSetNetTimingInfoAsync(String data, CallBack callBack); + void nvGetNetTimingInfoAsync(String data, CallBack callBack); + void nvCalibrateTimeAsync(String data, CallBack callBack); + void nvGetCurrentTimeAndZoneAsync(String data, CallBack callBack); + void nvGetPlayWindowSiteAsync(String data, CallBack callBack); + void nvSetPlayWindowSiteAsync(String data, CallBack callBack); + void nvGetMonitorInfoByReceiverIndexAsync(String data, CallBack callBack); + void nvGetReceiverCountAndInfoAsync(String data, CallBack callBack); + void nvGetSendCardMonitorInfoAsync(String data, CallBack callBack); + void nvGetAvailableMemoryAsync(String data, CallBack callBack); + void nvGetCPUTempAsync(String data, CallBack callBack); + void nvGetCPUUsageAsync(String data, CallBack callBack); + void nvGetAvailableStorageDataAsync(String data, CallBack callBack); + void nvGetBindPlayerAsync(String data, CallBack callBack); + void nvGetCloudPlayerListAsync(String data, CallBack callBack); + void nvSetBindPlayerAsync(String data, CallBack callBack); + void nvSetIcareConfigInfoAsync(String data, CallBack callBack); + void nvGetIcareConfigInfoAsync(String data, CallBack callBack); + void nvSetRecvCardFileAsync(String data, CallBack callBack); + void nvSendScreenScrAsync(String data, CallBack callBack); + void nvSetScreenAttributeAsync(String data, CallBack callBack); + void nvGetScreenAttributeAsync(String data, CallBack callBack); + void nvGetModuleInfoAsync(String data, CallBack callBack); + void nvSetWifiApStationSwitchAsync(String data, CallBack callBack); + void nvSetAPNetworkOpenStatusAsync(String data, CallBack callBack); + void nvGetAPNetworkOpenStatusAsync(String data, CallBack callBack); + void nvGet4GNetworkStatusAsync(String data, CallBack callBack); + void nvGetFlightModeAsync(String data, CallBack callBack); + void nvSetFlightModeAsync(String data, CallBack callBack); + void nvSetAPNInfoAsync(String data, CallBack callBack); + void nvGetAPNInfoAsync(String data, CallBack callBack); + void nvSetAPNetworkAsync(String data, CallBack callBack); + void nvGetAPNetworkAsync(String data, CallBack callBack); + void nvSetEthernetInfoAsync(String data, CallBack callBack); + void nvGetEthernetInfoAsync(String data, CallBack callBack); + void nvIsMobileModuleExistedAsync(String data, CallBack callBack); + void nvSetMobileNetworkAsync(String data, CallBack callBack); + void nvGetMobileNetworkAsync(String data, CallBack callBack); + void nvSendForgetWifiCommandAsync(String data, CallBack callBack); + void nvSetWifiEnabledAsync(String data, CallBack callBack); + void nvGetWifiEnabledAsync(String data, CallBack callBack); + void nvDisconnectWifiNetworkAsync(String data, CallBack callBack); + void nvConnectWifiNetworkAsync(String data, CallBack callBack); + void nvGetWifiListAsync(String data, CallBack callBack); + void nvUpdateVerifyAsync(String data, CallBack callBack); + void nvStopCurrentUpdateTaskAsync(String data, CallBack callBack); + void nvUpdateOSAsync(String data, CallBack callBack); + void nvUpdateAppAsync(String data, CallBack callBack); + void nvReadFileContentFromZipFileAsync(String data, CallBack callBack); + void nvStopDownloadUpgradeFileAsync(String data, CallBack callBack); + void nvDownloadUpgradeFileAsync(String data, CallBack callBack); + void nvGetOnlineUpgradeFileAsync(String data, CallBack callBack); + void nvQueryUpdateFileByTypeAsync(String data, CallBack callBack); + void nvDeleteCollectorAsync(String data, CallBack callBack); + void nvAddCollectorAsync(String data, CallBack callBack); + void nvGetPickerReceiverAsync(String data, CallBack callBack); + void nvSetCustomResolutionAsync(String data, CallBack callBack); + void nvSetHdmiOutputStatusAsync(String data, CallBack callBack); + void nvGetHdmiOutputStatusAsync(String data, CallBack callBack); + void nvSetReBootTaskAsync(String data, CallBack callBack); + void nvGetReBootTaskAsync(String data, CallBack callBack); + void nvGetSupportedResolutionAsync(String data, CallBack callBack); + void nvGetCurrentResolutionAsync(String data, CallBack callBack); + void nvSetCurrentResolutioAsync(String data, CallBack callBack); + void nvSetOTGUSBModeAsync(String data, CallBack callBack); + void nvGetOTGUSBModeAsync(String data, CallBack callBack); + void nvClearAllMediasAsync(String data, CallBack callBack); + void nvSetReBootWipeUserDataAsync(String data, CallBack callBack); + void nvGetSyncPlayAsync(String data, CallBack callBack); + void nvSetSyncPlayAsync(String data, CallBack callBack); + void nvStopPlayAsync(String data, CallBack callBack); + void nvResumePlayAsync(String data, CallBack callBack); + void nvPausePlayAsync(String data, CallBack callBack); + void nvStartPlayAsync(String data, CallBack callBack); + void nvDeletePlayListAsync(String data, CallBack callBack); + void nvGetProgramInfoAsync(String data, CallBack callBack); + void nvGetScreenPowerPolicyFor0x99Async(String data, CallBack callBack); + void nvGetScreenPowerManual0x99Async(String data, CallBack callBack); + void nvsetScreenPowerPolicy0x99Async(String data, CallBack callBack); + void nvsetScreenPowerManual0x99Async(String data, CallBack callBack); + void nvSetScreenPowerPolicyAsync(String data, CallBack callBack); + void nvGetScreenPowerPolicyAsync(String data, CallBack callBack); + void nvGetScreenPowerStateAsync(String data, CallBack callBack); + void nvSetScreenPowerStateAsync(String data, CallBack callBack); + void nvGetScreenPowerModeAsync(String data, CallBack callBack); + void nvSetScreenPowerModeAsync(String data, CallBack callBack); + void nvSetColorTemperatureAsync(String data, CallBack callBack); + void nvGetColorTemperatureAsync(String data, CallBack callBack); + void nvGetPolicyBrightnessFor0x99Async(String data, CallBack callBack); + void nvSetPolicyBrightnessFor0x99Async(String data, CallBack callBack); + void nvSetManualBrightnessFor0x99Async(String data, CallBack callBack); + void nvGetEnvironmentBrightnessAsync(String data, CallBack callBack); + void nvSetBrightnessPolicyAsync(String data, CallBack callBack); + void nvGetBrightnessPolicyAsync(String data, CallBack callBack); + void nvGetScreenBrightnessAsync(String data, CallBack callBack); + void nvSetScreenBrightnessAsync(String data, CallBack callBack); + void nvGetBrightnessAdjustModeAsync(String data, CallBack callBack); + void nvSetBrightnessAdjustModeAsync(String data, CallBack callBack); + void nvGetconfigurationAsync(String data, CallBack callBack); + void nvGetProductInfoAsync(String data, CallBack callBack); + void nvGetInstalledPackageVersionsAsync(String data, CallBack callBack); + void nvGetFirmwareInfosAsync(String data, CallBack callBack); + void nvLogoutAsync(String data, CallBack callBack); + void nvSetSystemInfoAsync(String data, CallBack callBack); + void nvSetTerminalInfoAsync(String data, CallBack callBack); + void nvGetTerminalInfoAsync(String data, CallBack callBack); + void nvSetScreenInfoAsync(String data, CallBack callBack); + void nvDelTerminalInfoAsync(String data, CallBack callBack); + void nvChangePassWordAsync(String data, CallBack callBack); + void nvLoginAsync(String data, CallBack callBack); + void nvSearchRangeIpAsync(String data, CallBack callBack); + void nvSearchAppointIpAsync(String data, CallBack callBack); + void nvGetUserInfoAsync(String data, CallBack callBack); + void nvSetUserInfoAsync(String data, CallBack callBack); + void nvSetVideoSourcePolicyFor0x99Async(String data, CallBack callBack); + void nvGetVideoSourcePolicyFor0x99Async(String data, CallBack callBack); + void nvSetVideoSourceManualFor0x99Async(String data, CallBack callBack); + void nvGetVideoSourceManualFor0x99Async(String data, CallBack callBack); + void nvGetVideoEDIDAsync(String data, CallBack callBack); + void nvSetVideoEDIDAsync(String data, CallBack callBack); + void nvSetVideoControlInfoAsync(String data, CallBack callBack); + void nvGetVideoControlInfoAsync(String data, CallBack callBack); + void nvSetRelayPowerStatusAsync(String data, CallBack callBack); + void nvGetRelayPowerStatusAsync(String data, CallBack callBack); + void nvGetRelayPowerPolicyAsync(String data, CallBack callBack); + void nvSetRelayPowerPolicyAsync(String data, CallBack callBack); + void nvSetRelayPowerManualAsync(String data, CallBack callBack); + void nvGetPowerModeAsync(String data, CallBack callBack); + void nvSetPowerModeAsync(String data, CallBack callBack); + void nvGetPowerInfoStatusAsync(String data, CallBack callBack); + void nvGetPowerInfoPolicyAsync(String data, CallBack callBack); + void nvSetPowerInfoPolicyAsync(String data, CallBack callBack); + void nvSetPowerInfoManualAsync(String data, CallBack callBack); + void nvGetLoraInfoAsync(String data, CallBack callBack); + void nvSetSupportSensorInfoAsync(String data, CallBack callBack); + void nvGetSupportSensorInfoAsync(String data, CallBack callBack); + void nvSetSpliceInfoAsync(String data, CallBack callBack); + void nvGetSpliceInfoAsync(String data, CallBack callBack); + void nvUpdateFontAsync(String data, CallBack callBack); + void nvDeleteFontAsync(String data, CallBack callBack); + void nvGetTerminalFontAsync(String data, CallBack callBack); + void nvGetPlaylogPathAsync(String data, CallBack callBack); + void nvStartUploadApkCoreAsync(String data, CallBack callBack); + void nvUninstallPackageAsync(String data, CallBack callBack); + void nvForceStopAppAsync(String data, CallBack callBack); + void nvGetRunningPackageInfoAsync(String data, CallBack callBack); + void nvGetInstalledPackageInfoAsync(String data, CallBack callBack); + void nvSetVPNConnectInfoAsync(String data, CallBack callBack); + void nvGetVPNConnectInfoAsync(String data, CallBack callBack); + void nvGetTimingVolumeFor0x99Async(String data, CallBack callBack); + void nvSetTimingVolumeFor0x99Async(String data, CallBack callBack); + void nvSetVolumeFor0x99Async(String data, CallBack callBack); + void nvGetVolumeFor0x99Async(String data, CallBack callBack); + void nvGetTimingVolumeAsync(String data, CallBack callBack); + void nvSetTimingVolumeAsync(String data, CallBack callBack); + void nvSetVolumeAsync(String data, CallBack callBack); + void nvGetVolumeAsync(String data, CallBack callBack); + void nvGetManualPowerSwitchStatusAsync(String data, CallBack callBack); + void nvSetManualPowerSwitchStatusAsync(String data, CallBack callBack); + void nvGetRealtimePowerSwitchStatusAsync(String data, CallBack callBack); + void nvGetTimingPowerSwitchStatusAsync(String data, CallBack callBack); + void nvSetTimingPowerSwitchStatusAsync(String data, CallBack callBack); + void nvGetPublicNetParamAsync(String data, CallBack callBack); + void nvDisconnectPublicNetAsync(String data, CallBack callBack); + void nvSetPublicNetConfigParamAsync(String data, CallBack callBack); + + + void nvGetFileFromTerminalAsync(String data, CallBack callBack); + void nvPPTProgramPageTurnAsync(String data, CallBack callBack); + void nvProgramRenameAsync(String data, CallBack callBack); + void nvVedioFastForwardAsync(String data, CallBack callBack); + void nvGetProgramPageDurationAsync(String data, CallBack callBack); + void nvGetHDMIEncryptedInfoAsync(String data, CallBack callBack); + void nvGetSpotInspectionInfoAsync(String data, CallBack callBack); + + +} + diff --git a/app/src/main/java/qianmu/container/view/AutoScrollTextView.java b/app/src/main/java/qianmu/container/view/AutoScrollTextView.java new file mode 100644 index 0000000..47246f8 --- /dev/null +++ b/app/src/main/java/qianmu/container/view/AutoScrollTextView.java @@ -0,0 +1,244 @@ +package qianmu.container.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Display; +import android.view.View; +import android.view.WindowManager; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/4/28 + * Time: 19:20 + */ +public class AutoScrollTextView extends androidx.appcompat.widget.AppCompatTextView implements View.OnClickListener { + + public final static String TAG = AutoScrollTextView.class.getSimpleName(); + + private float textLength = 0f;//文本长度 + private float speed = 1f;//文本长度 + private float viewWidth = 0f; + private float step = 0f;//文字的横坐标 + private float step1 = 0f;//文字的横坐标 + + boolean firstText = true; + boolean secondText = false; + private float y = 0f;//文字的纵坐标 + private float temp_view_plus_text_length = 0.0f;//用于计算的临时变量 + private float temp_view_plus_two_text_length = 0.0f;//用于计算的临时变量 + public boolean isStarting = false;//是否开始滚动 + private Paint paint = null;//绘图样式 + private String text = "";//文本内容 + + + public AutoScrollTextView(Context context) { + super(context); + initView(); + } + + public AutoScrollTextView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + + public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initView(); + } + + + private void initView() + { + setOnClickListener(this); + } + + + public void init(int width) + { + paint = getPaint(); + text = getText().toString(); + textLength = paint.measureText(text); + viewWidth = getWidth(); + + if(viewWidth == 0) + { + viewWidth = width; +// if(windowManager != null) +// { +// Display display = windowManager.getDefaultDisplay(); +//// viewWidth = display.getWidth(); +// viewWidth = width; +// } + } + + if(!text.isEmpty()){ + String text1 = text; + if(textLength < viewWidth){ + Log.e("TAG",text1); + int numb =(int) (viewWidth/textLength) ; + for(int i=0;i CREATOR + = new Creator() { + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + }; + + private SavedState(Parcel in) { + super(in); + boolean[] b = null; + in.readBooleanArray(b); + if(b != null && b.length > 0) + isStarting = b[0]; + step = in.readFloat(); + } + } + + + public void startScroll() + { + isStarting = true; + invalidate(); + } + + + public void stopScroll() + { + isStarting = false; + invalidate(); + } + + + public void setSpeed(float newspeed){ + speed=newspeed; + } + + public void setTextColor1(String corlor){ + paint.setColor(Color.parseColor(corlor)); + + } + + @Override + public void onDraw(Canvas canvas) { + canvas.drawText(text, temp_view_plus_text_length - step, y, paint); +// Log.e("TAG","第一个"); + step += speed;//0.5为文字滚动速度。 + + if(!isStarting) + { + return; + } + + if(step > temp_view_plus_two_text_length) { +// Log.e("TAG","1跑完了"); + firstText = false; + } + + if(step > textLength * 2+140 && secondText == false){ + step1 = textLength; + } + + if(step > textLength * 2+140 ||secondText == true){ +// Log.e("TAG","2"); + + canvas.drawText(text, temp_view_plus_text_length - step1, y, paint); + step1 += speed;//0.5为文字滚动速度。 + secondText = true; + + if(step1> textLength * 2+140 && firstText==false){ + step = textLength; + firstText= true; + } + + } + + if(step1 > temp_view_plus_two_text_length) { +// Log.e("TAG","2个跑完了"); + secondText = false; + } + + + invalidate(); + + } + + @Override + public void onClick(View v) { + if(isStarting) + stopScroll(); + else + startScroll(); + + } +} diff --git a/app/src/main/java/qianmu/container/view/CustomerVideoView.java b/app/src/main/java/qianmu/container/view/CustomerVideoView.java new file mode 100644 index 0000000..8bc2bcc --- /dev/null +++ b/app/src/main/java/qianmu/container/view/CustomerVideoView.java @@ -0,0 +1,35 @@ +package qianmu.container.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.VideoView; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/5/19 + * Time: 13:59 + */ + public class CustomerVideoView extends VideoView { + + public CustomerVideoView(Context context) { + super(context); + } + + public CustomerVideoView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CustomerVideoView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // 其实就是在这里做了一些处理。 + int width = getDefaultSize(0, widthMeasureSpec); + int height = getDefaultSize(0, heightMeasureSpec); + setMeasuredDimension(width, height); + } + +} diff --git a/app/src/main/java/qianmu/container/view/MarqueeTextView.java b/app/src/main/java/qianmu/container/view/MarqueeTextView.java new file mode 100644 index 0000000..add94c0 --- /dev/null +++ b/app/src/main/java/qianmu/container/view/MarqueeTextView.java @@ -0,0 +1,30 @@ +package qianmu.container.view; + +import android.content.Context; +import android.text.TextUtils; +import android.util.AttributeSet; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/12/10 + * Time: 18:57 + */ +public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView { + public MarqueeTextView(Context con) { + super(con); + } + + public MarqueeTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean isFocused() { + return true; + } +} diff --git a/app/src/main/java/qianmu/container/view/MarqueeTextView2.java b/app/src/main/java/qianmu/container/view/MarqueeTextView2.java new file mode 100644 index 0000000..7bc291b --- /dev/null +++ b/app/src/main/java/qianmu/container/view/MarqueeTextView2.java @@ -0,0 +1,111 @@ +package qianmu.container.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.widget.TextView; + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/7/21 + * Time: 18:54 + * 公共设施文字 + */ +public class MarqueeTextView2 extends TextView { + + + /** 是否停止滚动 */ + private boolean mStopMarquee; + private String mText; + private int textsize; + private int width; + private int height; + private float mCoordinateX; + private float mTextWidth; + public MarqueeTextView2(Context context) { + super(context); + } + public MarqueeTextView2(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setTextinfo(String text,int textsize ,int width,int height) { + this.mText = text; + this.textsize=textsize; + this.width=width; + this.height=height; + + mTextWidth = getPaint().measureText(mText); + if(mTextWidth<=width){ + mCoordinateX=(width-mTextWidth)/2; + return; + } + if (mHandler.hasMessages(0)) + mHandler.removeMessages(0); + mHandler.sendEmptyMessageDelayed(0, 2000); + } + + public void setTextinfo(String text) { + this.mText = text; + + mTextWidth = getPaint().measureText(mText); + if(mTextWidth<=width){ + mCoordinateX=(width-mTextWidth)/2; + return; + } + if (mHandler.hasMessages(0)) + mHandler.removeMessages(0); + mHandler.sendEmptyMessageDelayed(0, 2000); + } + + @Override + protected void onAttachedToWindow() { + mStopMarquee = false; + if (mText!=null&&!mText.isEmpty()) + mHandler.sendEmptyMessageDelayed(0, 2000); + super.onAttachedToWindow(); + } + + @Override + protected void onDetachedFromWindow() { + mStopMarquee = true; + if (mHandler.hasMessages(0)) + mHandler.removeMessages(0); + super.onDetachedFromWindow(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mText!=null&&!mText.isEmpty()) + canvas.drawText(mText, mCoordinateX, height/2+textsize/2, getPaint()); + } + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case 0: + if (Math.abs(mCoordinateX) > (mTextWidth + 50)) { + mCoordinateX = 0; + invalidate(); + if (!mStopMarquee) { + sendEmptyMessageDelayed(0, 2000); + } + } else { + mCoordinateX -= 1; + invalidate(); + if (!mStopMarquee) { + sendEmptyMessageDelayed(0, 30); + } + } + + break; + } + super.handleMessage(msg); + } + }; +} diff --git a/app/src/main/java/qianmu/container/view/MyImageView.java b/app/src/main/java/qianmu/container/view/MyImageView.java new file mode 100644 index 0000000..070b8e2 --- /dev/null +++ b/app/src/main/java/qianmu/container/view/MyImageView.java @@ -0,0 +1,39 @@ +package qianmu.container.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.util.Log; + +import androidx.appcompat.widget.AppCompatImageView; + + +/** + * Created by Android Studio. + * User: linzhibin + * Date: 2021/7/6 + * Time: 20:34 + */ +public class MyImageView extends AppCompatImageView { + + public MyImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public MyImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyImageView(Context context) { + super(context); + } + + @Override + protected void onDraw(Canvas canvas) { + try { + super.onDraw(canvas); + } catch (Exception e) { + Log.i(MyImageView.class.getSimpleName(), "Catch Canvas: trying to use a recycled bitmap"); + } + } +} diff --git a/app/src/main/java/qianmu/container/view/QMImageView.java b/app/src/main/java/qianmu/container/view/QMImageView.java new file mode 100644 index 0000000..7c88b5e --- /dev/null +++ b/app/src/main/java/qianmu/container/view/QMImageView.java @@ -0,0 +1,189 @@ +package qianmu.container.view; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; + +public class QMImageView extends AppCompatImageView { + //当前位置 + int currentWidth, currentHeight, currentMosaic1, currentMosaic2; + + //马赛克状态下 每个方格的宽高 + static final int tempWidth = 30; + static final int tempHeight = 30; + + //渐入时的透明度 + float currentAlpha; + + Paint paint = new Paint(); + + //动画效果:马赛克、上下滑动、左右滑动、随机、无 + public enum Type {MOSAIC, TOP, LEFT, RANDOM, GRADUALLY_IN, DEFAULT} + + //默认无动效模式 + Type currentType = Type.MOSAIC; + + + Bitmap behindBitmap = null, frontBitmap = null; + + public QMImageView(Context context) { + this(context, null); + } + + public QMImageView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public QMImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + paint.setAlpha(255); + if (frontBitmap == null) return; + + if (behindBitmap != null) { + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(behindBitmap, rect, rect, paint); + } + + + //根据动画类型绘制 前景图片 + if (currentType == Type.DEFAULT) drawDefault(canvas, paint); + else if (currentType == Type.MOSAIC) drawMosaic(canvas, paint); + else if (currentType == Type.LEFT) drawTranslateX(canvas, paint); + else if (currentType == Type.TOP) drawTranslateY(canvas, paint); + else if (currentType == Type.GRADUALLY_IN) drawGraduallyIn(canvas, paint); + } + + //无动画 + private void drawDefault(Canvas canvas, Paint paint) { + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(frontBitmap, rect, rect, paint); + } + + //马赛克动画 + private void drawMosaic(Canvas canvas, Paint paint) { + int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), paint, Canvas.ALL_SAVE_FLAG); + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(frontBitmap, rect, rect, paint); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + + for (int i = 0; i < getWidth() / tempWidth; i++) { + for (int j = 0; j < getHeight() / tempHeight; j++) { + if ((i + j) % 2 == 0) { + canvas.drawRect(i * tempWidth + currentMosaic1, j * tempHeight, (i + 1) * tempWidth, (j + 1) * tempHeight, paint); + } else { + canvas.drawRect(i * tempWidth + currentMosaic2, j * tempHeight, (i + 1) * tempWidth, (j + 1) * tempHeight, paint); + } + } + } + paint.setXfermode(null); + canvas.restoreToCount(layerId); + + if (currentMosaic1 < tempWidth) currentMosaic1 += 3; + else if (currentMosaic2 < tempWidth) currentMosaic2 += 3; + else { + currentMosaic1 = 0; + currentMosaic2 = 0; + return; + } + invalidate(); + } + + + //左右滑动动画 + private void drawTranslateX(Canvas canvas, Paint paint) { + int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), paint, Canvas.ALL_SAVE_FLAG); + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(frontBitmap, rect, rect, paint); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + canvas.drawRect(currentWidth, 0, getWidth(), getHeight(), paint); + paint.setXfermode(null); + canvas.restoreToCount(layerId); + if (currentWidth <= getWidth()) currentWidth += getWidth() / 20; + else { + currentWidth = 0; + return; + } + invalidate(); + } + + //上下滑动动画 + private void drawTranslateY(Canvas canvas, Paint paint) { + int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), paint, Canvas.ALL_SAVE_FLAG); + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(frontBitmap, rect, rect, paint); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + canvas.drawRect(0, currentHeight, getWidth(), getHeight(), paint); + paint.setXfermode(null); + canvas.restoreToCount(layerId); + if (currentHeight <= getHeight()) currentHeight += getHeight() / 20; + else { + currentHeight = 0; + return; + } + invalidate(); + } + + //渐入动画 修改透明度 + private void drawGraduallyIn(Canvas canvas, Paint paint) { + paint.setAlpha((int) currentAlpha); + Rect rect = new Rect(0, 0, getWidth(), getHeight()); + canvas.drawBitmap(frontBitmap, rect, rect, paint); + if (currentAlpha < 255) currentAlpha += 15; + else if (currentAlpha > 255) currentAlpha = 255; + else if (currentAlpha == 255) { + currentAlpha = 0; + return; + } + invalidate(); + } + + //设置动画类型 随机就默认选择一种 + public void setAnimType(Type type) { + if (type == Type.RANDOM) { + double result = Math.random(); + if (result < 0.25) currentType = Type.MOSAIC; + else if (result >= 0.25 && result < 0.5) currentType = Type.TOP; + else if (result >= 0.5 && result < 0.75) currentType = Type.LEFT; + else currentType = Type.GRADUALLY_IN; + } else currentType = type; + } + + public void setFrontBitmap(Bitmap bitmap) { + behindBitmap = frontBitmap; + frontBitmap = bitmap; + } + + + @Override + public void setImageBitmap(Bitmap bm) { + if (bm != null) setFrontBitmap(null); + super.setImageBitmap(bm); + } + + @Override + public void setImageDrawable(@Nullable Drawable drawable) { + if (drawable != null) { + int width = drawable.getIntrinsicWidth(); + int height = drawable.getIntrinsicWidth(); + if (width != -1 && height != -1) setFrontBitmap(null); + } + super.setImageDrawable(drawable); + + } +} + + diff --git a/app/src/main/java/qianmu/container/view/SubtitleView.java b/app/src/main/java/qianmu/container/view/SubtitleView.java new file mode 100644 index 0000000..2c94a40 --- /dev/null +++ b/app/src/main/java/qianmu/container/view/SubtitleView.java @@ -0,0 +1,262 @@ +package qianmu.container.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.util.AttributeSet; +import android.util.DisplayMetrics; + +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; + +import qianmu.container.app.MyApplication; +import qianmu.container.data.ScreenSaverData; +import qianmu.container.entity.Subtitle; +import qianmu.container.util.LoggerUtil; +import qianmu.container.util.StringUtil; + +public class SubtitleView extends SurfaceView implements SurfaceHolder.Callback, Runnable { + + List topSubtitleList = new ArrayList<>(); + List bottomSubtitleList = new ArrayList<>(); + + int topPosition = 0; + int bottomPosition = 0; + + private SurfaceHolder holder; + private Canvas canvas; + private boolean isDrawing; + private Paint paint; + private int windowWidth; + private int windowHeight; + int topBaselineX; + int bottomBaselineX; + + int temp = 50; + + Subtitle topSubtitle; + Subtitle bottomSubtitle; + + static final int TOTAL_COUNT = 10; + int topCount = TOTAL_COUNT; + int bottomCount = TOTAL_COUNT; + + public SubtitleView(Context context) { + this(context, null); + } + + public SubtitleView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SubtitleView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + //导航栏高度 + int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); + int navH = context.getResources().getDimensionPixelSize(resourceId); + DisplayMetrics dm = this.getContext().getResources().getDisplayMetrics(); + windowWidth = dm.widthPixels; + windowHeight = dm.heightPixels+navH; + topBaselineX = windowWidth; + bottomBaselineX = windowWidth; + initView(); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + isDrawing = true; + Executors.newSingleThreadExecutor().execute(this); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + isDrawing = false; + } + + private void initView() { + setZOrderOnTop(true); + holder = getHolder(); + holder.setFormat(PixelFormat.TRANSLUCENT); + holder.addCallback(this); + setFocusable(true); + setFocusableInTouchMode(true); + this.setKeepScreenOn(true); + //初始化画布 + paint = new Paint(); + paint.setTextSize(100); + paint.setAntiAlias(true); + getTopData(); + getBottomData(); + } + + @Override + public void run() { + while (isDrawing) { + try { + long start = System.currentTimeMillis(); + draw(); + long end = System.currentTimeMillis(); + if (end - start >= temp) continue; + Thread.sleep(temp - (end - start)); + } catch (Throwable t) { + LoggerUtil.e("run", StringUtil.getThrowableStr(t)); + } + } + } + + private void draw() { + try { + canvas = holder.lockCanvas(); + if (canvas == null) return; + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + drawTopSubTitle(); + drawBottomSubtitle(); + } catch (Throwable t) { + LoggerUtil.e("draw", StringUtil.getThrowableStr(t)); + } finally { + //判断画布是否为空,从而避免黑屏情况 + if (canvas != null) holder.unlockCanvasAndPost(canvas); + } + } + + private void drawTopSubTitle() { + //数据为空 获取下一个 + if (topSubtitle == null) { + if (topCount <= 0) getTopData(); + else topCount--; + return; + } + //字幕属性 + String text = StringUtil.getString(topSubtitle.getNewsText()); + String fontColor = StringUtil.getString(topSubtitle.getFontColor()); + int fontSize = topSubtitle.getFontSize(); + //更新文本大小 + paint.setTextSize(fontSize); + //获取文本信息 + Paint.FontMetrics fontMetrics = paint.getFontMetrics(); + float top = fontMetrics.top; + float bottom = fontMetrics.bottom; + float textWidth = paint.measureText(text); + + //文本长度为0 不进行绘制 + if (textWidth == 0) { + if (topCount <= 0) getTopData(); + else topCount--; + return; + } + + //基准线 + int baselineY = (int) -top; + //绘制背景颜色 + paint.setColor(Color.parseColor("#aa000000")); + canvas.drawRect(0, baselineY + top, windowWidth, bottom + baselineY, paint); + //绘制文本 + try { + paint.setColor(Color.parseColor(fontColor)); + } catch (Throwable t) { + paint.setColor(Color.parseColor("#FFFFFF")); + } + canvas.drawText(text, topBaselineX, baselineY, paint); + + if (-topBaselineX > textWidth) { + getTopData(); + topBaselineX = windowWidth; + } else topBaselineX -= 1; + } + + private void drawBottomSubtitle() { + //数据为空 获取下一个 + if (bottomSubtitle == null) { + if (bottomCount <= 0) getBottomData(); + else bottomCount--; + return; + } + //字幕属性 + String text = StringUtil.getString(bottomSubtitle.getNewsText()); + String fontColor = StringUtil.getString(bottomSubtitle.getFontColor()); + int fontSize = bottomSubtitle.getFontSize(); + //更新文本大小 + paint.setTextSize(fontSize); + Paint.FontMetrics fontMetrics = paint.getFontMetrics(); + float top = fontMetrics.top; + float bottom = fontMetrics.bottom; + float textWidth = paint.measureText(text); + + //文本长度为0 不进行绘制 + if (textWidth == 0) { + if (bottomCount <= 0) getBottomData(); + else bottomCount--; + return; + } + + int baselineY = (int) (windowHeight - bottom); + + paint.setColor(Color.parseColor("#aa000000")); + canvas.drawRect(0, baselineY + top, windowWidth, windowHeight, paint); + try { + paint.setColor(Color.parseColor(fontColor)); + } catch (Throwable t) { + paint.setColor(Color.parseColor("#FFFFFF")); + } + canvas.drawText(text, bottomBaselineX, baselineY, paint); + + if (-bottomBaselineX > textWidth) { + getBottomData(); + bottomBaselineX = windowWidth; + } else bottomBaselineX -= 1; + } + + private void getTopData() { + topCount = TOTAL_COUNT; + if (topPosition >= topSubtitleList.size()) { + topSubtitleList = ScreenSaverData.getSubtitleList(ScreenSaverData.TOP); + if (topPosition >= topSubtitleList.size()) topPosition = 0; + } + topSubtitle = getData(topSubtitleList, topPosition); + topPosition++; + } + + private void getBottomData() { + bottomCount = TOTAL_COUNT; + if (bottomPosition >= bottomSubtitleList.size()) { + bottomSubtitleList = ScreenSaverData.getSubtitleList(ScreenSaverData.FOOT); + if (bottomPosition >= bottomSubtitleList.size()) bottomPosition = 0; + } + bottomSubtitle = getData(bottomSubtitleList, bottomPosition); + bottomPosition++; + } + + private Subtitle getData(List subtitleList, int position) { + try { + if (subtitleList == null || subtitleList.size() == 0) return null; + if (position >= subtitleList.size()) return null; + Subtitle subtitle = subtitleList.get(position); + if (subtitle == null) return null; + String beginTime = subtitle.getStartTime(); + String endTime = subtitle.getEndTime(); + + long currentTimeMillis = System.currentTimeMillis(); + String date = MyApplication.getInstance().dateFormat.format(currentTimeMillis); + String time = MyApplication.getInstance().timeFormat.format(currentTimeMillis); + String currentTime = StringUtil.strSplice(date, " ", time); + if (beginTime.compareTo(currentTime) > 0) return null; + if (endTime.compareTo(currentTime) < 0) return null; + return subtitle; + } catch (Throwable t) { + LoggerUtil.e("getData", StringUtil.getThrowableStr(t)); + return null; + } + } +} diff --git a/app/src/main/java/qianmu/container/view/ViewHolder.java b/app/src/main/java/qianmu/container/view/ViewHolder.java new file mode 100644 index 0000000..08ca9a4 --- /dev/null +++ b/app/src/main/java/qianmu/container/view/ViewHolder.java @@ -0,0 +1,11 @@ +package qianmu.container.view; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +public class ViewHolder extends RecyclerView.ViewHolder { + public ViewHolder(View itemView) { + super(itemView); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-mdpi/ic_menu.png b/app/src/main/res/drawable-mdpi/ic_menu.png new file mode 100644 index 0000000..a0bee5a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_menu.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..cc14f03 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_keyboard.xml b/app/src/main/res/drawable/bt_keyboard.xml new file mode 100644 index 0000000..5882976 --- /dev/null +++ b/app/src/main/res/drawable/bt_keyboard.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a4f78de --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/icon_close.png b/app/src/main/res/drawable/icon_close.png new file mode 100644 index 0000000..905b963 Binary files /dev/null and b/app/src/main/res/drawable/icon_close.png differ diff --git a/app/src/main/res/drawable/shape_corner50.xml b/app/src/main/res/drawable/shape_corner50.xml new file mode 100644 index 0000000..0b02ff5 --- /dev/null +++ b/app/src/main/res/drawable/shape_corner50.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_corner51.xml b/app/src/main/res/drawable/shape_corner51.xml new file mode 100644 index 0000000..17ebd27 --- /dev/null +++ b/app/src/main/res/drawable/shape_corner51.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_key1.xml b/app/src/main/res/drawable/shape_key1.xml new file mode 100644 index 0000000..ac21a87 --- /dev/null +++ b/app/src/main/res/drawable/shape_key1.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/shape_key2.xml b/app/src/main/res/drawable/shape_key2.xml new file mode 100644 index 0000000..53a2533 --- /dev/null +++ b/app/src/main/res/drawable/shape_key2.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/weather_after_aqi.png b/app/src/main/res/drawable/weather_after_aqi.png new file mode 100644 index 0000000..8819b85 Binary files /dev/null and b/app/src/main/res/drawable/weather_after_aqi.png differ diff --git a/app/src/main/res/drawable/weather_after_hum.png b/app/src/main/res/drawable/weather_after_hum.png new file mode 100644 index 0000000..0b90eb6 Binary files /dev/null and b/app/src/main/res/drawable/weather_after_hum.png differ diff --git a/app/src/main/res/drawable/weather_after_pm25.png b/app/src/main/res/drawable/weather_after_pm25.png new file mode 100644 index 0000000..098b29f Binary files /dev/null and b/app/src/main/res/drawable/weather_after_pm25.png differ diff --git a/app/src/main/res/drawable/weather_after_weather.png b/app/src/main/res/drawable/weather_after_weather.png new file mode 100644 index 0000000..f533ce7 Binary files /dev/null and b/app/src/main/res/drawable/weather_after_weather.png differ diff --git a/app/src/main/res/drawable/weather_aqi.png b/app/src/main/res/drawable/weather_aqi.png new file mode 100644 index 0000000..18ef1cd Binary files /dev/null and b/app/src/main/res/drawable/weather_aqi.png differ diff --git a/app/src/main/res/drawable/weather_cloud.png b/app/src/main/res/drawable/weather_cloud.png new file mode 100644 index 0000000..bb5dd80 Binary files /dev/null and b/app/src/main/res/drawable/weather_cloud.png differ diff --git a/app/src/main/res/drawable/weather_fen.png b/app/src/main/res/drawable/weather_fen.png new file mode 100644 index 0000000..c7ae708 Binary files /dev/null and b/app/src/main/res/drawable/weather_fen.png differ diff --git a/app/src/main/res/drawable/weather_humidity.png b/app/src/main/res/drawable/weather_humidity.png new file mode 100644 index 0000000..293de7a Binary files /dev/null and b/app/src/main/res/drawable/weather_humidity.png differ diff --git a/app/src/main/res/drawable/weather_pm25.png b/app/src/main/res/drawable/weather_pm25.png new file mode 100644 index 0000000..ab40ee6 Binary files /dev/null and b/app/src/main/res/drawable/weather_pm25.png differ diff --git a/app/src/main/res/drawable/weather_rian.png b/app/src/main/res/drawable/weather_rian.png new file mode 100644 index 0000000..609a715 Binary files /dev/null and b/app/src/main/res/drawable/weather_rian.png differ diff --git a/app/src/main/res/drawable/weather_snow.png b/app/src/main/res/drawable/weather_snow.png new file mode 100644 index 0000000..129a5cc Binary files /dev/null and b/app/src/main/res/drawable/weather_snow.png differ diff --git a/app/src/main/res/drawable/weather_sum.png b/app/src/main/res/drawable/weather_sum.png new file mode 100644 index 0000000..557af5e Binary files /dev/null and b/app/src/main/res/drawable/weather_sum.png differ diff --git a/app/src/main/res/drawable/weather_yin.png b/app/src/main/res/drawable/weather_yin.png new file mode 100644 index 0000000..898a552 Binary files /dev/null and b/app/src/main/res/drawable/weather_yin.png differ diff --git a/app/src/main/res/layout/activity_device_info.xml b/app/src/main/res/layout/activity_device_info.xml new file mode 100644 index 0000000..55132f9 --- /dev/null +++ b/app/src/main/res/layout/activity_device_info.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +