V1.0.0(1) com.kb.love.keyboard.theme

This commit is contained in:
litingting 2024-07-26 20:18:59 +08:00
commit 562173f34d
121 changed files with 7700 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@ -0,0 +1,15 @@
*.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

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

BIN
app/LoveKeyBoard.jks Normal file

Binary file not shown.

69
app/build.gradle.kts Normal file
View File

@ -0,0 +1,69 @@
import java.text.SimpleDateFormat
import java.util.Date
plugins {
alias(libs.plugins.android.application)
id("org.jetbrains.kotlin.android")
id ("kotlin-kapt")
}
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
android {
namespace = "com.kb.myapplication.keyboard.choose"
compileSdk = 34
defaultConfig {
applicationId = "com.kb.love.keyboard.theme"
minSdk = 23
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
setProperty("archivesBaseName", "LoveKeyBoard_v${versionName}_(${versionCode})_$timestamp")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
viewBinding = true
}
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
}
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
implementation ("com.github.bumptech.glide:glide:4.16.0")
implementation("androidx.activity:activity-compose:1.8.2")
implementation("com.google.android.material:material:1.11.0")
implementation("com.github.omicronapps:7-Zip-JBinding-4Android:Release-16.02-2.02")
implementation ("com.google.code.gson:gson:2.10.1")
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
kapt("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-ktx:$room_version")
implementation("androidx.room:room-rxjava2:$room_version")
implementation("androidx.room:room-rxjava3:$room_version")
implementation("androidx.room:room-guava:$room_version")
testImplementation("androidx.room:room-testing:$room_version")
implementation("androidx.room:room-paging:$room_version")
}

5
app/info Normal file
View File

@ -0,0 +1,5 @@
包名com.kb.love.keyboard.theme
应用名LoveKeyBoard
签名文件LoveKeyBoard.jks
别名LoveKeyBoardkey0
密码LoveKeyBoard

29
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,29 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute Sourc
#-renamesourcefileattribute SourceFile
#-renamesourcefileattribute SourceFile
-keep class com.kb.myapplication.keyboard.choose.data.KeyBoardData{ *; }
-keep class com.omicronapplications.** { *; }
-keep class net.sf.sevenzipjbinding.** { *; }
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken

View File

@ -0,0 +1,26 @@
package com.kb.myapplication.keyboard.choose;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.kb.myapplication.keyboard.choose", appContext.getPackageName());
}
}

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".LoveKeyBoard"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/icon_logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/icon_logo"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<activity
android:name=".activity.ListAllDataActivity"
android:exported="false" />
<activity
android:name=".activity.SettingActivity"
android:exported="false" />
<activity
android:name=".activity.FavouriteActivity"
android:exported="false" />
<activity
android:name=".activity.PreViewActivity"
android:exported="false" />
<activity
android:name=".activity.MainActivity"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mp4" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
<activity
android:name=".activity.IntoActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".MyWork"
android:exported="true"
android:permission="android.permission.BIND_INPUT_METHOD">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data
android:name="android.view.im"
android:resource="@xml/im" />
</service>
<meta-data
android:name="applovin.sdk.key"
android:value="3cUMfTcsZKzlJevxK4IkNysgDAeQA4B5w332p3g8B9ZAgC54WQNZLVxuxnCx4sCHA5StLJnDTAFa68mFTi8rd8" />
</application>
</manifest>

View File

@ -0,0 +1,814 @@
{
"list": [
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0cd3014dfe1299673a425ebc66ec2ba3.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/21858a3a2b1370dd2dcdacf4289046da.jpg",
"title": "Love Parrots",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/05cdbfe6c9781ad45af02e2a1fe1656c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/322a787af26b11c6b7954b8ba4490bdc.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/23af1dd3335933ea0b0caa0ca4770ce6.jpg",
"title": "Sunset Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/4facae6abdb7bf01743cd971a9017b52.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/60d09cb601d85f74a8689c7ea8db4b38.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/635dcd5b39d67d31afe5527419e33b9f.jpg",
"title": "Angel Devil Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/0a3d998d998a9cf3f3ccfd6bef7b16cf.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/98fd518bda7fabda7faa93b151768d15.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d0a266b474469b3c2332352a7262ab06.jpg",
"title": "Glitter Rainbow Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b8ee85deca13b494488c339af09afc22.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/1ce53c34b35bf78d72b919e5194c7413.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/164cb1a1c461be5cc5fda03dd0206654.jpg",
"title": "Purple Love Diamond",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/afcaab63c0a30297d85f2243061aaba4.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/c5951c713f76a16db46119d4c38e381f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/795d371368577bd42c1cb516b55982f0.jpg",
"title": "Romantic Heart Roses",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/29e297b50cbdf05204bd27485359643c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/756349e863ff4719a2b0fd8899dda4ce.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1d154c71316e7c59e3b0084ab5286c88.jpg",
"title": "Sun Moon Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a7f4b339bb79ae371a7beae5a9afaff1.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/177ef878ccac5b1c62950ef530616379.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/48aa3f6963a0052f34b976c36d2ade21.jpg",
"title": "Red Valentine Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/db83f68e68cd0497716dc046d715b7d9.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/f345a4977b9b62e43413a9ce2c18323d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f9d5808fc0a119cdbf1aacf242c4b74b.jpg",
"title": "Pink Doodle Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c7aa936e42c622732cbf6b2340f2e422.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0e50d33331b1ca53732164241b301cb2.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d0dd3045d8097f0eb782a4c494f9e05b.jpg",
"title": "Puppy Kitty Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c424b4120ff33d2ea4f87e098a5302dd.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/cdeb7ac588ffd351a1cf28eef1377f29.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8bee8fa2ce265a3e12477d89f86014a4.jpg",
"title": "Red 3D Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/22c56f5cfa3e40561a5cc3e270791907.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/26fb1dd3ed3b885dbff1f6c26b322416.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/2dab2458f6da3ffc9f71ee8f9e33b428.jpg",
"title": "Blue Love Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/fdb57f770b282269bb242f0b52ccbe28.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2e4f96492a02ed12f231b39e75619496.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/edb07e0e247100d146d64f635f41a28c.jpg",
"title": "Pink Love Mirror",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/748ddd6cb623c0f4676f348bd115ebb2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/bc5213434d6c0362814a25f1a934fd5a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/13048bcbe6b1ba377cefbe790660f51e.jpg",
"title": "Love Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b05cda047a56286ddb3d8f4a9aa52fd7.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/e3fc1c83f59179702fbcb7a64c08d2d7.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/5c5c6a01a0b3a4805b13b6c33ffa79ca.jpg",
"title": "Sparkle Neon Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a882bc3d4312022446ef29674543352b.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/e6848e37732e25e37ea80eee5130c08d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8a9ef0cdbc04f4dc5210a125b58e9a7e.jpg",
"title": "Glitter Heart Coral",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/2ff33d571b054fe99e4dd4cfc687e6bd.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6ba97361c79a9639d3c6099e219c2b43.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/97a1d4230c053cec2a187d9c39e5b449.jpg",
"title": "Love Heart Neon",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c96cedb306c2b6295e902a42a3539c27.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/c8f1353c226c502ce1cef770103cbc1c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/69c5c402b5568e47d9ac36e174c26b77.jpg",
"title": "Aesthetic Sunset",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/33877b62fc70196ebcbf14a734fc995a.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ff93f73a242d8391ad44f65f2866a9e9.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f04768a2b777d7f168895923af8aef2e.jpg",
"title": "Neon Love Light",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/ab2c4ad6e6312d78ddb5407e31c1f641.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/9a8f1b966039fa110cce4c86a2e3edf5.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/896bb09a18d114841fc32483e752b2bf.jpg",
"title": "Cute Kitten Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/3d940466fa31e30df1c60f80c2b2c79b.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6b2d89c2f81ca6d6a4a6cbcbecf8a39e.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/ef8fd0c3f6a4723fd092a7fd33f77494.jpg",
"title": "Graffiti Rose Pink",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/d7c58f283c8755c99d0abe8950f5c7d1.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a05cb6aa0c4d5b4fee04a1534bc6ea04.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/580c7d0997c93ca57a6c4c62fd85d6d8.jpg",
"title": "Pink Neon Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/7aab01a381bf315210813cba67afaa0d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/82f6ab84adc7a9f621d5a66ab07bcb87.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/3528ab9f0ec9022f1ac0b61a040a32c4.jpg",
"title": "Neon Light Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8afbd8f60b302a69e6e7581807002626.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/4a8ceb2b8b082b744c8823fe1f34b5dc.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/581b74289fd52181777b34bc9f476b76.jpg",
"title": "Red Hearts 3D",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/7c6f0f7796761d67074749242691c46a.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/d3e38f0128ad8b2d6c19f20b536e0792.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/337c48b1d04a66c8c662fe8fac7d1f96.jpg",
"title": "Shy Love Emoji",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/73c74526b80ec6b00e4aea35b8b3cf10.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/4281984af73c48808ec381a2eb03842f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/3f56ae964777d071c10fb82268b72360.jpg",
"title": "Lovely Birds",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/1a1eb9cb1234641b6e7ad2ec3307fd04.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/abd43be8531db0a72b1db27293454fb4.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/e74ef3977541c33c72ee00db9ad5fb7d.jpg",
"title": "Love Balloon",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/255fc373390574160e87e4cdb588e4dc.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/07351b748fa7f2ba6f3ef884002e733c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/52dcbc054c8b8794ceaff7a6f7eb98d2.jpg",
"title": "Colorful Crystal Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/d215e2d40ab4c5638878f55c58899f54.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/d555577385bebaf3f1c9d48fe88e0998.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/435665abee707a3a7fddd5d6a61b57ab.jpg",
"title": "Cat Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/1e0139f2d561a09a6dd0d5485ddc0e05.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a94584cb8ffc7c9fd8edc5e7f644fb62.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/80e6151a3587253513dbe6c6ffb58997.jpg",
"title": "Shining Twin Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/4a707c5c0ed8c0f75db9f2ce02f7c5c1.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2aff11564a49dedcff9255a51228d694.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/3ada3855bfce57d155528d56d229e72c.jpg",
"title": "Love Heart Lollipop",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/0e5349b50a623e8e9cba9a2829c95682.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/bc61592ff75190347e8840cc6637f43b.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/61555a1baaad3ea85194ed431af92172.jpg",
"title": "Neon Kitten Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/553a163368a028f07ea83b381f436434.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/b39a4718a097019fa9bb91984b638d91.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/4a83f452037c1c1e0be2bbfca73613f1.jpg",
"title": "Love Kitten",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/cd69f48f9c719bc070d232808cd119b2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/50a6b9028c17f689e980535ab33c5284.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/472e91317bc96a393695dc0e852a8625.jpg",
"title": "Love And Peace",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8ffbe44dbe2b011c19a63ca430daab3d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ad0b8e69a433285a8fd9ae23e857d4ab.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/febb8cef9ae8d2e6e318bba37d1d0b3e.jpg",
"title": "Pink Love Balloons",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/5b9f3b02886fc935438448ca149fb8ed.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a4c378e32b413949f02cd93847a764f7.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f50c4d26af82ab8ecf2388e39602328f.jpg",
"title": "Dog Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/ed5963803a2b00d078a682dab3a1737f.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2e5d1512f63e4c9ea2378d7a33365250.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/e467146a07ae9557ea5b493b1f6d324c.jpg",
"title": "Galaxy Marble Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e2f7d694adf3ec22f35aa7a4ff52643a.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ac6410743ea9048cdb299b800a26dd60.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/85698dc949cd380f1822bcf7182e8a44.jpg",
"title": "Bright Blue Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/d9176e756817915375663be035096fba.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ecc75487e7038bd6c7dd72ea74d3d4b6.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/3ae613b256996ca888628571e074b387.jpg",
"title": "Parrot Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/37ae31adf1e9c1541cf04e99e63790d2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/283b5e61bf797c138e19cc2e47fa718f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/72897d23e69b92e20285f867d9e2f81d.jpg",
"title": "Love Pet Life",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/f0c78374e37a43deacb280f16cbc4e8d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6ab39f35c65e0e8f3ceb9397bb6fe472.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/323d398d38ab6d198aea4912376c1a9d.jpg",
"title": "Cute Bunny Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a0bffe36ae759d94538044f645fb0a81.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/cc3169c2853c7c6ef76aa341262ab803.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/a82105f908e63a5c1fed450f855f22e1.jpg",
"title": "Neon Finger Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a75373cf46ec40dd8c3f09a15967f417.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/44f47f5cfb02411fb4077b66c3ed058c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/bcb7e8bf064260ce689a6473e445e08f.jpg",
"title": "Red Love Valentines",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/633eb4f7ca16374728a20eb3655abc63.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/4671747ba8117a3bff1a5af7cb3957a7.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/7495c81c2c3ca2ab97608e49667e8d30.jpg",
"title": "Rose Gold Pearls",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/0e1bb2bbfc63359656d2d9626b9cbfa4.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dc5a25565b3cbbd7ca4759d41503e14a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0dea2ab904a92e76f13a9f92ebed2f57.jpg",
"title": "XOXO",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bb4abe2a966e99ce4cc00edf66ca18b6.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dfea248800b350c85c3b0704d59e3843.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/03314742fe2a1be29e9d500c72a39e67.jpg",
"title": "Pink Glitter Heart 2",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/93bbefb657fa054f6845387dab56ea0c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/767ffc55088e4cc1f6026592e172894f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/823e682de86a7df3d301e38fad16897e.jpg",
"title": "Avocado Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/32058e9dc1e0ad2c94cdc7250f5abf3c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3e6c4e8c4bc2184507789d738c943df0.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/be1a546d76c1a08b85547fbcda7fc136.jpg",
"title": "Pink RGB Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/5de85592a7e96862a81e56f1dae7e21f.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6d830c6ec0ab22a851d84c37bbb9f964.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8774e8fcc8c0dfa4089ba630c4b36092.jpg",
"title": "Neon Romantic Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b1a2723340145b9972c46e32211738fc.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/fa652fd752b83b4be2ee795592ce8686.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/bba3f6325628052e4ad5f277c04e8782.jpg",
"title": "Love Couple Cats",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8ef3574260b228ac18c3d942be156421.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/95459ffa27560a8d832b8e0bd68d839f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d14101bd18d88fe38c8926da51f5c527.jpg",
"title": "Love Heart Kpop",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/73234e4d1f8229a91085dc77e3bc01c2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/1ec1fdf2f65f56b35bd20e3ec37d0a4d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1f16466b0c02d7e12e88bd852965d6b6.jpg",
"title": "Valentine Lovelight",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/1e9781ed97d96bb1ede09b4324da4666.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2678a9d60a6deafcb0ce39611aab4ada.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/04aa21e32769749d30c107a193729ac3.jpg",
"title": "Love Penguin Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c694af4caa592c54dcaf7d0da8a373fe.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3e396b0112a3fe5ef2bdd423418dfef1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/cc0f081e2d2d314917fdc855f315e6ef.jpg",
"title": "Love Panda Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/579033fa6a038b04a5495a2e82632039.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/9113d3554aff19a708934018360ab389.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0cd61f43a46d90f956e6eade6bd0caf5.jpg",
"title": "Teddy Loving Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/4414f4e03dfa1501d89e11151b4ae1db.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ed744dce1f269d5d678bd3aee07fc142.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/46debd656f7ab1fdc2045b74defb26df.jpg",
"title": "Sparkle Glitter Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/2b7602f6dc1710c392a7fb0c0d87f3f7.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/121ffd309cf6f20cc6e54e03f2bc713b.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/5ca595c01a89db6d51c893e54e7e48c9.jpg",
"title": "Black Heartbeat",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e89c30a80f329f04c8f770cdaf3a8b6e.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/fb68c9429c1f43e6377c1f5b4b45355d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/fc16ae2a6687588003f42509ab3ccbea.jpg",
"title": "Red Valentine Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c1e0698ef820eb14be84697024885e7c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/9fc4ce4bed6c72fcee3d03f726473731.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/dc3c6ea8a9a42d6af7c08cdb9a0607ea.jpg",
"title": "Bear Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e83c5e33f8f5356178aa7de4dd6975f3.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/967541749f2f1442db1e9a23e95421a8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/9493c05cfdb60a75bc0d6ea3651992ce.jpg",
"title": "Cute Moon Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/efc2ee720eb22b534f44656ac50d34c8.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6ab39f35c65e0e8f3ceb9397bb6fe472.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/323d398d38ab6d198aea4912376c1a9d.jpg",
"title": "Cute Bunny Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a0bffe36ae759d94538044f645fb0a81.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/cc3169c2853c7c6ef76aa341262ab803.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/a82105f908e63a5c1fed450f855f22e1.jpg",
"title": "Neon Finger Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a75373cf46ec40dd8c3f09a15967f417.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/44f47f5cfb02411fb4077b66c3ed058c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/bcb7e8bf064260ce689a6473e445e08f.jpg",
"title": "Red Love Valentines",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/633eb4f7ca16374728a20eb3655abc63.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/4671747ba8117a3bff1a5af7cb3957a7.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/7495c81c2c3ca2ab97608e49667e8d30.jpg",
"title": "Rose Gold Pearls",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/0e1bb2bbfc63359656d2d9626b9cbfa4.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dc5a25565b3cbbd7ca4759d41503e14a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0dea2ab904a92e76f13a9f92ebed2f57.jpg",
"title": "XOXO",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bb4abe2a966e99ce4cc00edf66ca18b6.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dfea248800b350c85c3b0704d59e3843.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/03314742fe2a1be29e9d500c72a39e67.jpg",
"title": "Pink Glitter Heart 2",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/93bbefb657fa054f6845387dab56ea0c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/767ffc55088e4cc1f6026592e172894f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/823e682de86a7df3d301e38fad16897e.jpg",
"title": "Avocado Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/32058e9dc1e0ad2c94cdc7250f5abf3c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3e6c4e8c4bc2184507789d738c943df0.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/be1a546d76c1a08b85547fbcda7fc136.jpg",
"title": "Pink RGB Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/5de85592a7e96862a81e56f1dae7e21f.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6d830c6ec0ab22a851d84c37bbb9f964.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8774e8fcc8c0dfa4089ba630c4b36092.jpg",
"title": "Neon Romantic Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b1a2723340145b9972c46e32211738fc.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/fa652fd752b83b4be2ee795592ce8686.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/bba3f6325628052e4ad5f277c04e8782.jpg",
"title": "Love Couple Cats",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8ef3574260b228ac18c3d942be156421.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/95459ffa27560a8d832b8e0bd68d839f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d14101bd18d88fe38c8926da51f5c527.jpg",
"title": "Love Heart Kpop",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/73234e4d1f8229a91085dc77e3bc01c2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/1ec1fdf2f65f56b35bd20e3ec37d0a4d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1f16466b0c02d7e12e88bd852965d6b6.jpg",
"title": "Valentine Lovelight",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/1e9781ed97d96bb1ede09b4324da4666.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2678a9d60a6deafcb0ce39611aab4ada.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/04aa21e32769749d30c107a193729ac3.jpg",
"title": "Love Penguin Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c694af4caa592c54dcaf7d0da8a373fe.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3e396b0112a3fe5ef2bdd423418dfef1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/cc0f081e2d2d314917fdc855f315e6ef.jpg",
"title": "Love Panda Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/579033fa6a038b04a5495a2e82632039.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/9113d3554aff19a708934018360ab389.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0cd61f43a46d90f956e6eade6bd0caf5.jpg",
"title": "Teddy Loving Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/4414f4e03dfa1501d89e11151b4ae1db.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ed744dce1f269d5d678bd3aee07fc142.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/46debd656f7ab1fdc2045b74defb26df.jpg",
"title": "Sparkle Glitter Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/2b7602f6dc1710c392a7fb0c0d87f3f7.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/121ffd309cf6f20cc6e54e03f2bc713b.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/5ca595c01a89db6d51c893e54e7e48c9.jpg",
"title": "Black Heartbeat",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e89c30a80f329f04c8f770cdaf3a8b6e.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/fb68c9429c1f43e6377c1f5b4b45355d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/fc16ae2a6687588003f42509ab3ccbea.jpg",
"title": "Red Valentine Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c1e0698ef820eb14be84697024885e7c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/9fc4ce4bed6c72fcee3d03f726473731.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/dc3c6ea8a9a42d6af7c08cdb9a0607ea.jpg",
"title": "Bear Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e83c5e33f8f5356178aa7de4dd6975f3.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/967541749f2f1442db1e9a23e95421a8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/9493c05cfdb60a75bc0d6ea3651992ce.jpg",
"title": "Cute Moon Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/efc2ee720eb22b534f44656ac50d34c8.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dd5fbcddfdff76b7d58a1568082c9d21.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/c0c704ac8282ec17a437d2e3dd704f4c.jpg",
"title": "Sunset Lovers 2",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a9d6762f2f8a846a5fb2f260f0c5a198.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/841d6f969f2064b467f1eaca5a0325f3.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/500e5885cd29272651b799422515cbdf.jpg",
"title": "Couple Love Story",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/3eec6ce21ffeb7c1658dd37a14f76a3f.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/fe736d082251fa6d97db8c58986cab2c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/2098b91375ff1b51076c8c9192ddd697.jpg",
"title": "Teddy Bear Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/cfdf48db3b5058462ec3e32c465db6e2.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/10c36eb5a7a8172000ef2a154deebcb1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/dd6579a161d6b82d9b547bcde8d02116.jpg",
"title": "Diamond Purple Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/53885d9bdb51dc6c60b95fbdcb495558.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a64fee9a9dac129120193107e3cb231a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f7db9a6e3f57b0acf8ce59c8f0bed461.jpg",
"title": "Doodle Red Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/37958199700cc8d96ddad8dceda8ab80.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/4823dbbc77b6e21d154422525f4805f5.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/fc3c1e87255f20ee235af745eeb0be17.jpg",
"title": "Fairy Lights Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/47f7270d2ae94de74a5ee11b7ea3d198.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/caf8614e167ddc17487ced306c66776a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1c56ad42b17cb01c911c0d0d17167f97.jpg",
"title": "Pink Couple Bear",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/5490bf09d1924309238005051096807c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/bb46509d8625dae56eed4408733322d5.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d80d1ea5f5eda60782cbe132d0455ba9.jpg",
"title": "Lovely Red Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e5df650faccb66e7ce224dc7e1856418.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3adc4c3d10994ea70a010da23648104d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/73849c532ebe3ca7f1500e791083750f.jpg",
"title": "Bear Couple Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/638fa021a26e55dbc3a96b3d17015f06.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3f960095f31247dbc0db4ebcd31c2657.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0013e3260579e190e0fa29e4761d5877.jpg",
"title": "Love Red Rose",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/7f49631ec32225bf8a7f8dd49c2370fb.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0d8ae325a6ecbc356a1d3b76beca32fe.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/b40d5a5ac0c06c1b5544b1fc8f99095f.jpg",
"title": "Neon Light Rose",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/35855c73a0ee0071c5ae0f0e56357510.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/5b6fba1f3955eaae9c4bf88d2d8b9d11.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/b01a2187b9142a50183152cebbfc2c16.jpg",
"title": "Red Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bc59e2baa61fd6840010d3851e981c81.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/b0b9567e1ae90ddeb135745b1365b5b8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/43621e0f82a4764931cdfefb17a6e1ac.jpg",
"title": "Neon Streaks Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/91114c6c2cc25d287773d624bc1b64bc.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/68013a4751d5ab8fa799952a4c38c871.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f082befb417770957e62417ea462332c.jpg",
"title": "True Love Roses",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b38a26a89634807b4dfbbb06b8e1a61a.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/e2ac82ef4c9bffb97ba3000660fa569a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/339187477dc314f27d37aa6e3d033081.jpg",
"title": "Love Birds",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/663df7425d314df83bc46b75528075e4.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a794436515ba6cdc92bcc8d59fac7def.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/e09382ca186536d9e92ac55e9b0ff345.jpg",
"title": "Pink Heart Black",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/33bd498a8118935a64bd643e2b3f8df0.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0068d3a3ff6c14fa4204e5b96384ae4a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f55e6ea21c2c0ff9264e61a75ae046e0.jpg",
"title": "Yellow Couple Lover",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/802e5f7d2fc1cadb8d19164d6cded733.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/dcdda4fc64e23afd1e78ebfa7fcd491c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8955fde338d34013859d8a391e4f501f.jpg",
"title": "Purple Doodle Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/9ef09792a772bc0813d31de9538c1297.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/16da56b7c6bab5dcfa5f832d956d1ca8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f5e2f25a24bb45f7fd348f14845ca1ef.jpg",
"title": "Bubble Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/d842b752aca13d74f01d446c9efa4dc7.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/d3c71d7c3766e441b9dbbe13bd04452e.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/6f4d665077e0a2499cf572afa5ab2cb7.jpg",
"title": "Sexy Love Lips",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/83e852b8503d697abc324800111f766c.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/cac72a50cdcbdd36119dbdc47ffac9d6.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/2a64bcda6842dcaeea8604af26874b45.jpg",
"title": "Parrots Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/3e541d8ed0bf3ed6470cd348795b9182.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/a8bc295c764c040f3bec026f9e6c6d62.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/313a5c7f756c70ebbe4aba2e3193badb.jpg",
"title": "Transparent Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/af5797dec108055a9936dd1a5ab9ecf9.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/42397e7f5caa7cfcfde15c069cfdf6b8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d0e92526487439b64944a456839e54c6.jpg",
"title": "Neon Red Heartbeat",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/f246376590b509c63173963c71335535.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/f488f10ec3593ed3f545770d6d386db4.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f63666b958b6aea4137536b1d50b03fd.jpg",
"title": "Black Gold Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/36e55a59fb80a515e6f977900c08a6e1.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/770fb6d3810b764a623724d991c7775f.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/5105aa6cfc9aa2a9e3c44bbf14f3b2ae.jpg",
"title": "Purple Neon Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bd0ed1d65feae6e0f21a56924e9b6015.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3335bffc14452db55ffb53c11eb1b6e8.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d63b01a6be5a46ec57c497be44936344.jpg",
"title": "USA Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/f9fe6f443a3e140b1503a21566960639.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0f90d13aae661b3ba7236aef6628c6d1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/80c4a8642943f4b1eb562716cc1f6068.jpg",
"title": "Fairy Lights Heart 2",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e28ffc76f76632e34bae5bd815adbca3.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2ff613db906187cfefbc5ee1238c948c.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/386136fdfcda7d7806ff01991cb8d51b.jpg",
"title": "Neon Hand Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b3901b0fe1c7ff7e752a8c747a0552cc.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/33bb0254df22b4c7b8a45c8012c8507d.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1fd21a804dae285c0d435ff01a9eb52c.jpg",
"title": "Neon Heart Lights 2",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c0995dcb1673b19ed6fcc3e89c8b54e1.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/7619668cb63a40175bbf4fc80fa6bf39.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d2420b778f5dc024858cdcec9e0b53e6.jpg",
"title": "Love Birds Couple",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/e843ad02ed8c058bf2dbf3c42f79935f.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/6b5ba0a920158a3a8c0b3d8fdb98b717.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/f135b1a8cb6aafbfa28dfdc0459b1fe2.jpg",
"title": "Cactus Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/44dd8646e8a7cfb63639bd18ecc9d0d5.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/f12701a341921f6788b87bb1f8cd7e64.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/4fcfc083c377b653a298df082f4b4028.jpg",
"title": "Cute Avocado Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/65455c53286533a1b7de336d0fb256fd.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/88d1f4f88ce82925957905c51cf9aa26.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/157d372d6ebd87ec10d0f9d31f1f2e1e.jpg",
"title": "Cross Heartbeat",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/916370723b3b60f62efae752d7591039.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/005d254e1b2f675723c0eca69a5ae020.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0cc53f596a170e545ec14e5a62593bbf.jpg",
"title": "Rose Gold Marble Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c33e66e6281de12ba2bd9459ca5ddfcd.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/cac9728dcb632c387d90ad911a737e72.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/92cd223af4b01e54cd1b5e9b31cbcc70.jpg",
"title": "Neon Pink Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/6db73f2c4286ff6d8ae767f2bfd3c8f9.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/2254766caef14736d7a783b84f249e64.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/1a0596d424cf013bab4b19cfaf72eb8e.jpg",
"title": "Emoji Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/dd7c5fde1bc76b02be5dc566225f8754.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/facc6aded38e054aba98a2c8839986d3.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/7fe6e38b38598ab04e9332ccd3b0c281.jpg",
"title": "Glitter Emoji Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bc1c3e41a6029d01793cef5cd5a4e62d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/23ae98a16bc696d939821d376bdcec5a.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/3a77de6bf075e8ae257c866dec46333a.jpg",
"title": "Fairy Lights Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b26a10ebcfc9bf28ce99b91c10139afd.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/905895c61803623e17888ea655aa4ff7.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/5a3bbd4795fc15bec6075114ea22c185.jpg",
"title": "Grim Reaper Skull Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c79357f5d02ec6a1b4b128ec622e578e.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/ffbb4be389b0557885f07f1df5a5594b.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/32eb87ed6a725286b5fca63f91e7c939.jpg",
"title": "Neon Blue Heartbeat",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/b97abba35134ff1de476bfc399ae68cf.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/3ecb0be64972dc7d1cbaf8c35eba4cbe.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/86049b96b196c0894ad07c64db1be4b8.jpg",
"title": "Love You Emoji",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/082482741d8c81290b276355c3dc4b1d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/98e99f52957a700c33b0bb598b09cf16.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/7cb0e3a0978acfbd5b1a44ccfd8129c0.jpg",
"title": "Doodle Pink Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/6bf53db168e318f415b80fdcd9ebd525.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/5f0415e98234e3c81e1b939ed6d247d1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/4e46c11a200b664fccefc86499e36ec6.jpg",
"title": "Love Sweets",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8d7b061b994b4615d4b9d202e2db8646.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/1c717f202676dd3a3388e79a8e02e6d1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/66fcc417a0d8fbd75c376b9eec2453ae.jpg",
"title": "Lovely Ragged Bear",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/51f4c9c699b7db37ee6e18e57ac884b4.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/762f005d7b9a01193a35626201223f31.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/522b79ce9b60fd4da075ebfc81621e40.jpg",
"title": "Cute Birds Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/6a29220be7995facaee31c8904ff7d2d.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/7401f32670f06f0249cb7202ccd23685.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/d71c9ab6f0b2bf10aa156f42362e1c0f.jpg",
"title": "Neon Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/af977a101d7dea4c4e7877e1dd5b8d69.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/aa479881b7b82941d275e0e0c1c35cc2.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/37c7d921e85672618823c1c94b7390ad.jpg",
"title": "Valentine Hearts",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/c0f6ee79e5601dd0540616cbbd51ac98.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/54b9b431a24455df198de8f5826560aa.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/6bd55ffc38c331492f8d778229a8ebb2.jpg",
"title": "Pastel Blue Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bd9d2e985ec8d01b869f584cd2c78432.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/8e472772f568cc79ffff4a4b2e3afc77.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/8a77100efe5f2bb872122c1a53551ea9.jpg",
"title": "Neon Heart Wings",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/8745dbdb9359c1782561b522c0aae5da.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/b3ab689aaf812a61fd7a4efdf66e0be1.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/edc8f72de11ab73f7c63ff2d6e866b2b.jpg",
"title": "Love Pink Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/a4dbc7a8724ffee17464f51fc9f99b43.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/8c42c7acb0606eedb6a2b18270a06c83.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/0f6a8ff31c981e514c1962a54fbe5b7f.jpg",
"title": "Pink Love Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/7307d616bbf33111ac2efed0ce2fb16a.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/5fa2c51cab09488a4ae1070924c12cc3.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/89f26e6d81a3edc29bc1d39a87e949dd.jpg",
"title": "Rose Gold Heart",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/eb7fd32f8f3f82d43b5b01522a3e31e6.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/90717cd2ea4c240b08a51e49aeb3d764.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/9e4f0e11222bd3102d146c3af5b863a2.jpg",
"title": "Sweet Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/40378b72ad77ee8f8644e7c68ef5b220.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/357accac25c7e5bfe4b25470d1e90169.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/dc5f22ebb04336f927c0f59c68343aef.jpg",
"title": "Lovely Teddy",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/bd34f0ff89109933f97bd4962abb74e7.7z"
},
{
"preview": "https://resource-sg-public.lux-ad.com/keyboard/0c5d3e19ef62423528f5fc477b689983.webp",
"thumb": "https://resource-sg-public.lux-ad.com/keyboard/69849b2c5d44cf0441d408aae2e799ff.jpg",
"title": "Rose Love",
"zipUrl": "https://resource-sg-public.lux-ad.com/keyboard/205ac8d389c0997a03a9fd239d7797f7.7z"
}
]
}

Binary file not shown.

View File

@ -0,0 +1,27 @@
package com.kb.myapplication.keyboard.choose;
import android.app.Application;
import android.util.Log;
import com.kb.myapplication.keyboard.choose.data.KeyBoardData;
import com.kb.myapplication.keyboard.choose.room.LikeDataEntity;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import java.util.ArrayList;
import java.util.List;
public class LoveKeyBoard extends Application {
public static List<KeyBoardData> loveDataList= new ArrayList<>();
@Override
public void onCreate() {
super.onCreate();
MyValues.app = this;
List<KeyBoardData> loveData = MyTools.parseJson(this);
if(loveData != null){
loveDataList = loveData;
Log.d("---loveDataList","----loveDataList"+loveDataList.size());
}
}
}

View File

@ -0,0 +1,266 @@
package com.kb.myapplication.keyboard.choose;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.provider.Settings;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.kb.myapplication.keyboard.choose.LoveKeyBoard;
import com.kb.myapplication.keyboard.choose.activity.MainActivity;
import com.kb.myapplication.keyboard.choose.data.KeyBoardData;
import com.kb.myapplication.keyboard.choose.listener.DownloadZipListener;
import com.kb.myapplication.keyboard.choose.listener.Downloadfilezip;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.sf.sevenzipjbinding.ArchiveFormat;
import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import net.sf.sevenzipjbinding.impl.RandomAccessFileOutStream;
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
public class MyTools {
private static String Name = "shared_name";
private static final SharedPreferences sharedPreferences = MyValues.app.getSharedPreferences(Name,Context.MODE_PRIVATE);
private static final SharedPreferences.Editor editor = sharedPreferences.edit();
private static ExecutorService executorService;
//Parse the custom JSON file
public static List<KeyBoardData> parseJson(Context context) {
StringBuilder sb = new StringBuilder();
try {
InputStream open = context.getAssets().open("keyboard.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;
}
}
private static List<KeyBoardData> parseJsonString(String jsonString) {
List<KeyBoardData> myDataArrayList = new ArrayList<>();
try {
JSONObject string1 = new JSONObject(jsonString);
JSONArray list = string1.getJSONArray("list");
for (int i = 0; i < list.length(); i++) {
KeyBoardData loveData = new KeyBoardData();
JSONObject item = list.getJSONObject(i);
String preview = item.getString("preview");
String thumb = item.getString("thumb");
String title = item.getString("title");
String zipUrl = item.getString("zipUrl");
loveData.setPreview(String.valueOf(preview));
loveData.setThumb(thumb);
loveData.setTitle(title);
loveData.setZipUrl(zipUrl);
myDataArrayList.add(loveData);
}
return myDataArrayList;
} catch (JSONException jsonException) {
return null;
}
}
//sumbit a work to ExcutorService.
public static void RunIO(Runnable work){
getExecutorService().execute(work);
}
private static ExecutorService getExecutorService(){
if (executorService == null){
executorService = Executors.newSingleThreadExecutor();//单线程处理
}
return executorService;
}
//open inputmethod
private static InputMethodManager inputMethodManager = (InputMethodManager) MyValues.app.getSystemService(Context.INPUT_METHOD_SERVICE);
public static void GotoFistSetting(Context context){
Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS);
context.startActivity(intent);
}
public static boolean FirstSetting(){
for(InputMethodInfo inputMethodInfo : inputMethodManager.getEnabledInputMethodList()){
if (inputMethodInfo.getId().startsWith(MyValues.app.getPackageName())){
return true;
}
}
return false;
}
//choose this inputmethod as default inputmethod.
public static void GotoSecondSetting(){
inputMethodManager.showInputMethodPicker();
}
public static boolean SecondSetting() {
String string = Settings.Secure.getString(MyValues.app.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
if(string.startsWith(MyValues.app.getPackageName())) {
return true;
} else {
return false;
}
}
//download the resource picture
public static void DownLoadResourceZip(String url, Context context, DownloadZipListener downloadZip){
Glide.with(context)
.asFile()
.load(url)
.listener(new RequestListener<File>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<File> target, boolean isFirstResource) {
downloadZip.downloadziplistener(false,null);
return false;
}
@Override
public boolean onResourceReady(@NonNull File resource, @NonNull Object model, Target<File> target, @NonNull DataSource dataSource, boolean isFirstResource) {
downloadZip.downloadziplistener(true,resource);
return false;
}
}).preload();
}
public static void OnLoadFileZip(String resourcePath, File resource, Downloadfilezip loadfile){
if (!resource.exists()) {
loadfile.downloadfilezip(false,"");
return;
}
String itemfilepath = "";
RandomAccessFileOutStream randomAccessFileOutStream = 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(resourcePath, simple.getPath());
if (!simple.isFolder()) {
randomAccessFileOutStream = new RandomAccessFileOutStream(new RandomAccessFile(file, "rw"));
simple.extractSlow(randomAccessFileOutStream);
itemfilepath = file.getPath();
} else {
boolean mkdirs = file.mkdirs();
}
}
randomAccessFileInStream.close();
openInArchive.close();
if (randomAccessFileOutStream != null) {
randomAccessFileInStream.close();
}
int res = itemfilepath.indexOf("res");
String substring = itemfilepath.substring(0, res + 3);
loadfile.downloadfilezip(true, substring);
} catch (FileNotFoundException | SevenZipException e) {
loadfile.downloadfilezip(false, "");
} catch (IOException e) {
loadfile.downloadfilezip(false, "");
throw new RuntimeException(e);
}
}
public static StateListDrawable getStatus(Drawable draw, Drawable drawPress) {
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, drawPress);
stateListDrawable.addState(new int[]{}, draw);
return stateListDrawable;
}
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 saveKeyboardSkin(String resDirPath) {
editor.putString(Name, resDirPath);//存储
editor.apply();
}
public static String getKeyboardSkin() {
return sharedPreferences.getString(Name, "");//读取默认为空
}//读取
public static String getBoardSkinPathByName(String name) {
return sharedPreferences.getString(name, "");
}
public static void saveBoardSkinByName(String name, String resDirPath) {
editor.putString(name, resDirPath);
editor.apply();
}
public static int dpToPx(int dp, Context context) {
float density = context.getResources().getDisplayMetrics().density;
return (int) (dp * density);
}
public static float spToPpx(Float values, Context context) {
float scale = context.getResources().getDisplayMetrics().scaledDensity;
return values * scale;
}
}

View File

@ -0,0 +1,176 @@
package com.kb.myapplication.keyboard.choose;
import android.inputmethodservice.InputMethodService;
import android.os.SystemClock;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.LinearLayout;
import com.kb.myapplication.keyboard.choose.base.KeyBoard;
import com.kb.myapplication.keyboard.choose.base.LoveKeyBoardView;
import com.kb.myapplication.keyboard.choose.base.MyLoveKeyBoardView;
import java.util.List;
public class MyWork extends InputMethodService implements LoveKeyBoardView.OnKeyboardActionListener {
private long last_click = -1L;
private boolean press_double = false;
private int[] ViewType = new int[3];
private MyLoveKeyBoardView myLoveKeyBoardView;
@Override
public View onCreateInputView() {
ViewType[0] = R.xml.board_view_one;
ViewType[1] = R.xml.board_view_two;
ViewType[2] = R.xml.board_view_three;
View view = LayoutInflater.from(this).inflate(R.layout.my_input_view,null,false);
myLoveKeyBoardView = (MyLoveKeyBoardView) view.findViewById(R.id.my_keyboard_input);
myLoveKeyBoardView.setPreviewEnabled(false);
myLoveKeyBoardView.setKeyboard(new KeyBoard(this,ViewType[0]));
myLoveKeyBoardView.setOnKeyboardActionListener(this);
return view;
}
@Override
public void onWindowShown() {
super.onWindowShown();
myLoveKeyBoardView.updateConfigView(this);
}
@Override
public void onPress(int primaryCode) {
if(primaryCode == KeyBoard.KEYCODE_SHIFT) {
if (SystemClock.elapsedRealtime() - last_click < 300) {
press_double = true;
}
last_click = SystemClock.elapsedRealtime();
}
}
@Override
public void onRelease(int primaryCode) {
}
@Override
public void onKey(int primaryCode, int[] keyCodes) {
switch (primaryCode) {
case KeyBoard.KEYCODE_SHIFT:
int shiftStatus = myLoveKeyBoardView.getShift_status();
KeyBoard keyboard = myLoveKeyBoardView.getKeyboard();
switch (shiftStatus){
case 0:
if(press_double){
myLoveKeyBoardView.setShift_status(2);
}else {
myLoveKeyBoardView.setShift_status(1);
}
switchViewData(true,keyboard);
myLoveKeyBoardView.setKeyboard(keyboard);
break;
case 1:
if(press_double){
myLoveKeyBoardView.setShift_status(2);
}else {
switchViewData(false,keyboard);
myLoveKeyBoardView.setShift_status(0);
}
myLoveKeyBoardView.setKeyboard(keyboard);
break;
case 2:
myLoveKeyBoardView.setShift_status(0);
switchViewData(false,keyboard);
myLoveKeyBoardView.setKeyboard(keyboard);
break;
}
break;
case KeyBoard.KEYCODE_SHIFT_123:
changeView(2);
break;
case KeyBoard.KEYCODE_SHIFT_SYMBOL:
changeView(1);
break;
case KeyBoard.KEYCODE_DELETE:
getCurrentInputConnection().deleteSurroundingText(1, 0);
break;
case KeyBoard.KEYCODE_DONE:
getCurrentInputConnection().performEditorAction(EditorInfo.IME_ACTION_SEARCH);
break;
case KeyBoard.KEYCODE_MODE_CHANGE:
if(myLoveKeyBoardView.getViewType() == 0){
changeView(1);
}else {
changeView(0);
}
break;
default:
char charCode = (char) primaryCode;
String s = String.valueOf(charCode);
getCurrentInputConnection().commitText(String.valueOf(charCode), 1);
int shiftStatus2 = myLoveKeyBoardView.getShift_status();
KeyBoard keyboard1 = myLoveKeyBoardView.getKeyboard();
if(shiftStatus2 == 1){
myLoveKeyBoardView.setShift_status(0);
switchViewData(false,keyboard1);
myLoveKeyBoardView.setKeyboard(keyboard1);
}
break;
}
}
private void changeView(int i) {
myLoveKeyBoardView.setViewType(i);
myLoveKeyBoardView.setKeyboard(new KeyBoard(this, ViewType[i]));
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
private void switchViewData(Boolean success, KeyBoard keyboard) {
List<KeyBoard.Key> keys = keyboard.getKeys();
for(int h = 0;h<keys.size();h++){
KeyBoard.Key key = keys.get(h);
if(key.label != null && key.label != ""){
if(key.label.length() == 1){
String s = key.label.toString();
char myChar;
if(success){
myChar = s.toUpperCase().charAt(0);
}else {
myChar = s.toLowerCase().charAt(0);
}
key.label = String.valueOf(myChar);
key.codes[0] = (int) myChar;
}
}
}
}
}

View File

@ -0,0 +1,106 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.kb.myapplication.keyboard.choose.LoveKeyBoard;
import com.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.adapter.FavouriteAdapter;
import com.kb.myapplication.keyboard.choose.base.MySpace;
import com.kb.myapplication.keyboard.choose.room.LikeDataBase;
import com.kb.myapplication.keyboard.choose.room.LikeDataEntity;
import java.util.List;
public class FavouriteActivity extends AppCompatActivity {
private ImageView fav_back;
private RelativeLayout fav_main;
private RecyclerView fav_recycle;
private List<LikeDataEntity> list;
private TextView add_fav;
private LinearLayout fav_lin;
private TextView fav_text_add;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_favourite);
fav_main = findViewById(R.id.fav_main);
fav_lin =findViewById(R.id.fav_lin);
fav_back = findViewById(R.id.fav_back);
fav_recycle = findViewById(R.id.fav_recycle);
fav_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
add_fav = findViewById(R.id.fav_text_add);
add_fav.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FavouriteActivity.this,ListAllDataActivity.class);
startActivity(intent);
}
});
fav_lin.setVisibility(View.GONE);
initbackground();
goGetRecycle();
}
private void initbackground() {
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
fav_main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
private void goGetRecycle() {
MyTools.RunIO(new Runnable() {
@Override
public void run() {
list = LikeDataBase.getLikeDataBase().getlikeDataDAO().GetAllData();
runOnUiThread(new Runnable() {
@Override
public void run() {
if ((list.isEmpty())) {
fav_lin.setVisibility(View.VISIBLE);
}
FavouriteAdapter favouriteAdapter = new FavouriteAdapter( list,FavouriteActivity.this);
// Log.d("----------adapter","_____apapet"+favouriteAdapter);
fav_recycle.setAdapter(favouriteAdapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(FavouriteActivity.this,2);
fav_recycle.setLayoutManager(gridLayoutManager);
}
});
}
});
}
@Override
protected void onResume() {
super.onResume();
fav_lin.setVisibility(View.GONE);
goGetRecycle();
}
}

View File

@ -0,0 +1,43 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
import com.kb.myapplication.keyboard.choose.R;
public class IntoActivity extends AppCompatActivity {
private CountDownTimer countDownTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_into);
countDownTimer = new CountDownTimer(1000,200) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
Intent intent =new Intent(IntoActivity.this, MainActivity.class);
startActivity(intent);
}
};
timego();
}
private void timego() {
countDownTimer.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
countDownTimer.cancel();
}
}

View File

@ -0,0 +1,51 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.kb.myapplication.keyboard.choose.LoveKeyBoard;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.adapter.KeyBoardDataAdapter;
import com.kb.myapplication.keyboard.choose.base.MySpace;
public class ListAllDataActivity extends AppCompatActivity {
private LinearLayout list_lin;
private RecyclerView main_recycle;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_all_data);
main_recycle = findViewById(R.id.main_recycle);
list_lin = findViewById(R.id.list_lin);
initbackground();
getRecycle();
}
private void initbackground() {
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
list_lin.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
private void getRecycle() {
MySpace space = new MySpace(10,10,15);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,2);
main_recycle.setLayoutManager(gridLayoutManager);
main_recycle.addItemDecoration(space);
KeyBoardDataAdapter keyBoardDataAdapter = new KeyBoardDataAdapter(this, LoveKeyBoard.loveDataList);
main_recycle.setAdapter(keyBoardDataAdapter);
}
}

View File

@ -0,0 +1,154 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.menu.MenuPopupHelper;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import com.kb.myapplication.keyboard.choose.LoveKeyBoard;
import com.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.adapter.KeyBoardDataAdapter;
import com.kb.myapplication.keyboard.choose.base.MySpace;
import com.kb.myapplication.keyboard.choose.base.ServiceDialog;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MainActivity extends AppCompatActivity {
private ServiceDialog dialog;
private ImageView main_menu;
private RecyclerView main_recycle;
private LinearLayout menu_like;
private LinearLayout menu_set;
private LinearLayout menu_share;
private LinearLayout menu_pra;
private DrawerLayout main_lin;
private ViewPager viewPager;
private BroadcastReceiver broadcastReceiver;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main_lin = findViewById(R.id.main_lin);
main_menu = findViewById(R.id.main_menu);
main_recycle = findViewById(R.id.main_recycle);
menu_like = findViewById(R.id.menu_like);
menu_set = findViewById(R.id.menu_set);
menu_share = findViewById(R.id.menu_share);
menu_pra = findViewById(R.id.menu_pri);
onMyclick();
broadcastReceiver = new inputReceive();
registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED));
main_menu.setOnClickListener(new View.OnClickListener() {
@SuppressLint("RestrictedApi")
@Override
public void onClick(View v) {
main_lin.openDrawer(Gravity.RIGHT);
}
});
initbackground();
getRecycle();
}
class inputReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (dialog != null) {
dialog.refreshBtnStatus();
}
}
}
private void gotopricy() {
String url = getString(R.string.privacy);
Intent intent2 = new Intent(Intent.ACTION_VIEW);
intent2.setData(Uri.parse(url));
startActivity(intent2);
}
public void shareAPP() {
Intent sharedIntent = new Intent();
sharedIntent.setAction(Intent.ACTION_SEND);
sharedIntent.setType("text/*");
sharedIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_app)); //设置要分享的内容
startActivity(Intent.createChooser(sharedIntent, "Share"));
}
private void initbackground() {
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
main_lin.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
private void getRecycle() {
MySpace space = new MySpace(10, 10, 15);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
main_recycle.setLayoutManager(gridLayoutManager);
main_recycle.addItemDecoration(space);
KeyBoardDataAdapter keyBoardDataAdapter = new KeyBoardDataAdapter(this, LoveKeyBoard.loveDataList);
main_recycle.setAdapter(keyBoardDataAdapter);
}
private void getDialogsuccess() {
if (dialog == null) {
dialog = new ServiceDialog(MainActivity.this);
}
dialog.show(getSupportFragmentManager(), "");
}
public void onMyclick() {
menu_like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, FavouriteActivity.class);
startActivity(intent);
}
});
menu_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getDialogsuccess();
}
});
menu_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
shareAPP();
}
});
menu_pra.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//gotopricy();
}
});
}
}

View File

@ -0,0 +1,270 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
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.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.base.ServiceDialog;
import com.kb.myapplication.keyboard.choose.data.KeyBoardData;
import com.kb.myapplication.keyboard.choose.listener.DownloadZipListener;
import com.kb.myapplication.keyboard.choose.listener.Downloadfilezip;
import com.kb.myapplication.keyboard.choose.room.LikeDataBase;
import com.kb.myapplication.keyboard.choose.room.LikeDataEntity;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import java.io.File;
import java.lang.reflect.Method;
import java.util.List;
public class PreViewActivity extends AppCompatActivity {
private ImageView pre_back;
private ServiceDialog dialog;
private TextView pre_name;
private String name;
private String url;
private List<LikeDataEntity> LIST;
private String unzipPath;
private TextView pre_text_apply;
private ImageView pre_image;
private ImageView pre_fav_image;
private String board_image;
private String thumb;
private ProgressBar pre_pro;
private RelativeLayout pre_main;
private LikeDataEntity entity;
private boolean favsucces = false;
private BroadcastReceiver broadcastReceiver;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pre_view);
goFindview();
broadcastReceiver = new inputReceive();
registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED));
initbackground();
goGetData();
}
class inputReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
dialog.refreshBtnStatus();
}
}
private void initbackground() {
Window window = getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
pre_main.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
private void goGetData() {
Intent intent = getIntent();
pre_name.setText(intent.getStringExtra(MyValues.KeyBoard_name));
board_image = intent.getStringExtra(MyValues.KeyBoard_pre);
url = intent.getStringExtra(MyValues.KeyBoard_url);
name = intent.getStringExtra(MyValues.KeyBoard_name);
thumb = intent.getStringExtra(MyValues.KeyBoard_thumb);
Glide.with(this)
.load(board_image)
.error(R.mipmap.ic_launcher)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
Log.d("-----failed","-----fail"+null);
pre_pro.setVisibility(View.GONE);
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
Log.d("-----success","-----fail"+resource);
pre_pro.setVisibility(View.GONE);
return false;
}
}).into(pre_image);
MyTools.RunIO(new Runnable() {
@Override
public void run() {
LIST = LikeDataBase.getLikeDataBase().getlikeDataDAO().QueryTitle(name);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (LIST.isEmpty()) {
pre_fav_image.setBackgroundResource(R.drawable.like_image1);
favsucces = false;
} else {
pre_fav_image.setBackgroundResource(R.drawable.like_image2);
favsucces = true;
}
}
});
}
});
File cacheDir = this.getCacheDir();
unzipPath = cacheDir + "/" + name;
Log.d("------name","---------name"+name);
}
private void goFindview() {
pre_main = findViewById(R.id.pre_main);
pre_back = findViewById(R.id.pre_back);
pre_name = findViewById(R.id.pre_name);
pre_name.setTypeface(Typeface.createFromAsset(getAssets(),"myfront.ttf"));
pre_text_apply = findViewById(R.id.pre_text_apply);
pre_text_apply.setTypeface(Typeface.createFromAsset(getAssets(),"myfront.ttf"));
pre_image = findViewById(R.id.pre_image);
pre_fav_image = findViewById(R.id.pre_like_image);
pre_pro = findViewById(R.id.pre_pro);
pre_pro.setVisibility(View.VISIBLE);
onMyClick();
}
public void onMyClick() {
pre_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
pre_text_apply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!MyTools.FirstSetting() || !MyTools.SecondSetting()) {
getDialogsuccess();
return;
}
Toast.makeText(PreViewActivity.this, getString(R.string.wait), Toast.LENGTH_SHORT).show();
goApply();
}
});
pre_fav_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!favsucces) {
pre_fav_image.setBackgroundResource(R.drawable.like_image2);
favsucces = true;
//pre_fav_image.setBackgroundResource(R.drawable.like_image2);
LikeDataEntity likeDataEntity = new LikeDataEntity();
likeDataEntity.setTitle(name);
likeDataEntity.setThumb(thumb);
likeDataEntity.setPreview(board_image);
likeDataEntity.setZipUrl(url);
MyTools.RunIO(new Runnable() {
@Override
public void run() {
LikeDataBase.getLikeDataBase().getlikeDataDAO().InsertLikeEntity(likeDataEntity);
}
});
Toast.makeText(PreViewActivity.this,getString(R.string.fav_success),Toast.LENGTH_SHORT).show();
} else {
pre_fav_image.setBackgroundResource(R.drawable.like_image1);
favsucces = false;
MyTools.RunIO(new Runnable() {
@Override
public void run() {
LikeDataBase.getLikeDataBase().getlikeDataDAO().DeleteData(name);
}
});
}
}
});
}
@Override
protected void onResume() {
super.onResume();
}
private void goApply() {
String skinPathByName = MyTools.getBoardSkinPathByName(name);
Log.d("----skinPathByName","------skinPathByName"+skinPathByName);
if (!skinPathByName.isEmpty()) {
setCurrentKeyboardSkin(skinPathByName);
Toast.makeText(PreViewActivity.this, getString(R.string.set_successful), Toast.LENGTH_SHORT).show();
finish();
return;
}
MyTools.DownLoadResourceZip(url, this, new DownloadZipListener() {
@Override
public void downloadziplistener(boolean ok, File file) {
if (ok) {
MyTools.OnLoadFileZip(unzipPath, file, new Downloadfilezip() {
@Override
public void downloadfilezip(boolean ok, String filepath) {
if (ok) {
MyTools.saveBoardSkinByName(name, filepath);
setCurrentKeyboardSkin(filepath);
Toast.makeText(PreViewActivity.this, getString(R.string.set_successful), Toast.LENGTH_SHORT).show();
finish();
}
}
});
} else {
}
}
});
}
private void setCurrentKeyboardSkin(String filepath) {
MyTools.saveKeyboardSkin(filepath);
}
private void getDialogsuccess() {
boolean isSelect = MyTools.FirstSetting();
boolean isEnable = MyTools.SecondSetting();
Log.d("----eable","eable"+isEnable);
if (isSelect && isEnable) {
//goApply();
} else {
if (dialog == null) {
dialog = new ServiceDialog(PreViewActivity.this);
}
dialog.show(getSupportFragmentManager(), "");
}
}
@Override
protected void onPause() {
super.onPause();
// finish();
}
}

View File

@ -0,0 +1,20 @@
package com.kb.myapplication.keyboard.choose.activity;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.kb.myapplication.keyboard.choose.R;
public class SettingActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
}
}

View File

@ -0,0 +1,106 @@
package com.kb.myapplication.keyboard.choose.adapter;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.activity.PreViewActivity;
import com.kb.myapplication.keyboard.choose.room.LikeDataEntity;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import java.io.Serializable;
import java.util.List;
public class FavouriteAdapter extends RecyclerView.Adapter<FavouriteAdapter.FavouriteViewHolder> {
private List<LikeDataEntity> likeDataEntities ;
private Context mycontext;
public FavouriteAdapter(List<LikeDataEntity> list,Context context){
likeDataEntities = list;
mycontext = context;
}
@NonNull
@Override
public FavouriteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mycontext).inflate(R.layout.fav_recycle,parent,false);
return new FavouriteViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FavouriteViewHolder holder, int position) {
LikeDataEntity likeDataEntity = likeDataEntities.get(position);
holder.getFav_name().setText(likeDataEntity.getTitle());
String image = likeDataEntity.getThumb();
Glide.with(mycontext)
.load(image)
.transform(new RoundedCorners(40))
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
return false;
}
}).into(holder.getFav_image());
holder.getFav_recycle_lay().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mycontext, PreViewActivity.class);
intent.putExtra(MyValues.KeyBoard_name,likeDataEntity.getTitle());
intent.putExtra(MyValues.KeyBoard_pre,likeDataEntity.getPreview());
intent.putExtra(MyValues.KeyBoard_url,likeDataEntity.getZipUrl());
intent.putExtra(MyValues.KeyBoard_thumb,likeDataEntity.getThumb());
mycontext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return likeDataEntities.size();
}
public class FavouriteViewHolder extends RecyclerView.ViewHolder {
private ImageView fav_image;
private TextView fav_name;
private RelativeLayout fav_recycle_lay;
public FavouriteViewHolder(@NonNull View itemView) {
super(itemView);
fav_image = itemView.findViewById(R.id.fav_image);
fav_name = itemView.findViewById(R.id.fav_name);
fav_recycle_lay = itemView.findViewById(R.id.fav_relative_lay);
}
public ImageView getFav_image() {
return fav_image;
}
public TextView getFav_name() {
return fav_name;
}
public RelativeLayout getFav_recycle_lay() {
return fav_recycle_lay;
}
}
}

View File

@ -0,0 +1,126 @@
package com.kb.myapplication.keyboard.choose.adapter;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.activity.PreViewActivity;
import com.kb.myapplication.keyboard.choose.data.KeyBoardData;
import com.kb.myapplication.keyboard.choose.room.LikeDataBase;
import com.kb.myapplication.keyboard.choose.room.LikeDataEntity;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import java.util.List;
public class KeyBoardDataAdapter extends RecyclerView.Adapter<KeyBoardDataAdapter.DataViewHolder> {
private List<KeyBoardData> keyBoardData;
private Context mycon;
private LikeDataEntity entity;
public KeyBoardDataAdapter(Context context, List<KeyBoardData> data){
mycon = context;
keyBoardData = data;
}
@NonNull
@Override
public DataViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mycon).inflate(R.layout.keyboard_thumb, parent, false);
DataViewHolder dataViewHolder = new DataViewHolder(itemView);
return dataViewHolder;
}
@Override
public void onBindViewHolder(@NonNull DataViewHolder holder, int position) {
KeyBoardData keyBoardData1 = keyBoardData.get(position);
Log.d("-----keyBoardData1.getThumb()","----keyBoardData1.getThumb()"+keyBoardData1.getThumb());
Glide.with(mycon)
.load(keyBoardData1.getThumb())
.transform(new RoundedCorners(30))
.error(R.mipmap.ic_launcher)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
return false;
}
}).into(holder.getThumb_image());
holder.getThumb_name().setText(keyBoardData1.getTitle());
holder.getThumb_fra().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mycon, PreViewActivity.class);
intent.putExtra(MyValues.KeyBoard_name,keyBoardData1.getTitle());
intent.putExtra(MyValues.KeyBoard_pre,keyBoardData1.getPreview());
intent.putExtra(MyValues.KeyBoard_url,keyBoardData1.getZipUrl());
intent.putExtra(MyValues.KeyBoard_thumb,keyBoardData1.getThumb());
mycon.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return keyBoardData.size();
}
public static final class DataViewHolder extends RecyclerView.ViewHolder {
private TextView thumb_name;
private ImageView thumb_image;
private RelativeLayout thumb_fra;
public DataViewHolder(@NonNull View itemView) {
super(itemView);
thumb_image = itemView.findViewById(R.id.thumb_image);
thumb_name = itemView.findViewById(R.id.thumb_name);
thumb_fra = itemView.findViewById(R.id.thumb_fra);
}
public TextView getThumb_name() {
return thumb_name;
}
public void setThumb_name(TextView thumb_name) {
this.thumb_name = thumb_name;
}
public ImageView getThumb_image() {
return thumb_image;
}
public void setThumb_image(ImageView thumb_image) {
this.thumb_image = thumb_image;
}
public RelativeLayout getThumb_fra() {
return thumb_fra;
}
public void setThumb_fra(RelativeLayout thumb_fra) {
this.thumb_fra = thumb_fra;
}
}
}

View File

@ -0,0 +1,236 @@
package com.kb.myapplication.keyboard.choose.base;
import android.content.Context;
import android.graphics.Bitmap;
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.kb.myapplication.keyboard.choose.value.MyValues;
import com.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.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(MyValues.app, R.drawable.ico_shift_lit);
private Drawable iconDel = ContextCompat.getDrawable(MyValues.app, R.drawable.del_icon);
private Drawable BG = ContextCompat.getDrawable(MyValues.app, R.drawable.de_keyboard_bg);
private int keyNoramlcolor = MyValues.app.getResources().getColor(R.color.white, null);
private int keyActioncolor = MyValues.app.getResources().getColor(R.color.white, null);
private Drawable iconShiftLock = ContextCompat.getDrawable(MyValues.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(MyValues.app, R.drawable.ico_shift_lit);
iconDel = ContextCompat.getDrawable(MyValues.app, R.drawable.del_icon);
BG = ContextCompat.getDrawable(MyValues.app, R.drawable.de_keyboard_bg);
keyNoramlcolor = MyValues.app.getResources().getColor(R.color.white, null);
iconShiftLock = ContextCompat.getDrawable(MyValues.app, R.drawable.ico_shift_lit);
Drawable drawable1 = ContextCompat.getDrawable(
MyValues.app,
R.drawable.de_keybg_press
);
Drawable drawable = ContextCompat.getDrawable(MyValues.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;
}
// 获取位图尺寸
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// 计算缩放比例
options.inSampleSize = calculateInSampleSize(options, 100, 100); // 根据需要调整目标宽高
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
return new BitmapDrawable(context.getResources(), bitmap);
}
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// 原始宽高
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// 计算最合适的 inSampleSize
while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
private Drawable getBackGround(Context context, String resDirPath) {
String filePath = resDirPath + path_drawxxh + jpg_BG;
if (!new File(filePath).exists()) {
return null;
}
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
BitmapDrawable bitmapDrawable = new BitmapDrawable(context.getResources(), bitmap);
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.getKeyboardSkin();
if (!resDirPath.isEmpty()) {
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);
}
}
}

View File

@ -0,0 +1,53 @@
package com.kb.myapplication.keyboard.choose.base
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:MyLoveKeyBoardView
){
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)
}
}
}
}

View File

@ -0,0 +1,848 @@
package com.kb.myapplication.keyboard.choose.base;
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.kb.myapplication.keyboard.choose.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<Key> mKeys;
/** List of modifier keys such as Shift & Alt, if any */
private List<Key> 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<Row> 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<Key> 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.
*
* <p>Toggled state of the key will be flipped when all the following conditions are
* fulfilled:</p>
*
* <ul>
* <li>This is a sticky key, that is, {@link #sticky} is {@code true}.
* <li>The parameter {@code inside} is {@code true}.
* <li>{@link android.os.Build.VERSION#SDK_INT} is greater than
* {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1}.
* </ul>
*
* @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<Key> getKeys() {
return mKeys;
}
public List<Key> 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;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,158 @@
package com.kb.myapplication.keyboard.choose.base;
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 com.kb.myapplication.keyboard.choose.MyTools;
import java.util.List;
public class MyLoveKeyBoardView extends LoveKeyBoardView {
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 MyLoveKeyBoardView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MyLoveKeyBoardView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public MyLoveKeyBoardView(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<KeyBoard.Key> 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);
}
}
}

View File

@ -0,0 +1,56 @@
package com.kb.myapplication.keyboard.choose.base;
import android.graphics.Rect;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
public class MySpace 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 MySpace(int v_space, int h_space, int ex_space) {
this.ex_space = ex_space;
this.h_space = h_space;
this.v_space = v_space;
}
}

View File

@ -0,0 +1,93 @@
package com.kb.myapplication.keyboard.choose.base;
import static androidx.core.content.ContextCompat.getColor;
import static androidx.core.content.ContextCompat.registerReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.kb.myapplication.keyboard.choose.MyTools;
import com.kb.myapplication.keyboard.choose.R;
import com.kb.myapplication.keyboard.choose.activity.MainActivity;
import com.kb.myapplication.keyboard.choose.databinding.ServiceDialogBinding;
public class ServiceDialog extends DialogFragment {
private ServiceDialogBinding serviceDialogBinding;
//private PermissionBtnListener permissionBtnListener;
private Context myContext;
private BroadcastReceiver broadcastReceiver;
public ServiceDialog(Context context) {
myContext = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
serviceDialogBinding = ServiceDialogBinding.inflate(inflater, null, false);
init();
return serviceDialogBinding.getRoot();
}
/*public void setPermissionBtnListener(PermissionBtnListener permissionBtnListener) {
this.permissionBtnListener = permissionBtnListener;
}*/
@Override
public void onResume() {
super.onResume();
refreshBtnStatus();
}
public void refreshBtnStatus() {
boolean step1 = MyTools.FirstSetting();
Log.d("----step1","----step"+step1);
boolean step2 = MyTools.SecondSetting();
Log.d("----step2","----step"+step2);
serviceDialogBinding.mainDialogButton1.setSelected(step1);
serviceDialogBinding.mainDialogButton2.setSelected(step2);
}
public void init() {
setCancelable(true);
Window window = getDialog().getWindow();
window.setBackgroundDrawableResource(R.drawable.main_dialog_bg);
window.getDecorView().setPadding(0, 10, 0, 50);
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
serviceDialogBinding.dialogFra.setVisibility(View.VISIBLE);
serviceDialogBinding.mainDialogButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTools.GotoFistSetting(myContext);
}
});
serviceDialogBinding.mainDialogButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTools.GotoSecondSetting();
}
});
}
}

View File

@ -0,0 +1,42 @@
package com.kb.myapplication.keyboard.choose.data;
import java.io.Serializable;
public class KeyBoardData implements Serializable {
private String preview;
private String thumb;
private String title;
private String zipUrl;
public String getPreview() {
return preview;
}
public void setPreview(String preview) {
this.preview = preview;
}
public String getThumb() {
return thumb;
}
public void setThumb(String thumb) {
this.thumb = thumb;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getZipUrl() {
return zipUrl;
}
public void setZipUrl(String zipUrl) {
this.zipUrl = zipUrl;
}
}

View File

@ -0,0 +1,7 @@
package com.kb.myapplication.keyboard.choose.listener;
import java.io.File;
public interface DownloadZipListener {
void downloadziplistener(boolean ok, File file);
}

View File

@ -0,0 +1,6 @@
package com.kb.myapplication.keyboard.choose.listener;
public interface Downloadfilezip {
void downloadfilezip(boolean ok, String filepath);
}

View File

@ -0,0 +1,19 @@
package com.kb.myapplication.keyboard.choose.room;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.kb.myapplication.keyboard.choose.value.MyValues;
@Database(entities = {LikeDataEntity.class},version = 1,exportSchema = false)
public abstract class LikeDataBase extends RoomDatabase {
private static LikeDataBase likeDataBase;
public abstract LikeDataDAO getlikeDataDAO();
public static synchronized LikeDataBase getLikeDataBase(){
if(likeDataBase == null){
likeDataBase = Room.databaseBuilder(MyValues.app, LikeDataBase.class,MyValues.DATABASE_NAME).build();
}
return likeDataBase;
}
}

View File

@ -0,0 +1,27 @@
package com.kb.myapplication.keyboard.choose.room;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
import java.util.Vector;
@Dao
public interface LikeDataDAO {
@Query("select * from like_table where title=:title")
List<LikeDataEntity> QueryTitle(String title);
@Insert(onConflict = OnConflictStrategy.IGNORE)
void InsertLikeEntity(LikeDataEntity likeDataEntity);
@Delete
void DeleteLikeEntity(LikeDataEntity likeDataEntity);
@Update
void UpdateLikeEntity(LikeDataEntity likeDataEntity);
@Query("delete from like_table where title=:title")
void DeleteData(String title);
@Query("select * from like_table")
List<LikeDataEntity> GetAllData();
}

View File

@ -0,0 +1,59 @@
package com.kb.myapplication.keyboard.choose.room;
import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;
import com.kb.myapplication.keyboard.choose.value.MyValues;
import java.io.Serializable;
@Entity(tableName = MyValues.TABLE_NAME,indices = {@Index(value = "title",unique = true)})
public class LikeDataEntity implements Serializable {
@PrimaryKey(autoGenerate = true)
private int keyboardid;
private String title;
private String preview;
private String thumb;
private String zipUrl;
public int getKeyboardid() {
return keyboardid;
}
public void setKeyboardid(int keyboardid) {
this.keyboardid = keyboardid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPreview() {
return preview;
}
public void setPreview(String preview) {
this.preview = preview;
}
public String getThumb() {
return thumb;
}
public void setThumb(String thumb) {
this.thumb = thumb;
}
public String getZipUrl() {
return zipUrl;
}
public void setZipUrl(String zipUrl) {
this.zipUrl = zipUrl;
}
}

View File

@ -0,0 +1,15 @@
package com.kb.myapplication.keyboard.choose.value;
import com.kb.myapplication.keyboard.choose.LoveKeyBoard;
public class MyValues {
public static final String TABLE_NAME = "like_table";
public static final String DATABASE_NAME = "like_database";
public static final String KeyBoard_name = "keyboard_name";
public static final String KeyBoard_url = "keyboard_url";
public static final String KeyBoard_pre = "keyboard_pre";
public static final String KeyBoard_thumb = "keyboard_thumb";
public static final int step1 = 1;
public static final int step2 = 2;
public static LoveKeyBoard app;
}

View File

@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<group>
<clip-path
android:pathData="M0,0h40v40h-40z"/>
<path
android:pathData="M20,39.993C25.304,39.993 30.39,37.887 34.14,34.137C37.89,30.386 39.997,25.3 39.997,19.997C39.997,14.693 37.89,9.607 34.14,5.857C30.39,2.107 25.304,0 20,0C14.697,0 9.61,2.107 5.86,5.857C2.11,9.607 0.003,14.693 0.003,19.997C0.003,25.3 2.11,30.386 5.86,34.137C9.61,37.887 14.697,39.993 20,39.993Z"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M10.724,19.982H30.018"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
<path
android:pathData="M19.161,29.175L11.282,21.297C10.938,20.952 10.744,20.485 10.744,19.998C10.743,19.511 10.936,19.043 11.28,18.698L19.16,10.818"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</group>
</vector>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="9dp"/>
<solid android:color="@color/white"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white"/>
</shape>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M830.3,170.3H437.6A178.3,178.3 0,0 0,310.7 223L58.2,475.3a61.5,61.5 0,0 0,0 86.9l252.3,252.3a178.3,178.3 0,0 0,127.1 52.7h392.7A152.9,152.9 0,0 0,983 714.5V323a152.9,152.9 0,0 0,-152.7 -152.7zM760.2,628.8a25.6,25.6 0,0 1,-36.1 36.1L614.1,554.8 504,664.9a25.6,25.6 0,1 1,-36.1 -36.1L578,518.7 467.9,408.5A25.6,25.6 0,1 1,504 372.4l110.1,110.3L724.1,372.4a25.6,25.6 0,0 1,36.1 0,25.6 25.6,0 0,1 0,36.3L650.1,518.7z"/>
</vector>

View File

@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="24dp"
android:viewportWidth="25"
android:viewportHeight="24">
<path
android:pathData="M12.5,23.996C15.682,23.996 18.734,22.732 20.984,20.482C23.234,18.232 24.498,15.18 24.498,11.998C24.498,8.816 23.234,5.764 20.984,3.514C18.734,1.264 15.682,0 12.5,0C9.318,0 6.266,1.264 4.016,3.514C1.766,5.764 0.502,8.816 0.502,11.998C0.502,15.18 1.766,18.232 4.016,20.482C6.266,22.732 9.318,23.996 12.5,23.996Z"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M16.197,8.301L8.512,15.986"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
<path
android:pathData="M9.176,8H15.451C15.726,8 15.989,8.109 16.184,8.303C16.378,8.497 16.487,8.76 16.488,9.034V15.311"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M459.7,155.7l-5.5,4.1 -2.4,2 -3.8,3.5 -2.2,2.2 -3.5,3.8 -258.1,305.9 -4.2,5.4c-28.1,40.2 -20.7,93.3 16,123.6l5.9,4.4 3,2 4.9,2.9 5.6,2.8c13,6.1 26.2,8.9 39.5,8.9l58.6,-0 0,142.6 0.2,6.1c4,48.9 44,85.3 91.9,85.3h212.4l6.1,-0.2 2.7,-0.2 4.8,-0.6 4.7,-0.9c43.4,-9.4 73.7,-46.3 73.7,-89.5l-0,-142.6h58.8l6.1,-0.2c35.6,-2.9 65.4,-24.3 78.7,-55.7a90.9,90.9 0,0 0,-14.2 -94.1L582.4,172.4l-4.6,-5 -1.1,-1.1a92.6,92.6 0,0 0,-117.1 -10.6zM525.3,213.9l2.1,1.8 2.7,2.9 255.9,303.5a21,21 0,0 1,3.4 21.9,22.2 22.2,0 0,1 -18.7,13.3l-3.3,0.1 -127.1,-0v212.4l-0.2,2.6a21.9,21.9 0,0 1,-18.3 18.7l-1.5,0.2 -3.7,0.2L405.6,791.3a22,22 0,0 1,-22.2 -19.9l-0.1,-3.2v-210.9h-128.5l-2.8,-0.2a22.8,22.8 0,0 1,-8 -2.5l-1.7,-1 -3.3,-2.4c-7.4,-6.1 -9.1,-18.4 -2.7,-27.5l2.2,-2.9L494.6,217.4l1.4,-1.5 1.5,-1.3 2.9,-2.2c6.8,-4.6 17.3,-4.1 24.9,1.5z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M395.2,513.6l323.1,-312.4c19.1,-18.4 19.1,-48.3 0,-66.7 -19.1,-18.4 -49.9,-18.4 -69,0L291.8,480.3c-19.1,18.4 -19.1,48.3 0,66.7l357.6,345.7c9.5,9.2 22,13.8 34.5,13.8 12.5,0 25,-4.6 34.5,-13.8 19.1,-18.4 19.1,-48.2 0,-66.7L395.2,513.6z"
android:fillColor="#272636"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M512.5,955.4c-5.2,0 -10.3,-2.1 -14.1,-6.3 -7,-7.8 -6.4,-19.8 1.4,-26.8l189.5,-170.6c7.8,-7 19.8,-6.4 26.8,1.4 7,7.8 6.4,19.8 -1.4,26.8L525.2,950.6c-3.6,3.2 -8.1,4.8 -12.7,4.8z"
android:fillColor="#ffffff"/>
<path
android:pathData="M512.5,955.4c-4.6,0 -9.1,-1.7 -12.7,-4.9L310.4,780c-7.8,-7 -8.4,-19 -1.4,-26.8 7,-7.8 19,-8.4 26.8,-1.4l157.9,142.1V462.7c0,-10.5 8.5,-19 19,-19s19,8.5 19,19v473.8c0,7.5 -4.4,14.3 -11.2,17.3 -2.7,1.1 -5.3,1.6 -8,1.6z"
android:fillColor="#ffffff"/>
<path
android:pathData="M758.9,690.1c-10.5,0 -19,-8.5 -19,-19s8.5,-19 19,-19c98.8,0 170.6,-72 170.6,-171.2 0,-95.5 -60.1,-162.2 -153.2,-170 -7.2,-0.6 -13.4,-5.2 -16.1,-12C737,240 666.4,102.7 512.5,102.7S288.1,240 264.9,299.1c-2.6,6.7 -8.9,11.4 -16.1,12 -93.1,7.8 -153.2,74.5 -153.2,170 0,99.2 71.7,171.2 170.6,171.2 10.5,0 19,8.5 19,19s-8.5,19 -19,19c-120.8,0 -208.5,-87.9 -208.5,-209.1 0,-110.8 70.3,-192.4 176.2,-206.5C289.4,142.9 392.8,64.8 512.5,64.8S735.7,143 791.1,274.6c105.9,14 176.2,95.7 176.2,206.5 0.1,121.1 -87.6,209 -208.4,209z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="25dp"
android:viewportWidth="24"
android:viewportHeight="25">
<path
android:pathData="M4.615,18.324C4.155,18.324 3.771,18.17 3.463,17.862C3.154,17.554 3,17.169 3,16.709V7.939C3,7.479 3.154,7.095 3.463,6.787C3.771,6.479 4.155,6.324 4.615,6.324H19.385C19.845,6.324 20.229,6.479 20.537,6.787C20.846,7.095 21,7.479 21,7.939V16.709C21,17.169 20.846,17.553 20.538,17.861C20.229,18.17 19.845,18.324 19.385,18.324H4.615ZM8.231,16.094H15.769V14.554H8.231V16.094ZM5.231,13.094H6.769V11.554H5.231V13.094ZM8.231,13.094H9.769V11.554H8.231V13.094ZM11.231,13.094H12.769V11.554H11.231V13.094ZM14.231,13.094H15.769V11.554H14.231V13.094ZM17.231,13.094H18.769V11.554H17.231V13.094ZM5.231,10.094H6.769V8.554H5.231V10.094ZM8.231,10.094H9.769V8.554H8.231V10.094ZM11.231,10.094H12.769V8.554H11.231V10.094ZM14.231,10.094H15.769V8.554H14.231V10.094ZM17.231,10.094H18.769V8.554H17.231V10.094Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M20,0L20,0A20,20 0,0 1,40 20L40,20A20,20 0,0 1,20 40L20,40A20,20 0,0 1,0 20L0,20A20,20 0,0 1,20 0z"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M30.108,22.217C27.358,27.888 20.627,30.813 20.341,30.938C20.122,31.021 19.878,31.021 19.659,30.938C19.384,30.813 12.642,27.888 9.892,22.217C8.187,18.684 9.133,14.879 10.992,13.244C11.643,12.712 12.417,12.335 13.251,12.144C14.084,11.952 14.954,11.952 15.787,12.143C17.493,12.513 18.983,13.497 19.945,14.889C20.909,13.494 22.403,12.509 24.114,12.143C24.947,11.952 25.817,11.952 26.65,12.144C27.484,12.335 28.258,12.712 28.909,13.244C30.867,14.879 31.824,18.684 30.108,22.217Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40">
<path
android:pathData="M20,0L20,0A20,20 0,0 1,40 20L40,20A20,20 0,0 1,20 40L20,40A20,20 0,0 1,0 20L0,20A20,20 0,0 1,20 0z"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M30.108,22.217C27.358,27.888 20.627,30.813 20.341,30.938C20.122,31.021 19.878,31.021 19.659,30.938C19.384,30.813 12.642,27.888 9.892,22.217C8.187,18.684 9.133,14.879 10.992,13.244C11.643,12.712 12.417,12.335 13.251,12.144C14.084,11.952 14.954,11.952 15.787,12.143C17.493,12.513 18.983,13.497 19.945,14.889C20.909,13.494 22.403,12.509 24.114,12.143C24.947,11.952 25.817,11.952 26.65,12.144C27.484,12.335 28.258,12.712 28.909,13.244C30.867,14.879 31.824,18.684 30.108,22.217Z"
android:fillColor="#FC2778"/>
</vector>

View File

@ -0,0 +1,45 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="335dp"
android:height="50dp"
android:viewportWidth="335"
android:viewportHeight="50"
>
<group>
<clip-path
android:pathData="M24 0H311C324.255 0 335 10.7452 335 24V26C335 39.2548 324.255 50 311 50H24C10.7452 50 0 39.2548 0 26V24C0 10.7452 10.7452 0 24 0Z"
/>
<group
android:translateX="-1.826"
android:translateY="-0.913"
android:pivotX="167.5"
android:pivotY="25"
android:scaleX="5.652"
android:scaleY="5.652"
>
<path
android:pathData="M0 0V50H335V0"
>
<aapt:attr name="android:fillColor">
<gradient
android:type="linear"
android:startX="83.75"
android:startY="25"
android:endX="251.25"
android:endY="25"
>
<item
android:color="#999999"
android:offset="0"
/>
<item
android:color="#303C52"
android:offset="1"
/>
</gradient>
</aapt:attr>
</path>
</group>
</group>
</vector>

View File

@ -0,0 +1,55 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="159dp"
android:height="114dp"
android:viewportWidth="159"
android:viewportHeight="114">
<path
android:pathData="M81.65,106.93L83.45,95.86V88.79H96.11L91,101.58C94.04,101.42 94.33,98.33 100.26,98.33C103.88,98.33 107.46,99.89 107.22,104.94C107.16,106.17 106.65,107.43 105.97,108.58C104.51,111.04 101.59,112.01 98.72,112.01H92.06L85.54,111.71C83.08,111.6 81.26,109.37 81.65,106.93Z"
android:fillColor="#5101A9"/>
<path
android:pathData="M67.45,102.59V97.56L79.37,94.46L78.6,101.04L76.74,111.5C76.7,111.75 76.6,111.99 76.46,112.2C76.11,112.73 75.52,113.04 74.89,113.04C59.03,112.9 59.76,109.49 59.76,106.07C59.76,103.29 64.89,102.59 67.45,102.59Z"
android:fillColor="#5101A9"/>
<path
android:pathData="M27.77,1.07H130.97V104.27H27.77V1.07Z"
android:fillColor="#ffffff"
android:fillAlpha="0.01"/>
<path
android:pathData="M73.58,6.39C80.91,8.95 86.65,10.59 90.81,11.31C95.08,12.05 100.97,12.39 108.5,12.34C109.39,12.34 110.25,12.65 110.92,13.23C111.6,13.8 112.04,14.6 112.17,15.47L117.82,52.49C118.62,57.75 118.38,63.1 117.11,68.26C115.84,73.42 113.56,78.28 110.42,82.56C107.27,86.84 103.31,90.46 98.76,93.21C94.22,95.95 89.18,97.78 83.92,98.58L83.84,98.6C73.48,100.18 62.92,97.69 54.37,91.66C45.81,85.62 39.91,76.51 37.92,66.23L37.65,64.63L32.02,27.75C31.89,26.88 32.08,25.98 32.55,25.23C33.02,24.47 33.75,23.92 34.61,23.66C42.59,21.27 48.47,19.12 52.26,17.18C55.51,15.53 59.65,12.8 64.72,8.99L66.65,7.52C67.62,6.77 68.76,6.27 69.97,6.07C71.18,5.88 72.42,5.98 73.58,6.39L73.58,6.39Z"
android:fillColor="#84A7FF"/>
<path
android:pathData="M52.11,60.58C52.11,60.58 36.99,48.11 26.8,58.67C24.23,61.33 23.49,64.55 23.91,67.74M23.91,67.74C25.18,77.21 36.77,86.51 41.91,80.77C47.82,74.18 34.78,62.99 23.91,67.74ZM23.91,67.74C22.14,68.52 20.43,69.71 18.87,71.42C14.67,76.01 14.2,81.35 15.54,85.91M15.54,85.91C17.76,93.49 24.96,98.94 28.41,95.33C33.29,90.22 23.07,82.22 15.54,85.91ZM15.54,85.91C14.54,86.4 13.6,87.08 12.74,88.01C5.37,95.96 15.31,105.77 15.31,105.77"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#022C42"
android:strokeLineCap="round"/>
<path
android:pathData="M101.28,38.73C101.28,38.73 106.4,57.17 119.5,54.88C122.8,54.3 125.01,52.24 126.31,49.51M126.31,49.51C130.17,41.43 126.12,27.49 119.3,28.97C111.46,30.66 115.65,46.91 126.31,49.51ZM126.31,49.51C128.05,49.94 129.96,50 132.01,49.58C137.53,48.45 140.6,44.58 141.91,40.26M141.91,40.26C144.09,33.09 141.4,24.68 136.95,25.49C130.65,26.63 134.32,38.77 141.91,40.26ZM141.91,40.26C142.91,40.46 143.98,40.47 145.1,40.25C154.74,38.35 152.2,24.97 152.2,24.97"
android:strokeWidth="4"
android:fillColor="#00000000"
android:strokeColor="#022C42"
android:strokeLineCap="round"/>
<path
android:pathData="M62.22,53.46a13.16,7.22 74.59,1 0,13.93 -3.84a13.16,7.22 74.59,1 0,-13.93 3.84z"
android:fillColor="#ffffff"/>
<path
android:pathData="M62.95,51.9a3.3,1.65 83.12,1 0,3.27 -0.39a3.3,1.65 83.12,1 0,-3.27 0.39z"
android:fillColor="#021530"/>
<path
android:pathData="M72.32,49.27a13.16,7.22 77.13,1 0,14.09 -3.22a13.16,7.22 77.13,1 0,-14.09 3.22z"
android:fillColor="#ffffff"/>
<path
android:pathData="M73.13,48.47a3.3,1.65 80.77,1 0,3.26 -0.53a3.3,1.65 80.77,1 0,-3.26 0.53z"
android:fillColor="#021530"/>
<path
android:pathData="M71.21,105.16C71.41,105.53 71.89,105.67 72.26,105.46C72.63,105.25 72.77,104.78 72.56,104.41L71.21,105.16ZM67.5,102.72C67.83,102.72 68.53,102.9 69.31,103.34C70.06,103.77 70.78,104.39 71.21,105.16L72.56,104.41C71.96,103.32 70.99,102.52 70.07,102C69.17,101.48 68.2,101.17 67.5,101.17V102.72Z"
android:fillColor="#84A7FF"/>
<path
android:pathData="M96.02,100.27L96.74,100L96.21,98.55L95.48,98.81L96.02,100.27ZM87.58,104.25C87.28,104.56 87.29,105.05 87.6,105.34C87.91,105.64 88.4,105.63 88.7,105.32L87.58,104.25ZM95.48,98.81C94.32,99.24 90.79,100.9 87.58,104.25L88.7,105.32C91.71,102.18 95.02,100.63 96.02,100.27L95.48,98.81Z"
android:fillColor="#84A7FF"/>
<path
android:pathData="M74.01,73.31L74.27,73.48C77.4,75.51 81.58,74.61 83.59,71.47L85.88,67.89"
android:strokeWidth="3.09599"
android:fillColor="#00000000"
android:strokeColor="#ffffff"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,19 @@
<!-- drawable/frame_10000.xml -->
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="375dp"
android:height="375.04dp"
android:viewportWidth="375"
android:viewportHeight="375.04"
>
<group>
<clip-path
android:pathData="M0 0H375V375.04H0V0Z"
/>
<path
android:pathData="M0 0V375.04H375V0"
android:fillColor="#FFFFFF"
/>
</group>
</vector>

View File

@ -0,0 +1,18 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="155.5dp"
android:height="50dp"
android:viewportWidth="155.5"
android:viewportHeight="50"
>
<group>
<clip-path
android:pathData="M25 0H130.5C144.307 0 155.5 11.1929 155.5 25C155.5 38.8071 144.307 50 130.5 50H25C11.1929 50 0 38.8071 0 25C0 11.1929 11.1929 0 25 0Z"
/>
<path
android:pathData="M0 0V50H155.5V0"
android:fillColor="#3D475B"
/>
</group>
</vector>

View File

@ -0,0 +1,43 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="155.5dp"
android:height="50dp"
android:viewportWidth="155.5"
android:viewportHeight="50"
>
<group>
<clip-path
android:pathData="M25 0H130.5C144.307 0 155.5 11.1929 155.5 25C155.5 38.8071 144.307 50 130.5 50H25C11.1929 50 0 38.8071 0 25C0 11.1929 11.1929 0 25 0Z"
/>
<group
android:pivotX="77.75"
android:pivotY="25"
android:scaleX="2"
android:scaleY="2"
>
<path
android:pathData="M0 0V50H155.5V0"
>
<aapt:attr name="android:fillColor">
<gradient
android:type="linear"
android:startX="38.875"
android:startY="25"
android:endX="116.625"
android:endY="25"
>
<item
android:color="#5E5AE2"
android:offset="0"
/>
<item
android:color="#DF4980"
android:offset="1"
/>
</gradient>
</aapt:attr>
</path>
</group>
</group>
</vector>

View File

@ -0,0 +1,18 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="40dp"
android:height="40dp"
android:viewportWidth="40"
android:viewportHeight="40"
>
<group>
<clip-path
android:pathData="M20 0C31.0457 0 40 8.95431 40 20C40 31.0457 31.0457 40 20 40C8.95431 40 0 31.0457 0 20C0 8.95431 8.95431 0 20 0Z"
/>
<path
android:pathData="M0 0V40H40V0"
android:fillColor="#1AFFFFFF"
/>
</group>
</vector>

View File

@ -0,0 +1,22 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="40dp"
android:height="41dp"
android:viewportWidth="40"
android:viewportHeight="41">
<path
android:pathData="M20,0.5L20,0.5A20,20 0,0 1,40 20.5L40,20.5A20,20 0,0 1,20 40.5L20,40.5A20,20 0,0 1,0 20.5L0,20.5A20,20 0,0 1,20 0.5z"
android:fillColor="#ffffff"
android:fillAlpha="0.1"/>
<path
android:pathData="M15.5,16m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"
android:fillColor="#ffffff"/>
<path
android:pathData="M24.5,16m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"
android:fillColor="#ffffff"/>
<path
android:pathData="M15.5,25m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"
android:fillColor="#ffffff"/>
<path
android:pathData="M24.5,25m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="177dp"
android:height="207dp"
android:viewportWidth="177"
android:viewportHeight="207">
<path
android:pathData="M0,18.77C0,12.14 5.37,6.77 12,6.77H165C171.63,6.77 177,12.14 177,18.77V194.77C177,201.4 171.63,206.77 165,206.77H12C5.37,206.77 0,201.4 0,194.77V18.77Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M157.01,1.48L167.68,14.64C168.21,15.29 167.74,16.27 166.9,16.27H140.19C139.33,16.27 138.87,15.26 139.43,14.62L150.88,1.38C152.5,-0.5 155.44,-0.45 157.01,1.48Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M13.736,2.674C15.064,2.674 16.338,3.201 17.278,4.139C18.218,5.078 18.748,6.351 18.75,7.679C18.75,10.374 17.761,11.66 13.342,15.151L11.073,16.913C10.442,17.403 9.558,17.403 8.927,16.913L6.657,15.151C2.239,11.66 1.25,10.374 1.25,7.679C1.252,6.351 1.782,5.078 2.722,4.139C3.662,3.201 4.936,2.674 6.264,2.674C7.619,2.68 8.918,3.214 9.886,4.161L10,4.269L10.114,4.161C11.082,3.214 12.381,2.68 13.736,2.674Z"
android:fillColor="#021530"
android:fillType="evenOdd"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M16.408,4.18C15.953,3.736 15.37,3.445 14.742,3.346V3.113C14.741,2.923 14.702,2.735 14.628,2.56C14.554,2.385 14.446,2.226 14.311,2.093C14.175,1.96 14.014,1.855 13.838,1.784C13.662,1.713 13.473,1.678 13.283,1.68H6.617C6.234,1.678 5.865,1.827 5.592,2.096C5.319,2.364 5.163,2.73 5.158,3.113V3.363C4.573,3.489 4.036,3.778 3.608,4.196C3.322,4.476 3.094,4.811 2.94,5.18C2.785,5.549 2.706,5.946 2.708,6.346V14.446C2.71,14.958 2.814,15.464 3.014,15.935C3.215,16.406 3.507,16.832 3.875,17.188C4.619,17.921 5.623,18.328 6.667,18.322H13.333C14.377,18.328 15.381,17.921 16.125,17.188C16.493,16.832 16.785,16.406 16.986,15.935C17.186,15.464 17.29,14.958 17.292,14.446V6.338C17.295,5.53 16.977,4.754 16.408,4.18ZM6.408,3.105C6.413,3.053 6.437,3.005 6.476,2.971C6.514,2.937 6.565,2.919 6.617,2.921H13.283C13.335,2.919 13.386,2.937 13.425,2.971C13.463,3.005 13.487,3.053 13.492,3.105V4.771C13.487,4.823 13.463,4.871 13.425,4.905C13.386,4.939 13.335,4.957 13.283,4.955H6.617C6.565,4.957 6.514,4.939 6.476,4.905C6.437,4.871 6.413,4.823 6.408,4.771V3.105ZM13.208,14.047H6.792C6.571,14.047 6.359,13.959 6.202,13.802C6.046,13.646 5.958,13.434 5.958,13.213C5.958,12.992 6.046,12.78 6.202,12.624C6.359,12.468 6.571,12.38 6.792,12.38H13.208C13.429,12.38 13.641,12.468 13.798,12.624C13.954,12.78 14.042,12.992 14.042,13.213C14.042,13.434 13.954,13.646 13.798,13.802C13.641,13.959 13.429,14.047 13.208,14.047ZM13.208,10.388H6.792C6.571,10.388 6.359,10.3 6.202,10.144C6.046,9.988 5.958,9.776 5.958,9.555C5.958,9.334 6.046,9.122 6.202,8.966C6.359,8.809 6.571,8.721 6.792,8.721H13.208C13.429,8.721 13.641,8.809 13.798,8.966C13.954,9.122 14.042,9.334 14.042,9.555C14.042,9.776 13.954,9.988 13.798,10.144C13.641,10.3 13.429,10.388 13.208,10.388Z"
android:fillColor="#021530"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M17.925,12.159L16.883,11.059C17.016,10.257 16.999,9.438 16.833,8.642L17.85,7.542C17.929,7.455 17.982,7.346 18.002,7.23C18.023,7.114 18.011,6.994 17.967,6.884C17.545,5.842 16.922,4.893 16.133,4.092C16.056,4.015 15.96,3.96 15.855,3.932C15.749,3.905 15.638,3.905 15.533,3.934L14,4.326C13.528,3.986 13.016,3.706 12.475,3.492L12.1,2.059C12.072,1.943 12.011,1.837 11.923,1.756C11.836,1.674 11.726,1.62 11.608,1.601C11.089,1.503 10.562,1.456 10.033,1.459C9.372,1.462 8.714,1.549 8.075,1.717C7.968,1.744 7.871,1.8 7.793,1.877C7.715,1.955 7.66,2.052 7.633,2.159L7.233,3.634C6.786,3.833 6.362,4.079 5.967,4.367L4.45,3.992C4.344,3.965 4.231,3.966 4.126,3.997C4.02,4.028 3.925,4.087 3.85,4.167C3.021,5.028 2.388,6.057 1.992,7.184C1.953,7.293 1.945,7.41 1.969,7.524C1.992,7.637 2.046,7.741 2.125,7.826L3.175,8.917C3.122,9.268 3.094,9.621 3.092,9.976C3.092,10.226 3.092,10.476 3.133,10.726L2.042,11.943C1.968,12.023 1.917,12.122 1.894,12.229C1.87,12.336 1.875,12.447 1.908,12.551C2.251,13.653 2.818,14.671 3.575,15.542C3.651,15.632 3.751,15.698 3.863,15.734C3.975,15.769 4.095,15.772 4.208,15.743L5.642,15.376C6.143,15.798 6.705,16.144 7.308,16.401L7.725,17.892C7.757,18.001 7.817,18.098 7.899,18.176C7.981,18.253 8.082,18.308 8.192,18.334C8.792,18.47 9.408,18.54 10.025,18.542C10.517,18.538 11.007,18.49 11.492,18.401C11.607,18.381 11.714,18.328 11.801,18.25C11.888,18.172 11.951,18.071 11.983,17.959L12.375,16.551C13.094,16.293 13.765,15.916 14.358,15.434L15.825,15.767C15.935,15.793 16.05,15.788 16.157,15.753C16.264,15.717 16.36,15.653 16.433,15.568C17.164,14.756 17.73,13.811 18.1,12.784C18.13,12.674 18.129,12.557 18.099,12.448C18.068,12.337 18.008,12.238 17.925,12.159ZM10.1,13.217C9.679,13.225 9.26,13.149 8.869,12.994C8.477,12.839 8.121,12.607 7.82,12.312C7.519,12.017 7.279,11.666 7.116,11.278C6.952,10.89 6.867,10.473 6.866,10.052C6.864,9.631 6.947,9.213 7.109,8.824C7.27,8.435 7.508,8.083 7.807,7.786C8.107,7.49 8.462,7.256 8.853,7.099C9.243,6.941 9.661,6.863 10.083,6.868C10.925,6.866 11.733,7.198 12.33,7.792C12.927,8.386 13.264,9.193 13.266,10.035C13.268,10.877 12.936,11.686 12.342,12.283C11.748,12.88 10.941,13.216 10.099,13.218"
android:fillColor="#021530"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M18.3,14.981C18.299,15.443 18.202,15.899 18.015,16.321C17.828,16.744 17.556,17.122 17.215,17.434C16.874,17.745 16.472,17.982 16.035,18.13C15.597,18.278 15.134,18.334 14.674,18.293C14.214,18.253 13.767,18.117 13.363,17.895C12.958,17.673 12.604,17.369 12.323,17.003C12.042,16.636 11.84,16.216 11.729,15.767C11.619,15.319 11.604,14.852 11.683,14.398L7.6,12.548C7.288,12.935 6.893,13.247 6.445,13.462C5.996,13.677 5.506,13.789 5.008,13.789C4.124,13.789 3.276,13.438 2.651,12.813C2.026,12.188 1.675,11.34 1.675,10.456C1.675,9.572 2.026,8.724 2.651,8.099C3.276,7.474 4.124,7.123 5.008,7.123C5.465,7.124 5.917,7.22 6.336,7.403C6.754,7.587 7.131,7.854 7.442,8.189L11.742,5.856C11.666,5.585 11.63,5.304 11.633,5.023C11.632,4.247 11.902,3.495 12.396,2.897C12.889,2.299 13.576,1.892 14.338,1.745C15.099,1.599 15.888,1.723 16.568,2.095C17.248,2.468 17.777,3.066 18.064,3.787C18.351,4.507 18.377,5.305 18.139,6.043C17.9,6.781 17.412,7.413 16.758,7.83C16.104,8.247 15.325,8.422 14.556,8.327C13.786,8.231 13.074,7.87 12.542,7.306L8.242,9.648C8.317,9.919 8.353,10.199 8.35,10.481C8.35,10.676 8.334,10.872 8.3,11.064L12.383,12.914C12.815,12.372 13.406,11.977 14.072,11.786C14.739,11.594 15.449,11.616 16.103,11.847C16.757,12.078 17.322,12.507 17.72,13.075C18.119,13.643 18.33,14.321 18.325,15.014L18.3,14.981Z"
android:fillColor="#021530"/>
</vector>

View File

@ -0,0 +1,43 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="207dp"
android:height="50dp"
android:viewportWidth="207"
android:viewportHeight="50"
>
<group>
<clip-path
android:pathData="M25 0H182C195.807 0 207 11.1929 207 25C207 38.8071 195.807 50 182 50H25C11.1929 50 0 38.8071 0 25C0 11.1929 11.1929 0 25 0Z"
/>
<group
android:pivotX="103.5"
android:pivotY="25"
android:scaleX="2"
android:scaleY="2"
>
<path
android:pathData="M0 0V50H207V0"
>
<aapt:attr name="android:fillColor">
<gradient
android:type="linear"
android:startX="51.75"
android:startY="25"
android:endX="155.25"
android:endY="25"
>
<item
android:color="#5E5AE2"
android:offset="0"
/>
<item
android:color="#DF4980"
android:offset="1"
/>
</gradient>
</aapt:attr>
</path>
</group>
</group>
</vector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/main_dialog_button_bg"/>
<item android:state_selected="false" android:drawable="@drawable/main_dialog_button_bg2"/>
</selector>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="9dp"/>
<solid android:color="@color/white"/>
</shape>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="9dp"/>
<solid android:color="@color/white"/>
</shape>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:drawable="@drawable/step_background"/>
<item android:state_selected="true" android:drawable="@drawable/step_background_selected"/>
</selector>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="19dp"/>
<solid android:color="@color/white"/>
</shape>

View File

@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="160dp"
android:height="157dp"
android:viewportWidth="160"
android:viewportHeight="157">
<path
android:pathData="M0,24.32C0,11.07 10.75,0.32 24,0.32H136C149.26,0.32 160,11.07 160,24.32V132.32C160,145.58 149.26,156.32 136,156.32H24C10.75,156.32 0,145.58 0,132.32V24.32Z"
android:fillColor="#D9D9D9"/>
<path
android:pathData="M0,24.32C0,11.07 10.75,0.32 24,0.32H136C149.26,0.32 160,11.07 160,24.32V132.32C160,145.58 149.26,156.32 136,156.32H24C10.75,156.32 0,145.58 0,132.32V24.32Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="-290.65"
android:startY="77.75"
android:endX="161.54"
android:endY="77.75"
android:type="linear">
<item android:offset="0" android:color="#FF999999"/>
<item android:offset="1" android:color="#FF303C52"/>
</gradient>
</aapt:attr>
</path>
</vector>

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fav_main"
android:background="@mipmap/main_bg2"
tools:context=".activity.FavouriteActivity">
<LinearLayout
android:id="@+id/fav_top"
android:layout_marginTop="60dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/fav_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/back_image"/>
<TextView
android:id="@+id/pre_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:layout_weight="1"
android:text="@string/favourites"
android:textColor="@color/white"
android:textSize="25sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/fav_recycle"
android:layout_below="@id/fav_top"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/fav_lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="gone"
android:layout_below="@+id/fav_top">
<ImageView
android:layout_marginTop="50dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/favouritenull_bg"/>
<TextView
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/favouritesnull"
android:gravity="center_horizontal"
android:textColor="@color/white"
android:textSize="20sp"/>
<TextView
android:id="@+id/fav_text_add"
android:layout_width="207dp"
android:layout_height="50dp"
android:text="@string/add_fav"
android:textSize="25sp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/white"
android:layout_marginTop="30dp"
android:background="@drawable/pre_apply_bg"/>
</LinearLayout>
</RelativeLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/into_image"
tools:context=".activity.IntoActivity">
<TextView
android:id="@+id/into_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_alignParentBottom="true"
android:paddingBottom="100dp"
android:layout_centerHorizontal="true"
android:textColor="@color/white"
android:text="@string/app_name"
android:textSize="24sp" />
</RelativeLayout>

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/list_lin"
android:orientation="vertical"
android:background="@mipmap/main_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.ListAllDataActivity">
<LinearLayout
android:layout_marginTop="60dp"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<!-- Auto layout, variables, and unit scale are not yet supported -->
<RelativeLayout
android:id="@+id/frame_10000"
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingStart="20dp"
android:background="@drawable/main_bg2">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/key_image"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/explain"
android:layout_marginStart="30dp"
android:textSize="15sp"
android:layout_centerVertical="true"
android:textColor="@color/white"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/num"
android:textSize="15sp"
android:paddingEnd="20dp"
android:layout_centerVertical="true"
android:textColor="@color/white"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_recycle"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_lin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@mipmap/main_bg"
tools:context=".activity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<RelativeLayout
android:layout_marginTop="60dp"
android:paddingStart="24dp"
android:paddingRight="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- Auto layout, variables, and unit scale are not yet supported -->
<LinearLayout
android:id="@+id/main_id"
android:layout_width="300dp"
android:layout_height="45dp"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/logo"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:layout_marginStart="12dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hi"
android:textColor="@color/white"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/welcome"
android:textColor="@color/white"/>
</LinearLayout>
</LinearLayout>
<!-- Auto layout, variables, and unit scale are not yet supported -->
<ImageView
android:id="@+id/main_menu"
android:layout_width="40dp"
android:layout_height="40dp"
android:clipToOutline="true"
android:layout_alignParentEnd="true"
android:layout_gravity="center_vertical"
android:background="@drawable/menu"
/>
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="273dp"
android:gravity="center">
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:src="@mipmap/main_image" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="wrap_content">
<!-- Auto layout, variables, and unit scale are not yet supported -->
<RelativeLayout
android:id="@+id/frame_10000"
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingStart="20dp"
android:background="@drawable/main_bg2">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:src="@drawable/key_image"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/explain"
android:layout_marginStart="30dp"
android:textSize="15sp"
android:layout_centerVertical="true"
android:textColor="@color/white"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/num"
android:textSize="15sp"
android:paddingEnd="20dp"
android:layout_centerVertical="true"
android:textColor="@color/white"/>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_recycle"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:paddingTop="40dp"
android:paddingBottom="20dp"
android:paddingRight="20dp"
android:layout_marginTop="110dp"
android:paddingLeft="20dp"
android:gravity="center_horizontal"
android:background="@drawable/menu_bg">
<LinearLayout
android:id="@+id/menu_like"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_like"/>
<TextView
android:layout_marginStart="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/menu_like"/>
</LinearLayout>
<LinearLayout
android:id="@+id/menu_set"
android:layout_below="@+id/menu_like"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_set"/>
<TextView
android:layout_marginStart="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/menu_set"/>
</LinearLayout>
<LinearLayout
android:id="@+id/menu_share"
android:layout_below="@id/menu_set"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_share"/>
<TextView
android:layout_marginStart="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/menu_share"/>
</LinearLayout>
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/menu_pri"
android:visibility="gone"
android:layout_below="@+id/menu_share"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_pracicy"/>
<TextView
android:layout_marginStart="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/menu_privacy"/>
</LinearLayout>
</RelativeLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pre_main"
android:background="@mipmap/main_bg2"
tools:context=".activity.PreViewActivity">
<LinearLayout
android:layout_marginTop="60dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/pre_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/back_image"/>
<TextView
android:id="@+id/pre_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:layout_weight="1"
android:textColor="@color/white"
android:textSize="20sp" />
<ImageView
android:id="@+id/pre_like_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/like_image1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/pre_text_apply"
android:layout_width="207dp"
android:layout_height="50dp"
android:text="@string/apply"
android:textSize="25sp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@color/white"
android:background="@drawable/pre_apply_bg"/>
<ImageView
android:layout_marginTop="20dp"
android:id="@+id/pre_image"
android:layout_width="match_parent"
android:scaleType="fitXY"
android:layout_height="276dp"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="276dp"
android:orientation="vertical"
android:gravity="center"
android:layout_alignParentBottom="true">
<ProgressBar
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:indeterminateTint="#D1CBDF"
android:visibility="gone"
android:id="@+id/pre_pro"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.SettingActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_marginTop="20dp"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/fav_relative_lay"
android:layout_width="160dp"
android:layout_marginStart="5dp"
android:background="@drawable/thumb_bg"
android:layout_height="156dp">
<RelativeLayout
android:id="@+id/fav_top"
android:layout_width="160dp"
android:layout_height="40dp">
<TextView
android:id="@+id/fav_name"
android:layout_width="95.5dp"
android:layout_height="18dp"
android:textColor="@color/white"
android:layout_marginStart="20dp"
android:layout_centerVertical="true"/>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/group"
android:layout_centerVertical="true"
android:layout_marginLeft="120dp"/>
</RelativeLayout>
<ImageView
android:layout_below="@+id/fav_top"
android:layout_width="160dp"
android:layout_height="110dp"
android:id="@+id/fav_image"
android:layout_alignParentBottom="true"
android:scaleType="fitXY"/>
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_marginTop="20dp"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/thumb_fra"
android:layout_width="160dp"
android:layout_marginStart="5dp"
android:background="@drawable/thumb_bg"
android:layout_height="156dp">
<RelativeLayout
android:id="@+id/thumb_top"
android:layout_width="160dp"
android:layout_height="40dp">
<TextView
android:id="@+id/thumb_name"
android:layout_width="95.5dp"
android:layout_height="18dp"
android:textColor="@color/white"
android:layout_marginStart="20dp"
android:layout_centerVertical="true"/>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/group"
android:layout_centerVertical="true"
android:layout_marginLeft="120dp"/>
</RelativeLayout>
<ImageView
android:layout_below="@+id/thumb_top"
android:layout_width="160dp"
android:layout_height="110dp"
android:id="@+id/thumb_image"
android:layout_alignParentBottom="true"
android:scaleType="fitXY"/>
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/keyboard_thumb"
android:layout_marginTop="10dp"
android:scaleType="fitXY" />
</LinearLayout>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.kb.myapplication.keyboard.choose.base.MyLoveKeyBoardView
android:id="@+id/my_keyboard_input"
android:layout_width="match_parent"
android:layout_height="210dp"
android:keyBackground="@drawable/de_keyboard_bg"
android:padding="2dp" />
</LinearLayout>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/dialog_fra"
android:background="@drawable/main_dialog_bg"
tools:context=".activity.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/main_dialog_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/main_dia_image"/>
<TextView
android:id="@+id/main_dialog_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="25sp"
android:text="@string/dialog_main"
android:layout_below="@+id/main_dialog_image"
android:gravity="center_horizontal"/>
<TextView
android:id="@+id/main_dialog_button1"
android:layout_width="155.5dp"
android:layout_height="50dp"
android:layout_below="@id/main_dialog_text"
android:layout_marginTop="64dp"
android:text="@string/step1"
android:textColor="@color/white"
android:gravity="center"
android:background="@drawable/selector_dialog_buttonbg"/>
<TextView
android:id="@+id/main_dialog_button2"
android:layout_width="155.5dp"
android:layout_height="50dp"
android:layout_below="@id/main_dialog_text"
android:layout_marginTop="64dp"
android:layout_alignParentEnd="true"
android:text="@string/step2"
android:textColor="@color/white"
android:gravity="center"
android:background="@drawable/selector_dialog_buttonbg"/>
</RelativeLayout>
</FrameLayout>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu1"
android:title="@string/menu_like"
android:icon="@drawable/menu_like"/>
<item
android:id="@+id/menu2"
android:title="@string/menu_set"
android:icon="@drawable/menu_set"/>
<item
android:id="@+id/menu3"
android:title="@string/menu_share"
android:icon="@drawable/menu_share"/>
<item
android:id="@+id/menu4"
android:title="@string/menu_privacy"
android:icon="@drawable/menu_pracicy"/>
</menu>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Some files were not shown because too many files have changed in this diff Show More