From fc69284365716539f862c442fa2b6b5ea77cd3fa Mon Sep 17 00:00:00 2001 From: litingting Date: Tue, 16 Apr 2024 18:09:49 +0800 Subject: [PATCH] =?UTF-8?q?V1.0.1(2)=20=20Ad=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 18 + app/.gitignore | 1 + app/SignInfo | 3 + app/build.gradle.kts | 79 + app/google-services.json | 29 + app/keyboardSkinning.jks | Bin 0 -> 2580 bytes app/proguard-rules.pro | 23 + .../theme/ExampleInstrumentedTest.kt | 24 + app/src/main/AndroidManifest.xml | 59 + app/src/main/assets/selecion.json | 1138 ++++++++++++++ .../keyboardskinning/theme/KeyboardSkin.java | 37 + .../com/keyboardskinning/theme/MyData.java | 42 + .../theme/mylistadapter/ThumbAdapter.java | 82 + .../theme/mylistener/AdCallback.java | 13 + .../theme/mylistener/DownloadCallback.java | 8 + .../theme/mylistener/UnzipCallback.java | 6 + .../theme/tools/Admanager.java | 128 ++ .../theme/tools/CustomViewConfig.java | 200 +++ .../keyboardskinning/theme/tools/DrawIcon.kt | 53 + .../theme/tools/KeyBoard.java | 849 ++++++++++ .../theme/tools/KeyBoardView.java | 1368 +++++++++++++++++ .../theme/tools/MyKeyBoardView.java | 157 ++ .../theme/tools/MyService.java | 183 +++ .../keyboardskinning/theme/tools/MyTools.java | 270 ++++ .../theme/tools/SpaceItem.java | 56 + .../theme/ui/ActivityHome.java | 117 ++ .../theme/ui/MainActivity.java | 33 + .../theme/ui/PreviewActivity.java | 236 +++ .../theme/ui/SettingActivity.java | 98 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/btn_download_background.xml | 7 + app/src/main/res/drawable/de_keybg.9.png | Bin 0 -> 6989 bytes .../main/res/drawable/de_keybg_press.9.png | Bin 0 -> 6643 bytes app/src/main/res/drawable/de_keyboard_bg.xml | 6 + app/src/main/res/drawable/del_icon.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 ++ app/src/main/res/drawable/ico_shift_lit.xml | 9 + app/src/main/res/drawable/icon_back.xml | 9 + app/src/main/res/drawable/icon_download.xml | 15 + app/src/main/res/drawable/step_background.xml | 7 + .../res/drawable/step_background_selected.xml | 7 + app/src/main/res/drawable/step_selector.xml | 6 + app/src/main/res/layout/activity_home.xml | 27 + app/src/main/res/layout/activity_main.xml | 18 + app/src/main/res/layout/activity_preview.xml | 86 ++ app/src/main/res/layout/activity_setting.xml | 61 + .../main/res/layout/customer_input_view.xml | 14 + app/src/main/res/layout/list_thumb.xml | 17 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/mipmap-xxxhdpi/icon2.png | Bin 0 -> 166239 bytes app/src/main/res/values/colors.xml | 14 + app/src/main/res/values/strings.xml | 8 + app/src/main/res/values/style.xml | 81 + app/src/main/res/values/themes.xml | 8 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + app/src/main/res/xml/im.xml | 11 + app/src/main/res/xml/view_1.xml | 149 ++ app/src/main/res/xml/view_2.xml | 148 ++ app/src/main/res/xml/view_3.xml | 154 ++ .../keyboardskinning/theme/ExampleUnitTest.kt | 17 + app/testKeyboardSkinning.jks | Bin 0 -> 2604 bytes build.gradle.kts | 12 + gradle.properties | 23 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++ gradlew.bat | 89 ++ settings.gradle.kts | 22 + 80 files changed, 6779 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/SignInfo create mode 100644 app/build.gradle.kts create mode 100644 app/google-services.json create mode 100644 app/keyboardSkinning.jks create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/keyboardskinning/theme/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/selecion.json create mode 100644 app/src/main/java/com/keyboardskinning/theme/KeyboardSkin.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/MyData.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/mylistadapter/ThumbAdapter.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/mylistener/AdCallback.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/mylistener/DownloadCallback.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/mylistener/UnzipCallback.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/Admanager.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/CustomViewConfig.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/DrawIcon.kt create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/KeyBoard.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/KeyBoardView.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/MyKeyBoardView.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/MyService.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/MyTools.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/tools/SpaceItem.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/ui/ActivityHome.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/ui/MainActivity.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/ui/PreviewActivity.java create mode 100644 app/src/main/java/com/keyboardskinning/theme/ui/SettingActivity.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/btn_download_background.xml create mode 100644 app/src/main/res/drawable/de_keybg.9.png create mode 100644 app/src/main/res/drawable/de_keybg_press.9.png create mode 100644 app/src/main/res/drawable/de_keyboard_bg.xml create mode 100644 app/src/main/res/drawable/del_icon.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ico_shift_lit.xml create mode 100644 app/src/main/res/drawable/icon_back.xml create mode 100644 app/src/main/res/drawable/icon_download.xml create mode 100644 app/src/main/res/drawable/step_background.xml create mode 100644 app/src/main/res/drawable/step_background_selected.xml create mode 100644 app/src/main/res/drawable/step_selector.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_preview.xml create mode 100644 app/src/main/res/layout/activity_setting.xml create mode 100644 app/src/main/res/layout/customer_input_view.xml create mode 100644 app/src/main/res/layout/list_thumb.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon2.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/style.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/im.xml create mode 100644 app/src/main/res/xml/view_1.xml create mode 100644 app/src/main/res/xml/view_2.xml create mode 100644 app/src/main/res/xml/view_3.xml create mode 100644 app/src/test/java/com/keyboardskinning/theme/ExampleUnitTest.kt create mode 100644 app/testKeyboardSkinning.jks create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d303db9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +.idea/ +.safedk/ +app/release/ diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/SignInfo b/app/SignInfo new file mode 100644 index 0000000..1881d0a --- /dev/null +++ b/app/SignInfo @@ -0,0 +1,3 @@ +签名文件:keyboardSkinning.jks +别名:keyboardSkinningkey0 +密码:keyboardSkinning \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..a52dd27 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,79 @@ +import java.util.Date +import java.text.SimpleDateFormat + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("applovin-quality-service") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") +} +applovin{ + apiKey = "y87o4e7vb5bbqzuGVTFyOIfZiyBG0Nf0Ksq8S3m2MJOHf_A5BcWGJnKuQqoxwxVvtdQdiTC4O3MPzFwy8rJ9Cc" +} +val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) +android { + namespace = "com.keyboardskinning.theme" + compileSdk = 34 + + defaultConfig { + applicationId = "com.keyboardskinning.theme" + minSdk = 23 + targetSdk = 34 + versionCode = 2 + versionName = "1.0.1" + + setProperty("archivesBaseName", "KeyboardSkinning_V" + versionName + "(${versionCode})_$timestamp") + testInstrumentationRunner = "androidx.theme.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + implementation("androidx.core:core-ktx:1.12.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") + implementation("androidx.activity:activity-compose:1.8.2") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.11.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation ("com.github.bumptech.glide:glide:4.16.0") + implementation("com.github.omicronapps:7-Zip-JBinding-4Android:Release-16.02-2.02") + + implementation("com.applovin:applovin-sdk:+") + implementation("com.applovin.mediation:vungle-adapter:+") + implementation("com.applovin.mediation:bytedance-adapter:+") + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + implementation("com.google.firebase:firebase-analytics-ktx") + implementation ("com.google.firebase:firebase-crashlytics-ktx") +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..9f205fa --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "385313805976", + "project_id": "keyboardskinning", + "storage_bucket": "keyboardskinning.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:385313805976:android:9e3927a4b6f971fd4ce2ed", + "android_client_info": { + "package_name": "com.keyboardskinning.theme" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyBNx_DWofqkP9FDOyZ2UjK7ryHfLPcD9OU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/keyboardSkinning.jks b/app/keyboardSkinning.jks new file mode 100644 index 0000000000000000000000000000000000000000..2bd7b5518bf966054069dd5bb3e9fa65db663654 GIT binary patch literal 2580 zcma);XHe7G8pe|lN`O$L_k=FU@((R6AXTb@5J0Llk)pIq4Il_XzyQ)TNZ+7HRq3He zK?GsxB8wskMQVZyQe}n9&fRh6e!6$goO9;)6LGLwC=OP6iXQ_w#-aa`7(1aj#@18ZbUN#p*#360vw|T+9Hagz)B${cIvC-A z6QKFeksVNk^70*JTx&6y*Gy4_z_I7rQ6<51JP?T7=}!;x#wJF1`^1yt#3Xkw$#Edcoej4y7*FCST4#!0R+=mn z$eR3k&!sfnic8mF(b#$9&vPR~uk z37Dt1dA5mn$dF{6O2xS4`ut+z5#!$i72Dt#UK*Y&n)UuMe_5teTW|8PM87d_>2NB3 z_Pqs&;Xz|M>4lW($S6)DYp|vMvCh75KXz3xCgME+*h ziZONi3dy?qNPAsOGjWm#kMT8qN+>|jz91xNks$PuDonx&FA$ZS+!Vsc<=zg2Ds zH~6lk+wHPJp(w9IrWWHO%RFp$rM^Bsk)>Akvzl%$!*7aJvUQw?O zp`JO&wCf}RFn8LQcQqC5pPFa+@QTNe8l=srmqD!M^_9jlzx+{Im+3BZP0UMKjUV~z z5XYcF;9S1!1fGHW>A_tcB5|X|VJ3O&&o$R~-~mN=g<*0oW?|+7clA+25XMLeInngu zfCYZ9j4f-hLl*tfr)p>F9GS9sM^d|mv&PK7*X`TyXY^cl`u34C@W>J&rS)4eOTGhB zLh8GHnlJNY@bx{4>ZZ{{2#y)8W2WQS?=L#CsoCCz&43`;8mi=&-3{Shx_eWp+)Df5 z-kp`fL$JR@G*%@m)F1`&385&UMX&uqPMH-yN992w>wd zIoN%ke#Q72tkUQPQvG5%4H{7-eG4~c%XxoNt6nb7z$p7sAI>N!{f4}Ra6x{z+VVNJ z9QH_jMJy#(xjaJH(Dl>#ZVdaI#$?W(S$}l3uyS+v1||tD{JO}S7Ey{FV$I=c6HO9) zrFFqC2a&`9mbXbhHwgLUtt#t}R5UCIAfMWqHZ2~n4@2!Ms~)YsZuA?tfO}bR&Cbo8 zP|BLo1}zRnOru-@^v}42@uC#O%(EV=AfV&Mo0;W8p=Ubkhpn~B1%BnomDDK8ei*d6dFlELpN@2ro@W~r zjH0BOSZ52a)XCB&i0{a$T%2>?#q!wsmtin+-e+m%sma~`iG1^|7XgXF-Bgo3G1i1; zo0PTVfSu_(XjCuV)5xcu{+)3>`LPaSpXsVvwfS+dC3IqB*Fa^;d}?3!{q`=be5B<2 zH&MNP6c#6i@fGhvOXz$|UYr$ej%d2FAK;-^khVDlMx?*001Dj`d=MwCI#g-vRo`b% zR8+nRG7$~Xk*dgMWlxPr2+>9gm7 zi+(OecGR@J;!!MzEq+MyfNnHu=~iXi5q-e@mY9*0c|UpZwsg|EHiyUAwJ^)TIACh}a;gja6X!vs9a1Rs8p~@N$FwX6%wSd3 zxH0(EROUH)V7?_oPZ-K`%)M-n-}EWxG~aAx-j+$PQ^4;qy)JKu)GZ8FEg>zA|BTINp7&FiE5WyG`fUD9|vf5;#xq54t@m0WCU@Zi%zwSCee}A{h#8hl?$zt?>jH=lVi8OgfVy2>4cLNOWG|^x?~5~k!27zsK9YG8CTwoh-*l~5j(eKkL0H=Fd%E&w7w-4~?MDdaKVcsu^+S#~0A)W3n| zBMRkOjHn8I9Z)JCEOyewAZ=$Xu5@M_z7%QHx8btiF!#yP4Wde*a=_p&aoHXt^c zH4aXrXVV_Ut@)b_+WS`GwRZRx!T@lC5Em)X3t99umUUC${+u~r37`P@&rS&fW&}YI zKVF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/selecion.json b/app/src/main/assets/selecion.json new file mode 100644 index 0000000..8497c8b --- /dev/null +++ b/app/src/main/assets/selecion.json @@ -0,0 +1,1138 @@ +{ + "list": [ + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/19c72296075224cc8b9f702da834dc92.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/67bd14ce39e3d1127f1d9290c932aee5.webp", + "title": "Funny Xmas Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c28846d1d4909623466315e00e54fc5b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7726ce5eca5559cffae7d09374b693dc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/849c68ea7079053c790a72c70a065ba1.webp", + "title": "Bpink Kuromi Melody", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cfbf822f0566145979830f300d3dc803.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e611444bb8f5c320201681b157999a9b.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fbdc422a14eb6061b6c68f420af4872c.webp", + "title": "Cute Xmas Bear", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1feffec760891fcd014ee8f932284eab.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3dfe97e1613f4c8691f46b73dcbc4cb3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9a9aebb1dde282afee915143cf08c38e.jpg", + "title": "Evil Mask Man", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ab40377c02cfc54dde46edfbff7ef744.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/65c1b7ca8f5793b08b7ec8c9d50a0ddb.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f3224f0b24703bf5c5cf18dc38f17d9f.jpg", + "title": "Christmas Santa", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/33cdf721aeb9319bf16f004246aed924.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cee280737d1e5ebaa720c95872ee3151.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b0b92f7f829f32c3ac3ee3b7a57d0f8e.webp", + "title": "Cute Xmas Kuromi", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f84a09a2792b05aa2b84dac22284a575.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fc4565b86b4f1083594b0387734c1836.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fa1898b6346177cb1bb972e8429dea51.webp", + "title": "AIGC Pink Unicorn", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7b828e919375fbfe0a8117befb879268.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6982d859647ec22618f036b45b98fa67.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b8e6aa60756bbe23de1d1214ae50e499.webp", + "title": "Neon Cool Wing", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d20b56ed72c6123f8076de1296af60c2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f475b077711f41b6ece8dfdbbc1885a4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9ccb3cddce8c852380be6de6c5227504.jpg", + "title": "Christmas Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/597c54130a6d88dfa6a4a196c923b69a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4c1d9da5bf3b19a9684ba5a1312a31f6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/202074ea9e72cb4efa152eb46200aff1.jpg", + "title": "Cool Kakashi Naruto", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/028c883129ad8ca296ea2a00100a5d86.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b229b7f18a721abbb022298f644c7e48.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3659ea237954edee888248bff739a280.webp", + "title": "Cute Kuromi Melody", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8c4d30e090e6f7f523a1e51d53763a5e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e05996b00af94d6d9aa8510187afabd2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ce0a9e71535715abf6ee3a522ecf2ce4.webp", + "title": "Cool Red Neon Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fcd8940f87c864f0c23985da0cfc2d62.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/93abfe4fad90e5ba17f41124a099953a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e9d601af238ee5792ef07adac7faeb3f.jpg", + "title": "Romantic Neon Kiss", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/365f8ff6635d475002ef3decd5a9698c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6ffc7079cfb591d1d9cda86f756064d5.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f3ad8a95489cc711adfabebcc7380530.webp", + "title": "Pretty Colorful Key", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cbd38b72a48e246a6d29878f3a6fa86a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7eabb5b734ccb15e37c80e2acc79d3f2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9891901587a3a9f1add0135aee722565.jpg", + "title": "Christmas Nezuko", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/53e7253d92287e3e950fec09e21a39fd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/250a0646a4d7ff27730c51dcea975116.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2a784e04c665b8f0e423ddefd470da6b.webp", + "title": "Cool Heart Bat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d965528505cf318c8e9ebb4745603ca6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e747a0e22258790a593acb4496ca876e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/081e65ef9eef2fd97fb8e0b1af447030.jpg", + "title": "Sad Simpson Nike", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e0c271782ebf5495f97cb3cef52e3524.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6712cbd2ebf9b2f76da5e78fac5415d8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bca73e99c4be52841bf1bbb2dc5abc8a.jpg", + "title": "Red Christmas", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/077ae89e2171637381e8f1b32a7578bb.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4fa76ec0e1343db328860cc771d288fa.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a7009422f4207c0b7ac3d418cbc61d3d.webp", + "title": "Cute Gingerbread Man", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5dec257d0e290c4856e79de9b0f3398f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/de3b7758d5aa862b573a4f192da07f95.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3c4aa84e6d22d059e150f2eb275cb794.webp", + "title": "AIGC Devil Angel", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b7f64f1802ca3dde387a9123d7e74aaa.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c8749ae47b6731b61018e406b1340d8d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68884b53696f46116207b3ef9f964d90.webp", + "title": "Cutie Cinnamoroll", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b5ae2ebcbe3259bc6ee43ed5840e7694.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/31e81bc6237d682b647cdc686b71b37e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/67ab6aefcf8fffa6ce4a9a44cff032bc.webp", + "title": "Neon Drift Emoji", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d824ad24f725cfdacf208fbdf109a1f7.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e409a3da5f4dba5d54a60ff2d392f9f9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dab694f4bc985c7b7d757905e7b8034f.webp", + "title": "Xmas Heart Circle", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3f6bcbb8ec8361e677a079780e719e28.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d3e8ab16af342abc1e2569c549510e63.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/25c160c57909c28d211822e017949c9e.jpg", + "title": "Flaming Skull 3D", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7ab00ff74e28544903845323ac39b922.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0df6a14dae6b078ba3f0e9f8281d1340.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4440ffa39901ba4228598d2b0f3341c1.webp", + "title": "Cool Nike Rick", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6c309ece2a9bb4b2f043ee5188964988.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1cc5bceeacd8f9b131f8db43f4f0b865.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/295db2678930c18ebd690639b85e4e83.jpg", + "title": "Stitch Christmas", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/59d8b8467f9ca9b49815e9bd3a3d8f6b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/149d4845cde5c0c13e2919a00b80eeab.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a0c719bcdefbdbf0a5d53e2b966c5004.webp", + "title": "Special Waterdrop Key", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8e586ae05a8b3e141e890d5b070ed4fb.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f9522d243bbb0c63cbd47ce3bd4ec0fc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d0cd4507a09154d133943a7a3e7caa52.webp", + "title": "Cool Love Heart", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/317d6f9365450fdf635d9da547660ec6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/218b6bbf5bea541fdec77553ac82a737.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5b98879e233ff316f9b170bbfd911582.webp", + "title": "Cool Mixed Ghoul", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/14b8b447c40a2212964bbab6f1298834.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/997c00af1b3327857e0acd30a8517ab9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e4e3306d615dcc407b0a7de70e17c097.webp", + "title": "Cool Mixed Emoji", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e2d0f4e61fdd4c6bfb1c8ac71e068098.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/24af12017b9a1c17a84b5317aeb8d133.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a7cfed5a97309aee2df2b28cdc67ccb9.jpg", + "title": "Christmas Gift Kuromi", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/480971ba45558dbbc8eec075da9c64dd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c2675ad23b1c85d6b1ade36eaaa1f8c6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e059bbc65815156bc8eee9f9e860132c.webp", + "title": "Cool Nike Money", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/446f54b91b8dee5504733ae8a57d23ba.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b5f83c8899cdc2951ddc26ab9ffc2d02.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/28b66f028765852a04258b4673779c2c.webp", + "title": "Cool Venom Spider", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8f2fe009a00f60ea043b68252012cdae.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ecc9ef999fdbe5231125d50a3fab682f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6679ad952bb78f77ee274bec8f2f58f2.webp", + "title": "Neon Melting Heart", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6cf7a1c227207e1250b6159fa176a31a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/60378711e59cf8a75ad2591f06de4489.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d3b19bcc3a7e424853c72816abe46b3f.webp", + "title": "Cute Squid Man", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3f24e48d939c29e36426252e348098d0.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/159607275857cd4bd2b02d591c205a9f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bd10941715cae62f5cb1eda06bc3a204.webp", + "title": "AIGC Cute Panda", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9f2d356bbf9d7be536b93bcd5cf9d543.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8c8cdc83387722c6ea2516a2c62a5d93.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4de1cd0960e3ec2480d7cfca94b7e83c.webp", + "title": "Cute Xmas Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/206e1280394b53807c4391bca4c11d40.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2d05a2a234df44cc9def55ec33db91d6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e517be463771ac08c9acd225a0682df6.webp", + "title": "Cool CR7", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/abf336051fb870e6cb92fcaeffc8022e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/15e66e5f615fd3917a3d1c2047aeb559.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5007e0519d761be92cc2ecb1e08650c3.webp", + "title": "Cool Neon Flaming Boy", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/40a4f9bd14dba1714dbe72b5dea2eeca.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/415b84a5d098f495a15aeb378098e80e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8e97e2629a1da74ed5a5b9fad56b03cf.webp", + "title": "Cute Powerpuff Girls", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f756638f24ec008b6acbcdc5ab8c05a5.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6fdf8be7acd591573adf7bd908acee10.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5b439b7da0277c465b9da2b9966c30e5.webp", + "title": "Cute Football Player", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e1d5083956769fd06fc7639761becfef.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d3ce935f39cfa4bf877370e7166523e0.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f9b79cbc3b678e9a7e63d334ea66fc7c.jpg", + "title": "Neon Christmas Tree", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1d3a383e77eb647e2556090591f7dbb2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/612b0f2fe36fab27f7fcd57dd9b26d75.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a1acfad859114a6ae81730757ac67140.webp", + "title": "Cute Xmas Cinnamoroll", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8e210f36002c76db194aa180d3466595.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e9ee44d3abdc0296cc1d59b8b6183446.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6f46b9dd4d1c786b361088edf144b9a3.webp", + "title": "Cute Xmas Deer", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9e5730176b23e6a914a6a0bdf88916d2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0589390407b4edfc6b24c0015b7b2ac2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/46c43fd49c76bbc2b8dd02df338bf695.webp", + "title": "Neon Love Flamingo", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/12fe0fa555120bfc0be3051b32f86375.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/69433cef1acb4ffc6619084480dcf259.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/04905d4acd96521c99349ac80f5ccd67.jpg", + "title": "Santa Christmas", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2bc39e79ba2f51ef49f48979312227f4.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1b379c19538834341019c3295fa1f529.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f0983af41a1e5ce36dbc033fe4c400b6.webp", + "title": "Cute Stitch Cinnamoroll", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/67c52d5ca6ab3ae8696d9e8a95b03254.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3f49b5b00e613edaee088ca4f37f706e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/946b79b12bd50d674e63b5cf0593218d.jpg", + "title": "Silver Pink Minny", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c6de4110f95ae3b6e1d1bf4f5b61c498.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/39f1c021de417cac2d2f5adb91d42dad.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0e286fafd9b213777b0caa1ceba963f5.webp", + "title": "Cute Offline Dinosaur", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ec4891698215ac4fd0b6e63baa727833.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/29f27eedcac66402366aa9516e8daa3e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bfe6a2fc6d950cba569707c5c543078c.webp", + "title": "Neon Burj Khalifa", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/01338324032359830a77f6ab0014befa.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cdb7eede596df9d91457de27ad5d6815.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c0bdaf8bed469ce1053ab4297c616b0b.webp", + "title": "Cute Pikachu Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d7ab8c56560ac97f5619de24eac41a92.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d8093364a2a6a6f9c31d2c5a63f5c4e6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/50207c096ebc8f5995f99e3e4ae869d0.jpg", + "title": "Christmas Neon Light", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/11481d267beccb6640bbe91edea69c7f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fb609e8e53b4fd23c7229457392848e3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/efcb9a2268268d64edd0457f37f6075a.webp", + "title": "Cool Moon Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68a2409d9717e1d3fd3dbb6a159dc81c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2b3602b99dc2d22b7a6ad4967a4321b7.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3926b5f13a5aa50e0ea7cfaa17acbd6d.webp", + "title": "Cute Strawberry Cat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a97b79f4113b60af52fde7d9ca0b2fec.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bee34a4872a99e750c9aa0cc0f8b3179.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/302b7b6dc4590c74f6454bed49b9d665.webp", + "title": "Cute Cinnamoroll Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/263f4e7f64420c2175a6b8c20d190e3a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6fc7dfdea315b6773db81606eb476ad5.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9d4393fbc371a7bab1fd9982cbe8d8c9.jpg", + "title": "Aureate Christmas", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/157046fdd05e8d4a780caf2a8f581b84.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/11536531038f4a945d88a284cf83a354.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/41dd2c02c73935c5f626355494405142.webp", + "title": "AIGC Laser Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1e4bc9b454202f96974304ca3bed1918.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b1660e51a8365bcd7ddd7fd5edf5b660.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7234993b12877171b146598274df09ec.jpg", + "title": "Xmas Candy Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d7b2a115a7765519af080acb5cac5b78.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/56aeb0b3f484debe1adc5dfe72000a3a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c8334dac14fc0499dd6f2a1f7645582c.webp", + "title": "AIGC Horror Face", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d256de70b9b9f10c57b1710ff39034d2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e284869bfd6756834c580c808a662231.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/00001d79a10c164daba1aef9fa77c53a.webp", + "title": "AIGC Cute Cat Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/861fc86385757321d6527238c00410fa.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3373cab3c2bcdbf8e23d4345f0c169c8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/19f135b9cb5f52363f89a00af9e879f1.webp", + "title": "Pretty Laser Rose", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9e2292a30ff94aebceda47aab7c0c83b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/edddc804ae1dd2352b90ce9d3c506df9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cb6553826244578449509407e94af124.webp", + "title": "Neon Fire Heart", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b4056791fbc8052a1242420e2f85fe97.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5654e6cf01b84afa943edd9d51ccfa0b.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/43d59f969c6eb35ecc90cccd949ba984.webp", + "title": "Cute Christmas Rabbit", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ce5bdab2a653a8f5d19fd41b7f03d909.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/250fdf5ef5ea7e48b083aeebadcf7d0e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1d96ef4f1c6b3a963019078b5d5e9bbd.jpg", + "title": "One Peace Luffy", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1c0861ea6a0840cba75cd68f75e361cd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b80b431839c71a5e67fed6943f4d4c3e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1402647cc32a756004c8b68d5de40226.jpg", + "title": "Galaxy Liquid Droplet", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/56a1d39ac052dce7ad7c5b8c3bfa21c2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ce2d17b1151c0a97b53622eee755b5fe.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/94293a2fe747d10b660082157243e9a0.webp", + "title": "Colorful Football Player", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ac5aae4846258797560ce2d19a423036.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0624a878ed2ac0ed926d23f197dbe2a7.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e8416a79e4f148fca9ea02c75120bfd3.webp", + "title": "AIGC Pretty Gothic Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c86645805ae4283839eaf084e029abcd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2f31412046aaef6884be1805e737df83.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bb30a02b550ebb38c0854c917bd3f075.webp", + "title": "Cool My Hero Boys", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1b9e8a6327af0294e5b2589954b93929.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c3ec0a90880940b4a5b20bdc3be7e277.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/09895d061bf0496651be7e3205524af6.webp", + "title": "Cute Heart Cat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d86b256f7d712150c78b727390d7dacc.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/42397e7f5caa7cfcfde15c069cfdf6b8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d0e92526487439b64944a456839e54c6.jpg", + "title": "Neon Red Heartbeat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f246376590b509c63173963c71335535.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6b4c7a57ace55a55e8c0851e942ab59b.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/26461eadf045f3da914f9f0fd2fe5314.webp", + "title": "Cutie Brown Bear", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4153f92552e83d90010b7e8dd69ac343.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b2734060cafe6151f864c405cddd87bf.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8b745374502e89ef538df12cce096c32.png", + "title": "Cute Love Stitch Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/01fa065f178899fe2c18f29abb47ca5e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/773c5093402f82cea9fd55ad0619fc58.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4a0ddd37999eea0d155c9383ca5cd95f.webp", + "title": "Pretty Snowflake", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9a08e8cd1a76b6a722dd0b859f3224f0.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e7967fde707961b6462ac00536bd0a43.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/715dbdfe900bdc2fb802cec981eee8a5.jpg", + "title": "Golden Dollar Drops", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/883a7599e21c89582de8904fea9887c7.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/415c44c1aa7888be017f3c47a91d8bd5.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c565deb861739cf5c83f6114347938ef.webp", + "title": "Happy Snowman", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a36c4ed9af3a5457ce4c300b5dad450b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c47d542938bde2fcfbd66dbf8cf6f3aa.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/29a342dc78dc7e2552e100c9d8d14867.webp", + "title": "Purple Neon Unicorn", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6ff9b3415b979b8d92b9c8cc7d085ead.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5c7b1822eb1a81baf4dd568c3babd199.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c9792762d40f0b26092fbd6b6face09c.webp", + "title": "Cute Naruto Kurama", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8a0931c0dc054b11549de33d96d8d6b6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/76e022b002a44788a7a0fe87dfd77a42.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dd00cb8a904731454f87e7211f810194.jpg", + "title": "Thunder Neon Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2ae0bd4ef1a787cddfd990d7eb68aa0a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8e9e438516ba33233295b4a86c3fa614.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6dde8575c9344cf57a3a6498ff6cf875.jpg", + "title": "Fire Phoenix", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e464c81b3681a1c0dffad3fb973388c6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9a3b917b143137d41c6e6c8d1e36dee4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ff2262efdc37025ebb4d485071f9a595.webp", + "title": "Cool Black White Nike", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/953e6c52b283051a40149233237761f4.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4ff92018445d75d3f8f8b5acc3133a0d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/402223a10d734581b955ed749ad84012.webp", + "title": "Romantic Purple Universe", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/20480729a207c5f930bb917ad94d29a3.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8379d2f98ac8efd25ff3e876e2d6356f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c22f1ded0493b39af61fce5ab3631503.jpg", + "title": "Broken Hearts Gravity", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d5fca72596b5a5c2f192100160018007.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d964df07da8ce5f0d056df5656fcbf1c.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c1dcc97407c149c92e02bf778429ae23.jpg", + "title": "BFF Besties", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ae8f770c80ed51603f631aab0b4ec5a1.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/581476ba9d98d54465d585683d38752d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4b2d441c2440a5f02aa4dc15da32519d.jpg", + "title": "Sad Emojis Gravity", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1de9a8cbe6df14c3c07049d27141232e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6ba97361c79a9639d3c6099e219c2b43.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/97a1d4230c053cec2a187d9c39e5b449.jpg", + "title": "Love Heart Neon", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c96cedb306c2b6295e902a42a3539c27.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e1cab9141900726c0c14fe4adace8725.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/62a667571d748b81d8bb0767cc6c1f20.jpg", + "title": "Cute White Kitten", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c13b6813ebff77644478783841569658.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a0472c6ee4169ac7263e0ddc819599bb.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3819bc8f3eac85c49da446314e5f333e.jpg", + "title": "Neon Smokey Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b51bb61639f824bfc53bcc0bfa132499.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e8b924b23dbcffc8e23d558c80693bbd.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0f5f3d698a66475aaeb200c97a1999f0.jpg", + "title": "Luxury Gold", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/99580efba06827f7c24fb93d7596b227.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bd46ac13dc611f984fc18c17c9a647e6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b5d27f5d7fdf570885e5c42154717843.webp", + "title": "Cool Neon Gojo", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d70311731a124c3205d4f332665540a9.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a39574ca0fe4af8898cf649eda785198.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d8cecddd87e1468d3768e2b364e61c63.webp", + "title": "Cool Supreme Goku", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68d540805df27db11b5ad4a6aab103bc.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/98f0673511e03a3ec593db83e64269ea.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/34a22286b89a5313e6bdcf3859278f43.jpg", + "title": "Green Neon Check", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7d865fa5d872b508a40b405d12e04968.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/67f31c05d5979936fc599df6664c6282.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a940f85a9a6e03916a71f4dbcbb813a3.webp", + "title": "Glowing Moon Bear", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0e912e316d295a1c33e4b6d3528fdca2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2717adff9440f50fc3539292b4280f41.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c2a2a3a424336892a12d6527810b9fb4.jpg", + "title": "Neon Heart Love", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7b3ff95709c61045110379e41bd3651b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e1a2a2820955823179458b660f962ddf.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b50c5ec68d7aedd2830142793b6f8ba5.jpg", + "title": "Cool Supreme Kakashi", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3dab8d819cf8589f360d7268464dc091.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bc61592ff75190347e8840cc6637f43b.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/61555a1baaad3ea85194ed431af92172.jpg", + "title": "Neon Kitten Love", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/553a163368a028f07ea83b381f436434.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2446a3b6ea52ac07eb102b28845d085b.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/991c6e9ff84f157b3d9f905667b00733.webp", + "title": "Cool Miami Messi", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9099167d4da67117fa3a6278ec1e254f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/295402bbf71332321fe0f69841a15bf2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/aa90572d37d672c92826393040c0ca39.webp", + "title": "Neon Heart Love Hand", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f2ed79331bf9fc0dcae7787c4b5ae71d.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fc641c9e4ee1b68e8bb0a5bffa438db4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8c1f5d6642fc644650d04692117d6718.webp", + "title": "Heart Broken Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/84f26f69d3c37e0fbe748404fe84adf1.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6f11ee658a213b186fbbae4267dd0e4e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f62d987824bd0115fcafc65510558af8.webp", + "title": "Pink Power Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b7ae9cb348df6691ad69acf7df3b65cd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/519a79881a7503f235602a699e4446d2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8f7d2fac36b327b80905986f8a19fe9b.webp", + "title": "Cool Colorful Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/54b1c7e6195fd7169107a795b4ce0442.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e5dd9b83ee7c50013fa0c763d4b97cf8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/58beb08eded75a75d4b0b4457fe01a7b.webp", + "title": "Fantasy Glitter Sea", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f4fe349fbf0d07afb63d9c6a3c37904e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/47e0244b8d31591737023dd30ae8e335.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/44c7cd6ddfd72c90755e0062778a91e4.webp", + "title": "Spooky Zombie Hand", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/093e2c6cb33ae5b0f07256d9e0f29dd0.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/02b9783ab528e4ea823682d00dadc1a4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ab381b25a35a3e689e113d70954d0c1c.webp", + "title": "Cute Mixed Stitch Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/aba32940405dedc8febae62ed4b4ba51.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1d725cc37d4e868089e3b14fafc3dc96.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7f6971c44a4bce70afc514e7f39b546b.jpg", + "title": "Fluffy Cute Dog", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e731b589a8ed55bdc9298a308c8a3a19.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/50027210f8f4cf13c61998d906eddc2e.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/21c9965c2a63bfa42640f08e7974be9e.webp", + "title": "Cool Jack Nike", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d9832eab526fa16181e462313455d206.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0a4c27f9a8e5ab409124edfdd8159302.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9503af5c5db1f47b56527de23d609e7c.webp", + "title": "Cool Broken Batman", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/922542b804e2664c6c22fbf81c53fa6f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/36c3e498ce4bbbaddf164b258f636697.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/93e15cc90e3c17d0c3e094be97daf25a.webp", + "title": "Glitter Barbie Pink", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5e9d2f4b645292d21e327ed07ee91100.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a2893c26d90c762e409a3e2c60b6c604.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/364451115389dfe20779b27e68cfe586.webp", + "title": "AIGC Fire Butterfly", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4e9ea00b68a5ced5e6987e23e912887c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e5cfde953e0d1625a68fbb44756098fd.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0cd1ea4fc67b82bb9a472233a92aae92.webp", + "title": "Pray Money Skull", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a97f29676e85ccc128b220645961bcf1.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5336bae6e874a930a04b660102bf0ff3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0481eb42f646a64ef5b6395884dda792.webp", + "title": "Cute Neon Pumpkin Cat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7eca268d1f19054abce066ca51a70609.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d811c793fce17907374ee16179b1d288.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/75226c2c32ea1a28cec7cfc2d68a1861.webp", + "title": "Cool Natsu", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/591bea16d98f316039b722be8044936c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f9f105e0c2730f65cda1b7372f160ee0.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8f37c6ecc2cd9e012fbe658b50990378.webp", + "title": "Cool Skull Rose", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3e55cbb42d49d072eb06bafe6e862e52.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3e55fd7636c7953e0a94cee249496181.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7db247b6ed5f13f9d4fe367a99d5884c.webp", + "title": "Cute Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c2f952922d7d7f4c2a1006e3fa2baf44.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dc5472f21b4f962ad58ee4d602e1dbcc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7452bfb4742b25e4797a4fbac5b0c36f.webp", + "title": "Cute Coffee Yoda", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ab53669b1d109f488d6476d52bdf5ebd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c6cd526630ef7ad3fa28ddfdb3083ebf.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fe2d82675e06de64122851e54d68d064.webp", + "title": "Cool Horror Scream", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/026e9d37fe1a3271b1ff514a12c4aa0c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b0f00de00c3005041f20cbef9be3b81d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3eba90a97d3f435f3c682c186f86f540.webp", + "title": "Love Bear Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/587c041a47b1eb3c8131fb3763238769.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/660af5731173413885435ae3bfe2c414.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ce48fa4694894306fa77c560b192505f.webp", + "title": "Cute Spooky LV", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/36a87ff425fc48c37ee14917223a1c32.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d609594ab07dc8d3adc632a8d6104dbb.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/56af0400252e653b439ffe765d003b18.webp", + "title": "Cool Supreme Bart", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fea0b7362c5149ad10899e1275887cbe.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/eb6f2875f27a6ffe16eea477432fa3b2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b7975b0c56eee572c4c0ecf7408a9c5c.webp", + "title": "AIGC Demon Angel", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/559267b8b40feba8742b583e03d468b6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c2fc4bfa987ad4e4d1e4cbb4cd8f8e79.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f31cfd5e31998781f5a28dc8bac719d1.webp", + "title": "Cute Purple Witch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6996cf1224726828771ec248017d0d60.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7d9af181148acfc9012e70d2472eebbc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cc9e583660b15b4e931191778495acb2.webp", + "title": "Pink Smokey Skull", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/357f4ea01be6641528aee0ce8c9adf02.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/74d6b9ad2ef0aac3cad0bb1c31fc7983.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4a16c5a53d7ebc552161df14ce64aa4b.webp", + "title": "Cute Love Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6b015946f9e230eb747e7735a3f3b69d.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/304bd9e2ef110d90ee6fd9d0629e3d53.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8752a09615d81de04707d474e2212cd0.webp", + "title": "Halloween Cat Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3adf86b9b690e7f13c5522f4a80a9073.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8290532591f846a466f307426dd5106f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/47907642a2930ca5952f3b88591dcc2b.webp", + "title": "Cute OP Molang", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fadb7afd6abc13064c365b1963adaa07.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0cd3014dfe1299673a425ebc66ec2ba3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/21858a3a2b1370dd2dcdacf4289046da.jpg", + "title": "Love Parrots", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/05cdbfe6c9781ad45af02e2a1fe1656c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dda951cc92bf26a1afb7533097617542.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a988dad681f1136820c0031a445f7b4f.webp", + "title": "Neon Heart Kitty", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8559e55a5b5d9cac7c6fa6020812e07f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/41447fb48ac10590f5e32157c54e9ee2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4483a0071d703caf667fce975eaa94d7.jpg", + "title": "Fly Halloween Kitty", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/047a974042106e70ceed6fdff7a0ace8.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0c71843e172194a28c366a920e50c120.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d92e512ba6699e4f7f84f0f88fa419b9.webp", + "title": "Cool Neon Alien", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/65648185d44577b9375a4b5bbca96e85.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/452f91d05726acb051a3c720c911c218.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a3699f5a6bcc5843db71dcfd65b510c5.webp", + "title": "Pink Miami Messi", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d35c2fbacb24497a87144a7ae34572de.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4d073e98015c7ce15ff496d5aad637ab.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a04ae6cdc67da2cb0d91593849751675.webp", + "title": "Lovely Moon Cat", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9ea4400be830254af528c52d8874d95b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/33be81c491f825d671d1d91d976ba52d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a190ec1de0603851507df0ec9b0a7729.webp", + "title": "AIGC Neon Cat Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ab7f8138c6bce76772f7971bfb2dedff.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/93e37e82df00401b2e8cb78d447032f9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0efd9421eeb339899f5f188272e1ccab.webp", + "title": "Rose Heart Skull", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/90ff11938ab7d6d57487e4df5ed2a74d.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8ba47d924877b04b91fa4f1409b4a588.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/65b214274a02cadd6d6f738ae186cf04.webp", + "title": "Love Heart Bear", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/78fdda723d4dded718d0565a67f1509a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9da70d7b31903110d7e9772125040c74.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e06c2887246f213556f552bcfc7d046b.webp", + "title": "AIGC Barbie Pink Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d52f727727406bca52f183eb8cd660a3.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e6fcaab2212c76cdc53a5a72a65559b8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e517b9ff1e9e61ba33734542f0f7691e.webp", + "title": "Romantic Heart Beach", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b7d0d5b9f0cdd3f36293d2c40b8b27cb.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e3fb823b2f9f96d0fc4acd9e8970555d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/65781c5682de5bb899e4be0d0cfabc90.webp", + "title": "AIGC Colorful Neon Wolf", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68fba9d44db763ad15145a9987eebb1f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a580332b2208ad99556fa4a433f9b8d2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/985c0e1e2d3169f728f0d9eda38a0db2.webp", + "title": "Cool Neon Rock Hand", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/820b32c879fd3206c94d3272985a2201.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/758646c5f5b0a34fe2e859a929caa297.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ed7f0138afdf0621e72fd17eb1672b49.webp", + "title": "Neon Grim Reaper", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9cf5c5b728fa6a41d7ea1d823ca9c35d.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6db9c40254b2d67f0c2eb4ccae3d14ac.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d8fde605919741fb0fc5e60db8f2ff55.webp", + "title": "Sailor Moon Girls", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6adb1bb0aaf10106173a5fc11e2c33ba.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dd0b496336ce694f541cbb898daa16e0.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/956cd25f327bd851afcd588c2f4aaf81.webp", + "title": "Colorful Soccer", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/50bffb1a1a780398dda9efdfa408d773.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bc64c525341f3b72eb370d80074728c4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e522c6172e0b320d0d18b8614c298e54.webp", + "title": "Cool Glitch Skull", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5831eac819a0c940b88ab366efb3a5d6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8a319132b6d9c1bcbdf56700d54eb946.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/40cbb01094af0248aee99f1d6a1158d3.webp", + "title": "Neon Rosy Love", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4d9c4e069b065fea34735fc21e5316e4.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3cdc96a78cb98f3fa2f636a6e06a8755.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8dfeb33f9f06925da460ee6b783ae118.webp", + "title": "AIGC Cool Street Boy", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/60ae18f18e1881346ca7a1573689b0d1.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/9cd6ab0683434a6764bc70f489bcfd37.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a84085c8ed0da1b4f2730dbfab48754f.webp", + "title": "Lakers Legend", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2d4e3807de270814d3d7f3d463262e73.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3d01259924e24a366034b42162d229b6.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8b77c859bd6efa52252b690f25e99625.webp", + "title": "Neon Pink Scream", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3aea7cdd831166730d64b401d985a054.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b294b0b76cf3a91adcc483c3dc93c7b4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c728cfd4dca1adc8969b89537f9df437.webp", + "title": "Luffy Gear 5", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/64d1ae4762fcc321796a0954655d5ce4.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e91e00db15fb31e4d232b1aebddee4d2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a65d5594ead607f38db9e235ea8c9872.webp", + "title": "Cool Neon Switch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f0c4914f0a15d02f7cfbe9385bd85c2b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/084af4f1e6e44c8ebf442de5c76fa187.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ef43f2f31ef3a5f25592cf4f1c4979c4.webp", + "title": "Cute Gothic Bunny", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f36b858c08b6115fbcd6741d3a34c66c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d2b705b89f7a6088f3888f637a22c859.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/39e932255eaeda17b566c5c145200cde.webp", + "title": "Fantasy Castle", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/81b2c0eab158da26ea76f9fd3b75df41.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/32a1e6099b77a9d3a517645681dff882.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3efe850e72cf9a549375e600b88a2254.webp", + "title": "Cute Smile Shiba Inu", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c7832751c343cdec1e3a7e7489ddcd10.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/90214763a231016f82127b9ba598b1d4.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d3a95e657091ccaf86372b79ffbad797.webp", + "title": "Romantic Sunset Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0506816c201dd84e7e4293a02c327907.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3062c6c494ed0730ffb36abc03e9267c.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b630934122ad702396b8dd32c2f51cf5.jpg", + "title": "Purple Sparkle Live", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/db0dc00c3bf7ced21be4d65bc1cbf674.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/83d03503dc36c7588e57a8c7808c6efc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f87e9c7aec2675b89c9692101fc5d3db.webp", + "title": "Pretty Cinnamoroll", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5286420a88b8eaacd2b8a9b5efbe41c0.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/56d09a862dd0bcebe193c19b34d9986a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/38139313b9a5d9edd14b8303f38facff.webp", + "title": "Cute Ok Smiley", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d25de46da29dba77d39aef177198fb8f.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c5cf46899ae31946f15cb3cf355c7e05.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d7c5695339646f4b020707191ae5b264.webp", + "title": "Happy Heart Cheems", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/08bff89e5fcde339450ae224b162ca33.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8f51c53a5d692a25597a076887c0431f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6745e267850dae31387cfe23c96fd77d.webp", + "title": "AIGC Pink Barbie Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bf2339ca57610c3171a25278fa782131.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/226b504c98db299ecde1bc16888db487.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6beb9acbf52810ea71237ab7f4bd676d.webp", + "title": "Pretty Glitter Liquid", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/323b652bdfeae4d83f74b0c0198f8189.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2a589fa4ddd024a9beb49402e6dfd838.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bbd258d7ef1e431bb9cadfbcb3bfe8f2.webp", + "title": "Sad Baby Doge", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7110532db818650e370cb6efd2f03dc6.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b6e7f05553708df159ddb56d73be16cc.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/882e9dd76c15440a28654c3e56ed2790.webp", + "title": "Purple Neon Wave", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/63a10157419a3ec55314fcf795cecc8c.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bb4b51a862499de834ef9a2d56e8e33a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2b7e4f13c3f6c412ab0cd44af2330a17.webp", + "title": "Cool Fire Itadori", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68b3ad48afec1b770f80432461befaf7.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6ad0288014f7d06d44d37e02366325d3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e46cbc3565569cb91a9172ca96edbdf4.webp", + "title": "Cool Melting Smiley", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8f7fa9b6b0b5915bf62ba5cac11d9c35.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d4937284d26a654e44d1b52ccb380652.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1fb88616f46c4fc68514cf01b2b2aed0.webp", + "title": "Cute Unicorn Icecream", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/06ab5b6481f5da6f99f0eaab1bc7f4e1.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a3682119903a8cb52f8e7536d94c57e5.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/b80061f43dfbe58e59b37479eb0142f9.webp", + "title": "Pretty Pink Barbie", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c7e8948477d7a3bd1b43f4b8d4d44267.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e8612286b4e79d5a68b6b27dcefd4df8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/bf706ea3553d88133cd6e282e3ed1d65.webp", + "title": "Glittering Pink Chanel", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1da60626d96ea32c0d4e81c21b665859.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/59ccc2d6702d71bb7ace5bee4cf91a3d.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/72e04323014c0307b6d0b8d8580b3a84.webp", + "title": "Neon Green Rick", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/616d76273d8aab2e4ac3507458f6f21a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2f518170e7dc5902860ac46ade2d681a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/74a119c7653baa57b295830d5b28f95f.webp", + "title": "OS 17", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0ee3be0d32170237116253edeb38492b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e5dabdb9eb11d341b67ed0bad73fe1f9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f079da5b0ae3cae81f27cca47b69be84.webp", + "title": "Purple Heart Circle", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a2e21b08532d7dd7a4822563b1c3b14d.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5fe3680a471591f5a0aeae4a2c19cc06.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1018326ebd0bb2878a21ec3deff652b6.webp", + "title": "Neon Horror Eyes", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e8df24a07d40703d592e4dacd3e2e7e2.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ad275e8af5534c575535bda834bb53fe.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7e4599519b9f1b59022527df70d6fddc.webp", + "title": "Cute Happy Pikachu", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/5f6cf51b2336fc5045fa5ab6f34aafcd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/85075ecbf146bf10c0570384b5695253.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f74ebb7aa8c641be0bf540ae4dea6047.webp", + "title": "Cool Evil Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/eb1f88c7e51d70b2043e28d7ef032b84.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/53dbe057106d0f0e6e84ac88c3fc4a32.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2b379e03b3be4d58b4c72de385fb3db4.jpg", + "title": "Pink Barbie Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8e06208d5478620b910836933cb2209a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d1a3e6274534a36705a4aa4c198dc2b8.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/68107313faa74b5d74701888daf86d0e.webp", + "title": "AIGC Cool Gothic Girl", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/26cf9347b097adc0b98939e513461319.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f323c0dc8d2fcc9e0020e8d6aa30d6a2.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a452d27daf9b1c3d45f04ed844b7eb53.webp", + "title": "Cool Fire Luffy", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/efedca977be976f65278ee94aa7c43fc.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/0ab9bac9ec5ff70ef311c012829318c1.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/a37ad3df93d752dedcdf011a5ef75efc.webp", + "title": "AIGC Cute Dragon", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dbb4f0feecf882786b6490ef87268a47.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6a95a0d7218d2213f5c93f7d55833d80.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/03dc9f0f18c2b4a5302a21ace871c534.webp", + "title": "Barbie Pink Beach", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e8266ba4e1dc52251aa019f719690166.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/156a9f013bbaa89533611c50b52829f9.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/f541b4dd45856073327c6c02f192d616.webp", + "title": "Sad Glitch Boy", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d26e71af9a5d144049320f1e1324941a.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c93ecd549795f3a847507bb45c9ef7ad.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/808783d28144ed1b62f63a242c887f79.jpg", + "title": "Spooky Skeleton Love", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e399503da07a40b5735ac1c1bc3aabc8.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/3f68e592d6b0032315f4c9f5ad079b85.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/172cf893d15b8f72bd6b1521ed5799d9.webp", + "title": "Cute MM Beans", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/1d49905d292e542ff4755e03d98e1e44.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/36fbe019433abc03d2c0467781c70a2f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8a54724da6f1fc43e05ebb5265754f4d.webp", + "title": "Neon Moon Slayer", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/09ffce8573bfec37960cc4e72436c90b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/ba1a00cb2ec17cc11ee61a7bc392c982.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d5b6db7c058ad1d3e8c22d9c99be18b9.webp", + "title": "Neon Magical Mushroom", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d73170ed4d0dcb02db55d78706f419a0.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/459050e1e98bdac885f6510b92ca881f.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c91a27b0cda49ca4af3d11418a974e39.webp", + "title": "Cool Skeleton Hand", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/6bfb3ba21d3e605a7941cf240f130491.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4ec50b7aa436c625b9f5e394a314b790.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/dab485f3c95de35c7068ed442e6aa8e1.webp", + "title": "Cool Neon Selfie Skeleton", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e688c5ed4fcd4b5dbca70baa1eb42beb.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/119d480415d6ef3de72a3797a8d16dc3.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e6affafa45f99203d68587753d462307.webp", + "title": "AIGC Virgin Mary", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d556d0ebdbe49769a940e03cb1277a57.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/8ed4a416ce5be16527824c9159c171bd.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/737965868384f128f2d26b9d3f69b309.webp", + "title": "Cute Smile Sunflower", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/38e388c44f57d74938344a52e799fd9b.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/2cf7cf4ee52a7ba069011ec8d88a3184.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/93aae47ff15df72ff3a7bfd02093e48e.webp", + "title": "Love Toothless Couple", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/7e308c7b1ebb1057b13c92eac7f4d3b3.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/d90c21c20f582b8b76896a65a3284b66.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/939a6d31470ce3526e66aa07935dfed1.webp", + "title": "CG Sexy Lady", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/18133267460b2d18bd403a1708fc8ccd.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/381c393d91c5150e8f1cf6837cc36126.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/4fb3c984cb78cd6b067124e9f8e878fb.webp", + "title": "Barbie Pink Glass", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/e2518f061f87c850ba07f36ce250d5fa.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/804168ff29c22eb66dcfce2deb09499a.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/cdbe3c70a93a04e28bf2c728d012cef6.webp", + "title": "Cool Sasuke Supreme", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/09ec02ba5eba82acf90dcbac0bfb789e.7z" + }, + { + "preview": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/fc0312c2889b17c3f77f30e5c752e763.webp", + "thumb": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/987dd4b6180460cc557f5b67c7f96df3.jpg", + "title": "Pink Blue Stitch", + "zipUrl": "https://resource-sg-public.obs.ap-southeast-3.myhuaweicloud.com/keyboard/c4d2933d1a354b09b496073739b2c326.7z" + } + ] +} diff --git a/app/src/main/java/com/keyboardskinning/theme/KeyboardSkin.java b/app/src/main/java/com/keyboardskinning/theme/KeyboardSkin.java new file mode 100644 index 0000000..7139f62 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/KeyboardSkin.java @@ -0,0 +1,37 @@ +package com.keyboardskinning.theme; + +import android.app.Application; + +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.applovin.sdk.AppLovinSdk; +import com.applovin.sdk.AppLovinSdkConfiguration; +import com.keyboardskinning.theme.tools.MyTools; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class KeyboardSkin extends Application { + public static KeyboardSkin app; + public static List myDataArrayList = new ArrayList<>(); + private boolean isInit = false; + @Override + public void onCreate() { + super.onCreate(); + app = this; + List myData = MyTools.parseJson(this); + if(myData != null){ + myDataArrayList = myData; + + } + + } + + public static List getMyDataArrayList() { + Collections.shuffle(myDataArrayList); + return myDataArrayList; + } + + + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/MyData.java b/app/src/main/java/com/keyboardskinning/theme/MyData.java new file mode 100644 index 0000000..cfcce59 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/MyData.java @@ -0,0 +1,42 @@ +package com.keyboardskinning.theme; + +public class MyData { + + private String resourceName; + + private String thumbnail; + private String preview; + private String url; + + public void setPreview(String preview) { + this.preview = preview; + } + + public void setResourceName(String resourceName) { + this.resourceName = resourceName; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getPreview() { + return preview; + } + + public String getResourceName() { + return resourceName; + } + + public String getThumbnail() { + return thumbnail; + } + + public String getUrl() { + return url; + } +} diff --git a/app/src/main/java/com/keyboardskinning/theme/mylistadapter/ThumbAdapter.java b/app/src/main/java/com/keyboardskinning/theme/mylistadapter/ThumbAdapter.java new file mode 100644 index 0000000..be7fce3 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/mylistadapter/ThumbAdapter.java @@ -0,0 +1,82 @@ +package com.keyboardskinning.theme.mylistadapter; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.keyboardskinning.theme.MyData; +import com.keyboardskinning.theme.R; +import com.keyboardskinning.theme.ui.PreviewActivity; + +import java.util.List; + +public class ThumbAdapter extends RecyclerView.Adapter { + private Context adapter_Context; + private List myDataList; + public ThumbAdapter(Context context,List list){ + adapter_Context = context; + myDataList = list; + + } + @Override + public void onBindViewHolder(@NonNull ThumbViewHolder holder, int position) { + MyData myData = myDataList.get(position); + String thumbnail = myData.getThumbnail(); + Glide.with(adapter_Context).load(thumbnail).into(holder.getImageViewThumb()); + holder.getConstraintLayout().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(adapter_Context, PreviewActivity.class); + intent.putExtra(PreviewActivity.KEY_NAME,myData.getResourceName()); + intent.putExtra(PreviewActivity.KEY_URL,myData.getUrl()); + intent.putExtra(PreviewActivity.KEY_PRE,myData.getPreview()); + adapter_Context.startActivity(intent); + } + }); + + + } + public static final class ThumbViewHolder extends RecyclerView.ViewHolder{ + + private ImageView imageViewThumb; + private ConstraintLayout constraintLayout; + public ThumbViewHolder(@NonNull View itemView) { + super(itemView); + imageViewThumb = itemView.findViewById(R.id.image_view_thumb_id); + constraintLayout = itemView.findViewById(R.id.constraint_layout_id); + } + + public ConstraintLayout getConstraintLayout() { + return constraintLayout; + } + + public ImageView getImageViewThumb() { + return imageViewThumb; + } + } + @Override + public int getItemCount() { + return myDataList.size(); + } + @NonNull + @Override + public ThumbViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(adapter_Context).inflate(R.layout.list_thumb, parent, false); + ThumbViewHolder thumbViewHolder = new ThumbViewHolder(itemView); + return thumbViewHolder; + } + + +} + + + + diff --git a/app/src/main/java/com/keyboardskinning/theme/mylistener/AdCallback.java b/app/src/main/java/com/keyboardskinning/theme/mylistener/AdCallback.java new file mode 100644 index 0000000..e69309e --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/mylistener/AdCallback.java @@ -0,0 +1,13 @@ +package com.keyboardskinning.theme.mylistener; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxError; + +public interface AdCallback { + void onShowFail(MaxAd ad); + void onShowSuccess(MaxAd ad); + void onHidden( ); + + void onLoadFail(String string, MaxError maxError); + void onLoadSuccess(MaxAd ad); +} diff --git a/app/src/main/java/com/keyboardskinning/theme/mylistener/DownloadCallback.java b/app/src/main/java/com/keyboardskinning/theme/mylistener/DownloadCallback.java new file mode 100644 index 0000000..09b8111 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/mylistener/DownloadCallback.java @@ -0,0 +1,8 @@ +package com.keyboardskinning.theme.mylistener; + +import java.io.File; + +public interface DownloadCallback { + + void onDownloadCall(boolean successful, File resource); +} diff --git a/app/src/main/java/com/keyboardskinning/theme/mylistener/UnzipCallback.java b/app/src/main/java/com/keyboardskinning/theme/mylistener/UnzipCallback.java new file mode 100644 index 0000000..26a7fe9 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/mylistener/UnzipCallback.java @@ -0,0 +1,6 @@ +package com.keyboardskinning.theme.mylistener; + +public interface UnzipCallback { + + void onUnzipCall(boolean successful, String resDirPath); +} diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/Admanager.java b/app/src/main/java/com/keyboardskinning/theme/tools/Admanager.java new file mode 100644 index 0000000..1182e72 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/Admanager.java @@ -0,0 +1,128 @@ +package com.keyboardskinning.theme.tools; + +import android.app.Activity; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxAdListener; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.keyboardskinning.theme.mylistener.AdCallback; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Admanager { + + public static final String unit1 = "aa5f1b6007e164bb"; + public static final String unit2 = "2508a453b5762c26"; + public static final String unit3 = "15208b32ede43744"; + + public static MaxInterstitialAd show(List ads) { + Collections.shuffle(ads); + for (int g = 0; g < ads.size(); g++) { + MaxInterstitialAd maxInterstitialAd = ads.get(g); + if (maxInterstitialAd.isReady()) { + return maxInterstitialAd; + } + } + return null; + } + + public static void setAdShowCall(MaxInterstitialAd ad, AdCallback adListener) { + ad.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + if (adListener != null) { + adListener.onLoadSuccess(maxAd); + } + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + + if (adListener != null) { + adListener.onShowSuccess(maxAd); + } + + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + if (adListener != null) { + adListener.onHidden(); + } + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + if (adListener != null) { + adListener.onLoadFail(s, maxError); + } + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + if (adListener != null) { + adListener.onShowFail(maxAd); + } + } + }); + + } + + public static List initMyAd(Activity mActivity) { + MaxInterstitialAd ad1 = new MaxInterstitialAd(unit1, mActivity); + ad1.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + Log.d("-------","--------onAdLoaded ad1"+ad1.getAdUnitId()); + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + Log.d("-------","--------onAdLoadFailed ad1"+ad1.getAdUnitId()); + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + + } + }); + ad1.loadAd(); + MaxInterstitialAd ad2 = new MaxInterstitialAd(unit2, mActivity); + ad2.loadAd(); + MaxInterstitialAd ad3 = new MaxInterstitialAd(unit3, mActivity); + ad3.loadAd(); + ArrayList ads = new ArrayList<>(); + ads.add(ad1); + ads.add(ad2); + ads.add(ad3); + return ads; + } + + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/CustomViewConfig.java b/app/src/main/java/com/keyboardskinning/theme/tools/CustomViewConfig.java new file mode 100644 index 0000000..094dea8 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/CustomViewConfig.java @@ -0,0 +1,200 @@ +package com.keyboardskinning.theme.tools; + +import android.content.Context; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.util.Xml; + +import androidx.core.content.ContextCompat; + +import com.keyboardskinning.theme.KeyboardSkin; +import com.keyboardskinning.theme.R; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.util.Objects; + +public class CustomViewConfig { + private String Bg_action_normal = "btn_keyboard_key_functional_normal.9.png"; + private String jpg_BG = "keyboard_background.jpg"; + private String color_normal_key = "key_text_color_normal"; + private String color_action_key = "key_text_color_functional"; + private String Bg_pressed = "btn_keyboard_key_normal_pressed.9.png"; + private String Bg_normal = "btn_keyboard_key_normal_normal.9.png"; + private String path_drawxh = "/drawable-xhdpi-v4/"; + private String path_drawxxh = "/drawable-xxhdpi-v4/"; + private String path_color = "/colors.xml"; + private String icon_del = "sym_keyboard_delete_normal.png"; + private String icon_shift = "sym_keyboard_shift.png"; + private String Bg_action_pressed = "btn_keyboard_key_functional_pressed.9.png"; + private String icon_shift_lock = "sym_keyboard_shift_locked.png"; + + private String Bg_space_normal = "btn_keyboard_spacekey_normal_normal.9.png"; + private String Bg_space_pressed = "btn_keyboard_spacekey_normal_pressed.9.png"; + + + private Drawable BgActionDraw; + private Drawable BgSpaceDraw; + private Drawable BgNormalDraw; + + private Drawable iconShift = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.ico_shift_lit); + private Drawable iconDel = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.del_icon); + private Drawable BG = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.de_keyboard_bg); + + private int keyNoramlcolor = KeyboardSkin.app.getResources().getColor(R.color.white, null); + + private int keyActioncolor = KeyboardSkin.app.getResources().getColor(R.color.white, null); + + private Drawable iconShiftLock = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.ico_shift_lit); + + + public Drawable getBG() { + return BG; + } + + public Drawable getBgActionDraw() { + return BgActionDraw; + } + + public Drawable getBgNormalDraw() { + return BgNormalDraw; + } + + public Drawable getBgSpaceDraw() { + return BgSpaceDraw; + } + + public Drawable getIconDel() { + return iconDel; + } + + public Drawable getIconShift() { + return iconShift; + } + + public Drawable getIconShiftLock() { + return iconShiftLock; + } + + public int getKeyNoramlcolor() { + return keyNoramlcolor; + } + + + public int getKeyActioncolor() { + return keyActioncolor; + } + + public void init() { + + iconShift = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.ico_shift_lit); + iconDel = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.del_icon); + BG = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.de_keyboard_bg); + + keyNoramlcolor = KeyboardSkin.app.getResources().getColor(R.color.white, null); + + iconShiftLock = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.ico_shift_lit); + + + Drawable drawable1 = ContextCompat.getDrawable( + KeyboardSkin.app, + R.drawable.de_keybg_press + ); + Drawable drawable = ContextCompat.getDrawable(KeyboardSkin.app, R.drawable.de_keybg); + StateListDrawable status = MyTools.getStatus(drawable, drawable1); + BgActionDraw = status; + BgNormalDraw = status; + BgSpaceDraw = status; + } + + private Drawable getKeyBackGround(Context context, String resDirPath,String drawName) + { + ///data/user/0/com.keyboardskinning.theme/cache/Funny Xmas Stitch/new-android-funny_xmas_stitch-theme-aws_master_zip_theme-version-2_noad_336433_972836_223993/res/drawable-xxhdpi-v4/btn_keyboard_key_normal_normal.9.png + String filePath = resDirPath+path_drawxh+drawName; + File file = new File(filePath); + if (!file.exists()) { + return null; + } + BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), BitmapFactory.decodeFile(filePath)); + return bitmapDrawable; + } + private Drawable getBackGround(Context context,String resDirPath) + { + String filePath = resDirPath+path_drawxxh+jpg_BG; + if (!new File(filePath).exists()) { + return null; + } + BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), BitmapFactory.decodeFile(filePath)); + return bitmapDrawable; + } + + private void updateKeyColor(String resDirPath) { + + String colorXmlPath = resDirPath+path_color; + File file = new File(colorXmlPath); + if (!file.exists()) { + return; + } + try { + XmlPullParser xmlPullParser = Xml.newPullParser(); + + String s = MyTools.parseString(file); + xmlPullParser.setInput(new StringReader(s)); + xmlPullParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + int eventT = xmlPullParser.getEventType(); + while (eventT != XmlPullParser.END_DOCUMENT) { + if (eventT == XmlPullParser.START_TAG && (Objects.equals(xmlPullParser.getName(), "color") || Objects.equals(xmlPullParser.getName(), "item"))) { + String value = xmlPullParser.getAttributeValue(null, "name"); + if (value != null && value.equals(color_normal_key)) { + keyNoramlcolor = Color.parseColor(xmlPullParser.nextText()); + + } + if (value != null && value.equals(color_action_key)) { + keyActioncolor = Color.parseColor(xmlPullParser.nextText()); + + } + } + eventT = xmlPullParser.next(); + } + }catch (XmlPullParserException exception){ + + } catch (IOException e) { + throw new RuntimeException(e); + } + + + } + + public void updateConfig( Context con) { + String resDirPath = MyTools.getSkin(); + + updateKeyColor(resDirPath); + BG = getBackGround(con, resDirPath); + + Drawable keyBackGround = getKeyBackGround(con, resDirPath, Bg_normal); + Drawable keyBackGround1 = getKeyBackGround(con, resDirPath, Bg_pressed); + BgNormalDraw = MyTools.getStatus(keyBackGround, keyBackGround1); + + Drawable keyBackGround2 = getKeyBackGround(con, resDirPath, Bg_action_normal); + Drawable keyBackGround3 = getKeyBackGround(con, resDirPath, Bg_action_pressed); + BgActionDraw = MyTools.getStatus(keyBackGround2, keyBackGround3); + + Drawable keyBackGround4 = getKeyBackGround(con, resDirPath, Bg_space_normal); + Drawable keyBackGround5 = getKeyBackGround(con, resDirPath, Bg_space_pressed); + BgSpaceDraw = MyTools.getStatus(keyBackGround4, keyBackGround5); + + iconDel = getKeyBackGround(con, resDirPath, icon_del); + iconShift = getKeyBackGround(con, resDirPath, icon_shift); + iconShiftLock = getKeyBackGround(con, resDirPath, icon_shift_lock); + + } + + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/DrawIcon.kt b/app/src/main/java/com/keyboardskinning/theme/tools/DrawIcon.kt new file mode 100644 index 0000000..828cc72 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/DrawIcon.kt @@ -0,0 +1,53 @@ +package com.keyboardskinning.theme.tools + +import android.graphics.Canvas +import android.graphics.Rect +import android.graphics.drawable.Drawable + + +object DrawIcon { + + public fun onDrawKeyIcon(currentKey: KeyBoard.Key, + drawKeyIcon: Drawable, + myCanvas: Canvas, + myKeyBoardView:MyKeyBoardView + ){ + drawKeyIcon.apply { + currentKey.icon = this + + var icon_w = currentKey.icon.intrinsicWidth.toFloat() + var icon_wr = icon_w / currentKey.width.toFloat() + var icon_h = currentKey.icon.intrinsicHeight.toFloat() + var icon_hr = icon_h / currentKey.height.toFloat() + + + var tep1 = 0f + var tep2 = 0f + if (icon_wr > icon_hr) { + tep2 = icon_wr + tep1 = icon_wr.coerceAtLeast(0.5f) + + } else { + tep2 = icon_hr + tep1 = icon_hr.coerceAtLeast(0.5f) + + } + icon_h = (icon_h / tep2) * tep1 + icon_w = (icon_w / tep2) * tep1 + currentKey.icon.let { + it.bounds = Rect().apply { + + top = + (currentKey.y + myKeyBoardView.paddingTop + (currentKey.height - icon_h) / 2f).toInt() + left = + (currentKey.x + myKeyBoardView.paddingLeft + (currentKey.width - icon_w) / 2f).toInt() + bottom = (top + icon_h).toInt() + right = (left + icon_w).toInt() + + } + it.draw(myCanvas) + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoard.java b/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoard.java new file mode 100644 index 0000000..31363f4 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoard.java @@ -0,0 +1,849 @@ +package com.keyboardskinning.theme.tools; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.util.Xml; + +import androidx.annotation.XmlRes; + + +import com.keyboardskinning.theme.R; + +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class KeyBoard { + + static final String TAG = "Keyboard"; + + // Keyboard XML Tags + private static final String TAG_KEYBOARD = "Keyboard"; + private static final String TAG_ROW = "Row"; + private static final String TAG_KEY = "Key"; + + public static final int EDGE_LEFT = 0x01; + public static final int EDGE_RIGHT = 0x02; + public static final int EDGE_TOP = 0x04; + public static final int EDGE_BOTTOM = 0x08; + + public static final int KEYCODE_SHIFT = -1; + public static final int KEYCODE_MODE_CHANGE = -2; + public static final int KEYCODE_CANCEL = -3; + public static final int KEYCODE_DONE = -4; + public static final int KEYCODE_DELETE = -5; + public static final int KEYCODE_ALT = -6; + public static final int KEYCODE_BLANK = 32; + public static final int KEYCODE_SHIFT_123 = -360; + public static final int KEYCODE_SHIFT_SYMBOL = -361; + + /** Keyboard label **/ + private CharSequence mLabel; + + /** Horizontal gap default for all rows */ + private int mDefaultHorizontalGap; + + /** Default key width */ + private int mDefaultWidth; + + /** Default key height */ + private int mDefaultHeight; + + /** Default gap between rows */ + private int mDefaultVerticalGap; + + /** Is the keyboard in the shifted state */ + private boolean mShifted; + + /** Key instance for the shift key, if present */ + private Key[] mShiftKeys = { null, null }; + + /** Key index for the shift key, if present */ + private int[] mShiftKeyIndices = {-1, -1}; + + /** Current key width, while loading the keyboard */ + private int mKeyWidth; + + /** Current key height, while loading the keyboard */ + private int mKeyHeight; + + /** Total height of the keyboard, including the padding and keys */ + private int mTotalHeight; + + /** + * Total width of the keyboard, including left side gaps and keys, but not any gaps on the + * right side. + */ + private int mTotalWidth; + + /** List of keys in this keyboard */ + private List mKeys; + + /** List of modifier keys such as Shift & Alt, if any */ + private List mModifierKeys; + + /** Width of the screen available to fit the keyboard */ + private int mDisplayWidth; + + /** Height of the screen */ + private int mDisplayHeight; + + /** Keyboard mode, or zero, if none. */ + private int mKeyboardMode; + + // Variables for pre-computing nearest keys. + + private static final int GRID_WIDTH = 10; + private static final int GRID_HEIGHT = 5; + private static final int GRID_SIZE = GRID_WIDTH * GRID_HEIGHT; + private int mCellWidth; + private int mCellHeight; + private int[][] mGridNeighbors; + private int mProximityThreshold; + /** Number of key widths from current touch point to search for nearest keys. */ + private static float SEARCH_DISTANCE = 1.8f; + + private ArrayList rows = new ArrayList<>(); + + + public static class Row { + /** Default width of a key in this row. */ + public int defaultWidth; + /** Default height of a key in this row. */ + public int defaultHeight; + /** Default horizontal gap between keys in this row. */ + public int defaultHorizontalGap; + /** Vertical gap following this row. */ + public int verticalGap; + + ArrayList mKeys = new ArrayList<>(); + + + public int rowEdgeFlags; + + /** The keyboard mode for this row */ + public int mode; + + private KeyBoard parent; + + public Row(KeyBoard parent) { + this.parent = parent; + } + + public Row(Resources res, KeyBoard parent, XmlResourceParser parser) { + this.parent = parent; + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.style_view); + defaultWidth = getDimensionOrFraction(a, + R.styleable.style_view_android_keyWidth, + parent.mDisplayWidth, parent.mDefaultWidth); + defaultHeight = getDimensionOrFraction(a, + R.styleable.style_view_android_keyHeight, + parent.mDisplayHeight, parent.mDefaultHeight); + defaultHorizontalGap = getDimensionOrFraction(a, + R.styleable.style_view_android_horizontalGap, + parent.mDisplayWidth, parent.mDefaultHorizontalGap); + verticalGap = getDimensionOrFraction(a, + R.styleable.style_view_android_verticalGap, + parent.mDisplayHeight, parent.mDefaultVerticalGap); + a.recycle(); + a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.style_row); + rowEdgeFlags = a.getInt(R.styleable.style_row_android_rowEdgeFlags, 0); + mode = a.getResourceId(R.styleable.style_row_android_keyboardMode, + 0); + } + } + + /** + * Class for describing the position and characteristics of a single key in the keyboard. + * + * @attr ref android.R.styleable#King_Keyboard_keyWidth + * @attr ref android.R.styleable#King_Keyboard_keyHeight + * @attr ref android.R.styleable#King_Keyboard_horizontalGap + * @attr ref android.R.styleable#King_Keyboard_Key_codes + * @attr ref android.R.styleable#King_Keyboard_Key_keyIcon + * @attr ref android.R.styleable#King_Keyboard_Key_keyLabel + * @attr ref android.R.styleable#King_Keyboard_Key_iconPreview + * @attr ref android.R.styleable#King_Keyboard_Key_isSticky + * @attr ref android.R.styleable#King_Keyboard_Key_isRepeatable + * @attr ref android.R.styleable#King_Keyboard_Key_isModifier + * @attr ref android.R.styleable#King_Keyboard_Key_popupKeyboard + * @attr ref android.R.styleable#King_Keyboard_Key_popupCharacters + * @attr ref android.R.styleable#King_Keyboard_Key_keyOutputText + * @attr ref android.R.styleable#King_Keyboard_Key_keyEdgeFlags + */ + public static class Key { + /** + * All the key codes (unicode or custom code) that this key could generate, zero'th + * being the most important. + */ + public int[] codes; + + /** Label to display */ + public CharSequence label; + + /** Icon to display instead of a label. Icon takes precedence over a label */ + public Drawable icon; + /** Preview version of the icon, for the preview popup */ + public Drawable iconPreview; + /** Width of the key, not including the gap */ + public int width; + /** Height of the key, not including the gap */ + public int height; + /** The horizontal gap before this key */ + public int gap; + /** Whether this key is sticky, i.e., a toggle key */ + public boolean sticky; + /** X coordinate of the key in the keyboard layout */ + public int x; + /** Y coordinate of the key in the keyboard layout */ + public int y; + /** The current pressed state of this key */ + public boolean pressed; + /** If this is a sticky key, is it on? */ + public boolean on; + /** Text to output when pressed. This can be multiple characters, like ".com" */ + public CharSequence text; + /** Popup characters */ + public CharSequence popupCharacters; + + /** + * Flags that specify the anchoring to edges of the keyboard for detecting touch events + * that are just out of the boundary of the key. This is a bit mask of + * {@link KeyBoard#EDGE_LEFT}, {@link KeyBoard#EDGE_RIGHT}, {@link KeyBoard#EDGE_TOP} and + * {@link KeyBoard#EDGE_BOTTOM}. + */ + public int edgeFlags; + /** Whether this is a modifier key, such as Shift or Alt */ + public boolean modifier; + /** The keyboard that this key belongs to */ + private KeyBoard keyboard; + /** + * If this key pops up a mini keyboard, this is the resource id for the XML layout for that + * keyboard. + */ + public int popupResId; + /** Whether this key repeats itself when held down */ + public boolean repeatable; + + + private final static int[] KEY_STATE_NORMAL_ON = { + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_PRESSED_ON = { + android.R.attr.state_pressed, + android.R.attr.state_checkable, + android.R.attr.state_checked + }; + + private final static int[] KEY_STATE_NORMAL_OFF = { + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_PRESSED_OFF = { + android.R.attr.state_pressed, + android.R.attr.state_checkable + }; + + private final static int[] KEY_STATE_NORMAL = { + }; + + private final static int[] KEY_STATE_PRESSED = { + android.R.attr.state_pressed + }; + + /** Create an empty key with no attributes. */ + public Key(Row parent) { + keyboard = parent.parent; + height = parent.defaultHeight; + width = parent.defaultWidth; + gap = parent.defaultHorizontalGap; + edgeFlags = parent.rowEdgeFlags; + } + + /** Create a key with the given top-left coordinate and extract its attributes from + * the XML parser. + * @param res resources associated with the caller's context + * @param parent the row that this key belongs to. The row must already be attached to + * a {@link KeyBoard}. + * @param x the x coordinate of the top-left + * @param y the y coordinate of the top-left + * @param parser the XML parser containing the attributes for this key + */ + public Key(Resources res, Row parent, int x, int y, XmlResourceParser parser) { + this(parent); + + this.x = x; + this.y = y; + + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.style_view); + + width = getDimensionOrFraction(a, + R.styleable.style_view_android_keyWidth, + keyboard.mDisplayWidth, parent.defaultWidth); + height = getDimensionOrFraction(a, + R.styleable.style_view_android_keyHeight, + keyboard.mDisplayHeight, parent.defaultHeight); + gap = getDimensionOrFraction(a, + R.styleable.style_view_android_horizontalGap, + keyboard.mDisplayWidth, parent.defaultHorizontalGap); + a.recycle(); + a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.style_key); + this.x += gap; + TypedValue codesValue = new TypedValue(); + a.getValue(R.styleable.style_key_android_codes, + codesValue); + if (codesValue.type == TypedValue.TYPE_INT_DEC + || codesValue.type == TypedValue.TYPE_INT_HEX) { + codes = new int[] { codesValue.data }; + } else if (codesValue.type == TypedValue.TYPE_STRING) { + codes = parseCSV(codesValue.string.toString()); + } + + iconPreview = a.getDrawable(R.styleable.style_key_android_iconPreview); + if (iconPreview != null) { + iconPreview.setBounds(0, 0, iconPreview.getIntrinsicWidth(), + iconPreview.getIntrinsicHeight()); + } + popupCharacters = a.getText( + R.styleable.style_key_android_popupCharacters); + popupResId = a.getResourceId( + R.styleable.style_key_android_popupKeyboard, 0); + repeatable = a.getBoolean( + R.styleable.style_key_android_isRepeatable, false); + modifier = a.getBoolean( + R.styleable.style_key_android_isModifier, false); + sticky = a.getBoolean( + R.styleable.style_key_android_isSticky, false); + edgeFlags = a.getInt(R.styleable.style_key_android_keyEdgeFlags, 0); + edgeFlags |= parent.rowEdgeFlags; + + icon = a.getDrawable( + R.styleable.style_key_android_keyIcon); + if (icon != null) { + icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); + } + label = a.getText(R.styleable.style_key_android_keyLabel); + text = a.getText(R.styleable.style_key_android_keyOutputText); + + if (codes == null && !TextUtils.isEmpty(label)) { + codes = new int[] { label.charAt(0) }; + } + a.recycle(); + } + + /** + * Informs the key that it has been pressed, in case it needs to change its appearance or + * state. + * @see #onReleased(boolean) + */ + public void onPressed() { + pressed = !pressed; + } + + /** + * Changes the pressed state of the key. + * + *

Toggled state of the key will be flipped when all the following conditions are + * fulfilled:

+ * + *
    + *
  • This is a sticky key, that is, {@link #sticky} is {@code true}. + *
  • The parameter {@code inside} is {@code true}. + *
  • {@link android.os.Build.VERSION#SDK_INT} is greater than + * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}. + *
+ * + * @param inside whether the finger was released inside the key. Works only on Android M and + * later. See the method document for details. + * @see #onPressed() + */ + public void onReleased(boolean inside) { + pressed = !pressed; + if (sticky && inside) { + on = !on; + } + } + + int[] parseCSV(String value) { + int count = 0; + int lastIndex = 0; + if (value.length() > 0) { + count++; + while ((lastIndex = value.indexOf(",", lastIndex + 1)) > 0) { + count++; + } + } + int[] values = new int[count]; + count = 0; + StringTokenizer st = new StringTokenizer(value, ","); + while (st.hasMoreTokens()) { + try { + values[count++] = Integer.parseInt(st.nextToken()); + } catch (NumberFormatException nfe) { + Log.e(TAG, "Error parsing keycodes " + value); + } + } + return values; + } + + /** + * Detects if a point falls inside this key. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return whether or not the point falls inside the key. If the key is attached to an edge, + * it will assume that all points between the key and the edge are considered to be inside + * the key. + */ + public boolean isInside(int x, int y) { + boolean leftEdge = (edgeFlags & EDGE_LEFT) > 0; + boolean rightEdge = (edgeFlags & EDGE_RIGHT) > 0; + boolean topEdge = (edgeFlags & EDGE_TOP) > 0; + boolean bottomEdge = (edgeFlags & EDGE_BOTTOM) > 0; + if ((x >= this.x || (leftEdge && x <= this.x + this.width)) + && (x < this.x + this.width || (rightEdge && x >= this.x)) + && (y >= this.y || (topEdge && y <= this.y + this.height)) + && (y < this.y + this.height || (bottomEdge && y >= this.y))) { + return true; + } else { + return false; + } + } + + /** + * Returns the square of the distance between the center of the key and the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the square of the distance of the point from the center of the key + */ + public int squaredDistanceFrom(int x, int y) { + int xDist = this.x + width / 2 - x; + int yDist = this.y + height / 2 - y; + return xDist * xDist + yDist * yDist; + } + + /** + * Returns the drawable state for the key, based on the current state and type of the key. + * @return the drawable state of the key. + * @see android.graphics.drawable.StateListDrawable#setState(int[]) + */ + public int[] getCurrentDrawableState() { + int[] states = KEY_STATE_NORMAL; + + if (on) { + if (pressed) { + states = KEY_STATE_PRESSED_ON; + } else { + states = KEY_STATE_NORMAL_ON; + } + } else { + if (sticky) { + if (pressed) { + states = KEY_STATE_PRESSED_OFF; + } else { + states = KEY_STATE_NORMAL_OFF; + } + } else { + if (pressed) { + states = KEY_STATE_PRESSED; + } + } + } + return states; + } + } + + /** + * Creates a keyboard from the given xml key layout file. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + */ + public KeyBoard(Context context, int xmlLayoutResId) { + this(context, xmlLayoutResId, 0); + } + + /** + * Creates a keyboard from the given xml key layout file. Weeds out rows + * that have a keyboard mode defined but don't match the specified mode. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + * @param modeId keyboard mode identifier + * @param width sets width of keyboard + * @param height sets height of keyboard + */ + public KeyBoard(Context context, @XmlRes int xmlLayoutResId, int modeId, int width, + int height) { + mDisplayWidth = width; + mDisplayHeight = height; + + mDefaultHorizontalGap = 0; + mDefaultWidth = mDisplayWidth / 10; + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mKeys = new ArrayList<>(); + mModifierKeys = new ArrayList<>(); + mKeyboardMode = modeId; + loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + } + + /** + * Creates a keyboard from the given xml key layout file. Weeds out rows + * that have a keyboard mode defined but don't match the specified mode. + * @param context the application or service context + * @param xmlLayoutResId the resource file that contains the keyboard layout and keys. + * @param modeId keyboard mode identifier + */ + public KeyBoard(Context context, @XmlRes int xmlLayoutResId, int modeId) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + mDisplayWidth = dm.widthPixels; + mDisplayHeight = dm.heightPixels; + //Log.v(TAG, "keyboard's display metrics:" + dm); + + mDefaultHorizontalGap = 0; + mDefaultWidth = mDisplayWidth / 10; + mDefaultVerticalGap = 0; + mDefaultHeight = mDefaultWidth; + mKeys = new ArrayList<>(); + mModifierKeys = new ArrayList<>(); + mKeyboardMode = modeId; + loadKeyboard(context, context.getResources().getXml(xmlLayoutResId)); + } + + public KeyBoard(Context context, int layoutTemplateResId, + CharSequence characters, int columns, int horizontalPadding) { + this(context, layoutTemplateResId); + int x = 0; + int y = 0; + int column = 0; + mTotalWidth = 0; + + Row row = new Row(this); + row.defaultHeight = mDefaultHeight; + row.defaultWidth = mDefaultWidth; + row.defaultHorizontalGap = mDefaultHorizontalGap; + row.verticalGap = mDefaultVerticalGap; + row.rowEdgeFlags = EDGE_TOP | EDGE_BOTTOM; + final int maxColumns = columns == -1 ? Integer.MAX_VALUE : columns; + for (int i = 0; i < characters.length(); i++) { + char c = characters.charAt(i); + if (column >= maxColumns + || x + mDefaultWidth + horizontalPadding > mDisplayWidth) { + x = 0; + y += mDefaultVerticalGap + mDefaultHeight; + column = 0; + } + final Key key = new Key(row); + key.x = x; + key.y = y; + key.label = String.valueOf(c); + key.codes = new int[] { c }; + column++; + x += key.width + key.gap; + mKeys.add(key); + row.mKeys.add(key); + if (x > mTotalWidth) { + mTotalWidth = x; + } + } + mTotalHeight = y + mDefaultHeight; + rows.add(row); + } + + final void resize(int newWidth, int newHeight) { + int numRows = rows.size(); + for (int rowIndex = 0; rowIndex < numRows; ++rowIndex) { + Row row = rows.get(rowIndex); + int numKeys = row.mKeys.size(); + int totalGap = 0; + int totalWidth = 0; + for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) { + Key key = row.mKeys.get(keyIndex); + if (keyIndex > 0) { + totalGap += key.gap; + } + totalWidth += key.width; + } + if (totalGap + totalWidth > newWidth) { + int x = 0; + float scaleFactor = (float)(newWidth - totalGap) / totalWidth; + for (int keyIndex = 0; keyIndex < numKeys; ++keyIndex) { + Key key = row.mKeys.get(keyIndex); + key.width *= scaleFactor; + key.x = x; + x += key.width + key.gap; + } + } + } + mTotalWidth = newWidth; + // TODO: This does not adjust the vertical placement according to the new size. + // The main problem in the previous code was horizontal placement/size, but we should + // also recalculate the vertical sizes/positions when we get this resize call. + } + + public List getKeys() { + return mKeys; + } + + public List getModifierKeys() { + return mModifierKeys; + } + + protected int getHorizontalGap() { + return mDefaultHorizontalGap; + } + + protected void setHorizontalGap(int gap) { + mDefaultHorizontalGap = gap; + } + + protected int getVerticalGap() { + return mDefaultVerticalGap; + } + + protected void setVerticalGap(int gap) { + mDefaultVerticalGap = gap; + } + + protected int getKeyHeight() { + return mDefaultHeight; + } + + protected void setKeyHeight(int height) { + mDefaultHeight = height; + } + + protected int getKeyWidth() { + return mDefaultWidth; + } + + protected void setKeyWidth(int width) { + mDefaultWidth = width; + } + + /** + * Returns the total height of the keyboard + * @return the total height of the keyboard + */ + public int getHeight() { + return mTotalHeight; + } + + public int getMinWidth() { + return mTotalWidth; + } + + public boolean setShifted(boolean shiftState) { + for (Key shiftKey : mShiftKeys) { + if (shiftKey != null) { + shiftKey.on = shiftState; + } + } + if (mShifted != shiftState) { + mShifted = shiftState; + return true; + } + return false; + } + + public boolean isShifted() { + return mShifted; + } + + /** + * @hide + */ + public int[] getShiftKeyIndices() { + return mShiftKeyIndices; + } + + public int getShiftKeyIndex() { + return mShiftKeyIndices[0]; + } + + private void computeNearestNeighbors() { + // Round-up so we don't have any pixels outside the grid + mCellWidth = (getMinWidth() + GRID_WIDTH - 1) / GRID_WIDTH; + mCellHeight = (getHeight() + GRID_HEIGHT - 1) / GRID_HEIGHT; + mGridNeighbors = new int[GRID_SIZE][]; + int[] indices = new int[mKeys.size()]; + final int gridWidth = GRID_WIDTH * mCellWidth; + final int gridHeight = GRID_HEIGHT * mCellHeight; + for (int x = 0; x < gridWidth; x += mCellWidth) { + for (int y = 0; y < gridHeight; y += mCellHeight) { + int count = 0; + for (int i = 0; i < mKeys.size(); i++) { + final Key key = mKeys.get(i); + if (key.squaredDistanceFrom(x, y) < mProximityThreshold || + key.squaredDistanceFrom(x + mCellWidth - 1, y) < mProximityThreshold || + key.squaredDistanceFrom(x + mCellWidth - 1, y + mCellHeight - 1) + < mProximityThreshold || + key.squaredDistanceFrom(x, y + mCellHeight - 1) < mProximityThreshold) { + indices[count++] = i; + } + } + int [] cell = new int[count]; + System.arraycopy(indices, 0, cell, 0, count); + mGridNeighbors[(y / mCellHeight) * GRID_WIDTH + (x / mCellWidth)] = cell; + } + } + } + + /** + * Returns the indices of the keys that are closest to the given point. + * @param x the x-coordinate of the point + * @param y the y-coordinate of the point + * @return the array of integer indices for the nearest keys to the given point. If the given + * point is out of range, then an array of size zero is returned. + */ + public int[] getNearestKeys(int x, int y) { + if (mGridNeighbors == null) computeNearestNeighbors(); + if (x >= 0 && x < getMinWidth() && y >= 0 && y < getHeight()) { + int index = (y / mCellHeight) * GRID_WIDTH + (x / mCellWidth); + if (index < GRID_SIZE) { + return mGridNeighbors[index]; + } + } + return new int[0]; + } + + protected Row createRowFromXml(Resources res, XmlResourceParser parser) { + return new Row(res, this, parser); + } + + protected Key createKeyFromXml(Resources res, Row parent, int x, int y, + XmlResourceParser parser) { + return new Key(res, parent, x, y, parser); + } + + private void loadKeyboard(Context context, XmlResourceParser parser) { + boolean inKey = false; + boolean inRow = false; + boolean leftMostKey = false; + int row = 0; + int x = 0; + int y = 0; + Key key = null; + Row currentRow = null; + Resources res = context.getResources(); + boolean skipRow = false; + + try { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.START_TAG) { + String tag = parser.getName(); + if (TAG_ROW.equals(tag)) { + inRow = true; + x = 0; + currentRow = createRowFromXml(res, parser); + rows.add(currentRow); + skipRow = currentRow.mode != 0 && currentRow.mode != mKeyboardMode; + if (skipRow) { + skipToEndOfRow(parser); + inRow = false; + } + } else if (TAG_KEY.equals(tag)) { + inKey = true; + key = createKeyFromXml(res, currentRow, x, y, parser); + mKeys.add(key); + if (key.codes[0] == KEYCODE_SHIFT) { + // Find available shift key slot and put this shift key in it + for (int i = 0; i < mShiftKeys.length; i++) { + if (mShiftKeys[i] == null) { + mShiftKeys[i] = key; + mShiftKeyIndices[i] = mKeys.size()-1; + break; + } + } + mModifierKeys.add(key); + } else if (key.codes[0] == KEYCODE_ALT) { + mModifierKeys.add(key); + } + currentRow.mKeys.add(key); + } else if (TAG_KEYBOARD.equals(tag)) { + parseKeyboardAttributes(res, parser); + } + } else if (event == XmlResourceParser.END_TAG) { + if (inKey) { + inKey = false; + x += key.gap + key.width; + if (x > mTotalWidth) { + mTotalWidth = x; + } + } else if (inRow) { + inRow = false; + y += currentRow.verticalGap; + y += currentRow.defaultHeight; + row++; + } else { + // TODO: error or extend? + } + } + } + } catch (Exception e) { + Log.e(TAG, "Parse error:" + e); + e.printStackTrace(); + } + mTotalHeight = y - mDefaultVerticalGap; + } + + private void skipToEndOfRow(XmlResourceParser parser) + throws XmlPullParserException, IOException { + int event; + while ((event = parser.next()) != XmlResourceParser.END_DOCUMENT) { + if (event == XmlResourceParser.END_TAG + && parser.getName().equals(TAG_ROW)) { + break; + } + } + } + + private void parseKeyboardAttributes(Resources res, XmlResourceParser parser) { + TypedArray a = res.obtainAttributes(Xml.asAttributeSet(parser), + R.styleable.style_view); + + mDefaultWidth = getDimensionOrFraction(a, + R.styleable.style_view_android_keyWidth, + mDisplayWidth, mDisplayWidth / 10); + mDefaultHeight = getDimensionOrFraction(a, + R.styleable.style_view_android_keyHeight, + mDisplayHeight, 50); + mDefaultHorizontalGap = getDimensionOrFraction(a, + R.styleable.style_view_android_horizontalGap, + mDisplayWidth, 0); + mDefaultVerticalGap = getDimensionOrFraction(a, + R.styleable.style_view_android_verticalGap, + mDisplayHeight, 0); + mProximityThreshold = (int) (mDefaultWidth * SEARCH_DISTANCE); + mProximityThreshold = mProximityThreshold * mProximityThreshold; // Square it for comparison + a.recycle(); + } + + static int getDimensionOrFraction(TypedArray a, int index, int base, int defValue) { + TypedValue value = a.peekValue(index); + if (value == null) return defValue; + if (value.type == TypedValue.TYPE_DIMENSION) { + return a.getDimensionPixelOffset(index, defValue); + } else if (value.type == TypedValue.TYPE_FRACTION) { + // Round it to avoid values like 47.9999 from getting truncated + return Math.round(a.getFraction(index, base, base, defValue)); + } + return defValue; + } +} + diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoardView.java b/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoardView.java new file mode 100644 index 0000000..2d637b1 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/KeyBoardView.java @@ -0,0 +1,1368 @@ +package com.keyboardskinning.theme.tools; + + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.media.AudioManager; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.widget.PopupWindow; +import android.widget.TextView; + + +import com.keyboardskinning.theme.R; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class KeyBoardView extends View implements View.OnClickListener { + + + public interface OnKeyboardActionListener { + + + void onPress(int primaryCode); + + + void onRelease(int primaryCode); + + void onKey(int primaryCode, int[] keyCodes); + + void onText(CharSequence text); + + + void swipeLeft(); + + + void swipeRight(); + + + void swipeDown(); + + + void swipeUp(); + } + + private static final boolean DEBUG = false; + private static final int NOT_A_KEY = -1; + private static final int[] KEY_DELETE = { KeyBoard.KEYCODE_DELETE }; + private static final int[] LONG_PRESSABLE_STATE_SET = { R.styleable.Style_Pre_state_android_state_long_pressable }; + + private Context mContext; + private KeyBoard mKeyboard; + private int mCurrentKeyIndex = NOT_A_KEY; + + private int mLabelTextSize; + private int mKeyTextSize; + private int mKeyTextColor; + private float mShadowRadius; + private int mShadowColor; + private float mBackgroundDimAmount; + + private TextView mPreviewText; + private PopupWindow mPreviewPopup; + private int mPreviewTextSizeLarge; + private int mPreviewOffset; + private int mPreviewHeight; + // Working variable + private final int[] mCoordinates = new int[2]; + + private PopupWindow mPopupKeyboard; + private View mMiniKeyboardContainer; + private KeyBoardView mMiniKeyboard; + private boolean mMiniKeyboardOnScreen; + private View mPopupParent; + private int mMiniKeyboardOffsetX; + private int mMiniKeyboardOffsetY; + private Map mMiniKeyboardCache; + private KeyBoard.Key[] mKeys; + + + private OnKeyboardActionListener mKeyboardActionListener; + + private static final int MSG_SHOW_PREVIEW = 1; + private static final int MSG_REMOVE_PREVIEW = 2; + private static final int MSG_REPEAT = 3; + private static final int MSG_LONGPRESS = 4; + + private static final int DELAY_BEFORE_PREVIEW = 0; + private static final int DELAY_AFTER_PREVIEW = 70; + private static final int DEBOUNCE_TIME = 70; + + private int mVerticalCorrection; + private int mProximityThreshold; + + private boolean mPreviewCentered = false; + private boolean mShowPreview = true; + private boolean mShowTouchPoints = true; + private int mPopupPreviewX; + private int mPopupPreviewY; + + private int mLastX; + private int mLastY; + private int mStartX; + private int mStartY; + + private boolean mProximityCorrectOn; + + private Paint mPaint; + private Rect mPadding; + + private long mDownTime; + private long mLastMoveTime; + private int mLastKey; + private int mLastCodeX; + private int mLastCodeY; + private int mCurrentKey = NOT_A_KEY; + private int mDownKey = NOT_A_KEY; + private long mLastKeyTime; + private long mCurrentKeyTime; + private int[] mKeyIndices = new int[12]; + private GestureDetector mGestureDetector; + private int mPopupX; + private int mPopupY; + private int mRepeatKeyIndex = NOT_A_KEY; + private int mPopupLayout; + private boolean mAbortKey; + private KeyBoard.Key mInvalidatedKey; + private Rect mClipRegion = new Rect(0, 0, 0, 0); + private boolean mPossiblePoly; + private SwipeTracker mSwipeTracker = new SwipeTracker(); + private int mSwipeThreshold; + private boolean mDisambiguateSwipe; + + // Variables for dealing with multiple pointers + private int mOldPointerCount = 1; + private float mOldPointerX; + private float mOldPointerY; + + private Drawable mKeyBackground; + + private static final int REPEAT_INTERVAL = 50; // ~20 keys per second + private static final int REPEAT_START_DELAY = 300; + private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); + + private static int MAX_NEARBY_KEYS = 12; + private int[] mDistances = new int[MAX_NEARBY_KEYS]; + + // For multi-tap + private int mLastSentIndex; + private int mTapCount; + private long mLastTapTime; + private boolean mInMultiTap; + private static final int MULTITAP_INTERVAL = 600; // milliseconds + private StringBuilder mPreviewLabel = new StringBuilder(1); + + /** Whether the keyboard bitmap needs to be redrawn before it's blitted. **/ + private boolean mDrawPending; + /** The dirty region in the keyboard bitmap */ + private Rect mDirtyRect = new Rect(); + /** The keyboard bitmap for faster updates */ + private Bitmap mBuffer; + /** Notes if the keyboard just changed, so that we could possibly reallocate the mBuffer. */ + private boolean mKeyboardChanged; + /** The canvas for the above mutable keyboard bitmap */ + private Canvas mCanvas; + /** The accessibility manager for accessibility support */ +// private AccessibilityManager mAccessibilityManager; + /** The audio manager for accessibility support */ + private AudioManager mAudioManager; + /** Whether the requirement of a headset to hear passwords if accessibility is enabled is announced. */ + private boolean mHeadsetRequiredToHearPasswordsAnnounced; + + Handler mHandler; + + public KeyBoardView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public KeyBoardView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public KeyBoardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + mContext = context; + TypedArray a = context.obtainStyledAttributes( + attrs, R.styleable.style_view_keyboard, defStyleAttr, defStyleRes); + + LayoutInflater inflate = + (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + int previewLayout = 0; + int keyTextSize = 0; + + int n = a.getIndexCount(); + + for (int i = 0; i < n; i++) { + int attr = a.getIndex(i); + + if (attr == R.styleable.style_view_keyboard_android_keyBackground) { + mKeyBackground = a.getDrawable(attr); + } else if (attr == R.styleable.style_view_keyboard_android_verticalCorrection) { + mVerticalCorrection = a.getDimensionPixelOffset(attr, 0); + } else if (attr == R.styleable.style_view_keyboard_android_keyPreviewLayout) { + previewLayout = a.getResourceId(attr, 0); + } else if (attr == R.styleable.style_view_keyboard_android_keyPreviewOffset) { + mPreviewOffset = a.getDimensionPixelOffset(attr, 0); + } else if (attr == R.styleable.style_view_keyboard_android_keyPreviewHeight) { + mPreviewHeight = a.getDimensionPixelSize(attr, 80); + } else if (attr == R.styleable.style_view_keyboard_android_keyTextSize) { + mKeyTextSize = a.getDimensionPixelSize(attr, 18); + } else if (attr == R.styleable.style_view_keyboard_android_keyTextColor) { + mKeyTextColor = a.getColor(attr, 0xFF333333); + } else if (attr == R.styleable.style_view_keyboard_android_labelTextSize) { + mLabelTextSize = a.getDimensionPixelSize(attr, 14); + } else if (attr == R.styleable.style_view_keyboard_android_popupLayout) { + mPopupLayout = a.getResourceId(attr, 0); + } else if (attr == R.styleable.style_view_keyboard_android_shadowColor) { + mShadowColor = a.getColor(attr, 0); + } else if (attr == R.styleable.style_view_keyboard_android_shadowRadius) { + mShadowRadius = a.getFloat(attr, 0f); + } + } + + mPreviewPopup = new PopupWindow(context); + if (previewLayout != 0) { + mPreviewText = (TextView) inflate.inflate(previewLayout, null); + mPreviewTextSizeLarge = (int) mPreviewText.getTextSize(); + mPreviewPopup.setContentView(mPreviewText); + mPreviewPopup.setBackgroundDrawable(null); + } else { + mShowPreview = false; + } + + mPreviewPopup.setTouchable(false); + + mPopupKeyboard = new PopupWindow(context); + mPopupKeyboard.setBackgroundDrawable(null); + //mPopupKeyboard.setClippingEnabled(false); + + mPopupParent = this; + //mPredicting = true; + + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setTextSize(keyTextSize); + mPaint.setTextAlign(Paint.Align.CENTER); + mPaint.setAlpha(255); + + mPadding = new Rect(0, 0, 0, 0); + mMiniKeyboardCache = new HashMap(); + mKeyBackground.getPadding(mPadding); + + mSwipeThreshold = (int) (500 * getResources().getDisplayMetrics().density); +// mDisambiguateSwipe = getResources().getBoolean( +// R.bool.config_swipeDisambiguation); + + mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + + resetMultiTap(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + initGestureDetector(); + if (mHandler == null) { + mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_SHOW_PREVIEW: + showKey(msg.arg1); + break; + case MSG_REMOVE_PREVIEW: + mPreviewText.setVisibility(INVISIBLE); + break; + case MSG_REPEAT: + if (repeatKey()) { + Message repeat = Message.obtain(this, MSG_REPEAT); + sendMessageDelayed(repeat, REPEAT_INTERVAL); + } + break; + case MSG_LONGPRESS: + openPopupIfRequired((MotionEvent) msg.obj); + break; + } + } + }; + } + } + + private void initGestureDetector() { + if (mGestureDetector == null) { + mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onFling(MotionEvent me1, MotionEvent me2, + float velocityX, float velocityY) { + if (mPossiblePoly) return false; + final float absX = Math.abs(velocityX); + final float absY = Math.abs(velocityY); + float deltaX = me2.getX() - me1.getX(); + float deltaY = me2.getY() - me1.getY(); + int travelX = getWidth() / 2; // Half the keyboard width + int travelY = getHeight() / 2; // Half the keyboard height + mSwipeTracker.computeCurrentVelocity(1000); + final float endingVelocityX = mSwipeTracker.getXVelocity(); + final float endingVelocityY = mSwipeTracker.getYVelocity(); + boolean sendDownKey = false; + if (velocityX > mSwipeThreshold && absY < absX && deltaX > travelX) { + if (mDisambiguateSwipe && endingVelocityX < velocityX / 4) { + sendDownKey = true; + } else { + swipeRight(); + return true; + } + } else if (velocityX < -mSwipeThreshold && absY < absX && deltaX < -travelX) { + if (mDisambiguateSwipe && endingVelocityX > velocityX / 4) { + sendDownKey = true; + } else { + swipeLeft(); + return true; + } + } else if (velocityY < -mSwipeThreshold && absX < absY && deltaY < -travelY) { + if (mDisambiguateSwipe && endingVelocityY > velocityY / 4) { + sendDownKey = true; + } else { + swipeUp(); + return true; + } + } else if (velocityY > mSwipeThreshold && absX < absY / 2 && deltaY > travelY) { + if (mDisambiguateSwipe && endingVelocityY < velocityY / 4) { + sendDownKey = true; + } else { + swipeDown(); + return true; + } + } + + if (sendDownKey) { + detectAndSendKey(mDownKey, mStartX, mStartY, me1.getEventTime()); + } + return false; + } + }); + + mGestureDetector.setIsLongpressEnabled(false); + } + } + + public void setOnKeyboardActionListener(OnKeyboardActionListener listener) { + mKeyboardActionListener = listener; + } + + protected OnKeyboardActionListener getOnKeyboardActionListener() { + return mKeyboardActionListener; + } + + + public void setKeyboard(KeyBoard keyboard) { + if (mKeyboard != null) { + showPreview(NOT_A_KEY); + } + // Remove any pending messages + removeMessages(); + mKeyboard = keyboard; + List keys = mKeyboard.getKeys(); + mKeys = keys.toArray(new KeyBoard.Key[keys.size()]); + requestLayout(); + // Hint to reallocate the buffer if the size changed + mKeyboardChanged = true; + invalidateAllKeys(); + computeProximityThreshold(keyboard); + mMiniKeyboardCache.clear(); // Not really necessary to do every time, but will free up views + // Switching to a different keyboard should abort any pending keys so that the key up + // doesn't get delivered to the old or new keyboard + mAbortKey = true; // Until the next ACTION_DOWN + } + + + public KeyBoard getKeyboard() { + return mKeyboard; + } + + + public boolean setShifted(boolean shifted) { + if (mKeyboard != null) { + if (mKeyboard.setShifted(shifted)) { + // The whole keyboard probably needs to be redrawn + invalidateAllKeys(); + return true; + } + } + return false; + } + + + public boolean isShifted() { + if (mKeyboard != null) { + return mKeyboard.isShifted(); + } + return false; + } + + + public void setPreviewEnabled(boolean previewEnabled) { + mShowPreview = previewEnabled; + } + + /** + * Returns the enabled state of the key feedback popup. + * @return whether or not the key feedback popup is enabled + * @see #setPreviewEnabled(boolean) + */ + public boolean isPreviewEnabled() { + return mShowPreview; + } + + public void setVerticalCorrection(int verticalOffset) { + + } + public void setPopupParent(View v) { + mPopupParent = v; + } + + public void setPopupOffset(int x, int y) { + mMiniKeyboardOffsetX = x; + mMiniKeyboardOffsetY = y; + if (mPreviewPopup.isShowing()) { + mPreviewPopup.dismiss(); + } + } + + public void setProximityCorrectionEnabled(boolean enabled) { + mProximityCorrectOn = enabled; + } + + /** + * Returns true if proximity correction is enabled. + */ + public boolean isProximityCorrectionEnabled() { + return mProximityCorrectOn; + } + + /** + * Popup keyboard close button clicked. + * @hide + */ + public void onClick(View v) { + dismissPopupKeyboard(); + } + + private CharSequence adjustCase(CharSequence label) { + if (mKeyboard.isShifted() && label != null && label.length() < 3 + && Character.isLowerCase(label.charAt(0))) { + label = label.toString().toUpperCase(); + } + return label; + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Round up a little + if (mKeyboard == null) { + setMeasuredDimension(getPaddingLeft() + getPaddingRight(), getPaddingTop() + getPaddingBottom()); + } else { + int width = mKeyboard.getMinWidth() + getPaddingLeft() + getPaddingRight(); + if (MeasureSpec.getSize(widthMeasureSpec) < width + 10) { + width = MeasureSpec.getSize(widthMeasureSpec); + } + setMeasuredDimension(width, mKeyboard.getHeight() + getPaddingTop() + getPaddingBottom()); + } + } + + /** + * Compute the average distance between adjacent keys (horizontally and vertically) + * and square it to get the proximity threshold. We use a square here and in computing + * the touch distance from a key's center to avoid taking a square root. + * @param keyboard + */ + private void computeProximityThreshold(KeyBoard keyboard) { + if (keyboard == null) return; + final KeyBoard.Key[] keys = mKeys; + if (keys == null) return; + int length = keys.length; + int dimensionSum = 0; + for (int i = 0; i < length; i++) { + KeyBoard.Key key = keys[i]; + dimensionSum += Math.min(key.width, key.height) + key.gap; + } + if (dimensionSum < 0 || length == 0) return; + mProximityThreshold = (int) (dimensionSum * 1.4f / length); + mProximityThreshold *= mProximityThreshold; // Square it + } + + @Override + public void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mKeyboard != null) { + mKeyboard.resize(w, h); + } + // Release the buffer, if any and it will be reallocated on the next draw + mBuffer = null; + } + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); +// if (mDrawPending || mBuffer == null || mKeyboardChanged) { +// onBufferDraw(); +// } +// canvas.drawBitmap(mBuffer, 0, 0, null); + } + + private void onBufferDraw() { + if (mBuffer == null || mKeyboardChanged) { + if (mBuffer == null || mKeyboardChanged && + (mBuffer.getWidth() != getWidth() || mBuffer.getHeight() != getHeight())) { + // Make sure our bitmap is at least 1x1 + final int width = Math.max(1, getWidth()); + final int height = Math.max(1, getHeight()); + mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + mCanvas = new Canvas(mBuffer); + } + invalidateAllKeys(); + mKeyboardChanged = false; + } + + if (mKeyboard == null) return; + + mCanvas.save(); + final Canvas canvas = mCanvas; + canvas.clipRect(mDirtyRect); + + final Paint paint = mPaint; + final Drawable keyBackground = mKeyBackground; + final Rect clipRegion = mClipRegion; + final Rect padding = mPadding; + final int kbdPaddingLeft = getPaddingLeft(); + final int kbdPaddingTop = getPaddingTop(); + final KeyBoard.Key[] keys = mKeys; + final KeyBoard.Key invalidKey = mInvalidatedKey; + + paint.setColor(mKeyTextColor); + boolean drawSingleKey = false; + if (invalidKey != null && canvas.getClipBounds(clipRegion)) { + // Is clipRegion completely contained within the invalidated key? + if (invalidKey.x + kbdPaddingLeft - 1 <= clipRegion.left && + invalidKey.y + kbdPaddingTop - 1 <= clipRegion.top && + invalidKey.x + invalidKey.width + kbdPaddingLeft + 1 >= clipRegion.right && + invalidKey.y + invalidKey.height + kbdPaddingTop + 1 >= clipRegion.bottom) { + drawSingleKey = true; + } + } + canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR); + final int keyCount = keys.length; + for (int i = 0; i < keyCount; i++) { + final KeyBoard.Key key = keys[i]; + if (drawSingleKey && invalidKey != key) { + continue; + } + int[] drawableState = key.getCurrentDrawableState(); + keyBackground.setState(drawableState); + + // Switch the character to uppercase if shift is pressed + String label = key.label == null? null : adjustCase(key.label).toString(); + + final Rect bounds = keyBackground.getBounds(); + if (key.width != bounds.right || + key.height != bounds.bottom) { + keyBackground.setBounds(0, 0, key.width, key.height); + } + canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); + keyBackground.draw(canvas); + + if (label != null) { + // For characters, use large font. For labels like "Done", use small font. + if (label.length() > 1 && key.codes.length < 2) { + paint.setTextSize(mLabelTextSize); + paint.setTypeface(Typeface.DEFAULT_BOLD); + } else { + paint.setTextSize(mKeyTextSize); + paint.setTypeface(Typeface.DEFAULT); + } + // Draw a drop shadow for the text + paint.setShadowLayer(mShadowRadius, 0, 0, mShadowColor); + // Draw the text + canvas.drawText(label, + (key.width - padding.left - padding.right) / 2 + + padding.left, + (key.height - padding.top - padding.bottom) / 2 + + (paint.getTextSize() - paint.descent()) / 2 + padding.top, + paint); + // Turn off drop shadow + paint.setShadowLayer(0, 0, 0, 0); + } else if (key.icon != null) { + final int drawableX = (key.width - padding.left - padding.right + - key.icon.getIntrinsicWidth()) / 2 + padding.left; + final int drawableY = (key.height - padding.top - padding.bottom + - key.icon.getIntrinsicHeight()) / 2 + padding.top; + canvas.translate(drawableX, drawableY); + key.icon.setBounds(0, 0, + key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight()); + key.icon.draw(canvas); + canvas.translate(-drawableX, -drawableY); + } + canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); + } + mInvalidatedKey = null; + // Overlay a dark rectangle to dim the keyboard + if (mMiniKeyboardOnScreen) { +// paint.setColor((int) (mBackgroundDimAmount * 0xFF) << 24); + canvas.drawRect(0, 0, getWidth(), getHeight(), paint); + } + + if (DEBUG && mShowTouchPoints) { + paint.setAlpha(128); + paint.setColor(0xFFFF0000); + canvas.drawCircle(mStartX, mStartY, 3, paint); + canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint); + paint.setColor(0xFF0000FF); + canvas.drawCircle(mLastX, mLastY, 3, paint); + paint.setColor(0xFF00FF00); + canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint); + } + mCanvas.restore(); + mDrawPending = false; + mDirtyRect.setEmpty(); + } + + private int getKeyIndices(int x, int y, int[] allKeys) { + final KeyBoard.Key[] keys = mKeys; + int primaryIndex = NOT_A_KEY; + int closestKey = NOT_A_KEY; + int closestKeyDist = mProximityThreshold + 1; + Arrays.fill(mDistances, Integer.MAX_VALUE); + int [] nearestKeyIndices = mKeyboard.getNearestKeys(x, y); + final int keyCount = nearestKeyIndices.length; + for (int i = 0; i < keyCount; i++) { + final KeyBoard.Key key = keys[nearestKeyIndices[i]]; + int dist = 0; + boolean isInside = key.isInside(x,y); + if (isInside) { + primaryIndex = nearestKeyIndices[i]; + } + + if (((mProximityCorrectOn + && (dist = key.squaredDistanceFrom(x, y)) < mProximityThreshold) + || isInside) + && key.codes[0] > 32) { + // Find insertion point + final int nCodes = key.codes.length; + if (dist < closestKeyDist) { + closestKeyDist = dist; + closestKey = nearestKeyIndices[i]; + } + + if (allKeys == null) continue; + + for (int j = 0; j < mDistances.length; j++) { + if (mDistances[j] > dist) { + // Make space for nCodes codes + System.arraycopy(mDistances, j, mDistances, j + nCodes, + mDistances.length - j - nCodes); + System.arraycopy(allKeys, j, allKeys, j + nCodes, + allKeys.length - j - nCodes); + for (int c = 0; c < nCodes; c++) { + allKeys[j + c] = key.codes[c]; + mDistances[j + c] = dist; + } + break; + } + } + } + } + if (primaryIndex == NOT_A_KEY) { + primaryIndex = closestKey; + } + return primaryIndex; + } + + private void detectAndSendKey(int index, int x, int y, long eventTime) { + if (index != NOT_A_KEY && index < mKeys.length) { + final KeyBoard.Key key = mKeys[index]; + if (key.text != null) { + mKeyboardActionListener.onText(key.text); + mKeyboardActionListener.onRelease(NOT_A_KEY); + } else { + int code = key.codes[0]; + //TextEntryState.keyPressedAt(key, x, y); + int[] codes = new int[MAX_NEARBY_KEYS]; + Arrays.fill(codes, NOT_A_KEY); + getKeyIndices(x, y, codes); + // Multi-tap + if (mInMultiTap) { + if (mTapCount != -1) { + mKeyboardActionListener.onKey(KeyBoard.KEYCODE_DELETE, KEY_DELETE); + } else { + mTapCount = 0; + } + code = key.codes[mTapCount]; + } + mKeyboardActionListener.onKey(code, codes); + mKeyboardActionListener.onRelease(code); + } + mLastSentIndex = index; + mLastTapTime = eventTime; + } + } + + + private CharSequence getPreviewText(KeyBoard.Key key) { + if (mInMultiTap) { + // Multi-tap + mPreviewLabel.setLength(0); + mPreviewLabel.append((char) key.codes[mTapCount < 0 ? 0 : mTapCount]); + return adjustCase(mPreviewLabel); + } else { + return adjustCase(key.label); + } + } + + private void showPreview(int keyIndex) { + int oldKeyIndex = mCurrentKeyIndex; + final PopupWindow previewPopup = mPreviewPopup; + + mCurrentKeyIndex = keyIndex; + // Release the old key and press the new key + final KeyBoard.Key[] keys = mKeys; + if (oldKeyIndex != mCurrentKeyIndex) { + if (oldKeyIndex != NOT_A_KEY && keys.length > oldKeyIndex) { + KeyBoard.Key oldKey = keys[oldKeyIndex]; + oldKey.onReleased(mCurrentKeyIndex == NOT_A_KEY); + invalidateKey(oldKeyIndex); + final int keyCode = oldKey.codes[0]; + } + if (mCurrentKeyIndex != NOT_A_KEY && keys.length > mCurrentKeyIndex) { + KeyBoard.Key newKey = keys[mCurrentKeyIndex]; + newKey.onPressed(); + invalidateKey(mCurrentKeyIndex); + final int keyCode = newKey.codes[0]; + } + } + // If key changed and preview is on ... + if (oldKeyIndex != mCurrentKeyIndex && mShowPreview) { + mHandler.removeMessages(MSG_SHOW_PREVIEW); + if (previewPopup.isShowing()) { + if (keyIndex == NOT_A_KEY) { + mHandler.sendMessageDelayed(mHandler + .obtainMessage(MSG_REMOVE_PREVIEW), + DELAY_AFTER_PREVIEW); + } + } + if (keyIndex != NOT_A_KEY) { + if (previewPopup.isShowing() && mPreviewText.getVisibility() == VISIBLE) { + // Show right away, if it's already visible and finger is moving around + showKey(keyIndex); + } else { + mHandler.sendMessageDelayed( + mHandler.obtainMessage(MSG_SHOW_PREVIEW, keyIndex, 0), + DELAY_BEFORE_PREVIEW); + } + } + } + } + + private void showKey(final int keyIndex) { + final PopupWindow previewPopup = mPreviewPopup; + final KeyBoard.Key[] keys = mKeys; + if (keyIndex < 0 || keyIndex >= mKeys.length) return; + KeyBoard.Key key = keys[keyIndex]; + if (key.icon != null) { + mPreviewText.setCompoundDrawables(null, null, null, + key.iconPreview != null ? key.iconPreview : key.icon); + mPreviewText.setText(null); + } else { + mPreviewText.setCompoundDrawables(null, null, null, null); + mPreviewText.setText(getPreviewText(key)); + if (key.label!=null && key.label.length() > 1 && key.codes.length < 2) { + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mKeyTextSize); + mPreviewText.setTypeface(Typeface.DEFAULT_BOLD); + } else { + mPreviewText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mPreviewTextSizeLarge); + mPreviewText.setTypeface(Typeface.DEFAULT); + } + } + mPreviewText.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + int popupWidth = Math.max(mPreviewText.getMeasuredWidth(), key.width + + mPreviewText.getPaddingLeft() + mPreviewText.getPaddingRight()); + final int popupHeight = mPreviewHeight; + ViewGroup.LayoutParams lp = mPreviewText.getLayoutParams(); + if (lp != null) { + lp.width = popupWidth; + lp.height = popupHeight; + } + if (!mPreviewCentered) { + mPopupPreviewX = key.x - mPreviewText.getPaddingLeft() + getPaddingLeft(); + mPopupPreviewY = key.y - popupHeight + mPreviewOffset; + } else { + + mPopupPreviewX = 160 - mPreviewText.getMeasuredWidth() / 2; + mPopupPreviewY = - mPreviewText.getMeasuredHeight(); + } + mHandler.removeMessages(MSG_REMOVE_PREVIEW); + getLocationInWindow(mCoordinates); + mCoordinates[0] += mMiniKeyboardOffsetX; // Offset may be zero + mCoordinates[1] += mMiniKeyboardOffsetY; // Offset may be zero + + + mPreviewText.getBackground().setState( + key.popupResId != 0 ? LONG_PRESSABLE_STATE_SET : EMPTY_STATE_SET); + mPopupPreviewX += mCoordinates[0]; + mPopupPreviewY += mCoordinates[1]; + + + getLocationOnScreen(mCoordinates); + if (mPopupPreviewY + mCoordinates[1] < 0) { + + if (key.x + key.width <= getWidth() / 2) { + mPopupPreviewX += (int) (key.width * 2.5); + } else { + mPopupPreviewX -= (int) (key.width * 2.5); + } + mPopupPreviewY += popupHeight; + } + + if (previewPopup.isShowing()) { + previewPopup.update(mPopupPreviewX, mPopupPreviewY, + popupWidth, popupHeight); + } else { + previewPopup.setWidth(popupWidth); + previewPopup.setHeight(popupHeight); + previewPopup.showAtLocation(mPopupParent, Gravity.NO_GRAVITY, + mPopupPreviewX, mPopupPreviewY); + } + mPreviewText.setVisibility(VISIBLE); + } + + + public void invalidateAllKeys() { + mDirtyRect.union(0, 0, getWidth(), getHeight()); + mDrawPending = true; + invalidate(); + } + + + public void invalidateKey(int keyIndex) { + if (mKeys == null) return; + if (keyIndex < 0 || keyIndex >= mKeys.length) { + return; + } + final KeyBoard.Key key = mKeys[keyIndex]; + mInvalidatedKey = key; + mDirtyRect.union(key.x + getPaddingLeft(), key.y + getPaddingTop(), + key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); + onBufferDraw(); + invalidate(key.x + getPaddingLeft(), key.y + getPaddingTop(), + key.x + key.width + getPaddingLeft(), key.y + key.height + getPaddingTop()); + } + + private boolean openPopupIfRequired(MotionEvent me) { + // Check if we have a popup layout specified first. + if (mPopupLayout == 0) { + return false; + } + if (mCurrentKey < 0 || mCurrentKey >= mKeys.length) { + return false; + } + + KeyBoard.Key popupKey = mKeys[mCurrentKey]; + boolean result = onLongPress(popupKey); + if (result) { + mAbortKey = true; + showPreview(NOT_A_KEY); + } + return result; + } + + protected boolean onLongPress(KeyBoard.Key popupKey) { + int popupKeyboardId = popupKey.popupResId; + + if (popupKeyboardId != 0) { + mMiniKeyboardContainer = mMiniKeyboardCache.get(popupKey); + if (mMiniKeyboardContainer == null) { + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( + Context.LAYOUT_INFLATER_SERVICE); + mMiniKeyboardContainer = inflater.inflate(mPopupLayout, null); + mMiniKeyboard = mMiniKeyboardContainer.findViewById( + R.id.my_keyboard_view); +// View closeButton = mMiniKeyboardContainer.findViewById( +// R.id.closeButton); +// if (closeButton != null) closeButton.setOnClickListener(this); + mMiniKeyboard.setOnKeyboardActionListener(new OnKeyboardActionListener() { + public void onKey(int primaryCode, int[] keyCodes) { + mKeyboardActionListener.onKey(primaryCode, keyCodes); + dismissPopupKeyboard(); + } + + public void onText(CharSequence text) { + mKeyboardActionListener.onText(text); + dismissPopupKeyboard(); + } + + public void swipeLeft() { } + public void swipeRight() { } + public void swipeUp() { } + public void swipeDown() { } + public void onPress(int primaryCode) { + mKeyboardActionListener.onPress(primaryCode); + } + public void onRelease(int primaryCode) { + mKeyboardActionListener.onRelease(primaryCode); + } + }); + //mInputView.setSuggest(mSuggest); + KeyBoard keyboard; + if (popupKey.popupCharacters != null) { + keyboard = new KeyBoard(getContext(), popupKeyboardId, + popupKey.popupCharacters, -1, getPaddingLeft() + getPaddingRight()); + } else { + keyboard = new KeyBoard(getContext(), popupKeyboardId); + } + mMiniKeyboard.setKeyboard(keyboard); + mMiniKeyboard.setPopupParent(this); + mMiniKeyboardContainer.measure( + MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); + + mMiniKeyboardCache.put(popupKey, mMiniKeyboardContainer); + } else { + mMiniKeyboard = mMiniKeyboardContainer.findViewById( + R.id.my_keyboard_view); + } + getLocationInWindow(mCoordinates); + mPopupX = popupKey.x + getPaddingLeft(); + mPopupY = popupKey.y + getPaddingTop(); + mPopupX = mPopupX + popupKey.width - mMiniKeyboardContainer.getMeasuredWidth(); + mPopupY = mPopupY - mMiniKeyboardContainer.getMeasuredHeight(); + final int x = mPopupX + mMiniKeyboardContainer.getPaddingRight() + mCoordinates[0]; + final int y = mPopupY + mMiniKeyboardContainer.getPaddingBottom() + mCoordinates[1]; + mMiniKeyboard.setPopupOffset(x < 0 ? 0 : x, y); + mMiniKeyboard.setShifted(isShifted()); + mPopupKeyboard.setContentView(mMiniKeyboardContainer); + mPopupKeyboard.setWidth(mMiniKeyboardContainer.getMeasuredWidth()); + mPopupKeyboard.setHeight(mMiniKeyboardContainer.getMeasuredHeight()); + mPopupKeyboard.showAtLocation(this, Gravity.NO_GRAVITY, x, y); + mMiniKeyboardOnScreen = true; + //mMiniKeyboard.onTouchEvent(getTranslatedEvent(me)); + invalidateAllKeys(); + return true; + } + return false; + } + + + + @Override + public boolean onTouchEvent(MotionEvent me) { + // Convert multi-pointer up/down events to single up/down events to + // deal with the typical multi-pointer behavior of two-thumb typing + final int pointerCount = me.getPointerCount(); + final int action = me.getAction(); + boolean result = false; + final long now = me.getEventTime(); + + if (pointerCount != mOldPointerCount) { + if (pointerCount == 1) { + // Send a down event for the latest pointer + MotionEvent down = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, + me.getX(), me.getY(), me.getMetaState()); + result = onModifiedTouchEvent(down, false); + down.recycle(); + // If it's an up action, then deliver the up as well. + if (action == MotionEvent.ACTION_UP) { + result = onModifiedTouchEvent(me, true); + } + } else { + // Send an up event for the last pointer + MotionEvent up = MotionEvent.obtain(now, now, MotionEvent.ACTION_UP, + mOldPointerX, mOldPointerY, me.getMetaState()); + result = onModifiedTouchEvent(up, true); + up.recycle(); + } + } else { + if (pointerCount == 1) { + result = onModifiedTouchEvent(me, false); + mOldPointerX = me.getX(); + mOldPointerY = me.getY(); + } else { + // Don't do anything when 2 pointers are down and moving. + result = true; + } + } + mOldPointerCount = pointerCount; + + + return result; + } + + private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) { + int touchX = (int) me.getX() - getPaddingLeft(); + int touchY = (int) me.getY() - getPaddingTop(); + if (touchY >= -mVerticalCorrection) + touchY += mVerticalCorrection; + final int action = me.getAction(); + final long eventTime = me.getEventTime(); + int keyIndex = getKeyIndices(touchX, touchY, null); + mPossiblePoly = possiblePoly; + + // Track the last few movements to look for spurious swipes. + if (action == MotionEvent.ACTION_DOWN) mSwipeTracker.clear(); + mSwipeTracker.addMovement(me); + + // Ignore all motion events until a DOWN. + if (mAbortKey + && action != MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_CANCEL) { + mRepeatKeyIndex = NOT_A_KEY; + return true; + } + + if (mGestureDetector.onTouchEvent(me)) { + showPreview(NOT_A_KEY); + mHandler.removeMessages(MSG_REPEAT); + mHandler.removeMessages(MSG_LONGPRESS); + return true; + } + + // Needs to be called after the gesture detector gets a turn, as it may have + // displayed the mini keyboard + if (mMiniKeyboardOnScreen && action != MotionEvent.ACTION_CANCEL) { + mRepeatKeyIndex = NOT_A_KEY; + return true; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: + mAbortKey = false; + mStartX = touchX; + mStartY = touchY; + mLastCodeX = touchX; + mLastCodeY = touchY; + mLastKeyTime = 0; + mCurrentKeyTime = 0; + mLastKey = NOT_A_KEY; + mCurrentKey = keyIndex; + mDownKey = keyIndex; + mDownTime = me.getEventTime(); + mLastMoveTime = mDownTime; + checkMultiTap(eventTime, keyIndex); + mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ? + mKeys[keyIndex].codes[0] : 0); + if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) { + mRepeatKeyIndex = mCurrentKey; + Message msg = mHandler.obtainMessage(MSG_REPEAT); + mHandler.sendMessageDelayed(msg, REPEAT_START_DELAY); + repeatKey(); + // Delivering the key could have caused an abort + if (mAbortKey) { + mRepeatKeyIndex = NOT_A_KEY; + break; + } + } + if (mCurrentKey != NOT_A_KEY) { + Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); + mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + } + showPreview(keyIndex); + break; + + case MotionEvent.ACTION_MOVE: + boolean continueLongPress = false; + if (keyIndex != NOT_A_KEY) { + if (mCurrentKey == NOT_A_KEY) { + mCurrentKey = keyIndex; + mCurrentKeyTime = eventTime - mDownTime; + } else { + if (keyIndex == mCurrentKey) { + mCurrentKeyTime += eventTime - mLastMoveTime; + continueLongPress = true; + } else if (mRepeatKeyIndex == NOT_A_KEY) { + resetMultiTap(); + mLastKey = mCurrentKey; + mLastCodeX = mLastX; + mLastCodeY = mLastY; + mLastKeyTime = + mCurrentKeyTime + eventTime - mLastMoveTime; + mCurrentKey = keyIndex; + mCurrentKeyTime = 0; + } + } + } + if (!continueLongPress) { + // Cancel old longpress + mHandler.removeMessages(MSG_LONGPRESS); + // Start new longpress if key has changed + if (keyIndex != NOT_A_KEY) { + Message msg = mHandler.obtainMessage(MSG_LONGPRESS, me); + mHandler.sendMessageDelayed(msg, LONGPRESS_TIMEOUT); + } + } + showPreview(mCurrentKey); + mLastMoveTime = eventTime; + break; + + case MotionEvent.ACTION_UP: + removeMessages(); + if (keyIndex == mCurrentKey) { + mCurrentKeyTime += eventTime - mLastMoveTime; + } else { + resetMultiTap(); + mLastKey = mCurrentKey; + mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime; + mCurrentKey = keyIndex; + mCurrentKeyTime = 0; + } + if (mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME + && mLastKey != NOT_A_KEY) { + mCurrentKey = mLastKey; + touchX = mLastCodeX; + touchY = mLastCodeY; + } + showPreview(NOT_A_KEY); + Arrays.fill(mKeyIndices, NOT_A_KEY); + // If we're not on a repeating key (which sends on a DOWN event) + if (mRepeatKeyIndex == NOT_A_KEY && !mMiniKeyboardOnScreen && !mAbortKey) { + detectAndSendKey(mCurrentKey, touchX, touchY, eventTime); + } + invalidateKey(keyIndex); + mRepeatKeyIndex = NOT_A_KEY; + break; + case MotionEvent.ACTION_CANCEL: + removeMessages(); + dismissPopupKeyboard(); + mAbortKey = true; + showPreview(NOT_A_KEY); + invalidateKey(mCurrentKey); + break; + } + mLastX = touchX; + mLastY = touchY; + return true; + } + + private boolean repeatKey() { + if(mRepeatKeyIndex != NOT_A_KEY){ + KeyBoard.Key key = mKeys[mRepeatKeyIndex]; + detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime); + return true; + } + return false; + } + + protected void swipeRight() { + mKeyboardActionListener.swipeRight(); + } + + protected void swipeLeft() { + mKeyboardActionListener.swipeLeft(); + } + + protected void swipeUp() { + mKeyboardActionListener.swipeUp(); + } + + protected void swipeDown() { + mKeyboardActionListener.swipeDown(); + } + + public void closing() { + if (mPreviewPopup.isShowing()) { + mPreviewPopup.dismiss(); + } + removeMessages(); + + dismissPopupKeyboard(); + mBuffer = null; + mCanvas = null; + mMiniKeyboardCache.clear(); + } + + private void removeMessages() { + if (mHandler != null) { + mHandler.removeMessages(MSG_REPEAT); + mHandler.removeMessages(MSG_LONGPRESS); + mHandler.removeMessages(MSG_SHOW_PREVIEW); + } + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + closing(); + } + + private void dismissPopupKeyboard() { + if (mPopupKeyboard.isShowing()) { + mPopupKeyboard.dismiss(); + mMiniKeyboardOnScreen = false; + invalidateAllKeys(); + } + } + + public boolean handleBack() { + if (mPopupKeyboard.isShowing()) { + dismissPopupKeyboard(); + return true; + } + return false; + } + + private void resetMultiTap() { + mLastSentIndex = NOT_A_KEY; + mTapCount = 0; + mLastTapTime = -1; + mInMultiTap = false; + } + + private void checkMultiTap(long eventTime, int keyIndex) { + if (keyIndex == NOT_A_KEY) return; + KeyBoard.Key key = mKeys[keyIndex]; + if (key.codes.length > 1) { + mInMultiTap = true; + if (eventTime < mLastTapTime + MULTITAP_INTERVAL + && keyIndex == mLastSentIndex) { + mTapCount = (mTapCount + 1) % key.codes.length; + return; + } else { + mTapCount = -1; + return; + } + } + if (eventTime > mLastTapTime + MULTITAP_INTERVAL || keyIndex != mLastSentIndex) { + resetMultiTap(); + } + } + + private static class SwipeTracker { + + static final int NUM_PAST = 4; + static final int LONGEST_PAST_TIME = 200; + + final float mPastX[] = new float[NUM_PAST]; + final float mPastY[] = new float[NUM_PAST]; + final long mPastTime[] = new long[NUM_PAST]; + + float mYVelocity; + float mXVelocity; + + public void clear() { + mPastTime[0] = 0; + } + + public void addMovement(MotionEvent ev) { + long time = ev.getEventTime(); + final int N = ev.getHistorySize(); + for (int i=0; i= 0) { + final int start = drop+1; + final int count = NUM_PAST-drop-1; + System.arraycopy(pastX, start, pastX, 0, count); + System.arraycopy(pastY, start, pastY, 0, count); + System.arraycopy(pastTime, start, pastTime, 0, count); + i -= (drop+1); + } + pastX[i] = x; + pastY[i] = y; + pastTime[i] = time; + i++; + if (i < NUM_PAST) { + pastTime[i] = 0; + } + } + + public void computeCurrentVelocity(int units) { + computeCurrentVelocity(units, Float.MAX_VALUE); + } + + public void computeCurrentVelocity(int units, float maxVelocity) { + final float[] pastX = mPastX; + final float[] pastY = mPastY; + final long[] pastTime = mPastTime; + + final float oldestX = pastX[0]; + final float oldestY = pastY[0]; + final long oldestTime = pastTime[0]; + float accumX = 0; + float accumY = 0; + int N=0; + while (N < NUM_PAST) { + if (pastTime[N] == 0) { + break; + } + N++; + } + + for (int i=1; i < N; i++) { + final int dur = (int)(pastTime[i] - oldestTime); + if (dur == 0) continue; + float dist = pastX[i] - oldestX; + float vel = (dist/dur) * units; // pixels/frame. + if (accumX == 0) accumX = vel; + else accumX = (accumX + vel) * .5f; + + dist = pastY[i] - oldestY; + vel = (dist/dur) * units; // pixels/frame. + if (accumY == 0) accumY = vel; + else accumY = (accumY + vel) * .5f; + } + mXVelocity = accumX < 0.0f ? Math.max(accumX, -maxVelocity) + : Math.min(accumX, maxVelocity); + mYVelocity = accumY < 0.0f ? Math.max(accumY, -maxVelocity) + : Math.min(accumY, maxVelocity); + } + + public float getXVelocity() { + return mXVelocity; + } + + public float getYVelocity() { + return mYVelocity; + } + } +} + diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/MyKeyBoardView.java b/app/src/main/java/com/keyboardskinning/theme/tools/MyKeyBoardView.java new file mode 100644 index 0000000..e980950 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/MyKeyBoardView.java @@ -0,0 +1,157 @@ +package com.keyboardskinning.theme.tools; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +import java.util.List; + +public class MyKeyBoardView extends KeyBoardView { + + private CustomViewConfig config = new CustomViewConfig(); + private int shift_status = 0; + private int viewType = 0; + + private Context context; + + public void setShift_status(int shift_status) { + this.shift_status = shift_status; + } + + public int getShift_status() { + return shift_status; + } + + public void setViewType(int viewType) { + this.viewType = viewType; + } + + public int getViewType() { + return viewType; + } + + public MyKeyBoardView(Context context, AttributeSet attrs) { + + super(context, attrs); + initView(); + } + + public MyKeyBoardView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + public MyKeyBoardView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initView(); + } + + + private Paint mPaint; + + + private void initView() { + config.init(); + context = getContext(); + mPaint = new Paint(); + mPaint.setTextAlign(Paint.Align.CENTER); + float textSize = MyTools.spToPpx(16f, context); + mPaint.setTextSize(textSize); + mPaint.setColor(config.getKeyNoramlcolor()); + } + + + @Override + public void onDraw(Canvas canvas) { + super.onDraw(canvas); + + KeyBoard keyboard = getKeyboard(); + List keys = keyboard.getKeys(); + for (int r = 0; r < keys.size(); r++) { + KeyBoard.Key key = keys.get(r); + int code = key.codes[0]; + + mPaint.setColor(config.getKeyActioncolor()); + if (code == KeyBoard.KEYCODE_MODE_CHANGE) { + + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); + onDrawLabel(key, canvas); + + } else if (code == KeyBoard.KEYCODE_SHIFT) { + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); + DrawIcon.INSTANCE.onDrawKeyIcon(key, getShiftDraw(), canvas, this); + + } else if (code == KeyBoard.KEYCODE_SHIFT_123) { + + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); +// DrawIcon.INSTANCE.onDrawKeyIcon(key, getShiftDraw(), canvas, this); + onDrawLabel(key, canvas); + + } else if (code == KeyBoard.KEYCODE_SHIFT_SYMBOL) { + + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); +// DrawIcon.INSTANCE.onDrawKeyIcon(key, getShiftDraw(), canvas, this); + onDrawLabel(key, canvas); + + } else if (code == KeyBoard.KEYCODE_DONE) { + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); + onDrawLabel(key, canvas); + } else if (code == KeyBoard.KEYCODE_DELETE) { + + onDrawKeyBackground(key, config.getBgActionDraw(), canvas); + DrawIcon.INSTANCE.onDrawKeyIcon(key, config.getIconDel(), canvas, this); + onDrawLabel(key, canvas); + } else { + mPaint.setColor(config.getKeyNoramlcolor()); + onDrawKeyBackground(key, config.getBgNormalDraw(), canvas); + onDrawLabel(key, canvas); + } + } + + } + + public void updateConfigView(Context con) { + config.updateConfig(con); + setBackground(config.getBG()); + invalidateAllKeys(); + + } + + private Drawable getShiftDraw() { + if (shift_status == 0) { + return config.getIconShift(); + } else if (shift_status == 1) { + return config.getIconShiftLock(); + } else { + return config.getIconShiftLock(); + } + } + + + private void onDrawKeyBackground(KeyBoard.Key myKey, + Drawable keyBG, + Canvas canvas) { + if (keyBG != null) { + Rect rect = new Rect(myKey.x + getPaddingLeft(), myKey.y + getPaddingTop(), myKey.width + myKey.x + getPaddingLeft(), myKey.height + myKey.y + getPaddingTop()); + keyBG.setBounds(rect); + keyBG.setState(myKey.getCurrentDrawableState()); + keyBG.draw(canvas); + } + } + + private void onDrawLabel( + KeyBoard.Key myKey, + Canvas canvas) { + boolean b = myKey.label == null || myKey.label == ""; + if (!b) { + float y1 = myKey.y + getPaddingRight() + (myKey.height/ 2f) + ((mPaint.getTextSize() - mPaint.descent()) / 2f); + float x1 = myKey.x + getPaddingLeft() + ((myKey.width / 2f)); + canvas.drawText(myKey.label.toString(), x1, y1, mPaint); + + } + } + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/MyService.java b/app/src/main/java/com/keyboardskinning/theme/tools/MyService.java new file mode 100644 index 0000000..465c045 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/MyService.java @@ -0,0 +1,183 @@ +package com.keyboardskinning.theme.tools; + +import android.annotation.SuppressLint; +import android.inputmethodservice.InputMethodService; +import android.os.SystemClock; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.EditorInfo; + +import com.keyboardskinning.theme.R; + +import java.util.List; + +public class MyService extends InputMethodService implements KeyBoardView.OnKeyboardActionListener { + private long last_click = -1L; + + + private int[] ViewXmls = new int[3]; + + private boolean is_double = false; + + private MyKeyBoardView myKeyBoardView; + + @SuppressLint("MissingInflatedId") + @Override + public View onCreateInputView() { + + ViewXmls[0] = R.xml.view_1; + ViewXmls[1] = R.xml.view_2; + ViewXmls[2] = R.xml.view_3; + + View inputView = LayoutInflater.from(this).inflate(R.layout.customer_input_view, null, false); + + myKeyBoardView = (MyKeyBoardView) inputView.findViewById(R.id.my_keyboard_view); + myKeyBoardView.setPreviewEnabled(false); + myKeyBoardView.setKeyboard(new KeyBoard(this, ViewXmls[0])); + myKeyBoardView.setOnKeyboardActionListener(this); + return inputView; + } + + @Override + public void onWindowShown() { + super.onWindowShown(); + myKeyBoardView.updateConfigView(this); + } + + @Override + public void onPress(int primaryCode) { + + if (primaryCode == KeyBoard.KEYCODE_SHIFT) { + if (300 > SystemClock.elapsedRealtime() - last_click) { + is_double = true; + } + last_click = SystemClock.elapsedRealtime(); + } + } + + @Override + public void onRelease(int primaryCode) { + + } + private void switchCapital(Boolean toCapital, KeyBoard keyboard) { + List keys = keyboard.getKeys(); + for(int h = 0;h parseJson(Context context) { + StringBuilder sb = new StringBuilder(); + try { + InputStream open = context.getAssets().open("selecion.json"); + + BufferedReader br = new BufferedReader(new InputStreamReader(open)); + String next = ""; + while (null != (next = br.readLine())) { + sb.append(next); + } + String trim = sb.toString().trim(); + return parseJsonString(trim); + + } catch (IOException ioException) { + return null; + } + + } + + + public static String parseString(File file) { + StringBuilder sb = new StringBuilder(); + try { + + + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file))); + String next = ""; + while (null != (next = br.readLine())) { + sb.append(next); + } + String trim = sb.toString().trim(); + return trim; + + } catch (IOException ioException) { + + return null; + } + + } + + public static void saveSkin(String resDirPath) { + editorShare.putString(sharedpreferenceKey_skin, resDirPath); + editorShare.apply(); + } + + public static String getSkin() { + return share.getString(sharedpreferenceKey_skin, ""); + } + + public static String getSkinPathByName(String name) { + return share.getString(name, ""); + } + + public static void saveSkinByName(String name, String resDirPath) { + editorShare.putString(name, resDirPath); + editorShare.apply(); + } + + + public static int dpToPx(int dp, Context context) { + float density = context.getResources().getDisplayMetrics().density; + return (int) (dp * density); + } + + private static List parseJsonString(String jsonString) { + List myDataArrayList = new ArrayList<>(); + try { + JSONObject string1 = new JSONObject(jsonString); + JSONArray list = string1.getJSONArray("list"); + for (int g = 0; g < list.length(); g++) { + MyData myData = new MyData(); + JSONObject item = list.getJSONObject(g); + String preview = item.getString("preview"); + String thumb = item.getString("thumb"); + String title = item.getString("title"); + String zipUrl = item.getString("zipUrl"); + myData.setPreview(String.valueOf(preview)); + myData.setThumbnail(thumb); + myData.setUrl(zipUrl); + myData.setResourceName(title); + myDataArrayList.add(myData); + } + + return myDataArrayList; + } catch (JSONException jsonException) { + + return null; + } + } + + public static void goSetStep2() { + methodManager.showInputMethodPicker(); + } + + public static boolean isStep2() { + String string = Settings.Secure.getString(KeyboardSkin.app.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + if (string.startsWith(KeyboardSkin.app.getPackageName())) { + return true; + } else { + return false; + } + } + + public static void goSetStep1(Context context) { + Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS); + context.startActivity(intent); + } + + public static boolean isStep1() { + for (InputMethodInfo inputMethodInfo : methodManager.getEnabledInputMethodList()) { + if (inputMethodInfo.getId().startsWith(KeyboardSkin.app.getPackageName())) { + return true; + } + } + return false; + } + + public static void downloadZip(String url, Context context, DownloadCallback callback) { + + Glide.with(context) + .asFile() + .load(url) + .addListener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { + callback.onDownloadCall(false, null); + return false; + } + + @Override + public boolean onResourceReady(@NonNull File resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + callback.onDownloadCall(true, resource); + return false; + } + } + ).preload(); + + + } + + public static void unzipFile( + String unzipPath, + File resource, + UnzipCallback unzipCallback + ) { + if (!resource.exists()) { + unzipCallback.onUnzipCall(false, ""); + return; + } + String itemFilePath = ""; + + RandomAccessFileOutStream outStream = null; + IInArchive openInArchive; + RandomAccessFileInStream randomAccessFileInStream; + try { + randomAccessFileInStream = new RandomAccessFileInStream(new RandomAccessFile(resource, "r")); + openInArchive = SevenZip.openInArchive( + ArchiveFormat.SEVEN_ZIP, + randomAccessFileInStream + ); + + ISimpleInArchiveItem[] archiveItems = openInArchive.getSimpleInterface().getArchiveItems(); + for (int d = 0; d < archiveItems.length; d++) { + ISimpleInArchiveItem simple = archiveItems[d]; + File file = new File(unzipPath, simple.getPath()); + if (!simple.isFolder()) { + outStream = new RandomAccessFileOutStream(new RandomAccessFile(file, "rw")); + simple.extractSlow(outStream); + itemFilePath = file.getPath(); + + } else { + boolean mkdirs = file.mkdirs(); + } + } + randomAccessFileInStream.close(); + openInArchive.close(); + if (outStream != null) { + outStream.close(); + } + int res = itemFilePath.indexOf("res"); + String substring = itemFilePath.substring(0, res + 3); + unzipCallback.onUnzipCall(true, substring); + + } catch (FileNotFoundException | SevenZipException e) { + unzipCallback.onUnzipCall(false, ""); + + } catch (IOException e) { + unzipCallback.onUnzipCall(false, ""); + throw new RuntimeException(e); + } + + + } + + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/tools/SpaceItem.java b/app/src/main/java/com/keyboardskinning/theme/tools/SpaceItem.java new file mode 100644 index 0000000..63845b9 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/tools/SpaceItem.java @@ -0,0 +1,56 @@ +package com.keyboardskinning.theme.tools; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class SpaceItem extends RecyclerView.ItemDecoration { + private int ex_space = 0; + private int v_space = 0; + private int h_space = 0; + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + + int position = parent.getChildAdapterPosition(view); + int spanSize = 1; + int spanIndex = 0; + int spanCount = 1; + + RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); + + if (layoutManager instanceof GridLayoutManager) { + GridLayoutManager layoutManager1 = (GridLayoutManager) layoutManager; + GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams(); + spanCount = layoutManager1.getSpanCount(); + spanSize = layoutManager1.getSpanSizeLookup().getSpanSize(position); + spanIndex = layoutParams.getSpanIndex(); + + } + + + if (spanSize == spanCount) { + outRect.left = v_space + ex_space; + outRect.right = v_space + ex_space; + outRect.bottom = h_space; + } else { + int itemAllSpacing = (v_space * (spanCount + 1) + ex_space * 2) / spanCount; + int left = v_space * (spanIndex + 1) - itemAllSpacing * spanIndex + ex_space; + int right = itemAllSpacing - left; + outRect.left = left; + outRect.right = right; + outRect.bottom = h_space; + } + + } + + public SpaceItem(int v_space, int h_space, int ex_space) { + this.ex_space = ex_space; + this.h_space = h_space; + this.v_space = v_space; + + } +} diff --git a/app/src/main/java/com/keyboardskinning/theme/ui/ActivityHome.java b/app/src/main/java/com/keyboardskinning/theme/ui/ActivityHome.java new file mode 100644 index 0000000..8844412 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/ui/ActivityHome.java @@ -0,0 +1,117 @@ +package com.keyboardskinning.theme.ui; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.util.Log; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.applovin.sdk.AppLovinSdk; +import com.applovin.sdk.AppLovinSdkConfiguration; +import com.keyboardskinning.theme.R; +import com.keyboardskinning.theme.mylistener.AdCallback; +import com.keyboardskinning.theme.tools.Admanager; + +import java.util.List; + +public class ActivityHome extends AppCompatActivity implements AdCallback { + + private boolean needShow = true; + + private List maxInterstitialAds; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initSDK(); + setContentView(R.layout.activity_home); + } + + private void initSDK() { + AppLovinSdk.getInstance(this).setMediationProvider("max"); + AppLovinSdk.getInstance(this).initializeSdk(new AppLovinSdk.SdkInitializationListener() { + @Override + public void onSdkInitialized(AppLovinSdkConfiguration appLovinSdkConfiguration) { + maxInterstitialAds = Admanager.initMyAd(ActivityHome.this); + Log.d("-------","--------init"); + go(); + } + }); + } + + private void go() { + CountDownTimer countDownTimer = new CountDownTimer(13000, 500) { + @Override + public void onTick(long millisUntilFinished) { + if (needShow) { + MaxInterstitialAd cacheAd = Admanager.show(maxInterstitialAds); + if (cacheAd != null) { + Log.d("-------","--------showAd0"); + showAd(cacheAd); + } + } + + } + + @Override + public void onFinish() { + if (needShow) { + MaxInterstitialAd cacheAd = Admanager.show(maxInterstitialAds); + if (cacheAd != null) { + Log.d("-------","--------showAd1"); + showAd(cacheAd); + } else { + Log.d("-------","--------enterMain0"); + enterMain(); + } + } + + } + }; + countDownTimer.start(); + } + + + private void showAd(MaxInterstitialAd cacheAd) { + needShow = false; + Admanager.setAdShowCall(cacheAd, ActivityHome.this); + cacheAd.showAd(); + } + + @Override + public void onShowFail(MaxAd ad) { + Log.d("-------","--------onShowFail"); + enterMain(); + } + + @Override + public void onShowSuccess(MaxAd ad) { + + } + + @Override + public void onHidden() { + Log.d("-------","--------onHidden"); + enterMain(); + } + + @Override + public void onLoadFail(String string, MaxError maxError) { + + } + + @Override + public void onLoadSuccess(MaxAd ad) { + + } + + private void enterMain() { + Intent intent = new Intent(ActivityHome.this, MainActivity.class); + startActivity(intent); + finish(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/keyboardskinning/theme/ui/MainActivity.java b/app/src/main/java/com/keyboardskinning/theme/ui/MainActivity.java new file mode 100644 index 0000000..0ab8c4c --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/ui/MainActivity.java @@ -0,0 +1,33 @@ +package com.keyboardskinning.theme.ui; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.os.Bundle; + +import com.keyboardskinning.theme.KeyboardSkin; +import com.keyboardskinning.theme.R; +import com.keyboardskinning.theme.mylistadapter.ThumbAdapter; +import com.keyboardskinning.theme.tools.MyTools; +import com.keyboardskinning.theme.tools.SpaceItem; + +public class MainActivity extends AppCompatActivity { + private RecyclerView recyclerView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initView(); + + recyclerView.setAdapter(new ThumbAdapter(this, KeyboardSkin.getMyDataArrayList())); + recyclerView.setLayoutManager(new GridLayoutManager(this,2)); + recyclerView.addItemDecoration(new SpaceItem(MyTools.dpToPx(10,this),MyTools.dpToPx(10,this),MyTools.dpToPx(10,this))); + } + + private void initView(){ + recyclerView = findViewById(R.id.recycler_view_id); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/keyboardskinning/theme/ui/PreviewActivity.java b/app/src/main/java/com/keyboardskinning/theme/ui/PreviewActivity.java new file mode 100644 index 0000000..54cd5ad --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/ui/PreviewActivity.java @@ -0,0 +1,236 @@ +package com.keyboardskinning.theme.ui; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; +import com.keyboardskinning.theme.R; +import com.keyboardskinning.theme.mylistener.AdCallback; +import com.keyboardskinning.theme.mylistener.DownloadCallback; +import com.keyboardskinning.theme.mylistener.UnzipCallback; +import com.keyboardskinning.theme.tools.Admanager; +import com.keyboardskinning.theme.tools.MyTools; + +import java.io.File; +import java.util.List; + +public class PreviewActivity extends AppCompatActivity { + + + private String url; + private String name; + private String preview; + + private ImageView imageViewBack; + + private ImageView imageViewPreviwew; + private TextView textViewName; + private LinearLayout linearLayoutDownload; + public static String KEY_NAME = "key_name"; + + public static String KEY_URL = "key_url"; + + public static String KEY_PRE = "key_pre"; + + private String unzipPath; + private ProgressBar progressBarPreview; + + private ProgressBar progressBarDownload; + private List maxInterstitialAds; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + maxInterstitialAds = Admanager.initMyAd(PreviewActivity.this); + setContentView(R.layout.activity_preview); + + initView(); + progressBarPreview.setVisibility(View.VISIBLE); + onGetData(); + } + + + private void initView() { + imageViewBack = findViewById(R.id.image_view_back_id); + imageViewPreviwew = findViewById(R.id.image_view_preview_id); + textViewName = findViewById(R.id.text_view_name_id); + linearLayoutDownload = findViewById(R.id.linear_layout_download_id); + progressBarPreview = findViewById(R.id.progress_bar_preview_id); + progressBarDownload = findViewById(R.id.progress_bar_download_id); + } + + public void onGetData() { + + Intent intent = getIntent(); + name = intent.getStringExtra(KEY_NAME); + preview = intent.getStringExtra(KEY_PRE); + url = intent.getStringExtra(KEY_URL); + + textViewName.setText(name); + Glide.with(this).load(preview).addListener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { + progressBarPreview.setVisibility(View.GONE); + return false; + } + + @Override + public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + progressBarPreview.setVisibility(View.GONE); + return false; + } + }).into(imageViewPreviwew); + + File cacheDir = this.getCacheDir(); + unzipPath = cacheDir + "/" + name; + setListener(); + } + + + private void setListener() { + + linearLayoutDownload.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setAction(); + } + }); + imageViewBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d("-------","--------finish "); + showBackAd(); + finish(); + } + }); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + Log.d("-------","--------onBackPressed "); + showBackAd(); + } + + private void showBackAd(){ + MaxInterstitialAd cacheAd = Admanager.show(maxInterstitialAds); + if(cacheAd != null){ + cacheAd.showAd(); + } + } + + private void setAction() { + if (!MyTools.isStep1() || !MyTools.isStep2()) { + Toast.makeText(this, getString(R.string.text_hint), Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(this, SettingActivity.class); + startActivity(intent); + return; + } + + MaxInterstitialAd cacheAd = Admanager.show(maxInterstitialAds); + if (cacheAd != null) { + Admanager.setAdShowCall(cacheAd, new AdCallback() { + @Override + public void onShowFail(MaxAd ad) { + goApply(); + } + + @Override + public void onShowSuccess(MaxAd ad) { + + } + + @Override + public void onHidden() { + reLoadAd(); + goApply(); + } + + @Override + public void onLoadFail(String string, MaxError maxError) { + + } + + @Override + public void onLoadSuccess(MaxAd ad) { + + } + }); + cacheAd.showAd(); + } else { + goApply(); + } + } + + + private void reLoadAd() { + for (int i = 0; i < maxInterstitialAds.size(); i++) { + MaxInterstitialAd maxInterstitialAd = maxInterstitialAds.get(i); + if (!maxInterstitialAd.isReady()) { + Log.d("-------","--------reLoadAd "+maxInterstitialAd.getAdUnitId()); + maxInterstitialAd.loadAd(); + } + } + } + + private void goApply() { + progressBarDownload.setVisibility(View.VISIBLE); + String skinPathByName = MyTools.getSkinPathByName(name); + if (!skinPathByName.isEmpty()) { + setCurrentKeyboardSkin(skinPathByName); + progressBarDownload.setVisibility(View.GONE); + Toast.makeText(PreviewActivity.this, getString(R.string.set_successful), Toast.LENGTH_SHORT).show(); + finish(); + return; + } + MyTools.downloadZip(url, this, new DownloadCallback() { + @Override + public void onDownloadCall(boolean successful, File resource) { + if (successful) { + MyTools.unzipFile(unzipPath, resource, new UnzipCallback() { + + @Override + public void onUnzipCall(boolean successful, String resDirPath) { + progressBarDownload.setVisibility(View.GONE); + if (successful) { + MyTools.saveSkinByName(name, resDirPath); + setCurrentKeyboardSkin(resDirPath); + Toast.makeText(PreviewActivity.this, getString(R.string.set_successful), Toast.LENGTH_SHORT).show(); + finish(); + } + + } + }); + } else { + progressBarDownload.setVisibility(View.GONE); + } + + } + }); + } + + private void setCurrentKeyboardSkin(String resDirPath) { + MyTools.saveSkin(resDirPath); + } + + +} diff --git a/app/src/main/java/com/keyboardskinning/theme/ui/SettingActivity.java b/app/src/main/java/com/keyboardskinning/theme/ui/SettingActivity.java new file mode 100644 index 0000000..910fa57 --- /dev/null +++ b/app/src/main/java/com/keyboardskinning/theme/ui/SettingActivity.java @@ -0,0 +1,98 @@ +package com.keyboardskinning.theme.ui; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.keyboardskinning.theme.R; +import com.keyboardskinning.theme.tools.MyTools; + + +public class SettingActivity extends AppCompatActivity { + + private BroadcastReceiver broadcastReceiver; + + private ImageView imageViewBack; + + private TextView textViewStep1; + private TextView textViewStep2; + + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_setting); + findView(); + broadcastReceiver = new inputReceive(); + registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED)); + refreshStatus(); + setListener(); + } + + private void findView(){ + imageViewBack = findViewById(R.id.image_view_back_id); + textViewStep1 = findViewById(R.id.textview_step1); + textViewStep2 = findViewById(R.id.textview_step2); + } + + private void setListener(){ + imageViewBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + textViewStep1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MyTools.goSetStep1(SettingActivity.this); + + } + }); + textViewStep2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MyTools.goSetStep2(); + } + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(broadcastReceiver); + } + + private void refreshStatus() { + textViewStep2.setSelected(MyTools.isStep2()); + textViewStep1.setSelected(MyTools.isStep1()); + + } + + @Override + protected void onResume() { + super.onResume(); + refreshStatus(); + } + + class inputReceive extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + refreshStatus(); + } + } + + + +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_download_background.xml b/app/src/main/res/drawable/btn_download_background.xml new file mode 100644 index 0000000..70988e1 --- /dev/null +++ b/app/src/main/res/drawable/btn_download_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/de_keybg.9.png b/app/src/main/res/drawable/de_keybg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf5166b16bbd7bf536d78582c202f3840541de4 GIT binary patch literal 6989 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 y<+vwdljXBH;3tz>x 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 Zq+Y0Yw6_cEWd6)yu{5>8)nGkR{tu?<9wq<) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/de_keyboard_bg.xml b/app/src/main/res/drawable/de_keyboard_bg.xml new file mode 100644 index 0000000..7e0c160 --- /dev/null +++ b/app/src/main/res/drawable/de_keyboard_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/del_icon.xml b/app/src/main/res/drawable/del_icon.xml new file mode 100644 index 0000000..1c653c8 --- /dev/null +++ b/app/src/main/res/drawable/del_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ico_shift_lit.xml b/app/src/main/res/drawable/ico_shift_lit.xml new file mode 100644 index 0000000..858c5ef --- /dev/null +++ b/app/src/main/res/drawable/ico_shift_lit.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_back.xml b/app/src/main/res/drawable/icon_back.xml new file mode 100644 index 0000000..6f0920b --- /dev/null +++ b/app/src/main/res/drawable/icon_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icon_download.xml b/app/src/main/res/drawable/icon_download.xml new file mode 100644 index 0000000..ec67a29 --- /dev/null +++ b/app/src/main/res/drawable/icon_download.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/step_background.xml b/app/src/main/res/drawable/step_background.xml new file mode 100644 index 0000000..70988e1 --- /dev/null +++ b/app/src/main/res/drawable/step_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/step_background_selected.xml b/app/src/main/res/drawable/step_background_selected.xml new file mode 100644 index 0000000..40a6b83 --- /dev/null +++ b/app/src/main/res/drawable/step_background_selected.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/step_selector.xml b/app/src/main/res/drawable/step_selector.xml new file mode 100644 index 0000000..49be956 --- /dev/null +++ b/app/src/main/res/drawable/step_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..8aad718 --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..5f8b6a4 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preview.xml b/app/src/main/res/layout/activity_preview.xml new file mode 100644 index 0000000..0e46d6f --- /dev/null +++ b/app/src/main/res/layout/activity_preview.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml new file mode 100644 index 0000000..116ff31 --- /dev/null +++ b/app/src/main/res/layout/activity_setting.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/customer_input_view.xml b/app/src/main/res/layout/customer_input_view.xml new file mode 100644 index 0000000..760d763 --- /dev/null +++ b/app/src/main/res/layout/customer_input_view.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_thumb.xml b/app/src/main/res/layout/list_thumb.xml new file mode 100644 index 0000000..be9016e --- /dev/null +++ b/app/src/main/res/layout/list_thumb.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/icon2.png b/app/src/main/res/mipmap-xxxhdpi/icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..52f6677073f99c1e3be3e3a0f3f4af3c29db7c67 GIT binary patch literal 166239 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˚TV;O98*j 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�pP%q>EC~BEqn61qooM$bb>yg$9R5>f zT#Z|A^P(}#!BH<@;^1#!tp57OTa~p`DyvcsZxshkGc(~==yk(L|Iq*tZK7c9k_1K1 zv{@ITYg%k}O|9#owZ6N}LdO8#rg5q?c+}Q_)8FmTAD8vb%=@)QF+&;?0|yY3AXi~k z>bMgVnC%7GIb;A?(g(#Ib5ckZ$)%GjfLono(hATnIx%hc(f8&O%U?cTyl&7-ZC%^E zIt3M0a4W>LehqMVQpL$a-52Jf=zZ>)6`^SlHNGyo*s0HEzJ4?SBr)>@>@Ku5IpYzFMEwgMk>^FJ?V(MN$mx z{)^ttz<2A!s}GJfy$V;8;31^-%)&qL}DSsCO=< zDEgR!s~YFleb+Jh%ZCCq|2@}e-Qc2L=(%L|80k+$EF7&*C32Tu=4Y()+Isq6M<27& zvLOlKD!{arw&sP#EhunnT)IEkY8|SHy0gG^6Ohcom;F8~Bt>^iC%SR2*Z8}j_3d5k zgAEN7<=`lHp>HBbihltu@9d$i#8t4{x&FFwE9=b6@OA>B6~VD1ksm~BfGrB3U#bwU zI$^w>YWbZP>sqOrf2-@+kt|z%RYV1MW3^Dswb)u^z?fw6w|59m){42j9I(@99E=yY zOC2Ou#(?}L@;WaEJ~FRickI|{p;*ax794p=KRa{@06suuD0@-D;RFsQqPgUL_e~Vh zK%Y!gF=4RK03;LGkpv7X6_Dd#6DxDKYON3forkx0DGxzq@=Fpf9)fO#!-rBCa1k$V@ zy%}4-&q0)BR5V_JQAlwYriDIe%r}jlW8FGs{%ngk>$Pfp(EBtMBa__8^IDm;pmzz1fR6#n_Os!4x5f?!KiHo8g zMJEx*D}Bx=h~{tc01;&*J_#%n6q}y)pfRa5t!Yt<78PA;cU7plzl@wJ&}k9IXaf3S zDIoW31<~M7y`-q^>fbFANGNG=;@>v`WMc-IX;%OC`5zl7k_xW$078La>jm5dWSq@X z(|CFJg`UP&cQW^7l%Ua|0x^_2m#X1eMnFBM#FweqaFu9ayc&un~V9Wb<^+Wx$d zdqzR-IWEP|?n0X9i^ktH_)&2Eb#~9fOB}^kkjj-&0|o8Eer$F8k9}m}E(Xat<#W_H zI4&Y{EzEPJgzHPkR+9-e=*v~RkhJTEHF=xazOrh6F$rbJVp>Sn%k2;TAq%u4F$gOG zx+s$dI8rcRu7^>V1d~G}gq1OsT^1<#5EPUN#+b~Cz5m}!FxO!nIT%Sk|H5l61HI=# zg203ih+luK0!H%M9w3TbWg!<~@; zffXre?_o7SGbJZ~zxY90;6UxjJHbieARpy`nW)k0+QxbBGW>klrx@j#6Rix^73rGB zi)L2nyaX)vKz?5;sH;NyX}ty;s#aG<*ly9(I!Om@e6s3PQN}m;Bz$`}L(BxYPu7W* z&aF{!GXE2`I4uj^U0WynWIM>u zk;_cvoGNP3YZEQxWkS658Y9%L^Mx)ejx-!Qa|N7gmC#X}Dg|EB z&j!g^0GISrAv4`M52rQUn}|t!X(m3^hAfxb$cl`N72%s;76wNSqc2N2ZsnExG0mP~X|Rhz+MTMPH_%vw z6aZ+NzXdIB0szDD8g;OuhjA3VCW0Q?lG>SWX0*^=XE=cNc9V|KkZIUt9ieoM#e8Mjx{a+Kh|BFcB5g@BYn zk3%vm8=3E}^NC4Y&{^+3$O4nBRB2zC>>-5lkc_E~SJK9^O4bdW1RKsu@$=u&K))gz zn2R(yNWOYY;S0(g$IU6 z^ewGfe^SYF`oK+>O#b$86MzwM8JX|D3@MO|D9>(PGUw+3rS_f%j9gUk;H59tmKB&; zXyBLyhkB%-j8)pJV*)D%F3pr}e&;+$%&uE{N#U$Qaw{yd#dMJj*|bNZ)3U(Xjh$Xq z>OnXbQ*e=XYYzxIHv6sP#!B35yGx0A=n4S|5gC)%)@0Pefx4^aD#jtTZFT ztZormZ&lR5P@m>9e|8aN?v7ODvp5l(n@HjjWcROJ_SuH9HZp*<)xy;oT$zcrqPa{B z{6N#C1>mPZ#+=&%PDi3$%*!MkjLzF^CWx&pup<@ZX&n8jX2$TXEN&io4C_q7w4eNl zQ0tGG|BYGL-~C}KB*F5qntz@$6#RN1WZ|Uj=$)}tLOd$r)QKfy7_~ecE7SOmiJJCq zpWAx{l371Mf4bdJ+aC%D``s)bR*pF6*o~~_d`waFg??v2eKC87E}JW3uzgx)9Q0cs z?qlk&Y4ahbzFJWiv+kHyXu!kT%6-Lly$KJmFYCxk$hvgD`Qpo{pjAO-?=#l5HPirY z9hEV&P&omrUdOQvQX<(-AKWP9*-Sn7Fpy;Ltnb(7)05uA)=J(+-|d)UBJQfmf1$ah zHs9kW0lhxLKP1oxTnJ)@?`3PFAxohRso+$rE*lI8=r!gtbULv)z_Iro>!PrjnpRCD z7W`}DXD%5#!@{g6`92#`KmdC=N}z{*0j~WQ3_nE-T1&3-U}zIny5AZXIq^^yj;faZaAgi#3lWs&r?bu-xO(NTA2yzUdtk- zF_p@wLd?p$#>52kVm783^#_Oe#B@xvj3fcs3vHJLJ{fm=8@oGaW)>)96$4j=2!xYT zqWotrCask7O_0XCJuuNUvExE=$!i>Sgn~%a5iX)w8P4mUF-r@;%LSlmHRyG@i5qm> zL(-&73%0)vIG}yD-0n?QhJLKbO1&ybva=$rzaAAjF2y0(^M`B8?&*IgTOXO$YAJbz z%govXvNE$KwEH49B+Ex6^|`M(AJ;8X`52p)US{uU*O*lxFH&Vz8(Sx4ov^u?U1Yp z_THAxY4Z|LYng%s^W7Ur$k&`5#ZCS`+4mtEQ(Tt58M8D}=u?R8`XL3>0;x3>>RJLL zt?mTpy!$2n^ym@*yx$bXgg2|i*E=g8UP~~|-w!Gt+CV^pQ|8Ehs9j1`B}N%Q3iHO zXX$%#l`+AJ#6*W}I#@eg#lV(FPyP#XU!Lb~TDhf(*%|JmTyr7`|6U^_nPhVd#LyaH zIo)Lj)XJDl+WC17Js>b}M-tvSfQmYoCg|+!fRzdh3o13?VXlgyAjuE483mwA!Y7|M zn-d#!1DcaI6+Ei7jk%h&$6bmgu=Z@PMxG;gO*O7tJ z2z}b60SBjJIO!6Qvh`!G0~@&Rh6U%qt6*w3_2Vq{XnS5v-R#6`!1b+h#_zQWue_JLVg z`aro%6ZC<;#HyK-A^H3B0!TJKCbX>$^XXgPBkS*H{mEk-%pDU+*#Y@|R@tvVl`+y6 zEiy3Uk-kS047x6?zJC?cT5+UUfkNlZIngqE4VDBj#y}I({ka+2tSD$d44Bke|E&0o zou=sZU2LtGFf(B5x&%-xIL-Q+yDNrk(}0&)30yzkwtn)pR*?2%9xGvF^Am_16|fvb zhm#;i6?isQWcT($HQN_t*A#JGQ1;mqVf~ooybN(Jh%IQaw5pN@-tvcJ{V3I{v{Jxj z6*LPI@;(DS8KBwp4n1Hd^>bdrxE3Hc&McRg^ueJ^0PsFi^s4=jq~Oo8TsJkIMrHqXtZ|$ z2bDznA8SOpRY%)6hS~3)WNJ27$I_(=hjswUaD00pr0)Z2x`mxdcoj&MOq!H962U>x2ma7uSOuL)K>-lTs0d6|k{)EXmf6&6ipv?D?h@ z0E$3$zguCdlPXnKBx}!v(-0U0N00eAL%lGSYClFN+jd$U~GK}l{T{oZYpC7=gT zG3^zH2zh%q`^?70$beRVkAk8u1Azuw*9r%@w7#6)oO|kWFw$GNTym}0ycdo>PN*tk_AKYh9c0Phz?LDb6{<|9dY>vL`&aG#mpoH9St z%ya)7WSW1*xPi55f1u|5n0)vaSmagsIj2Eqn%7%&qP3YDAU7>;B&Tg@dg7`|X2?En z!HdcNeho*Z)^d-jkkJLh(Z6e6C9liIL2C6UX4Gq5SsO)6CVhaQSs0Z9oTXlG(e1`i zT}<^5%)AcCb&?CLO;c;%nb0;@O&}FfTIjCq&uUQSjIIMS%Wj&(Itwst9sL1OIpeqZ zkX!)dnxrY<_G4PTff2ONc8Z;k=?sEV3toX;34H+}6HfVhC2PMI3NE=d@@$isU7!CO z^cneC2Yvkk)-5h@c5TTzl21Dqd$3&gK@#y?f#pcqH*+7kHHMSmxVDm_I9p8u0TEFE zd_>AP7ve_9H_^HKi3Ac2;8_Y_9a1Jhp~BWGFqS%zX8zB|qaPCkxFjtfk_AVHK+Xiw zbX6-jcB-d<8o07|u=TU@5Gp-iqEqETqdG5o*Gqc;=n??D4`d8@Rlt#^{pFi&6UB_- z=YDV#pr)k+)(f(j87>UkGOfVO#E}#%wn^J4Nha1FJh;RZF6=w&4A)22P6M24VU@dD za&_S{jfBn2!I)PcQS6f6-%7+nGT-JJU$4<-ZP`2Znp&Ikpe--nhh!~Ti=D9hNb_R- z?%Y}P?iyfjIW9`vK|lq8)~ffU`L*}5v9)TC!AU$y z5rk2jo59{S*UE<}n0Z`5=je}SE)_81(zxZI!q!Djxv$)j+z|HskhRqdoRH>ysWl?3 zlA&1ic>u|UFAW@O+uo}+qtSUO9&TSj z%9yb=WGR}KSz?EG<$%t{A|K0~@{-MvwETQNAX%H7emK(cw?5?WVC$ms66`!uzB47w z^(6@S>C+_uc#p|8MdxK>9@WAq9;SA95tA9aQ3+#F`?xFx&1(igV2x=TMFytSNPk?Y z6&CTzyiG`1`()7(8ip0La>cbtc#YjgSCB-Un;9QWLfT zkWnYs+Np{T)zVZTS{kPH&3yP)cVJnrYxou*Y6sYuYoQ28$z`9~H2-fNxR$TgzT#ZS zViObzd6HG2?&Nc`Hkd#iuK7OW!mJC~T>9)D6P`WDRiS3**e|tY^|Vc=99B^p8KxuV z>m~2kD9Xu?4G`2CU`HpLi|9PExRF-l0y>{=n6U0UZwt}ls}^EOI`Ha(_Iu%M0g{?^ zFxR=ZL%$*^P%ppNPU_6#NbLQWKDkm{%z%G32j)(i=sI0`ahH{yoXL^bYv@5*OqPKA zH9h|tHOabjNk3h>1OV?bxhRZxUW?y>be&H^w&7+O=LihDV*a3nuCq|es+sG9Gn69Kd=GVRbOAstceyi51B zUIOWgD4(}3tr5byc4dI3Qo*+>H0UcNt*{J9Q}i*J>HCtx3P=`uLfoWDe*7{d-?}|F zkm^a;x;0mWffRFBG(|E$TOeu7`fcm2FG6Euny){7Q3D@l5phx4ZxL5R@LDlYwb5}_ zn%DM`6=pJUHFTK`mtX>QPP09tTBhX6j@Z`?7_I|rvvqPxAvFZ&*!Qrz5}}WdQKNjo zKv@rx+-Bv#)_4!pbdD`0*GD~%K{tuD(dzmdYu$i=t_@xLIhgF{C#3PR{bgrJ)Is7k z7TNmRSXMbEi`&viW|fT2q=l+kk2$%dpB`NTfcKiz2Yxgb^MB_zZ}9$d6*^YmKQ~9_ z+KTx*9m!3wi5w}Y&dk7C$gKZ9XM_e=`t-I32-y5V);9wqtuY4&vs!Ze?~LF;OCGC& zc81mfj9xQ}>-{FKo8X7{=D(Yug=F@3sHR8Ka5_?4frpgh#=7a-nj1dLQt^VmJEj%6 zbrW{~Udnu1tu8mt%I}(xHI1=<2BgD$B5NSU+N|58ecNZ1x^?<`4qk+JKm?@4qLiuy znhCp5N!O>BDWK?6#&k_hvTTUpQ(&Q4k!+lMH-bK|^J&~n09s#6Kv-MR=FBA_Z|Q=Q zPE5>EEhu&nRvD7Hf9OWQosCCuB$u1{$b)`qX_p2LH)*hjDO;qNRj08M9@uMTFWPa! zxr@Z^HNdxVk&%SGrAOxL*#LnB-Im~hk=_~+nNR_nwqrag@Ek7k8!se*1bEr=vDkMPav=Y<* z(2tt8ADjfsY_+1@-5IeKacp$}Mj>rFoM`GjukbQovCF^$NeFli?8`Met6}a`vuG+f zoroqsS<*8Sw5{G%V12j0m9Z~J@~r7nzFTO)quXORDxw?*OJWXZ#zB8Ka8O1V2Pc7u z*@HLm$DZ;aJ$uJdm(D?NyalHanFb>fkAQtH}h6z#6{ zP3OkIsnm8MNyk? z8%tXwx)fy2q7#dk)1!wgdJW)R$qI1b&toW;bRi`GU>h}LOjfm-jY-S@K2t7ObzxcY zjE5Zqhb->H8s3`ffh}w{8|L>w(tP^JbJmC7g7~5rLGPN>&(LUFrSv~W4bt(l!9#%1 zK`ej@Vi$2ul(X)=V_8DiLUE|~>%(Igk^kgD1}bnt(!+uymX7EltRQH#?`aKhj^XZD z)3mhzo3!_Ud~OAFT9+cc?Y;Zpz5xgsj-xRvb4!@Jz>{1lRt?cAADSQ3Kv(cdsF}88 zKK(wmF)O5!Gwcu`EM;CwXh>Po=J&M6d2a8uojt02M~PYBsV4EY85ao$1c`!q|doVZfu!m>h|LV%CC zP^?Bs5mG!()H#frgBdGCfgtUdE+*@Mtxu~bVf%8Gjq{KqDK4i)K*G!068L-LRQk3m zHs5<8+1Nzkfh_{$-^tN-Lxp0vJl;+_KgoTY`tXz9_pp8F0f0l9PX}Ea`+@9QXw|3d zlp$Q$s2g09ZNT`T>o&ZBUDJO(yl=zv;o`P7-IBK*^j(WuBB}wr2VXc5tPhx_UIXwF z<^I-KKI>0&JLeu3(@AJMdJcJRhHg|SHeQ8E0kH+QfKdr$1>HH9s5Wfw@MMR(yQi7I?1ooJcS zC2L1NZn_?DdR!&;tU>18$#wccYTaL4M`wMhD{MyeRjJTO;HX` zBcP&n$=5zNjcg_TSb2#TX;cfFG$PnTsRC8|VS;r8z2#=QN{gwl-WIe%9|;hx3O!*^ z0nhGIGczg)qANo>Hr5Iq*|zdg3Jn$7H`lC>|3o!CGtc)Wrh~L={_9rPxt%8vb?!R! z%n6bu!0Kh#J{el0W~Bgt-9`e_R!-|U=ykn@tn07wV(Bs2x(1MRZM9A<2QE@am~>8# z({+)Vk87s;O#s6FEC6EU)Wf}r1ipS~?$`>@tRi9La9zaDTWBHF6%mIsq(Q_L0oo3? z3dB)C+!6_Fk6n2gqp`YjS|=L$vdCgj6flj{0&!ZYtEq!_CPK8_fw4(yl6%NU8RHOT zEG_+SzmYLJ(zecvYqEY?z~&2Ek<$p*X6`2j05(q{h|<%wk*<}$iS((DIj?XTQadwc zn^4?_?>0^KIn)1>-?!zYUmX;Yb5$d93(q=EIS6^ED_@ygZv!8gqr z=+tCa6bWQRz1Qhy=iLWlvcB*>27SoxGYV!lJmr_b(?`XUyI){sq5{)Z}9$!R8H5AiG zsG*riWxre7kvAu>AkE=$o#ua!izxjoB$9jtw79PpmLF|3JMQhaQ%T% zO%#ifRW`)>UPIiLwu+gq#Sn?hK&*j%wG*5uF!A(2_Tup4ju2YS|geZB$|sd zu3ZTSQ~F|Dwofl4T@R+Dc51y6ehgl%p2nArFLa&!?QIjrBwq?ufsOy0>_d5euRPj) zt+r*VbC7-FoXQ-#kM*|tKIq(-vb}a+JlltjeINAUqQ0ADI7V5^HdbamDMP0N+QURR1ixl?te zzc0#t07Z6R&}bC9FJ#Ab6|`)hg)D5<7n1H1vOf4im~gXjv`cw* zyOKp0f(Re!2WM1TGc_KT@W!^FWea#YPxzaLW&Y0msML7@O(&*R3x%&#P!N<^jbOAd zjLa=%Qxqc@dl+fjP*X_R)>3_r#vs~JAt$ss7`ey|7n$ulZtXipE7d@~!xfHJH<%}4 zSx&32z&RL|k+F}oMDCZ4`_A$DR%BMDlkUQXkW*Xp1tQ=ga6)7&z`o9R@Gz>x`Vt+) z6>FNOQ%%29?iQnHKz7KIhrV2H9nL;GI*9>rh(^93X^nj#S(jobRz>pR+TYPj;9t|h z7O+)AJE4z=H|vufLS#a5OFI}<0M^Jn)n4XmIfA7MnL>;;bPD8xqX!2*N}y%wMW`-~ zVQBx0%q3DOQx6U%C2Wl%zH`JSObZcoMIi#SDl(=Iv?GZ7I_?f=1O)gd5bH>LO$1qO zk=~`eOW|a0=E!*2xQ;Y(e_p063Q&Kwm(OhM`yf7-`V^h)F9U;SQLrO%Ee^u8`{1R$ zNhf=2RYSccd%S5CT-5SIgt%~W)UxuzQSB%e@*a16WE5b}IZnJpyBnyq08Eo3FwKP%$1F)6_u(&im`DnS!(Jad#-mo4aoT0^_9f) z+})D~Su$6Bu6-UB~X zV1Nku+9m&J5d|2S|J#Co98e+5uJ(>6oG^i^RXO6+C+@%@8zXApy;G2YqzK*HavT7@ zbWELq%Hakd{$2q)`ulx!9Q2~jC1fAau}~Ae>!3K5cUVnf)c`Y1dx}Z(QTZc6MTL7# z2Ewc&qLtG%^Q7TC7n9$;_28RiWhrYIPods{Vpp`g($SyQj`qcCdqvid2z^jhfoV35 z(usgCRj8R2qSEWTNMAp`)Bw*i(%;utUyMmR4tlSPPyz5?KKB!F$?OtjWWVB5jSI7S;-zeH*~$+HSTjq>O6SQyW}^$s zBOuINi2>=e1&o$np1EiQ{I(9-V_>H1poVTFZiY$&EUTc$g)7f;fxaM@0Rbzh)z68x zy+T}qILB5k!KZc0T5L^D4i%VPq-#`gRgP)`<82sCl1A)(;{6WQe09EEAIPPaVmFWp z%8=J&iIbMh?HiO=_wprg-)HxcwYA|s12eKGU zu!~%j%dR20>?Z;zIBo-P0jG!{F%x$F&PG1_szd}92s5ooX@B`rjEGse(03-P7U^L% z65!RfFrG=iu^o_t%go{-X@vQ^_&{R1`fp!Z(WUFEK%XjUo2shh;FIksuq`h?)iKEU z!I|Jkn}2)nTxfJU4w=PHTrY!bRQ~sKnO~;{HQMa?d0P=^5MeVx)`hJt>sQcc*j)EC zPQSKWzF$wJ6X6OXgjV`*sKuh>JMgC>oEIvQwz_0KHbL*RfwOedz6zuI0nXc3_KOQ5 zJbfiGJ*Ai5%P5+^tI{}B3Mzw+SLf(mggKdeV496@sef0bz1Xq7|MRh2B0zUrhjFa; z`i$ocl?HoGU8m3Oa`On zP_bjZ4FKePA*X%}RC#Ek#Gagv=mQ$h@R~>;xZLR?tVSZICOcvQC{4kL>7M?XPWZ*} zb2I%XC6+Xqc5ku%H}33xY-ryV8?M>(ya)ARQ{T^PYjB?%zRQN^;h-FE35wdeCW9*4 zESEGOUq~!OQOg84;N)Hkko0QiT$FHsDyF&J;KUrWp}l-vS)i1Qs_8jF(5GG)V^Kr7 z3!_T4ePq5(urIT}9qU!V@@E-CS?M(Cc9c!ga^Y<_z*2gM2a8v1bjhL(#ThiEap{MkD4FJiaxdJizJLegs>xN()s)50LXry=oF;kY4#9VXXYuZMx6`sea?Z+5|{n+2;hi?%9wN`j% zKqf3AqU|3d%TR9ln0M_l!=k%$Z1DikTpvLxDe>`{BL$d=3TAd21l=j{!3e;ydm{lZ*~ZA1MonYSwl@Gu6JF!fYu4 zbd|;cxR5LXee8sG%7W=Es4eV2pi;ry8u$mS7!UZZmnT9~b1u>iM(x`b*+ zTp1SdXMO7}Mi%)P41Tf;B8a6ebrI;OX2@^s3>5%~rlsjX~uC$7gLgR7)HsM%*^SM2aqf z8VlBRUQbqY^tAKI{d1QSz7m|w-FSDG((F!^r*_}knF}TY04VMK>H441( zaMTF1AGs{(FEhVaL87e}nsPSMSb}At*C+^Zq-==7K`|D=;mfmN%-+?^=q5DHU1EaR z=E*c=6V_JaA&{&M=sjhW=bQT@pA$&ywnYH+nN~1syezJ^K$V>eiY;lYI}t&f1JvPh#^`$!lQqDsXG5!nk!5>W zHcO?!s-0KiALI$e2qwFcYMMYn%*`I!k-w=$>wZ!yN0W!&?3a|t6=II+mJnBPxDq6L zSc&=mJc^JCYLKh|fJC!*vO%VmXq8nZKGmTXK=yYo6dy#nz=3s>W6s$kBUpql)U z8%WH}v>K-m?P4UhkrKzaa%|Tk{Ef+*l_u|}jpL>{%qbVtZg9_<;K|y^HTHa54G@?q z*|Wwc`#FvzS3vG|F#$Pj+nzVD|aGMn*Rx(?^`d$+*;>E5!QP1enc$ znYLS~W~xHffPjZo!q&?ks|Td04Fdy zhOMh`Wd|mc)B)ouBlQWoAX#F~4B|qAO|=$4AAb_m8sO+FQd-fby!OVBB5G+U6wD=z zD3;Y$)yvvYg*icEC5DBQ(VrtbDw7}EQWm_YW{B`et&brofkW5+IwF^K5MgN zUHESrI`ft1%rLivti7WXMq%lkEa+1=*A8FFw0?VT&u|@m5TK=Y*+Dm5h}0t(Z^5K= zJs8Rb^d^gR?nmDAj`@7#LL>~v%f7ccvid*yJth<)XXn#r-{+Q-f%W{1Yl02mF}TM{ z35U~2`$lBdM6s}3as9ak#=AX|j(bL7>G%0Kj-8ZUFP^m)Z04@y*932W>V!xg}r-APRl&+@jVWyp-KzF&;VD_Z{L! z%iVdCY@UYhB%@pju}S~1^EAtx$>myo{)U?bj!|wR&NUFzSZ*Ue%=tOb)up>>Ex?nr{a7~Gtjt_w76 ziFHeb_20419L)#s^f_GzZ7UjMp&Y(+8qKd$))$8{ZPS2C=G*iRqI0x3$+sR02sF1w zKJJ^y#&~GqFtYj0!JUo237uR>TNhgG{lIHQA*pcoYZC*jD__TG<|XpmdC(}leD{RAo?Se6_7=r&aoIZ;u>hYT5r@s z;46s`uL^kw6TVG02651j+=OpqTxIu~P#m@cN%IdeY5K$Q?u%MwpdQj1ZV@1K8`&4v zkkr_cvuzFme{b=L(6*7;AMfbOe7y0hy(@3%uh-LjBc7Ih;r2eDDhT_LeN9=9G{dP(n? zE&)JBF`@+%AjF9GQaGVJ&%Ul4bUB6D0@}izF;#E6#p1&=+J^w^wqHJ9%GOd!kk*CN0)jn9-d7i)-jYFP|$cO~h5vxU?E7zF{ydC;Rn=W(PUS%Wl<9HgU(T{^5PkTL@L zzHJ~Iqs~c6;1N)+U~8_LzSp(1Nkh4$cTAT6AfwR1@-#9#lA=Fl?U?SubeFZ#!Z~%o zX&t%00}HKFzlqx!bLcgfAjN9D6JOe*kf`axL9~i@dar4JIit-Vah?Wmf^$joK|&HH z_IECba`2LC{$|2oAg2Gj$Y!mMQ zQ0}vq%e;jCw82Wpuo!_GLAQXog7HMmp{*BdV{Q=N2L7)Os;^er^%5^2?^lhwS>i4{ND(PKAMvL4TaF zJ>R+hchmeW4y8fB7GA*9c}&~p+_cTHhqex^$_`qGUlxQCT;bLPj-_Lc+XM_cC(pF; zU3r=NkxO%wyU7;Fe$X%xPW1Ds_TSuDwx-Sf)R5L!K41CT_qwi!r&dC;4p?dG{Jvfj z*5}_xDoS1<0cZomHg4^iHX^Q(B0lW`y4q1~!DJ*cMYbPCCG1aNF@pPzxB;4_fNSF= z7Mxpv6hPV$OU>vQMoR$!vr69ON+)grOUtyQq#bHy(>_}zN7njG?=o39aAlM-*y>U! z3eo(B!1t2g9l8Vn8FdYu9>SY1z|kET??fJb&N15B005LZHi+M<8NvJ{LK7KRUWzqj ztF_M~kBM>Rfo3j1Y(-d&uZsE7ZqKzp^JCT|ZSFk5V?x9x*%(a7e$N@$P>AQk-%NuC zi1vSgyt}2l4ev8Bkqe)^20)p8ZtpqK-z}4%A_+$ixDMhRR(D`=j2wIfQU{<;dCZVN zK;eYpjm?KCXRb(ES|mPE2#UIEoLU9u8kAI)TC3ls_Zp6SPWF!ZeA#j` z!D67JLB5E3aHeF&nS6EV1)aFC!1C%Ry>hpTPn* zVck+@lwW7-*Q{BNB#84lvR>Q2c8$${9ktrthWD~LnsWL87k)lSCQa~-9@vPO!`d(SXoq|L!$Az~+Q#O%QK8GHXm6`nQj0QWcF^{(y zlGO}Ylu|^kE@4v0J}U|?qx;_@x�jg&<{q@4p$j`zlPYz|K|DnFBfLrdc`wC#6eI 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

+gGRV`;)O!xHm>@KjgyVxZNf~1iEi3b`V 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 + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + #d9c7ff + #faa052 + #0e0701 + #DCDCDC + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..084a05f --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + KeyboardSkinning + Step One + Step Two + For normal use, please enter the setting to complete the setting steps. + Apply the keyboard skin successfully + Settings + \ No newline at end of file diff --git a/app/src/main/res/values/style.xml b/app/src/main/res/values/style.xml new file mode 100644 index 0000000..dbbad75 --- /dev/null +++ b/app/src/main/res/values/style.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..7375b41 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml new file mode 100644 index 0000000..fa0f996 --- /dev/null +++ b/app/src/main/res/xml/backup_rules.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml new file mode 100644 index 0000000..9ee9997 --- /dev/null +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/im.xml b/app/src/main/res/xml/im.xml new file mode 100644 index 0000000..aeaa192 --- /dev/null +++ b/app/src/main/res/xml/im.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/view_1.xml b/app/src/main/res/xml/view_1.xml new file mode 100644 index 0000000..42868c9 --- /dev/null +++ b/app/src/main/res/xml/view_1.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/view_2.xml b/app/src/main/res/xml/view_2.xml new file mode 100644 index 0000000..e2484e3 --- /dev/null +++ b/app/src/main/res/xml/view_2.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/view_3.xml b/app/src/main/res/xml/view_3.xml new file mode 100644 index 0000000..86d6441 --- /dev/null +++ b/app/src/main/res/xml/view_3.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/com/keyboardskinning/theme/ExampleUnitTest.kt b/app/src/test/java/com/keyboardskinning/theme/ExampleUnitTest.kt new file mode 100644 index 0000000..f6250d4 --- /dev/null +++ b/app/src/test/java/com/keyboardskinning/theme/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.keyboardskinning.theme + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit theme, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/app/testKeyboardSkinning.jks b/app/testKeyboardSkinning.jks new file mode 100644 index 0000000000000000000000000000000000000000..b3347d0e9ba41eb8190254cbe7de30fe2d12de8d GIT binary patch literal 2604 zcma);cQo8t8^@6_XjwUXmXpOYB`BFzZ_ivnyg=KnZC;EW&u34^;5jliBz z2Cy6hXAz%g&$cMEjTj1`YSNU?F2XPzQP3|Pw(quF^+78!)d>|kADPf7wlo}s2;5Fd zarHwQ&Jaf%UUGz&o4fC4WnCy+-y&TPHFy2}IGsl@IQ>h@zTd_yt(A48JW4lyhs*r= z7!}i@y68$u&^OCpGq>%nIbk(z$c}D0BLfJT-P#&qK7v?Tcd(Tl{<|kb@ zrc@jgyA@T?fa{t*ryU1|PK=127=0+I&f}ev_unEfyq%STFyzMAD!;q}= zbRr(Vhnosu#oxk6J7vD;)Ok1N1%k?SMs4fe?0vd#hU?EBLGD6edZ^G*iT%G+n}u-?4963GTtH zhO`$*^f^aZ>cxbvmm|`#G<;_WChHaBuhjdFl*A}{Oxb0!a>h!x&CBF|9e?64F3WNo zJ9aEV6Qi6bHYTrJ-{cKHGkbF=oQ(Gu;CS5DQ&vRoT~PbFue&6>vtS|c=nG{jCH05= zNR2Oc2>oocfv|yAsfdRT8OyaDdxs$K12ai3Us9duwuzGm4Jd(OIvxy2_iFMBLR6-^ zsambnf?a*;H~O1duCHIjl43PUcbZZM^rfEp8qWD1x&>m_=VtC?M;>j?eiLsx244%qni>+;VO z*!5v#tVd~eOviIBEgYr0wnZPvZqR8`maq@0g?$R~ybyl=DQ^!L3FMggO zMLBX9{lpBrf-K$X>V3RKW{ae=S4JtKKF9ef$+x5QFw0hrn-!qDJt$cpGxQQOQ8)*? z&B3$G*Cb}jz9YCo~^&D_dgr} z#QrtlL-R6lTlxO#DT=;;22=o5H5EWbRTUsW7rq~2f{_W((KCq(0fWxk>wgLOe?>Wd za!H5HcCqV76Wb?WFYoeEDZt_XiE@)PDTJCa>m4tuB<^m9jZHKGYN3PiIU?liVN(}Q z4Ic&Jyr5N*UFVC_6XuW)r|rN|RPHBGp*Eu$CdP1eu(7Pmo>vMRKD#;>ym3@&JRDU_Idv8C$@?`e5U? zTMBj!Q7vmS1072pV>hJb9vA1?Gk?Xjk;DCMO6ET2(A?%bcj_lhiFm0V#3ON#Zh<&D zIqoq3t@x1eT8Fb259UIw@YWy8*fA?>_Kyuw(IP(*OXMh9skSHc=$&rCx4rkPd;1nbB(6To`yY-=b<3!pUHv?s6V z)aCGCl8u4rycer;prU7`R3Bf5g@r+DTr>N_ED>|$q|H^=#ONf&`K$bU9^L3Fm9~bk z+jp(X5}%6=Y}CIVY+9#jbSi)S(+*}hWNn(ec1^@8nFyh<;vXvVb28pWK6%~dGm}{{ zl9M@de6eDkxzLOlH!dw&soD~uS((?YkXwu2+k(qwNT8)pjK3XnrVpC7j;z2nhsN3F z@BgxkU4C|OEF^J2o3po?Cjq*=Caj{ojA7hvH;Gam&v;m zJ=y;mv_N!{G!@=<16&a30b16wJ12S>V2angH;3#IKCHN9*;C<{pYc<|xp+-{be zM?*|V-EZS1!|(yi9QjWHCc4j0Cw%fc)3siCJ>XZO3^)##hhsk-eQB>Ar-{sM8-!1y zn|T>(1CL@_MUmH__2D3c0Au%z(Etak#3UlYR_`iLhiVa859JjEt+b(79iA}36vKl zBkyAYQveMhzW<;gU`7ywsDkR7Z-R6WQ`$bV;S~qh!!7w+`|0@^cY2O(xRVF%-!t$E bS^sHYdg`EnI_+=LEbb7TNFb>G{iOc_3&Ff< literal 0 HcmV?d00001 diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..1b56b3d --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,12 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id("com.android.application") version "8.1.3" apply false + id("org.jetbrains.kotlin.android") version "1.8.10" apply false + id("com.google.gms.google-services") version "4.3.15" apply false + id ("com.google.firebase.crashlytics") version "2.9.2" apply false +} +buildscript{ + dependencies{ + classpath("com.applovin.quality:AppLovinQualityServiceGradlePlugin:+") + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..3c5031e --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +# Enables namespacing of each library's R class so that its R class includes only the +# resources declared in the library itself and none from the library's dependencies, +# thereby reducing the size of the R class for that library +android.nonTransitiveRClass=true \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..98d01bd --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Mar 11 11:05:07 CST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..a972e42 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,22 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + maven{url = uri("https://artifacts.applovin.com/android")} + + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven("https://jitpack.io") + maven ("https://artifact.bytedance.com/repository/pangle") + } +} + +rootProject.name = "KeyboardSkinning" +include(":app") + \ No newline at end of file