├── .gitignore ├── .idea ├── .name ├── codeStyles │ └── Project.xml ├── compiler.xml ├── dictionaries │ └── xiaoqi.xml ├── gradle.xml ├── jarRepositories.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── LICENSE ├── README.md ├── WBackup.jks ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wwxiaoqi │ │ └── wechat_backup │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── backup.sh │ │ └── recovery.sh │ ├── java │ │ └── com │ │ │ └── wwxiaoqi │ │ │ └── wechat_backup │ │ │ ├── MainActivity.kt │ │ │ ├── base │ │ │ └── AppConst.kt │ │ │ ├── thread │ │ │ ├── BackupThread.kt │ │ │ └── RestoreThread.kt │ │ │ ├── utils │ │ │ ├── AppUtils.kt │ │ │ ├── CloseUtils.kt │ │ │ ├── DialogUtil.kt │ │ │ ├── FileUtils.kt │ │ │ ├── PermissionUtils.kt │ │ │ ├── ShellUtils.kt │ │ │ ├── TimeUtils.kt │ │ │ └── ToastUtils.kt │ │ │ └── widget │ │ │ └── FilletButtonWidget.kt │ └── res │ │ ├── layout │ │ ├── activity_home.xml │ │ └── widget_button_view.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-ldpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── raw │ │ └── animation.json │ │ ├── values-zh │ │ └── strings.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── wwxiaoqi │ └── wechat_backup │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle ├── signing.gradle └── signing.properties /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | 16 | /app/release -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | WeChat_Backup -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 20 | 21 | 22 | 23 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | xmlns:android 32 | 33 | ^$ 34 | 35 | 36 | 37 |
38 |
39 | 40 | 41 | 42 | xmlns:.* 43 | 44 | ^$ 45 | 46 | 47 | BY_NAME 48 | 49 |
50 |
51 | 52 | 53 | 54 | .*:id 55 | 56 | http://schemas.android.com/apk/res/android 57 | 58 | 59 | 60 |
61 |
62 | 63 | 64 | 65 | .*:name 66 | 67 | http://schemas.android.com/apk/res/android 68 | 69 | 70 | 71 |
72 |
73 | 74 | 75 | 76 | name 77 | 78 | ^$ 79 | 80 | 81 | 82 |
83 |
84 | 85 | 86 | 87 | style 88 | 89 | ^$ 90 | 91 | 92 | 93 |
94 |
95 | 96 | 97 | 98 | .* 99 | 100 | ^$ 101 | 102 | 103 | BY_NAME 104 | 105 |
106 |
107 | 108 | 109 | 110 | .* 111 | 112 | http://schemas.android.com/apk/res/android 113 | 114 | 115 | ANDROID_ATTRIBUTE_ORDER 116 | 117 |
118 |
119 | 120 | 121 | 122 | .* 123 | 124 | .* 125 | 126 | 127 | BY_NAME 128 | 129 |
130 |
131 |
132 |
133 |
134 |
-------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/dictionaries/xiaoqi.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | wechat 5 | wwxiaoqi 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WeChat_Backup 2 | 用于备份&还原微信的数据 3 | 4 | 这是一个 Root 才可以使用的软件,它可以备份和还原微信的数据 5 | 6 | 备份包含以下内容: 7 | 8 | 1. 图片 9 | 2. 语音 10 | 3. 视频 11 | 4. 下载文件 12 | 13 | 脚本作者是 #by:酷安@搓澡君 14 | 我只是做了个封装 15 | 16 | ## 我的备份数据在哪 17 | 它们在你的文件管理下的 `WeChat_backup` 文件夹里面 18 | 19 | ## 如何使用 20 | 你可以先到 `Releases` 下载 APK,打开点击「备份」就会自动备份了。 21 | 点击「恢复」按钮并选择对应的数据包,稍等片刻,你的微信数据又回来了。 22 | 23 | ## 使用许可 24 | 25 | ![](https://img.shields.io/badge/license-Apache-blue) 26 | -------------------------------------------------------------------------------- /WBackup.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/WBackup.jks -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | apply from: '../signing.gradle' 5 | 6 | android { 7 | compileSdkVersion 30 8 | buildToolsVersion "30.0.3" 9 | 10 | defaultConfig { 11 | applicationId "com.wwxiaoqi.wechat_backup" 12 | minSdkVersion 19 13 | targetSdkVersion 30 14 | versionCode 1 15 | versionName "1.1" 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | debug { 21 | applicationIdSuffix '.debug' 22 | } 23 | release { 24 | minifyEnabled true 25 | shrinkResources true 26 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 27 | signingConfig signingConfigs.release 28 | } 29 | } 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_1_8 32 | targetCompatibility JavaVersion.VERSION_1_8 33 | } 34 | } 35 | 36 | repositories { 37 | mavenCentral() 38 | } 39 | 40 | dependencies { 41 | implementation fileTree(dir: "libs", include: ["*.jar"]) 42 | implementation group: 'commons-io', name: 'commons-io', version: '2.8.0' 43 | implementation 'androidx.appcompat:appcompat:1.3.0' 44 | implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 45 | implementation "androidx.core:core-ktx:1.5.0" 46 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 47 | implementation 'com.airbnb.android:lottie:3.4.4' 48 | implementation 'androidx.cardview:cardview:1.0.0' 49 | testImplementation 'junit:junit:4.13.1' 50 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 51 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 52 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | 23 | -optimizationpasses 5 24 | -dontusemixedcaseclassnames 25 | -dontskipnonpubliclibraryclasses 26 | -dontskipnonpubliclibraryclassmembers 27 | -dontoptimize 28 | -dontpreverify 29 | -ignorewarnings 30 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 31 | -keepattributes *Annotation* 32 | -keepattributes Signature 33 | -keepattributes SourceFile,LineNumberTable 34 | -allowaccessmodification 35 | -repackageclasses '' 36 | -verbose 37 | 38 | -keep public class * extends android.app.Activity 39 | -keep public class * extends android.app.Application 40 | -keep public class * extends android.app.Service 41 | -keep public class * extends android.content.BroadcastReceiver 42 | -keep public class * extends android.content.ContentProvider 43 | -keep public class * extends android.app.backup.BackupAgentHelper 44 | -keep public class * extends android.preference.Preference 45 | -keep public class * extends android.view.View 46 | 47 | -assumenosideeffects class android.util.Log { 48 | public static boolean isLoggable(java.lang.String, int); 49 | public static int v(...); 50 | public static int i(...); 51 | public static int w(...); 52 | public static int d(...); 53 | public static int e(...); 54 | } 55 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wwxiaoqi/wechat_backup/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | assertEquals("com.wwxiaoqi.wechat_backup", appContext.getPackageName()); 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/assets/backup.sh: -------------------------------------------------------------------------------- 1 | #备份(本地版) 2 | #备份路径为/storage/emulated/0/WeChat_backup/ 3 | 4 | ###################配置区################### 5 | 6 | 7 | 8 | need_pictures="1" #备份图片开关,1为开启,0为关闭 9 | need_voice="1" #备份语音开关,1为开启,0为关闭 10 | need_video="1" #备份视频开关,1为开启,0为关闭 11 | need_files="1" #备份下载文件开关,1为开启,0为关闭 12 | 13 | 14 | delete_day="0" #自动删除x天前备份数据的开关,0为关闭 15 | 16 | 17 | 18 | ############################################ 19 | 20 | 21 | 22 | #by:酷安@搓澡君 23 | 24 | 25 | 26 | ############################################ 27 | 28 | rm -rf /storage/emulated/0/WeChat_tmp/ 29 | mkdir /storage/emulated/0/WeChat_tmp/ 30 | 31 | if [ ! -d "/storage/emulated/0/WeChat_backup" ]; then 32 | mkdir /storage/emulated/0/WeChat_backup 33 | fi 34 | 35 | 36 | cut_string(){ 37 | all_string=$1 38 | all_string=`echo $all_string | sed s/[[:space:]]//g ` 39 | first_string=$2 40 | first_cut=${all_string#*$first_string} 41 | second_string=$3 42 | second_string_position=`awk -v a="$first_cut" -v b="$second_string" 'BEGIN{print index(a,b)}'` 43 | second_string_position=$(($second_string_position-1)) 44 | final_string=${first_cut: 0 : second_string_position } 45 | echo $final_string 46 | } 47 | 48 | echo "开始备份……" 49 | am force-stop com.tencent.mm 50 | 51 | rm -rf /storage/emulated/0/WeChat_tmp/backup 52 | mkdir /storage/emulated/0/WeChat_tmp/backup 53 | 54 | echo "备份聊天记录中…" 55 | dir_all=$(ls "/data/data/com.tencent.mm/MicroMsg/") 56 | for dir_i in $dir_all 57 | do 58 | 59 | if (( ${#dir_i} > 30 )) && (( ${#dir_i} < 34 ));then 60 | dir_cut=$(ls "/data/data/com.tencent.mm/MicroMsg/${dir_i}") 61 | for dir_name in $dir_cut 62 | do 63 | if [[ $dir_name == *"EnMicroMsg2"* ]];then 64 | rm -f /data/data/com.tencent.mm/MicroMsg/${dir_i}/${dir_name} 65 | elif [[ $dir_name == *"EnMicroMsg"* ]];then 66 | if [ ! -d /storage/emulated/0/WeChat_tmp/backup/$dir_i ];then 67 | mkdir /storage/emulated/0/WeChat_tmp/backup/$dir_i 68 | fi 69 | cp -rf /data/data/com.tencent.mm/MicroMsg/${dir_i}/${dir_name} /storage/emulated/0/WeChat_tmp/backup/$dir_i 70 | fi 71 | 72 | 73 | if (( need_pictures == 1 ));then 74 | if [[ $dir_name == *"image2"* ]];then 75 | echo "备份data/data/微信图片中…" 76 | cp -rLf /data/data/com.tencent.mm/MicroMsg/${dir_i}/${dir_name} /storage/emulated/0/WeChat_tmp/backup/ 77 | echo "备份data/data/微信图片完成!" 78 | fi 79 | fi 80 | done 81 | 82 | fi 83 | done 84 | 85 | 86 | 87 | 88 | storage_dir_all=$(ls "/storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/") 89 | for storage_dir_i in $storage_dir_all 90 | do 91 | 92 | if (( ${#storage_dir_i} > 30 )) && (( ${#storage_dir_i} < 34 ));then 93 | storage_dir_cut=$(ls "/storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}") 94 | for storage_dir_name in $storage_dir_cut 95 | do 96 | if (( need_pictures == 1 ));then 97 | if [[ $storage_dir_name == *"image2"* ]];then 98 | echo "备份/Android/data/微信图片中…" 99 | cp -rLf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/${storage_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 100 | echo "备份/Android/data/微信图片完成!" 101 | fi 102 | fi 103 | 104 | if (( need_voice == 1 ));then 105 | if [[ $storage_dir_name == *"voice2"* ]];then 106 | echo "备份/Android/data/微信语音中…" 107 | cp -rLf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/${storage_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 108 | echo "备份/Android/data/微信语音完成!" 109 | fi 110 | fi 111 | 112 | if (( need_video == 1 ));then 113 | if [[ $storage_dir_name == *"video"* ]];then 114 | echo "备份/Android/data/微信视频中…" 115 | cp -rLf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/${storage_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 116 | echo "备份/Android/data/微信视频完成!" 117 | fi 118 | fi 119 | done 120 | 121 | fi 122 | done 123 | 124 | 125 | 126 | tencent="tencent" 127 | if [ ! -d /storage/emulated/0/tencent ];then 128 | tencent="Tencent" 129 | fi 130 | 131 | if [ -d /storage/emulated/0/${tencent}/MicroMsg/ ];then 132 | tencent_dir_all=$(ls "/storage/emulated/0/${tencent}/MicroMsg/") 133 | for tencent_dir_i in $tencent_dir_all 134 | do 135 | 136 | if (( ${#tencent_dir_i} > 30 )) && (( ${#tencent_dir_i} < 34 ));then 137 | tencent_dir_cut=$(ls "/storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}") 138 | for tencent_dir_name in $tencent_dir_cut 139 | do 140 | if (( need_pictures == 1 ));then 141 | if [[ $tencent_dir_name == *"image2"* ]];then 142 | echo "备份/${tencent}/微信图片中…" 143 | cp -rLf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/${tencent_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 144 | echo "备份/${tencent}/微信图片完成!" 145 | fi 146 | fi 147 | 148 | if (( need_voice == 1 ));then 149 | if [[ $tencent_dir_name == *"voice2"* ]];then 150 | echo "备份/${tencent}/微信语音中…" 151 | cp -rLf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/${tencent_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 152 | echo "备份/${tencent}/微信语音完成!" 153 | fi 154 | fi 155 | 156 | if (( need_video == 1 ));then 157 | if [[ $tencent_dir_name == *"video"* ]];then 158 | echo "备份/${tencent}/微信视频中…" 159 | cp -rLf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/${tencent_dir_name} /storage/emulated/0/WeChat_tmp/backup/ 160 | echo "备份/${tencent}/微信视频完成!" 161 | fi 162 | fi 163 | done 164 | 165 | fi 166 | done 167 | fi 168 | 169 | 170 | 171 | if (( need_files == 1 ));then 172 | echo "备份下载的文件中…" 173 | if [ -d /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/Download ];then 174 | cp -rLf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/Download /storage/emulated/0/WeChat_tmp/backup 175 | fi 176 | if [ -d /storage/emulated/0/tencent/MicroMsg/Download ];then 177 | cp -rLf /storage/emulated/0/tencent/MicroMsg/Download /storage/emulated/0/WeChat_tmp/backup 178 | fi 179 | echo "备份下载的文件完成" 180 | fi 181 | 182 | if [ -e /data/data/com.tencent.mm/files/KeyInfo.bin ];then 183 | cp -f /data/data/com.tencent.mm/files/KeyInfo.bin /storage/emulated/0/WeChat_tmp/backup 184 | echo "获取跨设备恢复关键文件成功!" 185 | else 186 | echo "获取跨设备恢复关键文件失败!可能导致数据包无法跨设备恢复!" 187 | fi 188 | 189 | if [ -d /storage/emulated/0/WeChat_tmp/backup/video ];then 190 | video_dir=$(ls "/storage/emulated/0/WeChat_tmp/backup/video") 191 | for video_dir_i in $video_dir 192 | do 193 | if [[ $video_dir_i == *".tmp"* ]];then 194 | rm -f /storage/emulated/0/WeChat_tmp/backup/video/${video_dir_i} 195 | fi 196 | done 197 | fi 198 | 199 | time2=$(date "+%Y%m%d") 200 | cd /storage/emulated/0/WeChat_tmp/ && tar -cf ${time2}.tar ./backup/* 201 | mv /storage/emulated/0/WeChat_tmp/${time2}.tar /storage/emulated/0/WeChat_backup/ 202 | echo "微信数据打包完成" 203 | 204 | if (( $delete_day > 0 ));then 205 | echo "开始删除${delete_day}天前的备份文件" 206 | check_file_name='.tar' 207 | 208 | file_date=$(ls "/storage/emulated/0/WeChat_backup/") 209 | 210 | for file_name in $file_date 211 | do 212 | if [[ $file_name == *$check_file_name* ]];then 213 | file_name_date=${file_name: 0 : 8 } 214 | file_date=$(($time2-$file_name_date)) 215 | if [[ $file_date -ge $delete_day ]];then 216 | rm -f /storage/emulated/0/WeChat_backup/${file_name} 217 | fi 218 | fi 219 | done 220 | echo "删除${delete_day}天前的备份文件完成!" 221 | fi 222 | 223 | rm -rf /storage/emulated/0/WeChat_tmp/ 224 | echo "备份全部完成啦!!!" -------------------------------------------------------------------------------- /app/src/main/assets/recovery.sh: -------------------------------------------------------------------------------- 1 | #恢复(本地版) 2 | #路径/storage/emulated/0/WeChat_backup/ 3 | 4 | ###################配置区################### 5 | 6 | 7 | 8 | recovery_date="20201011" #需要恢复数据的日期,格式"年月日" 9 | 10 | 11 | 12 | ############################################ 13 | 14 | 15 | 16 | #by:酷安@搓澡君 17 | 18 | 19 | 20 | ############################################ 21 | 22 | rm -rf /storage/emulated/0/WeChat_tmp/ 23 | mkdir /storage/emulated/0/WeChat_tmp/ 24 | 25 | cut_string(){ 26 | all_string=$1 27 | all_string=`echo $all_string | sed s/[[:space:]]//g ` 28 | first_string=$2 29 | first_cut=${all_string#*$first_string} 30 | second_string=$3 31 | second_string_position=`awk -v a="$first_cut" -v b="$second_string" 'BEGIN{print index(a,b)}'` 32 | second_string_position=$(($second_string_position-1)) 33 | final_string=${first_cut: 0 : second_string_position } 34 | echo $final_string 35 | } 36 | 37 | echo "开始恢复……" 38 | am force-stop com.tencent.mm 39 | cp /storage/emulated/0/WeChat_backup/${recovery_date}.tar /storage/emulated/0/WeChat_tmp/ 40 | cd /storage/emulated/0/WeChat_tmp/ && tar -xf ${recovery_date}.tar >> /dev/null 2>&1 41 | 42 | if [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 43 | wechat_versioncode=`pm dump com.tencent.mm | grep "versionCode"` 44 | wechat_versioncode=`echo $wechat_versioncode | sed s/[[:space:]]//g ` 45 | wechat_versioncode=${wechat_versioncode: 12 : 4 } 46 | echo "微信版本号为${wechat_versioncode}" 47 | if (( $wechat_versioncode > 1681 ));then 48 | echo "微信版本大于7.0.15,将采用新版图片恢复方案~" 49 | else 50 | echo "微信版本小于或等于7.0.15,将采用旧版图片恢复方案~" 51 | fi 52 | fi 53 | 54 | tencent="tencent" 55 | if [ ! -d /storage/emulated/0/tencent ];then 56 | tencent="Tencent" 57 | fi 58 | if [ ! -d "/storage/emulated/0/Android/data/com.tencent.mm/MicroMsg" ]; then 59 | mkdir /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg 60 | fi 61 | if [ ! -d "/storage/emulated/0/${tencent}/MicroMsg" ]; then 62 | mkdir /storage/emulated/0/${tencent}/MicroMsg 63 | fi 64 | recovery_dir_all=$(ls "/storage/emulated/0/WeChat_tmp/backup/") 65 | data_dir_all=$(ls "/data/data/com.tencent.mm/MicroMsg/") 66 | for recovery_dir_i in $recovery_dir_all 67 | do 68 | if (( ${#recovery_dir_i} > 30 )) && (( ${#recovery_dir_i} < 34 ));then 69 | echo "恢复文字聊天记录中…" 70 | cp -rf /storage/emulated/0/WeChat_tmp/backup/${recovery_dir_i}/* /data/data/com.tencent.mm/MicroMsg/${recovery_dir_i}/ 71 | echo "恢复文字聊天记录完成!" 72 | fi 73 | done 74 | 75 | for data_dir_i in $data_dir_all 76 | do 77 | if (( ${#data_dir_i} > 30 )) && (( ${#data_dir_i} < 34 ));then 78 | data_dir_cut=$(ls "/data/data/com.tencent.mm/MicroMsg/${data_dir_i}") 79 | for data_dir_cut_i in $data_dir_cut 80 | do 81 | if [[ $data_dir_cut_i == *"EnMicroMsg2"* ]];then 82 | rm -f /data/data/com.tencent.mm/MicroMsg/${data_dir_i}/${data_dir_cut_i} 83 | elif [[ $data_dir_cut_i == *"EnMicroMsg"* ]];then 84 | chmod 0777 /data/data/com.tencent.mm/MicroMsg/${data_dir_i}/${data_dir_cut_i} 85 | fi 86 | done 87 | fi 88 | done 89 | 90 | storage_dir_all=$(ls "/storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/") 91 | for storage_dir_i in $storage_dir_all 92 | do 93 | if (( ${#storage_dir_i} > 30 )) && (( ${#storage_dir_i} < 34 ));then 94 | storage_str=${storage_dir_i} 95 | break 96 | fi 97 | done 98 | 99 | tencent_dir_all=$(ls "/storage/emulated/0/${tencent}/MicroMsg/") 100 | if [[ $storage_str == "" ]];then 101 | in_android="0" 102 | for tencent_dir_i in $tencent_dir_all 103 | do 104 | if (( ${#tencent_dir_i} > 30 )) && (( ${#tencent_dir_i} < 34 ));then 105 | storage_str=${tencent_dir_i} 106 | break 107 | fi 108 | done 109 | 110 | fi 111 | 112 | 113 | for storage_dir_i in $storage_dir_all 114 | do 115 | if (( ${#storage_dir_i} > 30 )) && (( ${#storage_dir_i} < 34 ));then 116 | if [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 117 | rm -rf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/image2 118 | fi 119 | if [ -d /storage/emulated/0/WeChat_tmp/backup/voice2 ];then 120 | rm -rf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/voice2 121 | fi 122 | if [ -d /storage/emulated/0/WeChat_tmp/backup/video ];then 123 | rm -rf /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/video 124 | fi 125 | fi 126 | done 127 | 128 | for tencent_dir_i in $tencent_dir_all 129 | do 130 | if (( ${#tencent_dir_i} > 30 )) && (( ${#tencent_dir_i} < 34 ));then 131 | if [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 132 | rm -rf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/image2 133 | fi 134 | if [ -d /storage/emulated/0/WeChat_tmp/backup/voice2 ];then 135 | rm -rf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/voice2 136 | fi 137 | if [ -d /storage/emulated/0/WeChat_tmp/backup/video ];then 138 | rm -rf /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/video 139 | fi 140 | fi 141 | done 142 | 143 | for data_dir_i in $data_dir_all 144 | do 145 | if (( ${#data_dir_i} > 30 )) && (( ${#data_dir_i} < 34 ));then 146 | if [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 147 | rm -rf /data/data/com.tencent.mm/MicroMsg/${data_dir_i}/image2 148 | fi 149 | fi 150 | done 151 | 152 | 153 | if [[ ${in_android} == 0 ]];then 154 | storage_path="/storage/emulated/0/${tencent}/MicroMsg/${storage_str}/" 155 | else 156 | storage_path="/storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_str}/" 157 | fi 158 | 159 | if [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 160 | echo "恢复图片中…" 161 | cp -rf /storage/emulated/0/WeChat_tmp/backup/image2 ${storage_path} 162 | echo "恢复图片成功!" 163 | fi 164 | if [ -d /storage/emulated/0/WeChat_tmp/backup/voice2 ];then 165 | echo "恢复语音中…" 166 | cp -rf /storage/emulated/0/WeChat_tmp/backup/voice2 ${storage_path} 167 | echo "恢复语音成功!" 168 | fi 169 | if [ -d /storage/emulated/0/WeChat_tmp/backup/video ];then 170 | echo "恢复视频中…" 171 | cp -rf /storage/emulated/0/WeChat_tmp/backup/video ${storage_path} 172 | echo "恢复视频成功!" 173 | fi 174 | 175 | 176 | if [[ $wechat_versioncode > 1681 ]] && [ -d /storage/emulated/0/WeChat_tmp/backup/image2 ];then 177 | for recovery_dir_i in $recovery_dir_all 178 | do 179 | if (( ${#recovery_dir_i} > 30 )) && (( ${#recovery_dir_i} < 34 ));then 180 | if [ -d ${storage_path}/image2 ];then 181 | echo "恢复图片到data/data/中…" 182 | ln -s ${storage_path}/image2 /data/data/com.tencent.mm/MicroMsg/${recovery_dir_i}/ 183 | echo "恢复图片到data/data成功!" 184 | fi 185 | fi 186 | done 187 | fi 188 | 189 | for storage_dir_i in $storage_dir_all 190 | do 191 | if (( ${#storage_dir_i} > 30 )) && [[ ${storage_dir_i} != ${storage_str} ]] && (( ${#storage_dir_i} < 34 ));then 192 | if [ -d ${storage_path}/image2 ];then 193 | echo "恢复图片到/Android/data中…" 194 | ln -s ${storage_path}/image2 /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/ 195 | echo "恢复图片到/Android/data成功!" 196 | fi 197 | if [ -d ${storage_path}/voice2 ];then 198 | echo "恢复语音到/Android/data中…" 199 | ln -s ${storage_path}/voice2 /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/ 200 | echo "恢复语音到/Android/data成功!" 201 | fi 202 | if [ -d ${storage_path}/video ];then 203 | echo "恢复视频到/Android/data中…" 204 | ln -s ${storage_path}/video /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/${storage_dir_i}/ 205 | echo "恢复视频到/Android/data成功!" 206 | fi 207 | fi 208 | done 209 | 210 | for tencent_dir_i in $tencent_dir_all 211 | do 212 | if (( ${#tencent_dir_i} > 30 )) && [[ ${tencent_dir_i} != ${storage_str} ]] && (( ${#tencent_dir_i} < 34 ));then 213 | if [ -d ${storage_path}/image2 ];then 214 | echo "恢复图片到/${tencent}中…" 215 | ln -s ${storage_path}/image2 /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/ 216 | echo "恢复图片到/${tencent}成功!" 217 | fi 218 | if [ -d ${storage_path}/voice2 ];then 219 | echo "恢复语音到/${tencent}中…" 220 | ln -s ${storage_path}/voice2 /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/ 221 | echo "恢复语音到/${tencent}成功!" 222 | fi 223 | if [ -d ${storage_path}/video ];then 224 | echo "恢复视频到/${tencent}中…" 225 | ln -s ${storage_path}/video /storage/emulated/0/${tencent}/MicroMsg/${tencent_dir_i}/ 226 | echo "恢复视频到/${tencent}成功!" 227 | fi 228 | fi 229 | done 230 | 231 | if [[ -d /storage/emulated/0/WeChat_tmp/backup/Download ]];then 232 | echo "恢复下载的文件中…" 233 | cp -rf /storage/emulated/0/WeChat_tmp/backup/Download /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/ 234 | if [[ -d /storage/emulated/0/${tencent}/MicroMsg/Download ]];then 235 | cp -rLf /storage/emulated/0/${tencent}/MicroMsg/Download /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/ >> /dev/null 2>&1 236 | rm -rf /storage/emulated/0/${tencent}/MicroMsg/Download 237 | fi 238 | ln -s /storage/emulated/0/Android/data/com.tencent.mm/MicroMsg/Download /storage/emulated/0/${tencent}/MicroMsg/ 239 | echo "下载的文件恢复完成" 240 | fi 241 | 242 | if [ -e /storage/emulated/0/WeChat_tmp/backup/KeyInfo.bin ];then 243 | cp -f /storage/emulated/0/WeChat_tmp/backup/KeyInfo.bin /data/data/com.tencent.mm/files/ 244 | chmod 0777 /data/data/com.tencent.mm/files/KeyInfo.bin 245 | echo "恢复跨设备恢复关键文件成功!" 246 | else 247 | echo "恢复跨设备恢复关键文件失败!可能会导致无法恢复聊天记录!" 248 | fi 249 | 250 | rm -rf /storage/emulated/0/WeChat_tmp/ 251 | echo "恢复全部完成啦!!!" -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup 2 | 3 | import android.annotation.SuppressLint 4 | import android.app.AlertDialog 5 | import android.content.DialogInterface 6 | import android.os.Bundle 7 | import android.os.Handler 8 | import android.os.Message 9 | import android.view.View 10 | import android.widget.Toast 11 | import androidx.appcompat.app.AppCompatActivity 12 | import com.wwxiaoqi.wechat_backup.base.AppConst 13 | import com.wwxiaoqi.wechat_backup.thread.BackupThread 14 | import com.wwxiaoqi.wechat_backup.thread.RestoreThread 15 | import com.wwxiaoqi.wechat_backup.utils.AppUtils.isFirstRunApp 16 | import com.wwxiaoqi.wechat_backup.utils.DialogUtil 17 | import com.wwxiaoqi.wechat_backup.utils.FileUtils 18 | import com.wwxiaoqi.wechat_backup.utils.FileUtils.copyAssetManagerFiles 19 | import com.wwxiaoqi.wechat_backup.utils.FileUtils.getFileSort 20 | import com.wwxiaoqi.wechat_backup.utils.FileUtils.replaceFileStr 21 | import com.wwxiaoqi.wechat_backup.utils.PermissionUtils.verifyStoragePermissions 22 | import com.wwxiaoqi.wechat_backup.utils.TimeUtils 23 | import com.wwxiaoqi.wechat_backup.utils.ToastUtils 24 | 25 | class MainActivity : AppCompatActivity(), View.OnClickListener { 26 | 27 | @SuppressLint("HandlerLeak") 28 | private val timeHandler: Handler = object : Handler() { 29 | override fun handleMessage(msg: Message) { 30 | super.handleMessage(msg) 31 | runDialog() 32 | } 33 | } 34 | 35 | override fun onCreate(savedInstanceState: Bundle?) { 36 | super.onCreate(savedInstanceState) 37 | setContentView(R.layout.activity_home) 38 | init() 39 | initPermission() 40 | initView() 41 | } 42 | 43 | private fun init() { 44 | if (isFirstRunApp(this)) { 45 | copyAssetManagerFiles(assets, filesDir, "backup.sh") 46 | copyAssetManagerFiles(assets, filesDir, "recovery.sh") 47 | } 48 | } 49 | 50 | private fun initPermission() { 51 | verifyStoragePermissions(this) 52 | } 53 | 54 | private fun initView() { 55 | findViewById(R.id.btn_backup).setOnClickListener(this) 56 | findViewById(R.id.btn_restore).setOnClickListener(this) 57 | } 58 | 59 | override fun onClick(view: View) { 60 | when (view.id) { 61 | R.id.btn_backup -> runBackup() 62 | R.id.btn_restore -> runRestore() 63 | } 64 | } 65 | 66 | private fun runDialog() { 67 | val stringBuffer: StringBuffer = StringBuffer() 68 | stringBuffer.append(AppConst.WECHAT_BACKUP_PATH) 69 | stringBuffer.append(TimeUtils.dataTime) 70 | stringBuffer.append(AppConst.WECHAT_BACKUP_EXTENSION_NAME) 71 | 72 | // if (FileUtils.fileIsExists(this, stringBuffer.toString())) { 73 | // ToastUtils.show(this, getString(R.string.success_prompt)) 74 | // DialogUtil.dismiss() 75 | // return 76 | // } 77 | // ToastUtils.show(this, getString(R.string.error_prompt)) 78 | 79 | // 很奇怪的现象 80 | ToastUtils.show(this, getString(R.string.success_prompt)) 81 | DialogUtil.dismiss() 82 | } 83 | 84 | private fun runRestore() { 85 | val list = getFileSort(AppConst.WECHAT_BACKUP_PATH) 86 | val array = arrayOfNulls(list.size) 87 | 88 | for ((index, value) in list.withIndex()) { 89 | array[index] = value.name 90 | } 91 | 92 | val builder = AlertDialog.Builder(this) 93 | builder.setItems(array) { _: DialogInterface?, which: Int -> 94 | var options = array[which] 95 | options = options!!.replace(AppConst.WECHAT_BACKUP_EXTENSION_NAME, "") 96 | replaceFileStr( 97 | "$filesDir/recovery.sh", 98 | "recovery_date=\"(.*)\"", 99 | "recovery_date=\"$options\"" 100 | ) 101 | DialogUtil.showLoadingDialog(this, null, getString(R.string.prompt), false) 102 | val restoreThread = RestoreThread(filesDir, timeHandler) 103 | restoreThread.start() 104 | } 105 | builder.show() 106 | } 107 | 108 | private fun runBackup() { 109 | DialogUtil.showLoadingDialog(this, null, getString(R.string.prompt), false) 110 | val backupThread = BackupThread(filesDir, timeHandler) 111 | backupThread.start() 112 | } 113 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/base/AppConst.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.base 2 | 3 | /** 4 | * 常量 5 | */ 6 | object AppConst { 7 | var WECHAT_BACKUP_EXTENSION_NAME = ".tar" 8 | 9 | var WECHAT_BACKUP_PATH = "/storage/emulated/0/WeChat_backup/" 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/thread/BackupThread.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.thread 2 | 3 | import android.os.Handler 4 | import android.os.Message 5 | import com.wwxiaoqi.wechat_backup.utils.ShellUtils 6 | import java.io.File 7 | 8 | class BackupThread( 9 | private val fileDir: File, 10 | private val timeHandler: Handler 11 | ) : Thread() { 12 | override fun run() { 13 | try { 14 | Thread { 15 | val cmd = arrayOf("su", "source $fileDir/backup.sh") 16 | ShellUtils.execCmd(cmd, true) 17 | }.start() 18 | sleep(3000) 19 | val message: Message = Message.obtain() 20 | message.what = 0 21 | timeHandler.sendMessage(message) 22 | } catch (e: InterruptedException) { 23 | e.printStackTrace() 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/thread/RestoreThread.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.thread 2 | 3 | import android.os.Handler 4 | import android.os.Message 5 | import com.wwxiaoqi.wechat_backup.utils.ShellUtils 6 | import java.io.File 7 | 8 | class RestoreThread( 9 | private val fileDir: File, 10 | private val timeHandler: Handler 11 | ) : Thread() { 12 | 13 | override fun run() { 14 | try { 15 | Thread { 16 | val cmd = arrayOf("su", "source $fileDir/recovery.sh") 17 | ShellUtils.execCmd(cmd, true) 18 | }.start() 19 | sleep(3000) 20 | val message: Message = Message.obtain() 21 | message.what = 0 22 | timeHandler.sendMessage(message) 23 | } catch (e: InterruptedException) { 24 | e.printStackTrace() 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/AppUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import android.content.Context 4 | 5 | object AppUtils { 6 | 7 | /** 8 | * 判断 app 是否第一次运行 9 | * @param context Context 10 | */ 11 | fun isFirstRunApp(context: Context): Boolean { 12 | val sharedPreferences = context.getSharedPreferences("share", Context.MODE_PRIVATE) 13 | val isFirstRun = sharedPreferences.getBoolean("isFirstRun", true) 14 | val editor = sharedPreferences.edit() 15 | if (isFirstRun) { 16 | editor.putBoolean("isFirstRun", false) 17 | editor.apply() 18 | return true 19 | } 20 | return false 21 | } 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/CloseUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import java.io.Closeable 4 | import java.io.IOException 5 | 6 | /** 7 | * 关闭相关工具类 8 | */ 9 | class CloseUtils private constructor() { 10 | companion object { 11 | /** 12 | * 关闭IO 13 | * 14 | * @param closeables closeable 15 | */ 16 | fun closeIO(vararg closeables: Closeable?) { 17 | for (closeable in closeables) { 18 | if (closeable != null) { 19 | try { 20 | closeable.close() 21 | } catch (e: IOException) { 22 | e.printStackTrace() 23 | } 24 | } 25 | } 26 | } 27 | 28 | /** 29 | * 安静关闭IO 30 | * 31 | * @param closeables closeable 32 | */ 33 | fun closeIOQuietly(vararg closeables: Closeable?) { 34 | for (closeable in closeables) { 35 | if (closeable != null) { 36 | try { 37 | closeable.close() 38 | } catch (ignored: IOException) { 39 | } 40 | } 41 | } 42 | } 43 | } 44 | 45 | init { 46 | throw UnsupportedOperationException("u can't instantiate me...") 47 | } 48 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/DialogUtil.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import android.app.ProgressDialog 4 | import android.content.Context 5 | import android.content.DialogInterface 6 | import java.lang.ref.WeakReference 7 | 8 | object DialogUtil { 9 | private var weakReference: WeakReference? = null 10 | 11 | fun dismiss() { 12 | if (weakReference!!.get() != null && weakReference!!.get()!!.isShowing) { 13 | weakReference!!.get()!!.dismiss() 14 | } 15 | } 16 | 17 | /** 18 | * 圆形进度转圈 19 | * 20 | * @param context 21 | * @param title 标题 22 | * @param message 内容 23 | * @param cancelable 点击外部是否消失,为 true 可以点击消失 24 | * @param cancelListener dialog 取消监听器 25 | */ 26 | fun showLoadingDialog(context: Context?, title: String?, message: String?, cancelable: Boolean?, cancelListener: DialogInterface.OnCancelListener?) { 27 | val progressDialog = ProgressDialog.show( 28 | context, title, message, false, 29 | cancelable!!, cancelListener 30 | ) 31 | weakReference = WeakReference(progressDialog) 32 | } 33 | 34 | fun showLoadingDialog(context: Context?, title: String?, message: String?, cancelable: Boolean?) { 35 | val progressDialog = ProgressDialog.show( 36 | context, title, message, false, 37 | cancelable!! 38 | ) 39 | weakReference = WeakReference(progressDialog) 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/FileUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import android.content.Context 4 | import android.content.res.AssetManager 5 | import org.apache.commons.io.IOUtils 6 | import java.io.* 7 | import java.util.* 8 | 9 | /** 10 | * 文件处理工具类 11 | */ 12 | object FileUtils { 13 | 14 | /*** 15 | * 复制 AssetManager 文件到指定位置 16 | * @param assetManager AssetManager 17 | * @param fileDir 文件路径 18 | * @param name 文件名称 19 | */ 20 | fun copyAssetManagerFiles(assetManager: AssetManager, fileDir: File, name: String) { 21 | try { 22 | val file = File(fileDir, name) 23 | val open = assetManager.open(name) 24 | val fileOutputStream = FileOutputStream(file) 25 | IOUtils.copy(open, fileOutputStream) 26 | open.close() 27 | fileOutputStream.close() 28 | } catch (e: IOException) { 29 | e.printStackTrace() 30 | } 31 | } 32 | 33 | /*** 34 | * 判断文件是否存在 35 | * @param filePath 文件路径 36 | * @return boolean 存在 true,不存在 false 37 | */ 38 | fun fileIsExists(context: Context, filePath: String): Boolean { 39 | try { 40 | val file = File(context.externalCacheDir!!.absolutePath, filePath) 41 | if (!file.exists()) { 42 | return false 43 | } 44 | } catch (e: Exception) { 45 | e.printStackTrace() 46 | return false 47 | } 48 | return true 49 | } 50 | 51 | /*** 52 | * 获取目录下所有文件(按时间排序) 53 | * @param path 文件夹路径 54 | * @return List 列表 55 | */ 56 | fun getFileSort(path: String): List { 57 | val list = getFiles(path, ArrayList()) 58 | if (list.isNotEmpty()) { 59 | Collections.sort(list) { file: File, newFile: File -> newFile.lastModified().compareTo(file.lastModified()) } 60 | } 61 | return list 62 | } 63 | 64 | /*** 65 | * 获取目录下所有文件 66 | * @param ralph 文件夹路径 67 | * @param files List 列表 68 | * @return List 69 | */ 70 | private fun getFiles(ralph: String, files: MutableList): List { 71 | val realFile = File(ralph) 72 | if (realFile.isDirectory) { 73 | val subsides = realFile.listFiles()!! 74 | for (file in subsides) { 75 | if (file.isDirectory) { 76 | getFiles(file.absolutePath, files) 77 | } else { 78 | files.add(file) 79 | } 80 | } 81 | } 82 | return files 83 | } 84 | 85 | /*** 86 | * 替换指定文件中的指定内容 87 | * @param filepath 文件路径 88 | * @param sourceStr 文件需要替换的内容 89 | * @param targetStr 替换后的内容 90 | * @return 替换成功返回 true,否则返回 false 91 | */ 92 | fun replaceFileStr(filepath: String, sourceStr: String, targetStr: String): Boolean { 93 | return try { 94 | val fileReader = FileReader(filepath) 95 | val data = CharArray(1024) 96 | var rn: Int 97 | val stringBuilder = StringBuilder() 98 | while (fileReader.read(data).also { rn = it } > 0) { 99 | val str = String(data, 0, rn) 100 | println(str) 101 | stringBuilder.append(str) 102 | } 103 | fileReader.close() 104 | val str = stringBuilder.toString().replace(sourceStr.toRegex(), targetStr) 105 | val flout = FileWriter(filepath) 106 | flout.write(str.toCharArray()) 107 | flout.close() 108 | true 109 | } catch (e: IOException) { 110 | e.printStackTrace() 111 | false 112 | } 113 | } 114 | 115 | /** 116 | * 删除单个文件 117 | * 118 | * @param fileName 要删除的文件的文件名 119 | * @return 删除成功返回 true,否则返回 false 120 | */ 121 | fun deleteSingleFile(fileName: String): Boolean { 122 | val file = File(fileName) 123 | return if (file.exists() && file.isFile) { 124 | file.delete() 125 | } else { 126 | false 127 | } 128 | } 129 | 130 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/PermissionUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import android.app.Activity 4 | import android.content.pm.PackageManager 5 | import androidx.core.app.ActivityCompat 6 | 7 | /** 8 | * android 权限 9 | */ 10 | object PermissionUtils { 11 | private const val REQUEST_EXTERNAL_STORAGE = 1 12 | private val PERMISSIONS_STORAGE = arrayOf( 13 | "android.permission.READ_EXTERNAL_STORAGE", 14 | "android.permission.WRITE_EXTERNAL_STORAGE" 15 | ) 16 | 17 | /*** 18 | * 动态权限申请 19 | * @param activity Activity 20 | */ 21 | fun verifyStoragePermissions(activity: Activity?) { 22 | try { 23 | // 检测是否有写的权限 24 | val permission = ActivityCompat.checkSelfPermission(activity!!, "android.permission.WRITE_EXTERNAL_STORAGE") 25 | if (permission != PackageManager.PERMISSION_GRANTED) { 26 | // 没有写的权限,去申请写的权限,会弹出对话框 27 | ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE) 28 | } 29 | } catch (e: Exception) { 30 | e.printStackTrace() 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/ShellUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import java.io.* 4 | 5 | /** 6 | * Shell 相关工具类 7 | */ 8 | class ShellUtils private constructor() { 9 | /** 10 | * 返回的命令结果 11 | */ 12 | class CommandResult( 13 | /** 14 | * 结果码 15 | */ 16 | var result: Int, 17 | /** 18 | * 成功信息 19 | */ 20 | var successMsg: String?, 21 | /** 22 | * 错误信息 23 | */ 24 | var errorMsg: String? 25 | ) 26 | 27 | companion object { 28 | /** 29 | * 是否是在root下执行命令 30 | * 31 | * @param command 命令 32 | * @param isRoot 是否需要root权限执行 33 | * @return CommandResult 34 | */ 35 | fun execCmd(command: String, isRoot: Boolean): CommandResult { 36 | return execCmd(arrayOf(command), isRoot, true) 37 | } 38 | 39 | /** 40 | * 是否是在root下执行命令 41 | * 42 | * @param commands 多条命令链表 43 | * @param isRoot 是否需要root权限执行 44 | * @return CommandResult 45 | */ 46 | fun execCmd(commands: List, isRoot: Boolean): CommandResult { 47 | return execCmd(commands, isRoot, true) 48 | } 49 | 50 | /** 51 | * 是否是在root下执行命令 52 | * 53 | * @param command 命令 54 | * @param isRoot 是否需要root权限执行 55 | * @param isNeedResultMsg 是否需要结果消息 56 | * @return CommandResult 57 | */ 58 | fun execCmd(command: String, isRoot: Boolean, isNeedResultMsg: Boolean): CommandResult { 59 | return execCmd(arrayOf(command), isRoot, isNeedResultMsg) 60 | } 61 | 62 | /** 63 | * 是否是在root下执行命令 64 | * 65 | * @param commands 命令链表 66 | * @param isRoot 是否需要root权限执行 67 | * @param isNeedResultMsg 是否需要结果消息 68 | * @return CommandResult 69 | */ 70 | private fun execCmd(commands: List?, isRoot: Boolean, isNeedResultMsg: Boolean): CommandResult { 71 | return execCmd(commands, isRoot, isNeedResultMsg) 72 | } 73 | 74 | /** 75 | * 是否是在root下执行命令 76 | * 77 | * @param commands 多条命令数组 78 | * @param isRoot 是否需要root权限执行 79 | * @return CommandResult 80 | */ 81 | fun execCmd(commands: Array?, isRoot: Boolean, isNeedResultMsg: Boolean = true): CommandResult { 82 | var result = -1 83 | if (commands == null) { 84 | return CommandResult(result, null, null) 85 | } 86 | var process: Process? = null 87 | var successResult: BufferedReader? = null 88 | var errorResult: BufferedReader? = null 89 | var successMsg: StringBuilder? = null 90 | var errorMsg: StringBuilder? = null 91 | var os: DataOutputStream? = null 92 | try { 93 | process = ProcessBuilder() 94 | .command(if (isRoot) "su" else "sh") 95 | .redirectErrorStream(true) 96 | .start() 97 | 98 | os = DataOutputStream(process.outputStream) 99 | for (command in commands) { 100 | os.write(command.toByteArray()) 101 | os.writeBytes("\n") 102 | os.flush() 103 | } 104 | os.writeBytes("exit\n") 105 | os.flush() 106 | 107 | result = process.waitFor() 108 | 109 | if (isNeedResultMsg) { 110 | var s: String 111 | 112 | successMsg = StringBuilder() 113 | errorMsg = StringBuilder() 114 | 115 | successResult = BufferedReader(InputStreamReader(process.inputStream, "UTF-8")) 116 | errorResult = BufferedReader(InputStreamReader(process.errorStream, "UTF-8")) 117 | 118 | while (successResult.ready()) { 119 | if (successResult.readLine().also { s = it } != null) { 120 | successMsg.append(s) 121 | } 122 | } 123 | 124 | while (errorResult.ready()) { 125 | if (errorResult.readLine().also { s = it } != null) { 126 | errorMsg.append(s) 127 | } 128 | } 129 | } 130 | } catch (e: Exception) { 131 | e.printStackTrace() 132 | } finally { 133 | CloseUtils.closeIO(os, successResult, errorResult) 134 | process?.destroy() 135 | } 136 | return CommandResult( 137 | result, 138 | successMsg?.toString(), 139 | errorMsg?.toString() 140 | ) 141 | } 142 | } 143 | 144 | init { 145 | throw UnsupportedOperationException("u can't instantiate me...") 146 | } 147 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/TimeUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import java.text.SimpleDateFormat 4 | import java.util.* 5 | 6 | /** 7 | * 时间工具类 8 | */ 9 | object TimeUtils { 10 | /*** 11 | * 获取当前时间日期 12 | * @return 返回 yyyyMMdd 格式 13 | */ 14 | val dataTime: String 15 | get() { 16 | val format = SimpleDateFormat("yyyyMMdd", Locale.CHINA) 17 | return format.format(Calendar.getInstance().time) 18 | } 19 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/utils/ToastUtils.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.utils 2 | 3 | import android.content.Context 4 | import android.view.Gravity 5 | import android.widget.Toast 6 | 7 | 8 | object ToastUtils { 9 | fun show(context: Context?, text: CharSequence?) { 10 | val toast: Toast = Toast.makeText(context, text, Toast.LENGTH_LONG) 11 | toast.setGravity(Gravity.CENTER, 0, 0) 12 | toast.show() 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wwxiaoqi/wechat_backup/widget/FilletButtonWidget.kt: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup.widget 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Context 5 | import android.util.AttributeSet 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import androidx.appcompat.widget.AppCompatImageView 9 | import androidx.appcompat.widget.AppCompatTextView 10 | import androidx.cardview.widget.CardView 11 | import com.wwxiaoqi.wechat_backup.R 12 | 13 | /** 14 | * @author: wwxiaoqi 15 | * @description: Fillet Button Widget 16 | * @date: 6/2/2020 3:22 PM 17 | */ 18 | class FilletButtonWidget : CardView { 19 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { 20 | init(context, attrs) 21 | } 22 | 23 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( 24 | context, 25 | attrs, 26 | defStyleAttr 27 | ) { 28 | init(context, attrs) 29 | } 30 | 31 | @SuppressLint("CustomViewStyleable", "InflateParams") 32 | private fun init(context: Context, attrs: AttributeSet?) { 33 | val view = LayoutInflater.from(context).inflate(R.layout.widget_button_view, null) 34 | 35 | val typedArray = context.obtainStyledAttributes(attrs, R.styleable.WidgetButton) 36 | cardElevation = typedArray.getDimension(R.styleable.WidgetButton_elevation, 0.0f) 37 | radius = typedArray.getDimension( 38 | R.styleable.WidgetButton_radius, 39 | getDisplayView(context, 4.0f).toFloat() 40 | ) 41 | 42 | val appCompatImageView: AppCompatImageView = view.findViewById(R.id.item_button_icon) 43 | val appCompatTextView: AppCompatTextView = view.findViewById(R.id.item_button_text) 44 | appCompatTextView.setTextColor( 45 | typedArray.getColor( 46 | R.styleable.WidgetButton_text_color, 47 | -1 48 | ) 49 | ) 50 | appCompatTextView.text = typedArray.getString(R.styleable.WidgetButton_text) 51 | 52 | val mColorView = typedArray.getColor(R.styleable.WidgetButton_bg_color, 0) 53 | if (mColorView != 0) { 54 | view.setBackgroundColor(mColorView) 55 | } 56 | 57 | val resource = typedArray.getResourceId(R.styleable.WidgetButton_src, -1) 58 | if (resource == -1) { 59 | appCompatImageView.visibility = View.GONE 60 | } else { 61 | appCompatImageView.setImageResource(resource) 62 | } 63 | 64 | val mColorTint = typedArray.getColor(R.styleable.WidgetButton_tint_color, -1) 65 | if (mColorTint != -1) { 66 | appCompatImageView.setColorFilter(mColorTint) 67 | } 68 | 69 | typedArray.recycle() 70 | addView(view) 71 | } 72 | 73 | companion object { 74 | fun getDisplayView(context: Context, f: Float): Int { 75 | return (f * context.resources.displayMetrics.density + 0.5f).toInt() 76 | } 77 | } 78 | 79 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 27 | 28 | 36 | 37 | 41 | 42 | 52 | 53 | 57 | 58 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_button_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 21 | 22 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/raw/animation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.5.2","fr":60,"ip":0,"op":121,"w":360,"h":180,"nm":"*darkmode_shareTap","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"arrow","parent":3,"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":89,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[-60]},{"t":115,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.8,"y":0},"t":5,"s":[16.205,-14.131,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[21.205,-9.131,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":89,"s":[21.205,-9.131,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[-17.795,-14.131,0],"to":[0,0,0],"ti":[0,0,0]},{"t":115,"s":[16.205,-14.131,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[16.205,-14.131,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":95,"s":[16.205,-8.131,0],"to":[0,0,0],"ti":[0,0,0]},{"t":115,"s":[16.205,-14.131,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,17.667]},"o":{"x":[0.8,0.8,0.333],"y":[0,0,0]},"t":5,"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":15,"s":[0,0,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":89,"s":[0,0,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.325,0.698],[0,0],[0.442,-0.631],[0,0],[-0.767,-0.067],[0,0]],"o":[[0,0],[-0.325,-0.698],[0,0],[-0.442,0.631],[0,0],[0.767,0.067]],"v":[[19.457,-12.42],[17.467,-16.688],[15.741,-16.839],[13.04,-12.981],[13.772,-11.411],[18.464,-11.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.75686275959,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"docs","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-1,"ix":10},"p":{"a":0,"k":[179.272,60.318,0],"ix":2},"a":{"a":0,"k":[-0.728,-26.432,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.12,-0.23],[0,0],[0.24,0.14],[0,0],[0,0],[1.02,0.58],[-0.58,1.02],[-1.02,-0.58],[-0.08,-0.07],[0,0],[-0.24,-0.14],[0,0]],"o":[[0,0],[-0.13,0.24],[0,0],[0,0],[-0.58,1.02],[-1.02,-0.58],[0.58,-1.02],[0.09,0.05],[0,0],[0.13,-0.24],[0,0],[0.24,0.14]],"v":[[22.875,-28.195],[22.065,-26.775],[21.385,-26.585],[20.395,-27.145],[18.625,-24.025],[15.715,-23.225],[14.915,-26.135],[17.825,-26.935],[18.085,-26.755],[19.865,-29.895],[20.545,-30.085],[22.675,-28.875]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.45,0.81],[0,0],[0.82,-1.44],[0,0],[-1.44,-0.82],[0,0],[-0.82,1.44],[0,0]],"o":[[0,0],[-1.44,-0.82],[0,0],[-0.82,1.44],[0,0],[1.44,0.82],[0,0],[0.75,-1.65]],"v":[[25.235,-30.545],[18.515,-34.345],[14.375,-33.195],[10.575,-26.465],[11.725,-22.325],[18.455,-18.525],[22.595,-19.675],[26.395,-26.395]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.913725495338,0.258823543787,0.207843139768,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":100,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"t":115,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.8,0.8],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[0,0]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":100,"s":[0,0]},{"t":110,"s":[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":"Transform"}],"nm":"docC","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.034,0.877],[-0.877,0.034],[-0.034,-0.877],[0.877,-0.034]],"o":[[-0.034,-0.877],[0.877,-0.034],[0.034,0.877],[-0.877,0.034]],"v":[[-4.531,-33.142],[-3.004,-34.792],[-1.354,-33.266],[-2.881,-31.615]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"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],[0.119,-0.178],[0,0],[0,0],[0.287,-0.52],[0,0],[0,0],[0.287,-0.52],[0,0],[0.02,0.46],[0,0],[-1.301,0.025],[0,0],[-0.025,-1.301]],"o":[[-0.034,0.243],[0,0],[0,0],[-0.267,-0.564],[0,0],[0,0],[-0.267,-0.564],[0,0],[-0.238,-0.415],[0,0],[0.053,-1.326],[0,0],[1.326,0.053],[0,0]],"v":[[4.812,-27.186],[4.689,-26.616],[4.66,-26.765],[2.227,-32.077],[0.9,-32.13],[-1.896,-26.325],[-3.139,-29.089],[-4.466,-29.142],[-5.947,-26.069],[-6.364,-27.374],[-6.284,-33.643],[-3.827,-36.059],[2.442,-35.979],[4.858,-33.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.628,0.074],[0,0],[0.058,-1.717],[0,0],[-1.717,-0.058],[0,0],[-0.058,1.717],[0,0]],"o":[[0,0],[-1.707,-0.048],[0,0],[-0.048,1.707],[0,0],[1.707,0.048],[0,0],[-0.031,-1.692]],"v":[[3.365,-37.333],[-4.458,-37.421],[-7.577,-34.41],[-7.665,-26.588],[-4.654,-23.468],[3.168,-23.38],[6.288,-26.391],[6.376,-34.213]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":95,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"t":110,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.8,0.8],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[0,0]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":95,"s":[0,0]},{"t":105,"s":[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":"Transform"}],"nm":"docB","np":2,"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.33,-0.25],[0,0],[0.25,0.32],[-0.33,0.25],[0,0],[-0.25,-0.33]],"o":[[0,0],[-0.33,0.25],[-0.25,-0.33],[0,0],[0.33,-0.25],[0.22,0.51]],"v":[[-16.285,-25.715],[-22.385,-20.975],[-23.545,-21.115],[-23.395,-22.275],[-17.295,-27.015],[-16.135,-26.865]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.33,-0.26],[0,0],[0.25,0.32],[-0.33,0.25],[0,0],[-0.25,-0.33]],"o":[[0,0],[-0.33,0.25],[-0.25,-0.33],[0,0],[0.33,-0.25],[0.34,0.42]],"v":[[-17.475,-20.945],[-20.525,-18.575],[-21.685,-18.715],[-21.535,-19.875],[-18.485,-22.245],[-17.325,-22.095]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.25,0.33],[-0.32,0.25],[0,0],[-0.25,-0.33],[0.33,-0.25],[0,0]],"o":[[-0.25,-0.33],[0,0],[0.33,-0.25],[0.15,0.41],[0,0],[-0.32,0.25]],"v":[[-25.405,-23.515],[-25.265,-24.675],[-19.165,-29.415],[-18.005,-29.265],[-18.155,-28.105],[-24.255,-23.365]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[1.02,1.31],[0,0],[1.31,-1.02],[0,0],[-1.02,-1.31],[0,0],[-1.31,1.02],[0,0]],"o":[[0,0],[-1.21,-1.33],[0,0],[-1.31,1.02],[0,0],[1.02,1.31],[0,0],[1.31,-1.02]],"v":[[-11.945,-25.075],[-16.685,-31.175],[-20.945,-31.705],[-27.045,-26.965],[-27.575,-22.705],[-22.835,-16.605],[-18.575,-16.075],[-12.475,-20.815]],"c":true},"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.329411774874,0.494117647409,0.96862745285,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":90,"s":[0,-15],"to":[0,0],"ti":[0,0]},{"t":105,"s":[0,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.8,0.8],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[0,0]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":90,"s":[0,0]},{"t":100,"s":[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":"Transform"}],"nm":"docA","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[179.873,74.233,0],"ix":2},"a":{"a":0,"k":[-0.127,-15.767,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.613,0],[4.549,-3.669]],"o":[[-4.521,-3.548],[-6.74,0],[0,0]],"v":[[17.156,-13.014],[0,-18.728],[-17.411,-12.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":115,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[1],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[0]},{"t":90,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.75686275959,0.027450980619,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":2,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":4,"ix":2}}],"nm":"Stroke 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":"Transform"}],"nm":"null","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"deviceB","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[-10]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":91,"s":[-10]},{"t":110,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":10,"s":[28.165,-5.059,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":25,"s":[27.165,-0.059,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":91,"s":[27.165,-0.059,0],"to":[0,0,0],"ti":[0,0,0]},{"t":110,"s":[28.165,-5.059,0]}],"ix":2},"a":{"a":0,"k":[28.165,-5.059,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.45,-0.33],[0,0],[0.34,-0.47],[0,0],[0.45,0.33],[0,0],[-0.34,0.47],[0,0]],"o":[[0,0],[0.46,0.33],[0,0],[-0.34,0.46],[0,0],[-0.46,-0.33],[0,0],[0.34,-0.47]],"v":[[29.605,-14.462],[36.705,-9.252],[36.915,-7.802],[28.165,4.108],[26.725,4.348],[19.625,-0.862],[19.415,-2.312],[28.165,-14.222]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.458823531866,0.458823531866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"screen","np":2,"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":[[-1.06,-0.78],[0,0],[0.78,-1.06],[0,0],[1.06,0.78],[0,0],[-0.78,1.06],[0,0]],"o":[[0,0],[1.06,0.78],[0,0],[-0.78,1.06],[0,0],[-1.06,-0.78],[0,0],[0.77,-1.05]],"v":[[30.605,-17.555],[39.365,-11.125],[39.875,-7.805],[29.045,6.935],[25.725,7.435],[16.965,1.005],[16.455,-2.315],[27.285,-17.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.380392163992,0.380392163992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"phone","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"tidyB","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":5,"s":[245.8,113.61,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":30,"s":[245.8,125.61,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.4,"y":0},"t":80,"s":[245.8,125.61,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120,"s":[245.8,113.61,0]}],"ix":2},"a":{"a":0,"k":[65.8,23.61,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.98,0],[0.12,2.16],[-0.57,0],[0,-0.57],[-4.3,0],[0,0.46],[-0.56,0],[0,-0.56]],"o":[[-4.99,0],[0,-0.57],[0.57,0],[0,0.11],[4.19,0],[0,-0.57],[0.56,0],[-0.1,2.16]],"v":[[58.605,16.545],[51.915,10.535],[52.935,9.405],[54.065,10.425],[58.595,14.395],[63.125,10.425],[64.255,9.405],[65.275,10.535]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141176477075,0.75686275959,0.878431379795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"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":[[-1.69,0],[0,-1.69],[1.69,0],[0,1.69]],"o":[[1.69,0],[0,1.69],[-1.69,0],[0,-1.69]],"v":[[66.335,-0.005],[69.395,3.055],[66.335,6.115],[63.275,3.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141176477075,0.75686275959,0.878431379795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"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":[[-1.69,0],[0,-1.69],[1.69,0],[0,1.69]],"o":[[1.69,0],[0,1.69],[-1.69,0],[0,-1.69]],"v":[[51.465,-0.005],[54.525,3.055],[51.465,6.115],[48.405,3.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141176477075,0.75686275959,0.878431379795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":10,"s":[58.135,7.066],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":25,"s":[56.135,8.066],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":75,"s":[56.135,8.066],"to":[0,0],"ti":[0,0]},{"t":109,"s":[58.135,7.066]}],"ix":2},"a":{"a":0,"k":[58.135,7.066],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":25,"s":[5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":75,"s":[5]},{"t":109,"s":[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":"Transform"}],"nm":"faceB","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0.89],[0.29,0.29],[0,-0.89],[-0.89,0],[-0.89,-4.12],[-0.59,0]],"o":[[0.88,-0.29],[-1.47,-5.88],[-0.88,-0.29],[-0.29,0.88],[0,0],[0.29,0.59],[0.29,-0.01]],"v":[[85.805,9.495],[86.985,7.725],[79.925,0.075],[78.155,1.255],[79.335,3.025],[84.045,8.325],[85.515,9.505]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.882352948189,0.96862745285,0.976470589638,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"highlight","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":10,"s":[{"i":[[0.17,0.2],[-0.02,0.97],[0,0],[0,0],[-0.43,-0.25],[0,0],[0,0],[0,0]],"o":[[-0.71,-0.89],[0,0],[0,0],[0.45,0.07],[0,0],[0,0],[0,0],[-0.21,-0.24]],"v":[[29.005,6.845],[28.035,3.985],[31.775,0.275],[32.675,-0.085],[34.005,0.375],[36.465,1.555],[37.295,1.93],[30.286,8.206]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":25,"s":[{"i":[[0.228,0.131],[0.339,0.909],[0,0],[0,0],[-0.492,-0.074],[0,0],[0,0],[0,0]],"o":[[-0.988,-0.566],[0,0],[0,0],[0.444,-0.101],[0,0],[0,0],[0,0],[-0.284,-0.146]],"v":[[31.036,10.806],[29.082,8.504],[31.193,3.677],[31.897,3.011],[33.303,2.949],[36.025,3.141],[36.935,3.184],[32.729,11.6]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":90,"s":[{"i":[[0.228,0.131],[0.339,0.909],[0,0],[0,0],[-0.492,-0.074],[0,0],[0,0],[0,0]],"o":[[-0.988,-0.566],[0,0],[0,0],[0.444,-0.101],[0,0],[0,0],[0,0],[-0.284,-0.146]],"v":[[31.036,10.806],[29.082,8.504],[31.193,3.677],[31.897,3.011],[33.303,2.949],[36.025,3.141],[36.935,3.184],[32.729,11.6]],"c":true}]},{"t":109,"s":[{"i":[[0.17,0.2],[-0.02,0.97],[0,0],[0,0],[-0.43,-0.25],[0,0],[0,0],[0,0]],"o":[[-0.71,-0.89],[0,0],[0,0],[0.45,0.07],[0,0],[0,0],[0,0],[-0.21,-0.24]],"v":[[29.005,6.845],[28.035,3.985],[31.775,0.275],[32.675,-0.085],[34.005,0.375],[36.465,1.555],[37.295,1.93],[30.286,8.206]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.408887326717,0.799838125706,0.975091934204,1],"ix":4},"o":{"a":0,"k":30,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"cast","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":10,"s":[{"i":[[-0.59,1.47],[-2.06,-1.17],[0,0],[-9.12,0],[-4.11,-9.71],[-0.29,-2.65],[-2.06,-3.23],[0.59,-1.17],[1.77,1.18],[0,0],[0,0],[0,0],[5,-1.77],[0.88,-1.77],[1.47,0],[0,2.35],[0,0],[2.06,0],[2.35,0.3],[0,0],[2.05,-0.29],[0.59,1.47],[0.88,3.53],[2.03,3.38],[0,0],[-2.94,12.65],[1.48,1.76]],"o":[[1.18,-2.06],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.77,1.47],[0.88,1.47],[-1.18,2.06],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-0.88,3.24],[-0.59,1.47],[-2.06,0],[0,0],[-2.06,0.29],[-2.65,0],[0,0],[0,2.35],[-1.47,0],[-0.88,-1.77],[-4.41,-1.77],[0,0],[0,0],[-2.65,-2.35],[-1.18,-1.46]],"v":[[28.435,2.135],[34.025,0.365],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.275,16.255],[102.865,26.845],[103.155,31.255],[97.565,32.725],[91.975,29.785],[89,36.52],[88.875,37.04],[81.165,44.795],[81.015,55.535],[77.485,57.885],[73.665,53.475],[71.165,46.855],[65.285,47.145],[57.635,46.555],[57.635,50.34],[53.815,54.75],[50.285,52.4],[47.635,44.195],[39.695,37.135],[39.695,37.135],[36.385,13.895],[29.025,6.835]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":25,"s":[{"i":[[-0.202,1.571],[-2.288,-0.615],[0,0],[-9.12,0],[-4.11,-9.71],[0.139,-2.662],[-1.515,-3.519],[0.77,-1.06],[1.558,1.449],[0,0],[0,0],[0,0],[5.104,-1.443],[0.992,-1.709],[1.467,0.095],[-0.152,2.345],[0,0],[2.06,0],[2.275,0.662],[0,0],[2.07,0.033],[0.354,1.544],[0.32,3.624],[2.03,3.38],[0,0],[-2.94,12.65],[1.875,1.332]],"o":[[0.625,-2.29],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.511,1.735],[0.633,1.592],[-1.495,1.844],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-1.087,3.176],[-0.684,1.429],[-2.056,-0.133],[0,0],[-2.074,0.156],[-2.65,0],[0,0],[-0.366,2.321],[-1.452,-0.229],[-0.594,-1.885],[-4.081,-2.435],[0,0],[0,0],[-2.65,-2.35],[-1.509,-1.117]],"v":[[29.011,6.194],[33.977,3.077],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.801,15.705],[101.554,27.857],[101.133,32.257],[95.379,32.811],[91.975,29.785],[89,36.52],[88.875,37.04],[81.273,46.285],[80.43,56.993],[76.755,59.11],[73.228,54.462],[71.161,47.695],[64.535,48.395],[57.128,48.268],[56.539,52.007],[52.079,55.769],[48.958,52.898],[47.617,44.381],[39.695,37.135],[39.695,37.135],[36.385,13.895],[30.762,10.596]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":55,"s":[{"i":[[-0.59,1.47],[-2.06,-1.17],[0,0],[-9.12,0],[-4.11,-9.71],[-0.085,-2.664],[-1.805,-3.379],[0.679,-1.121],[1.674,1.313],[0,0],[0,0],[0,0],[5,-1.77],[0.88,-1.77],[1.47,0],[0,2.35],[0,0],[2.06,0],[2.35,0.3],[0,0],[2.05,-0.29],[0.59,1.47],[0.88,3.53],[2.03,3.38],[0,0],[-2.94,12.65],[1.48,1.76]],"o":[[1.18,-2.06],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.651,1.602],[0.764,1.534],[-1.335,1.963],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-0.88,3.24],[-0.59,1.47],[-2.06,0],[0,0],[-2.06,0.29],[-2.65,0],[0,0],[0,2.35],[-1.47,0],[-0.88,-1.77],[-4.41,-1.77],[0,0],[0,0],[-2.65,-2.35],[-1.18,-1.46]],"v":[[28.435,2.135],[34.025,0.365],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.371,16.596],[102.112,27.972],[102.06,32.391],[96.374,33.425],[91.975,29.785],[89,36.52],[88.875,37.04],[81.165,44.795],[81.015,55.535],[77.485,57.885],[73.665,53.475],[71.165,46.855],[65.285,47.145],[57.635,46.555],[57.635,50.34],[53.815,54.75],[50.285,52.4],[47.635,44.195],[39.695,37.135],[39.695,37.135],[36.385,13.895],[29.025,6.835]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":75,"s":[{"i":[[-0.202,1.571],[-2.288,-0.615],[0,0],[-9.12,0],[-4.11,-9.71],[0.018,-2.666],[-1.673,-3.446],[0.721,-1.094],[1.622,1.376],[0,0],[0,0],[0,0],[5,-1.77],[0.88,-1.77],[1.47,0],[0,2.35],[0,0],[2.06,0],[2.35,0.3],[0,0],[2.05,-0.29],[0.59,1.47],[0.88,3.53],[2.03,3.38],[0,0],[-2.94,12.65],[1.875,1.332]],"o":[[0.625,-2.29],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.589,1.664],[0.704,1.562],[-1.41,1.91],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-0.88,3.24],[-0.59,1.47],[-2.06,0],[0,0],[-2.06,0.29],[-2.65,0],[0,0],[0,2.35],[-1.47,0],[-0.88,-1.77],[-4.41,-1.77],[0,0],[0,0],[-2.65,-2.35],[-1.509,-1.117]],"v":[[29.011,6.194],[33.977,3.077],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.178,15.66],[101.475,27.401],[101.254,31.815],[95.532,32.63],[91.975,29.785],[89,36.52],[88.875,37.04],[81.165,44.795],[81.015,55.535],[77.485,57.885],[73.665,53.475],[71.165,46.855],[65.285,47.145],[57.635,46.555],[57.635,50.34],[53.815,54.75],[50.285,52.4],[47.635,44.195],[39.695,37.135],[39.695,37.135],[36.385,13.895],[30.762,10.596]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":90,"s":[{"i":[[-0.202,1.571],[-2.288,-0.615],[0,0],[-9.12,0],[-4.11,-9.71],[-0.115,-2.663],[-1.842,-3.359],[0.666,-1.129],[1.688,1.294],[0,0],[0,0],[0,0],[5,-1.77],[0.88,-1.77],[1.47,0],[0,2.35],[0,0],[2.06,0],[2.35,0.3],[0,0],[2.05,-0.29],[0.59,1.47],[0.88,3.53],[2.03,3.38],[0,0],[-2.94,12.65],[1.875,1.332]],"o":[[0.625,-2.29],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.669,1.584],[0.781,1.525],[-1.313,1.978],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-0.88,3.24],[-0.59,1.47],[-2.06,0],[0,0],[-2.06,0.29],[-2.65,0],[0,0],[0,2.35],[-1.47,0],[-0.88,-1.77],[-4.41,-1.77],[0,0],[0,0],[-2.65,-2.35],[-1.509,-1.117]],"v":[[29.011,6.194],[33.977,3.077],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.782,15.903],[101.65,27.418],[101.649,31.838],[95.974,32.936],[91.975,29.785],[89,36.52],[88.875,37.04],[81.165,44.795],[81.015,55.535],[77.485,57.885],[73.665,53.475],[71.165,46.855],[65.285,47.145],[57.635,46.555],[57.635,50.34],[53.815,54.75],[50.285,52.4],[47.635,44.195],[39.695,37.135],[39.695,37.135],[36.385,13.895],[30.762,10.596]],"c":true}]},{"t":114,"s":[{"i":[[-0.59,1.47],[-2.06,-1.17],[0,0],[-9.12,0],[-4.11,-9.71],[-0.29,-2.65],[-2.06,-3.23],[0.59,-1.17],[1.77,1.18],[0,0],[0,0],[0,0],[5,-1.77],[0.88,-1.77],[1.47,0],[0,2.35],[0,0],[2.06,0],[2.35,0.3],[0,0],[2.05,-0.29],[0.59,1.47],[0.88,3.53],[2.03,3.38],[0,0],[-2.94,12.65],[1.48,1.76]],"o":[[1.18,-2.06],[0,0],[5,-7.06],[11.18,0],[1.18,2.65],[1.77,1.47],[0.88,1.47],[-1.18,2.06],[0,0],[-0.88,4.41],[0,0],[-0.88,3.24],[-0.88,3.24],[-0.59,1.47],[-2.06,0],[0,0],[-2.06,0.29],[-2.65,0],[0,0],[0,2.35],[-1.47,0],[-0.88,-1.77],[-4.41,-1.77],[0,0],[0,0],[-2.65,-2.35],[-1.18,-1.46]],"v":[[28.435,2.135],[34.025,0.365],[40.795,3.605],[64.035,-8.165],[90.215,8.605],[92.275,16.255],[102.865,26.845],[103.155,31.255],[97.565,32.725],[91.975,29.785],[89,36.52],[88.875,37.04],[81.165,44.795],[81.015,55.535],[77.485,57.885],[73.665,53.475],[71.165,46.855],[65.285,47.145],[57.635,46.555],[57.635,50.34],[53.815,54.75],[50.285,52.4],[47.635,44.195],[39.695,37.135],[39.695,37.135],[36.385,13.895],[29.025,6.835]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.796078443527,0.941176474094,0.972549021244,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"body","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","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":"Transform"}],"nm":"tidyB","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"deviceA","parent":7,"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":5,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[13]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":80,"s":[13]},{"t":100,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":5,"s":[-28.66,-4.671,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.167,"y":0.167},"t":20,"s":[-25.66,-0.671,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":80,"s":[-25.66,-0.671,0],"to":[0,0,0],"ti":[0,0,0]},{"t":100,"s":[-28.66,-4.671,0]}],"ix":2},"a":{"a":0,"k":[-28.66,-4.671,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,-0.37],[0,0],[-0.37,-0.44],[0,0],[-0.43,0.37],[0,0],[0.37,0.44],[0,0]],"o":[[0,0],[-0.43,0.36],[0,0],[0.37,0.44],[0,0],[0.43,-0.36],[0,0],[-0.37,-0.44]],"v":[[-30.685,-13.966],[-37.445,-8.316],[-37.565,-6.856],[-28.085,4.484],[-26.635,4.624],[-19.875,-1.026],[-19.755,-2.486],[-29.235,-13.826]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.458823531866,0.458823531866,0.458823531866,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"screen","np":2,"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":[[1.01,-0.84],[0,0],[-0.84,-1.01],[0,0],[-1.01,0.85],[0,0],[0.84,1.01],[0,0]],"o":[[0,0],[-1.01,0.84],[0,0],[0.84,1.01],[0,0],[1.01,-0.84],[0,0],[-0.84,-1.01]],"v":[[-31.885,-16.995],[-40.215,-10.025],[-40.515,-6.675],[-28.785,7.355],[-25.435,7.645],[-17.105,0.675],[-16.805,-2.675],[-28.535,-16.695]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.380392163992,0.380392163992,0.380392163992,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"phone","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"tidyA","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":50,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":70,"s":[-5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":75,"s":[-5]},{"t":100,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":5,"s":[114.118,116.61,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":30,"s":[114.118,121.61,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":50,"s":[114.118,119.6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[114.118,127.61,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":75,"s":[114.118,127.61,0],"to":[0,0,0],"ti":[0,0,0]},{"t":105,"s":[114.118,116.61,0]}],"ix":2},"a":{"a":0,"k":[-65.882,23.61,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-4.99,0],[-0.12,2.16],[0.57,0],[0,-0.57],[4.3,0],[0,0.46],[0.56,0],[0,-0.56]],"o":[[4.99,0],[0,-0.57],[-0.57,0],[0,0.11],[-4.19,0],[0,-0.57],[-0.57,0],[0.09,2.16]],"v":[[-58.475,16.545],[-51.785,10.535],[-52.805,9.405],[-53.935,10.425],[-58.465,14.395],[-62.995,10.425],[-64.125,9.405],[-65.145,10.535]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"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":[[-1.69,0],[0,-1.69],[1.69,0],[0,1.69]],"o":[[1.69,0],[0,1.69],[-1.69,0],[0,-1.69]],"v":[[-66.215,-0.005],[-63.155,3.055],[-66.215,6.115],[-69.275,3.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"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":[[-1.69,0],[0,-1.69],[1.69,0],[0,1.69]],"o":[[1.69,0],[0,1.69],[-1.69,0],[0,-1.69]],"v":[[-51.335,-0.005],[-48.275,3.055],[-51.335,6.115],[-54.395,3.055]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"null","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":5,"s":[-58.688,6.918],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":25,"s":[-57.688,7.918],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":50,"s":[-57.688,7.918],"to":[0,0],"ti":[0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":75,"s":[-56.688,9.918],"to":[0,0],"ti":[0,0]},{"t":100,"s":[-58.688,6.918]}],"ix":2},"a":{"a":0,"k":[-58.688,6.918],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":25,"s":[-5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":50,"s":[-5]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":75,"s":[-5]},{"t":100,"s":[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":"Transform"}],"nm":"faceA","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0.89],[-0.29,0.29],[0,-0.89],[0.89,0],[0.89,-4.12],[0.59,0]],"o":[[-0.88,-0.29],[1.47,-5.88],[0.88,-0.29],[0.29,0.88],[0,0],[-0.29,0.59],[-0.29,-0.01]],"v":[[-85.875,9.495],[-87.055,7.725],[-79.995,0.075],[-78.225,1.255],[-79.405,3.025],[-84.115,8.325],[-85.585,9.505]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.890196084976,0.949019610882,0.992156863213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"highlight","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"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":5,"s":[{"i":[[0,0],[0,0],[-0.17,0.2],[0.02,0.97],[0,0],[0,0],[0.43,-0.25]],"o":[[0,0],[0.21,-0.24],[0.71,-0.89],[0,0],[0,0],[-0.45,0.07],[0,0]],"v":[[-37.016,1.763],[-30.366,8.206],[-29.095,6.845],[-28.125,3.985],[-31.865,0.275],[-32.765,-0.085],[-34.095,0.375]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":20,"s":[{"i":[[0,0],[0,0],[-0.22,0.143],[-0.288,0.926],[0,0],[0,0],[0.487,-0.101]],"o":[[0,0],[0.275,-0.161],[0.955,-0.619],[0,0],[0,0],[-0.449,-0.076],[0,0]],"v":[[-35.809,2.97],[-31.543,11.188],[-29.905,10.299],[-28.079,7.894],[-30.452,3.19],[-31.191,2.564],[-32.599,2.579]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[-0.22,0.143],[-0.288,0.926],[0,0],[0,0],[0.487,-0.101]],"o":[[0,0],[0.275,-0.161],[0.955,-0.619],[0,0],[0,0],[-0.449,-0.076],[0,0]],"v":[[-35.809,2.97],[-31.543,11.188],[-29.905,10.299],[-28.079,7.894],[-30.452,3.19],[-31.191,2.564],[-32.599,2.579]],"c":true}]},{"t":100,"s":[{"i":[[0,0],[0,0],[-0.17,0.2],[0.02,0.97],[0,0],[0,0],[0.43,-0.25]],"o":[[0,0],[0.21,-0.24],[0.71,-0.89],[0,0],[0,0],[-0.45,0.07],[0,0]],"v":[[-37.016,1.763],[-30.366,8.206],[-29.095,6.845],[-28.125,3.985],[-31.865,0.275],[-32.765,-0.085],[-34.095,0.375]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.622597038746,0.748029828072,0.951317429543,1],"ix":4},"o":{"a":0,"k":30,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"cast","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":5,"s":[{"i":[[0.59,1.47],[2.06,-1.17],[0,0],[9.12,0],[4.11,-9.71],[0.29,-2.65],[2.06,-3.23],[-0.59,-1.17],[-1.77,1.18],[0,0],[0,0],[0,0],[-5,-1.77],[-0.88,-1.77],[-1.47,0],[0,2.35],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.05,-0.29],[-0.59,1.47],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.48,1.76]],"o":[[-1.18,-2.06],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.77,1.47],[-0.88,1.47],[1.18,2.06],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.59,1.47],[2.06,0],[0,0],[2.06,0.29],[2.65,0],[0,0],[0,2.35],[1.47,0],[0.88,-1.77],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.19,-1.46]],"v":[[-28.505,2.135],[-34.095,0.365],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.345,16.255],[-102.945,26.845],[-103.235,31.255],[-97.645,32.725],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.47,55.535],[-76.94,57.885],[-73.12,53.475],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.715,50.965],[-53.895,55.375],[-50.365,53.025],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.105,6.835]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[0.59,1.47],[2.06,-1.17],[0,0],[9.12,0],[4.11,-9.71],[0.29,-2.65],[2.06,-3.23],[-0.59,-1.17],[-1.77,1.18],[0,0],[0,0],[0,0],[-5,-1.77],[-1.131,-1.621],[-1.454,0.216],[0.345,2.324],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.07,0.009],[-0.372,1.54],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.48,1.76]],"o":[[-1.18,-2.06],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.77,1.47],[-0.88,1.47],[1.18,2.06],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.8,1.367],[2.038,-0.303],[0,0],[2.06,0.29],[2.65,0],[0,0],[0.339,2.325],[1.455,-0.212],[0.615,-1.878],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.19,-1.46]],"v":[[-28.505,2.135],[-34.095,0.365],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.345,16.255],[-102.945,26.845],[-103.235,31.255],[-97.645,32.725],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.206,55.262],[-76.369,57.068],[-73.239,52.144],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.99,51.082],[-53.574,54.895],[-50.42,52.06],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.105,6.835]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":35,"s":[{"i":[[0.036,1.584],[2.34,-0.372],[0,0],[9.12,0],[4.11,-9.71],[0.602,-2.597],[1.975,-3.283],[-0.62,-1.154],[-1.738,1.226],[0,0],[0,0],[0,0],[-5,-1.77],[-0.88,-1.77],[-1.47,0],[0,2.35],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.05,-0.29],[-0.59,1.47],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.986,1.159]],"o":[[-0.381,-2.343],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.932,1.25],[-0.841,1.493],[1.234,2.028],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.59,1.47],[2.06,0],[0,0],[2.06,0.29],[2.65,0],[0,0],[0,2.35],[1.47,0],[0.88,-1.77],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.627,-0.949]],"v":[[-27.734,6.13],[-32.346,2.509],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.745,16.221],[-102.832,26.742],[-103.006,31.158],[-97.379,32.481],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.47,55.535],[-76.94,57.885],[-73.12,53.475],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.715,50.965],[-53.895,55.375],[-50.365,53.025],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.946,10.32]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":50,"s":[{"i":[[0.036,1.584],[2.34,-0.372],[0,0],[9.12,0],[4.11,-9.71],[0.602,-2.597],[1.975,-3.283],[-0.62,-1.154],[-1.738,1.226],[0,0],[0,0],[0,0],[-5,-1.77],[-0.88,-1.77],[-1.47,0],[0,2.35],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.05,-0.29],[-0.59,1.47],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.986,1.159]],"o":[[-0.381,-2.343],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.932,1.25],[-0.841,1.493],[1.234,2.028],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.59,1.47],[2.06,0],[0,0],[2.06,0.29],[2.65,0],[0,0],[0,2.35],[1.47,0],[0.88,-1.77],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.627,-0.949]],"v":[[-27.734,6.13],[-32.346,2.509],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.745,16.221],[-102.832,26.742],[-103.006,31.158],[-97.379,32.481],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.47,55.535],[-76.94,57.885],[-73.12,53.475],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.715,50.965],[-53.895,55.375],[-50.365,53.025],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.946,10.32]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":70,"s":[{"i":[[0.036,1.584],[2.34,-0.372],[0,0],[9.12,0],[4.11,-9.71],[1.548,-2.831],[1.208,-3.635],[-0.858,-0.99],[-1.428,1.577],[0,0],[0,0],[0,0],[-5.202,-1.038],[-1.124,-1.626],[-1.455,0.21],[0.336,2.326],[0,0],[-2.06,0],[-2.197,0.887],[0,0],[-2.056,0.24],[-0.197,1.572],[0.046,3.638],[-1.88,3.45],[0,0],[2.94,12.65],[-1.986,1.159]],"o":[[-0.381,-2.343],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.357,1.858],[-0.494,1.64],[1.648,1.709],[0,0],[1.616,4.197],[0,0],[0.88,3.24],[1.334,3.081],[0.794,1.371],[2.039,-0.294],[0,0],[2.08,-0.007],[2.65,0],[0,0],[0.597,2.273],[1.422,-0.374],[0.401,-1.936],[3.815,-2.833],[0,0],[0,0],[2.65,-2.35],[1.627,-0.949]],"v":[[-27.734,6.13],[-32.346,2.509],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-93.087,14.299],[-101.447,26.653],[-100.651,31],[-94.871,31.06],[-92.424,29.164],[-90.33,35.27],[-90.33,35.27],[-80.438,47.062],[-78.846,57.052],[-75.016,58.874],[-71.865,53.964],[-70.247,47.673],[-64.556,48.226],[-55.203,47.862],[-54.687,52.286],[-49.871,55.581],[-47.055,52.411],[-46.131,43.039],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.946,10.32]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":75,"s":[{"i":[[0.036,1.584],[2.34,-0.372],[0,0],[9.12,0],[4.11,-9.71],[1.548,-2.831],[1.208,-3.635],[-0.858,-0.99],[-1.428,1.577],[0,0],[0,0],[0,0],[-5.202,-1.038],[-1.124,-1.626],[-1.455,0.21],[0.336,2.326],[0,0],[-2.06,0],[-2.197,0.887],[0,0],[-2.056,0.24],[-0.197,1.572],[0.046,3.638],[-1.88,3.45],[0,0],[2.94,12.65],[-1.986,1.159]],"o":[[-0.381,-2.343],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.357,1.858],[-0.494,1.64],[1.648,1.709],[0,0],[1.616,4.197],[0,0],[0.88,3.24],[1.334,3.081],[0.794,1.371],[2.039,-0.294],[0,0],[2.08,-0.007],[2.65,0],[0,0],[0.597,2.273],[1.422,-0.374],[0.401,-1.936],[3.815,-2.833],[0,0],[0,0],[2.65,-2.35],[1.627,-0.949]],"v":[[-27.734,6.13],[-32.346,2.509],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-93.087,14.299],[-101.447,26.653],[-100.651,31],[-94.871,31.06],[-92.424,29.164],[-90.33,35.27],[-90.33,35.27],[-80.438,47.062],[-78.846,57.052],[-75.016,58.874],[-71.865,53.964],[-70.247,47.673],[-64.556,48.226],[-55.203,47.862],[-54.687,52.286],[-49.871,55.581],[-47.055,52.411],[-46.131,43.039],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.946,10.32]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":90,"s":[{"i":[[0.036,1.584],[2.34,-0.372],[0,0],[9.12,0],[4.11,-9.71],[0.29,-2.65],[2.06,-3.23],[-0.59,-1.17],[-1.77,1.18],[0,0],[0,0],[0,0],[-5,-1.77],[-0.88,-1.77],[-1.47,0],[0,2.35],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.05,-0.29],[-0.59,1.47],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.986,1.159]],"o":[[-0.381,-2.343],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.77,1.47],[-0.88,1.47],[1.18,2.06],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.59,1.47],[2.06,0],[0,0],[2.06,0.29],[2.65,0],[0,0],[0,2.35],[1.47,0],[0.88,-1.77],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.627,-0.949]],"v":[[-27.734,6.13],[-32.346,2.509],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.345,16.255],[-102.945,26.845],[-103.235,31.255],[-97.645,32.725],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.47,55.535],[-76.94,57.885],[-73.12,53.475],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.715,50.965],[-53.895,55.375],[-50.365,53.025],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.946,10.32]],"c":true}]},{"t":100,"s":[{"i":[[0.59,1.47],[2.06,-1.17],[0,0],[9.12,0],[4.11,-9.71],[0.29,-2.65],[2.06,-3.23],[-0.59,-1.17],[-1.77,1.18],[0,0],[0,0],[0,0],[-5,-1.77],[-0.88,-1.77],[-1.47,0],[0,2.35],[0,0],[-2.06,0],[-2.35,0.3],[0,0],[-2.05,-0.29],[-0.59,1.47],[-0.88,3.53],[-1.88,3.45],[0,0],[2.94,12.65],[-1.48,1.76]],"o":[[-1.18,-2.06],[0,0],[-5,-7.06],[-11.18,0],[-1.18,2.65],[-1.77,1.47],[-0.88,1.47],[1.18,2.06],[0,0],[0.88,4.41],[0,0],[0.88,3.24],[0.88,3.24],[0.59,1.47],[2.06,0],[0,0],[2.06,0.29],[2.65,0],[0,0],[0,2.35],[1.47,0],[0.88,-1.77],[4.41,-1.77],[0,0],[0,0],[2.65,-2.35],[1.19,-1.46]],"v":[[-28.505,2.135],[-34.095,0.365],[-40.865,3.605],[-64.105,-8.165],[-90.285,8.605],[-92.345,16.255],[-102.945,26.845],[-103.235,31.255],[-97.645,32.725],[-92.055,29.785],[-90.33,35.27],[-90.33,35.27],[-80.62,45.42],[-80.47,55.535],[-76.94,57.885],[-73.12,53.475],[-70.62,47.48],[-64.74,47.458],[-57.09,46.555],[-57.715,50.965],[-53.895,55.375],[-50.365,53.025],[-47.09,44.195],[-39.15,37.135],[-39.15,37.135],[-36.465,13.895],[-29.105,6.835]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.819607853889,0.886274516582,0.992156863213,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"body","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","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":"Transform"}],"nm":"tidyA","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"stars","sr":1,"ks":{"o":{"a":0,"k":73,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[175.048,101.297,0],"ix":2},"a":{"a":0,"k":[-2.452,-1.203,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.504,-0.339],[0,0],[-0.232,0.085],[0,0],[0.158,-0.587],[0,0],[-0.149,-0.188],[0,0],[0.606,-0.024],[0,0],[0.131,-0.2],[0,0],[0.211,0.567],[0,0],[0.236,0.061],[0,0],[-0.481,0.378],[0,0],[0.015,0.242],[0,0]],"o":[[0,0],[0.2,0.131],[0,0],[0.561,-0.226],[0,0],[-0.064,0.228],[0,0],[0.391,0.467],[0,0],[-0.245,0.007],[0,0],[-0.324,0.517],[0,0],[-0.081,-0.224],[0,0],[-0.584,-0.15],[0,0],[0.188,-0.149],[0,0],[-0.067,-0.598]],"v":[[-24.571,38.822],[-23.2,39.739],[-22.518,39.813],[-20.99,39.205],[-20.01,40.087],[-20.457,41.664],[-20.316,42.333],[-19.263,43.598],[-19.799,44.797],[-21.444,44.864],[-22.033,45.203],[-22.913,46.596],[-24.217,46.461],[-24.785,44.917],[-25.291,44.46],[-26.887,44.057],[-27.159,42.77],[-25.861,41.75],[-25.582,41.123],[-25.686,39.474]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.792156875134,0.250980407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"Group 1","np":2,"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.621,-0.417],[0,0],[-0.286,0.104],[0,0],[0.195,-0.724],[0,0],[-0.184,-0.231],[0,0],[0.747,-0.03],[0,0],[0.161,-0.246],[0,0],[0.259,0.699],[0,0],[0.291,0.075],[0,0],[-0.593,0.466],[0,0],[0.018,0.298],[0,0]],"o":[[0,0],[0.246,0.161],[0,0],[0.691,-0.279],[0,0],[-0.079,0.281],[0,0],[0.481,0.576],[0,0],[-0.302,0.009],[0,0],[-0.4,0.637],[0,0],[-0.1,-0.277],[0,0],[-0.72,-0.185],[0,0],[0.231,-0.184],[0,0],[-0.082,-0.737]],"v":[[-125.39,17.321],[-123.7,18.45],[-122.859,18.541],[-120.977,17.792],[-119.768,18.879],[-120.32,20.822],[-120.146,21.646],[-118.848,23.206],[-119.509,24.684],[-121.536,24.766],[-122.262,25.183],[-123.346,26.9],[-124.953,26.734],[-125.653,24.831],[-126.277,24.268],[-128.244,23.771],[-128.578,22.185],[-126.979,20.928],[-126.635,20.155],[-126.764,18.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.792156875134,0.250980407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"Group 2","np":2,"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.297,-0.687],[0,0],[-0.297,-0.067],[0,0],[0.555,-0.504],[0,0],[-0.03,-0.294],[0,0],[0.644,0.378],[0,0],[0.269,-0.12],[0,0],[-0.159,0.728],[0,0],[0.204,0.22],[0,0],[-0.751,0.071],[0,0],[-0.146,0.261],[0,0]],"o":[[0,0],[0.12,0.269],[0,0],[0.732,0.139],[0,0],[-0.218,0.194],[0,0],[0.094,0.744],[0,0],[-0.259,-0.156],[0,0],[-0.68,0.32],[0,0],[0.065,-0.287],[0,0],[-0.506,-0.545],[0,0],[0.294,-0.03],[0,0],[0.329,-0.664]],"v":[[119.83,-12.944],[120.642,-11.081],[121.3,-10.55],[123.289,-10.163],[123.719,-8.596],[122.204,-7.258],[121.906,-6.471],[122.155,-4.458],[120.801,-3.571],[119.05,-4.597],[118.214,-4.638],[116.374,-3.779],[115.111,-4.788],[115.55,-6.767],[115.33,-7.578],[113.944,-9.059],[114.519,-10.574],[116.543,-10.767],[117.251,-11.232],[118.24,-13.01]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.792156875134,0.250980407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"Group 3","np":2,"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.505,-1.167],[0,0],[-0.505,-0.114],[0,0],[0.943,-0.856],[0,0],[-0.051,-0.5],[0,0],[1.094,0.643],[0,0],[0.456,-0.204],[0,0],[-0.271,1.238],[0,0],[0.347,0.374],[0,0],[-1.276,0.121],[0,0],[-0.247,0.443],[0,0]],"o":[[0,0],[0.204,0.456],[0,0],[1.244,0.236],[0,0],[-0.371,0.329],[0,0],[0.16,1.265],[0,0],[-0.44,-0.265],[0,0],[-1.156,0.543],[0,0],[0.11,-0.487],[0,0],[-0.859,-0.925],[0,0],[0.5,-0.051],[0,0],[0.559,-1.129]],"v":[[72.384,-39.915],[73.763,-36.749],[74.881,-35.848],[78.259,-35.189],[78.99,-32.528],[76.417,-30.256],[75.91,-28.918],[76.333,-25.498],[74.032,-23.991],[71.059,-25.734],[69.638,-25.804],[66.511,-24.345],[64.367,-26.058],[65.113,-29.42],[64.739,-30.798],[62.384,-33.314],[63.361,-35.888],[66.8,-36.217],[68.002,-37.005],[69.682,-40.027]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.792156875134,0.250980407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"Group 4","np":2,"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.809,-1.193],[0,0],[-0.586,-0.02],[0,0],[0.87,-1.153],[0,0],[-0.162,-0.546],[0,0],[1.355,0.485],[0,0],[0.465,-0.324],[0,0],[-0.04,1.436],[0,0],[0.465,0.344],[0,0],[-1.395,0.404],[0,0],[-0.182,0.546],[0,0]],"o":[[0,0],[0.324,0.465],[0,0],[1.436,0],[0,0],[-0.344,0.445],[0,0],[0.445,1.375],[0,0],[-0.546,-0.202],[0,0],[-1.173,0.849],[0,0],[0.02,-0.566],[0,0],[-1.153,-0.849],[0,0],[0.546,-0.162],[0,0],[0.384,-1.375]],"v":[[-72.477,-49.109],[-70.273,-45.873],[-68.837,-45.105],[-64.934,-45.085],[-63.559,-42.274],[-65.945,-39.2],[-66.228,-37.602],[-65.035,-33.881],[-67.28,-31.717],[-70.96,-33.032],[-72.558,-32.809],[-75.733,-30.524],[-78.483,-31.98],[-78.362,-35.883],[-79.069,-37.339],[-82.224,-39.645],[-81.678,-42.719],[-77.917,-43.811],[-76.744,-44.943],[-75.51,-48.664]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.792156875134,0.250980407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 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":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":121,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /app/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Recover 4 | 5 | 备份 6 | 恢复 7 | 8 | 💪 正在努力执行中… 9 | 成功啦! 10 | 11 | 欢迎 12 | 错误 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000 4 | #000 5 | #000 6 | 7 | #FFFFFF 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Recover 3 | 4 | Backup 5 | Restore 6 | 7 | 💪 Hard working… 8 | Successful. 9 | 10 | Welcome 11 | Error 12 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/test/java/com/wwxiaoqi/wechat_backup/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.wwxiaoqi.wechat_backup; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext.kotlin_version = '1.5.10' 4 | repositories { 5 | google() 6 | mavenCentral() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.2.1' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | 12 | // NOTE: Do not place your application dependencies here; they belong 13 | // in the individual module build.gradle files 14 | } 15 | } 16 | 17 | allprojects { 18 | repositories { 19 | google() 20 | mavenCentral() 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wwxiaoqi/wechat_backup/73df69284236b6c96c592835f415bb7eac71aeda/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Oct 08 20:10:43 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | rootProject.name = "WeChat_Backup" -------------------------------------------------------------------------------- /signing.gradle: -------------------------------------------------------------------------------- 1 | android { 2 | signingConfigs { 3 | release { 4 | Properties signingProperties = new Properties() 5 | signingProperties.load(rootProject.file("signing.properties").newDataInputStream()) 6 | storeFile rootProject.file(signingProperties.get("storeFile")) 7 | storePassword signingProperties.get("storePassword") ?: System.getenv("STORE_PASSWORD") ?: System.console()?.readLine("\nStore password: ") 8 | keyAlias signingProperties.get("keyAlias") 9 | keyPassword signingProperties.get("keyPassword") ?: System.getenv("KEY_PASSWORD") ?: System.console()?.readLine("\nKey password: ") 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /signing.properties: -------------------------------------------------------------------------------- 1 | storeFile=WBackup.jks 2 | storePassword= 3 | keyAlias=wechat_backup 4 | keyPassword= 5 | --------------------------------------------------------------------------------