This commit is contained in:
litingting 2024-07-03 16:41:47 +08:00
commit cfa327d14e
110 changed files with 4860 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/CustomKeyboard.jks Normal file

Binary file not shown.

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

@ -0,0 +1,79 @@
import java.util.Date
import java.text.SimpleDateFormat
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
id("applovin-quality-service")
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
applovin {
apiKey = "gOk7rpCP2naSEBtPcs45qG898lZ0W4AGOK7NvppKss0DZsVbbRTUSTuv4EyztWXLOFVOFf767ZeE7z2zP5rFsD"
}
val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date())
android {
namespace = "com.sunny.app.soft.timberkeyboardnew"
compileSdk = 34
defaultConfig {
//com.sunny.tools.app.soft
applicationId = "com.sunny.tools.app.soft"
minSdk = 23
targetSdk = 34
versionCode = 2
versionName = "1.0.1"
setProperty("archivesBaseName", "Custom Keyboard_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_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
implementation("com.geyifeng.immersionbar:immersionbar:3.2.2")
implementation("com.geyifeng.immersionbar:immersionbar-ktx:3.2.2")
implementation ("com.google.code.gson:gson:2.10.1")
implementation ("com.github.bumptech.glide:glide:4.12.0")
annotationProcessor ("com.github.bumptech.glide:compiler:4.12.0")
implementation("com.applovin:applovin-sdk:12.5.0")
implementation("com.applovin.mediation:vungle-adapter:7.3.2.2")
implementation("com.applovin.mediation:bytedance-adapter:5.9.0.6.0")
implementation ("com.applovin.mediation:mintegral-adapter:16.7.51.0")
implementation("com.applovin.mediation:unityads-adapter:4.12.0.0")
implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
implementation("com.google.firebase:firebase-analytics-ktx")
implementation("com.google.firebase:firebase-crashlytics-ktx")
}

29
app/google-services.json Normal file
View File

@ -0,0 +1,29 @@
{
"project_info": {
"project_number": "361631722137",
"project_id": "custom-keyboardtheme-3768d",
"storage_bucket": "custom-keyboardtheme-3768d.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:361631722137:android:fb69ca1b27d2564b07a608",
"android_client_info": {
"package_name": "com.sunny.tools.app.soft"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAqGYvcuwa6SIijZVuJrvsfS221d5G2oJQ"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

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

@ -0,0 +1,23 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-keep class com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity { *; }
-keep class com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity { *; }

View File

@ -0,0 +1,24 @@
package com.sunny.app.soft.timberkeyboardnew
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.sunny.app.soft.timberkeyboardnew", appContext.packageName)
}
}

View File

@ -0,0 +1,48 @@
<?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=".App"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/logo"
android:supportsRtl="true"
android:theme="@style/Theme.TimberKeyboardNew"
tools:targetApi="31">
<activity
android:name=".ui.activity.LoadingActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activity.MainActivity" />
<activity android:name=".ui.activity.SetKeyboardActivity" />
<activity android:name=".ui.activity.SelectActivity" />
<activity android:name=".ui.activity.DownloadActivity" />
<service
android:name=".service.KeyboardService"
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/key_view" />
</service>
</application>
</manifest>

View File

@ -0,0 +1,95 @@
{
"ID": 24055,
"version": "3.3.4",
"name": "Abstract",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24055_89_44_1654593252.png",
"backgrounds": [{
"ID": 24057,
"version": "3.3.4",
"skinNumber": 1101,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24057_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24057_91_44_1698326473.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24058,
"version": "3.3.4",
"skinNumber": 1102,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24058_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24058_91_44_1654593252.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24059,
"version": "3.3.4",
"skinNumber": 1103,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24059_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24059_91_44_1698326473.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24060,
"version": "3.3.4",
"skinNumber": 1104,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24060_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24060_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1104",
"videoCount": 0
}, {
"ID": 24061,
"version": "3.3.4",
"skinNumber": 1105,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24061_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24061_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1105",
"videoCount": 0
}, {
"ID": 24062,
"version": "3.3.6",
"skinNumber": 1106,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24062_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24062_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1106",
"videoCount": 0
}, {
"ID": 24063,
"version": "3.3.4",
"skinNumber": 1107,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24063_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24063_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1107",
"videoCount": 0
}, {
"ID": 24064,
"version": "3.3.4",
"skinNumber": 1108,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24064_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24064_91_44_1654593252.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1108",
"videoCount": 0
}, {
"ID": 24065,
"version": "3.3.4",
"skinNumber": 1109,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24065_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24065_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1109",
"videoCount": 2
}, {
"ID": 24066,
"version": "3.3.4",
"skinNumber": 1110,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24066_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24066_91_44_1698326473.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1110",
"videoCount": 2
}, {
"ID": 24067,
"version": "3.3.4",
"skinNumber": 1111,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24067_90_44_1654593252.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24067_91_44_1698847414.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground1111",
"videoCount": 2
}]
}

View File

@ -0,0 +1,71 @@
{
"ID": 23847,
"version": "3.0",
"name": "Chinese New Year",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23847_89_44_1642593030.png",
"backgrounds": [{
"ID": 23848,
"version": "3.0",
"skinNumber": 9001,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23848_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23848_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23849,
"version": "3.0",
"skinNumber": 9002,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23849_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23849_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23850,
"version": "3.0",
"skinNumber": 9003,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23850_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23850_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23851,
"version": "3.0",
"skinNumber": 9004,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23851_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23851_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23852,
"version": "3.0",
"skinNumber": 9005,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23852_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23852_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23853,
"version": "3.0",
"skinNumber": 9006,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23853_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23853_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23854,
"version": "3.0",
"skinNumber": 9007,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23854_90_44_1642593030.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23854_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23856,
"version": "3.0",
"skinNumber": 9008,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23856_90_44_1642604696.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23856_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}]
}

View File

@ -0,0 +1,135 @@
{
"ID": 21854,
"version": "3.0",
"name": "Christmas",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21854_89_44_1638354842.png",
"backgrounds": [{
"ID": 23708,
"version": "3.3",
"skinNumber": 8001,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23708_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23708_91_44_1698849477.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23709,
"version": "3.3",
"skinNumber": 8002,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23709_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23709_91_44_1698849477.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23710,
"version": "3.3",
"skinNumber": 8003,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23710_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23710_91_44_1698849477.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23711,
"version": "3.3",
"skinNumber": 8004,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23711_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23711_91_44_1698849477.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 23712,
"version": "3.3",
"skinNumber": 8005,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23712_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23712_91_44_1698849477.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.1",
"videoCount": 0
}, {
"ID": 23713,
"version": "3.3",
"skinNumber": 8006,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23713_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23713_91_44_1698849477.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.2",
"videoCount": 0
}, {
"ID": 23714,
"version": "3.3",
"skinNumber": 8007,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23714_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23714_91_44_1698849477.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.3",
"videoCount": 0
}, {
"ID": 23715,
"version": "3.3",
"skinNumber": 8008,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_23715_90_44_1638354842.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_23715_91_44_1698849477.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.4",
"videoCount": 0
}, {
"ID": 21855,
"version": "3.0",
"skinNumber": 65,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21855_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21855_91_44_1698328754.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.5",
"videoCount": 0
}, {
"ID": 21856,
"version": "3.0",
"skinNumber": 66,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21856_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21856_91_44_1698328754.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.7",
"videoCount": 0
}, {
"ID": 21857,
"version": "3.0",
"skinNumber": 67,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21857_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21857_91_44_1698328754.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.8",
"videoCount": 0
}, {
"ID": 21858,
"version": "3.0",
"skinNumber": 68,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21858_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21858_91_44_1607879233.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.9",
"videoCount": 0
}, {
"ID": 21859,
"version": "3.0",
"skinNumber": 69,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21859_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21859_91_44_1698849995.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 21860,
"version": "3.0",
"skinNumber": 70,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21860_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21860_91_44_1607879233.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.10",
"videoCount": 0
}, {
"ID": 21861,
"version": "3.0",
"skinNumber": 71,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21861_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21861_91_44_1607881055.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.11",
"videoCount": 0
}, {
"ID": 21862,
"version": "3.0",
"skinNumber": 72,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21862_90_44_1607879233.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21862_91_44_1698849995.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground.21854.12",
"videoCount": 0
}]
}

View File

@ -0,0 +1,95 @@
{
"ID": 20456,
"version": "3.0",
"name": "Glitter",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20456_89_44_1577098648.png",
"backgrounds": [{
"ID": 20457,
"version": "3.0",
"skinNumber": 17,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20457_90_44_1577097049.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20457_91_44_1577097049.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20503,
"version": "3.0",
"skinNumber": 18,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20503_90_44_1577181185.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20503_91_44_1577181185.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20496,
"version": "3.0",
"skinNumber": 19,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20496_90_44_1577106813.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20496_91_44_1577106813.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20504,
"version": "3.0",
"skinNumber": 20,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20504_90_44_1577181209.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20504_91_44_1577181209.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground20",
"videoCount": 0
}, {
"ID": 20461,
"version": "3.0",
"skinNumber": 21,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20461_90_44_1577097239.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20461_91_44_1577097239.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground21",
"videoCount": 0
}, {
"ID": 20462,
"version": "3.0",
"skinNumber": 22,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20462_90_44_1577097347.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20462_91_44_1577097347.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground22",
"videoCount": 0
}, {
"ID": 20505,
"version": "3.0",
"skinNumber": 23,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20505_90_44_1577181309.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20505_91_44_1577181309.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground23",
"videoCount": 0
}, {
"ID": 20464,
"version": "3.0",
"skinNumber": 24,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20464_90_44_1577097441.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20464_91_44_1577097441.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground24",
"videoCount": 0
}, {
"ID": 22151,
"version": "3.3",
"skinNumber": 3001,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22151_90_44_1623938500.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22151_91_44_1698327307.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground3001",
"videoCount": 3
}, {
"ID": 22147,
"version": "3.3",
"skinNumber": 3002,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22147_90_44_1623929654.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22147_91_44_1624457460.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground3002",
"videoCount": 3
}, {
"ID": 22148,
"version": "3.3",
"skinNumber": 3003,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22148_90_44_1623931308.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22148_91_44_1698327307.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground3003",
"videoCount": 3
}]
}

View File

@ -0,0 +1,71 @@
{
"ID": 24187,
"version": "3.3.4",
"name": "Halloween",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24187_89_44_1666095894.png",
"backgrounds": [{
"ID": 24188,
"version": "3.3.4",
"skinNumber": 1123,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24188_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24188_91_44_1698848177.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24189,
"version": "3.3.4",
"skinNumber": 1124,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24189_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24189_91_44_1666095894.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24190,
"version": "3.3.4",
"skinNumber": 1125,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24190_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24190_91_44_1666095894.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24191,
"version": "3.3.4",
"skinNumber": 1126,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24191_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24191_91_44_1698848177.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24192,
"version": "3.3.4",
"skinNumber": 1127,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24192_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24192_91_44_1698848177.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24193,
"version": "3.3.4",
"skinNumber": 1128,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24193_90_44_1666095894.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24193_91_44_1698848177.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24194,
"version": "3.3.4",
"skinNumber": 1129,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24194_90_44_1666341686.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24194_91_44_1666780655.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 24195,
"version": "3.3.4",
"skinNumber": 1130,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_24195_90_44_1666780501.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_24195_91_44_1698848177.zip",
"inappString": "",
"videoCount": 0
}]
}

View File

@ -0,0 +1,95 @@
{
"ID": 21737,
"version": "3.2.1",
"name": "Pastel",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21737_89_44_1603799588.png",
"backgrounds": [{
"ID": 21738,
"version": "3.2.1",
"skinNumber": 57,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21738_90_44_1625666113.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21738_91_44_1698326102.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 21739,
"version": "3.2.1",
"skinNumber": 58,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21739_90_44_1625665750.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21739_91_44_1625664575.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 21740,
"version": "3.2.1",
"skinNumber": 59,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21740_90_44_1604052582.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21740_91_44_1625664628.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 21741,
"version": "3.2.1",
"skinNumber": 60,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21741_90_44_1604052649.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21741_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground60",
"videoCount": 0
}, {
"ID": 21742,
"version": "3.2.1",
"skinNumber": 61,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21742_90_44_1604576855.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21742_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground61",
"videoCount": 0
}, {
"ID": 21743,
"version": "3.2.1",
"skinNumber": 62,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21743_90_44_1604052836.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21743_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground62",
"videoCount": 0
}, {
"ID": 21744,
"version": "3.2.1",
"skinNumber": 63,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21744_90_44_1604052934.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21744_91_44_1625664848.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground63",
"videoCount": 0
}, {
"ID": 21745,
"version": "3.2.1",
"skinNumber": 64,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_21745_90_44_1604576826.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_21745_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground64",
"videoCount": 0
}, {
"ID": 22142,
"version": "3.3",
"skinNumber": 7001,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22142_90_44_1623758837.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22142_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground7001",
"videoCount": 3
}, {
"ID": 22141,
"version": "3.3",
"skinNumber": 7002,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22141_90_44_1623756868.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22141_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground7002",
"videoCount": 3
}, {
"ID": 22145,
"version": "3.3",
"skinNumber": 7003,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22145_90_44_1623764512.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22145_91_44_1698326102.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground7003",
"videoCount": 3
}]
}

View File

@ -0,0 +1,95 @@
{
"ID": 20447,
"version": "3.0",
"name": "Unicorn",
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20447_89_44_1577098636.png",
"backgrounds": [{
"ID": 20448,
"version": "3.0",
"skinNumber": 9,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20448_90_44_1577096586.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20448_91_44_1577096586.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20449,
"version": "3.0",
"skinNumber": 10,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20449_90_44_1577096612.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20449_91_44_1577096612.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20497,
"version": "3.0",
"skinNumber": 11,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20497_90_44_1577107523.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20497_91_44_1577107523.zip",
"inappString": "",
"videoCount": 0
}, {
"ID": 20451,
"version": "3.0",
"skinNumber": 12,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20451_90_44_1577096666.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20451_91_44_1577096666.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground12",
"videoCount": 0
}, {
"ID": 20452,
"version": "3.0",
"skinNumber": 13,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20452_90_44_1577096876.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20452_91_44_1577096876.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground13",
"videoCount": 0
}, {
"ID": 20453,
"version": "3.0",
"skinNumber": 14,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20453_90_44_1577096909.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20453_91_44_1577096909.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground14",
"videoCount": 0
}, {
"ID": 20502,
"version": "3.0",
"skinNumber": 15,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20502_90_44_1577181135.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20502_91_44_1577181135.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground15",
"videoCount": 0
}, {
"ID": 20455,
"version": "3.0",
"skinNumber": 16,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_20455_90_44_1577096966.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_20455_91_44_1577096966.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground16",
"videoCount": 0
}, {
"ID": 22159,
"version": "3.3",
"skinNumber": 2001,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22159_90_44_1624619080.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22159_91_44_1624619080.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground2001",
"videoCount": 3
}, {
"ID": 22160,
"version": "3.3",
"skinNumber": 2002,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22160_90_44_1624625621.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22160_91_44_1624625621.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground2002",
"videoCount": 3
}, {
"ID": 22152,
"version": "3.3",
"skinNumber": 2003,
"coverPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/pictures\/photo_22152_90_44_1624358800.png",
"contentPath": "https:\/\/milenica.info\/AppSetUp\/SetUp\/files\/file_22152_91_44_1698326756.zip",
"inappString": "milicapetrovic.emojikeyboard.colorkeyboard.UnlockBackground2003",
"videoCount": 3
}]
}

View File

@ -0,0 +1,44 @@
package com.sunny.app.soft.timberkeyboardnew
import android.app.Application
import android.content.Context
import android.content.Intent
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.facebook.FacebookSdk
class App : Application() {
companion object {
lateinit var appContext: Context
const val SDK =
"Gh30bAynDQKKuCplTJzpa0Up7GT11xtMxoe5SGqIJaNG2a8wTWTHNvHo_CJaHm416PdQDk5mVAtfMdT9OL_8zy"
const val AD_INIT = "on_action"
var initOK = false
}
override fun onCreate() {
super.onCreate()
appContext = this
initMAX()
}
private fun initMAX() {
val initConfig =
AppLovinSdkInitializationConfiguration.builder(SDK, this)
.setMediationProvider(AppLovinMediationProvider.MAX)
.build()
AppLovinSdk.getInstance(this).initialize(initConfig) {
initOK = true
LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(AD_INIT))
}
AppLovinSdk.getInstance(this).settings.setVerboseLogging(true)
AppLovinSdk.getInstance(this).showMediationDebugger();
}
}

View File

@ -0,0 +1,38 @@
package com.sunny.app.soft.timberkeyboardnew.data
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonObject
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
import java.io.InputStream
import java.io.InputStreamReader
class DataManager {
private fun parseJsonFile(jsonInputStream: InputStream): CategoryEntity {
val reader = InputStreamReader(jsonInputStream)
val jsonString = reader.readText()
val gson = Gson()
val json = gson.fromJson(jsonString, JsonObject::class.java)
val entity: CategoryEntity = gson.fromJson(json.toString(), CategoryEntity::class.java)
return entity
}
private fun getCategoryEntity(uil: String): CategoryEntity {
return parseJsonFile(App.appContext.assets.open(uil))
}
fun getModelList(): List<CategoryEntity> {
val modelList = mutableListOf<CategoryEntity>()
modelList.add(getCategoryEntity("Abstract.json"))
modelList.add(getCategoryEntity("Chinese.json"))
modelList.add(getCategoryEntity("Christmas.json"))
modelList.add(getCategoryEntity("Glitter.json"))
modelList.add(getCategoryEntity("Halloween.json"))
modelList.add(getCategoryEntity("Pastel.json"))
modelList.add(getCategoryEntity("Unicorn.json"))
return modelList
}
}

View File

@ -0,0 +1,13 @@
package com.sunny.app.soft.timberkeyboardnew.data.entity
import java.io.Serializable
data class BackgroundEntity(
val id: Int,
val version: String,
val skinNumber: Int,
val coverPath: String,
val contentPath: String,
val inappString: String,
val videoCount: Int
) : Serializable

View File

@ -0,0 +1,11 @@
package com.sunny.app.soft.timberkeyboardnew.data.entity
import java.io.Serializable
data class CategoryEntity(
val id: Int,
val version: String,
val name: String,
val coverPath: String,
val backgrounds: List<BackgroundEntity>
) : Serializable

View File

@ -0,0 +1,8 @@
package com.sunny.app.soft.timberkeyboardnew.max;
import com.applovin.mediation.MaxAd;
public interface MaxListener {
void onFail(MaxAd ad);
void onHidden( );
}

View File

@ -0,0 +1,91 @@
package com.sunny.app.soft.timberkeyboardnew.max;
import androidx.annotation.NonNull;
import com.applovin.mediation.MaxAd;
import com.applovin.mediation.MaxAdListener;
import com.applovin.mediation.MaxError;
import com.applovin.mediation.ads.MaxInterstitialAd;
import com.sunny.app.soft.timberkeyboardnew.App;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MaxManager {
private static final String one_AD = "28199ac21a0f949c";
private static final String two_Ad = "6c78e8d532d1fe28";
private static final String three_ad = "8f21ab262b435489";
private static List<MaxInterstitialAd> adList = new ArrayList<>();
public static MaxInterstitialAd getAd(List<MaxInterstitialAd> list) {
Collections.shuffle(list);
for (MaxInterstitialAd ad : list) {
if (ad.isReady()) {
return ad;
}
}
return null;
}
public static List<MaxInterstitialAd> onLoadAd() {
if (adList.isEmpty()) {
MaxInterstitialAd AdT = new MaxInterstitialAd(two_Ad, App.appContext);
MaxInterstitialAd AdOne = new MaxInterstitialAd(one_AD, App.appContext);
MaxInterstitialAd AdThree = new MaxInterstitialAd(three_ad, App.appContext);
adList.add(AdOne);
adList.add(AdT);
adList.add(AdThree);
}
for (MaxInterstitialAd ad : adList) {
if (!ad.isReady()) {
ad.loadAd();
}
}
return adList;
}
public static void setMyListener(MaxInterstitialAd ad, MaxListener maxListener) {
ad.setListener(new MaxAdListener() {
@Override
public void onAdLoaded(@NonNull MaxAd maxAd) {
}
@Override
public void onAdDisplayed(@NonNull MaxAd maxAd) {
}
@Override
public void onAdHidden(@NonNull MaxAd maxAd) {
maxListener.onHidden();
}
@Override
public void onAdClicked(@NonNull MaxAd maxAd) {
}
@Override
public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) {
}
@Override
public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) {
maxListener.onFail(maxAd);
}
});
}
}

View File

@ -0,0 +1,86 @@
package com.sunny.app.soft.timberkeyboardnew.max
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.CountDownTimer
import android.util.Log
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.applovin.mediation.MaxAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.sunny.app.soft.timberkeyboardnew.App
object WelComManager {
private lateinit var timer: CountDownTimer
private var need_Show = true
private lateinit var lists: List<MaxInterstitialAd>
fun initTimer(context: Context,countTime:Long,goMainAction: () -> Unit):CountDownTimer{
need_Show = true
timer = object : CountDownTimer(countTime, 100) {
override fun onTick(millisUntilFinished: Long) {
if (need_Show) {
startShowAd {
Log.d("----------","--onTick----------it=$it")
if(it){
goMainAction.invoke()
}
}
}
}
override fun onFinish() {
if (need_Show) {
startShowAd {
Log.d("----------","--onFinish----------it=$it")
goMainAction.invoke()
}
}
}
}
startAd(context)
return timer
}
private fun startAd(context: Context) {
if (!App.initOK) {
LocalBroadcastManager.getInstance(context).registerReceiver(object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
lists = MaxManager.onLoadAd()
timer.start()
Log.d("------------", "------------1sucess")
}
}, IntentFilter(App.AD_INIT))
} else {
lists = MaxManager.onLoadAd()
timer.start()
Log.d("------------", "------------2sucess")
}
}
private fun startShowAd(action: (go:Boolean) -> Unit) {
val checkCacheAd = MaxManager.getAd(lists)
if (checkCacheAd == null) {
action.invoke(false)
} else {
need_Show = false
MaxManager.setMyListener(checkCacheAd, object : MaxListener {
override fun onFail(ad: MaxAd?) {
action.invoke(true)
}
override fun onHidden() {
action.invoke(true)
}
})
checkCacheAd.showAd()
}
}
}

View File

@ -0,0 +1,189 @@
package com.sunny.app.soft.timberkeyboardnew.service
import android.inputmethodservice.InputMethodService
import android.inputmethodservice.Keyboard
import android.inputmethodservice.KeyboardView
import android.os.Build
import android.os.SystemClock
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.annotation.RequiresApi
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.ViewInputBinding
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListener {
private lateinit var binding: ViewInputBinding
private val views =
intArrayOf(R.xml.keyboard_letter, R.xml.keyboard_number, R.xml.keyboard_symbol)
private var mouble = false
private var laTime = -3L
private fun keyCase(toBig: Boolean, keyboard: Keyboard) {
for (key in keyboard.keys) {
if (!key.label.isNullOrEmpty()) {
if (key.label.length == 1) {
var strin: Char = if (toBig) {
key.label.toString()[0].uppercaseChar()
} else {
key.label.toString()[0].lowercaseChar()
}
key.run {
label = strin.toString()
codes[0] = strin.code
}
}
}
}
}
private fun changeXml(mode: Int) {
binding.myCustomInput.run {
when (mode) {
0 -> {
xmlMode = AppConstant.xml0
keyboard = Keyboard(context, views[0])
}
2 -> {
xmlMode = AppConstant.xml2
keyboard = Keyboard(context, views[2])
}
1 -> {
xmlMode = AppConstant.xml1
keyboard = Keyboard(context, views[1])
}
}
}
}
override fun onCreateInputView(): View {
binding = ViewInputBinding.inflate(layoutInflater, null, false)
binding.myCustomInput.setOnKeyboardActionListener(this)
binding.myCustomInput.run {
keyboard = Keyboard(this@KeyboardService, views[0])
isEnabled = true
}
return binding.root
}
override fun onWindowShown() {
super.onWindowShown()
binding.myCustomInput.upUi(this@KeyboardService)
}
override fun onPress(primaryCode: Int) {
mouble = false
if (primaryCode == Keyboard.KEYCODE_SHIFT) {
if (300 > SystemClock.elapsedRealtime() - laTime) {
mouble = true
}
laTime = SystemClock.elapsedRealtime()
}
}
override fun onRelease(primaryCode: Int) {
}
override fun onKey(primaryCode: Int, keyCodes: IntArray?) {
when (primaryCode) {
Keyboard.KEYCODE_SHIFT -> {
binding.myCustomInput.run {
val myKeyboard = keyboard
when (shiftStatus) {
AppConstant.Shift_S -> {
shiftStatus = if (mouble) {
AppConstant.Shift_B_lo
} else {
AppConstant.Shift_B
}
keyCase(true, myKeyboard)
keyboard = myKeyboard
}
AppConstant.Shift_B_lo -> {
shiftStatus = AppConstant.Shift_S
keyCase(false, myKeyboard)
keyboard = myKeyboard
}
AppConstant.Shift_B -> {
shiftStatus = if (mouble) {
AppConstant.Shift_B_lo
} else {
keyCase(false, myKeyboard)
AppConstant.Shift_S
}
keyboard = myKeyboard
}
}
}
}
// 点击完成
Keyboard.KEYCODE_DONE -> {
currentInputConnection.performEditorAction(EditorInfo.IME_ACTION_SEARCH)
}
Keyboard.KEYCODE_MODE_CHANGE -> {
binding.myCustomInput.run {
if (xmlMode == AppConstant.xml0) {
changeXml(1)
} else {
changeXml(0)
}
}
}
AppConstant.SHIFT_NUMBER -> {
changeXml(2)
}
Keyboard.KEYCODE_DELETE -> {
currentInputConnection.deleteSurroundingText(1, 0)
}
AppConstant.SHIFT_SYMBOL -> {
changeXml(1)
}
else -> {
currentInputConnection.commitText(primaryCode.toChar().toString(), 1)
binding.myCustomInput.keyboard = binding.myCustomInput.apply {
if (shiftStatus == AppConstant.Shift_B) {
shiftStatus = AppConstant.Shift_S
keyCase(false, binding.myCustomInput.keyboard)
}
}.keyboard
}
}
}
override fun onText(text: CharSequence?) {
}
override fun swipeLeft() {
}
override fun swipeRight() {
}
override fun swipeDown() {
}
override fun swipeUp() {
}
}

View File

@ -0,0 +1,51 @@
package com.sunny.app.soft.timberkeyboardnew.tools
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R
object AppConstant {
val KEY_EXTRA = "key_extra"
val res_path = "/res"
const val SHARE_NAME = "sp_name"
const val SHIFT_NUMBER = -300
const val SHIFT_SYMBOL = -301
const val KEY_CUR_Path = "all_path"
const val KEY_CUR_Path_img = "all_path_img"
const val xml0 = 24
const val xml1 = 25
const val xml2 = 26
const val Shift_B_lo = 2
const val Shift_S = 0
const val Shift_B = 1
val title_fun_Bg = "btn_keyboard_key_functional_normal.9.png"
val title_del_ic = "sym_keyboard_delete_normal.png"
val title_shitf_ic = "sym_keyboard_shift.png"
val title_func_bg_press = "btn_keyboard_key_functional_pressed.9.png"
val title_nor_Bg = "btn_keyboard_key_normal_normal.9.png"
val parent_path = "/drawable-xhdpi-v4/"
val xx_path = "/drawable-xxhdpi-v4/"
val color_path = "/colors.xml"
val title_shitf_ic_lock = "sym_keyboard_shift_locked.png"
val title_bg = "keyboard_background.jpg"
val title_nor_Bg_press = "btn_keyboard_key_normal_pressed.9.png"
val title_sp_Bg = "btn_keyboard_spacekey_normal_normal.9.png"
val title_sp_Bg_press = "btn_keyboard_spacekey_normal_pressed.9.png"
val title_color = "key_text_color_normal"
const val KEY_POS: String = "key_pos"
const val KEYTheme = "key_theme"
fun getDeleteRes(id: String) = String.format(App.appContext.getString(R.string.delete_res), id)
fun getFunBg(id: String) = String.format(App.appContext.getString(R.string.but_res), id)
fun getCapsenable(id: String) = String.format(App.appContext.getString(R.string.caps_res), id)
fun getCaps(id: String) = String.format(App.appContext.getString(R.string.caps_no_res), id)
fun getnormalBg(id: String) = String.format(App.appContext.getString(R.string.normal_res), id)
}

View File

@ -0,0 +1,26 @@
package com.sunny.app.soft.timberkeyboardnew.tools
import android.content.Context
import android.provider.Settings
import android.view.inputmethod.InputMethodManager
import com.sunny.app.soft.timberkeyboardnew.App
object KeyboardManager {
private val inputManager = App.appContext.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
fun isChoose(): Boolean {
return Settings.Secure.getString(App.appContext.contentResolver, Settings.Secure.DEFAULT_INPUT_METHOD)
.startsWith(App.appContext.packageName)
}
fun isEnable(): Boolean {
for (inputMethodInfo in inputManager.enabledInputMethodList) {
if (inputMethodInfo.id.startsWith(App.appContext.packageName)) {
return true
}
}
return false
}
}

View File

@ -0,0 +1,41 @@
package com.sunny.app.soft.timberkeyboardnew.tools
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.util.zip.ZipInputStream
object ZipTools {
fun unzip(zipFilePath: String?, destDirectory: String) {
val destDir = File(destDirectory)
if (!destDir.exists()) {
destDir.mkdir()
}
val zipIn = ZipInputStream(FileInputStream(zipFilePath))
var entry = zipIn.nextEntry
while (entry != null) {
val filePath = destDirectory + File.separator + entry.name
if (!entry.isDirectory) {
extractFile(zipIn, filePath)
} else {
val dir = File(filePath)
dir.mkdir()
}
zipIn.closeEntry()
entry = zipIn.nextEntry
}
zipIn.close()
}
private fun extractFile(zipIn: ZipInputStream, filePath: String) {
val bos = BufferedOutputStream(FileOutputStream(filePath))
val bytesIn = ByteArray(4096)
var read: Int
while ((zipIn.read(bytesIn).also { read = it }) != -1) {
bos.write(bytesIn, 0, read)
}
bos.close()
}
}

View File

@ -0,0 +1,26 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.gyf.immersionbar.ImmersionBar
abstract class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(setRootView())
initView()
}
abstract fun setRootView(): View
open fun initView() {
initStatusBar()
}
private fun initStatusBar() {
ImmersionBar.with(this).statusBarDarkFont(true).init()
}
}

View File

@ -0,0 +1,338 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.BitmapFactory
import android.graphics.drawable.BitmapDrawable
import android.util.Log
import android.view.View
import android.widget.Toast
import com.applovin.mediation.MaxAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityDownloadBinding
import com.sunny.app.soft.timberkeyboardnew.max.MaxListener
import com.sunny.app.soft.timberkeyboardnew.max.MaxManager
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.tools.KeyboardManager
import com.sunny.app.soft.timberkeyboardnew.tools.ZipTools
import com.sunny.app.soft.timberkeyboardnew.ui.listener.ApplyListener
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.InputStream
class DownloadActivity :
BaseActivity(),
View.OnClickListener,
ApplyListener {
private lateinit var binding: ActivityDownloadBinding
private lateinit var backgroundEntity: BackgroundEntity
private lateinit var zipPath: String
private lateinit var unzipPath: String
private lateinit var sp: SharedPreferences
private lateinit var ads:List<MaxInterstitialAd>
override fun setRootView(): View {
binding = ActivityDownloadBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
backgroundEntity = intent.getSerializableExtra(AppConstant.KEY_EXTRA) as BackgroundEntity
ads = MaxManager.onLoadAd()
sp = getSharedPreferences(
AppConstant.SHARE_NAME, Context.MODE_PRIVATE
)
val path = sp.getString("${AppConstant.KEY_CUR_Path_img}_${backgroundEntity.skinNumber}", "")
val file = File(path)
if (file.exists()) {
val bitmapDrawable =
BitmapDrawable(resources, BitmapFactory.decodeFile(path))
binding.downloadImg.setImageDrawable(bitmapDrawable)
Log.d("----------", "exists")
} else {
initImg()
}
//187df1496820a65c01b38bc74333cc1bae249226b337397125f7c6367023e86c.0
unzipPath = "$cacheDir/${backgroundEntity.skinNumber}/skin_${backgroundEntity.skinNumber}"
initDownload()
initButton()
initTitle()
}
private fun initTitle() {
binding.bgName.text = "Keyboard background"
}
private fun initDownload() {
val cacheDir = cacheDir
val dataUrl = backgroundEntity.contentPath
zipPath = "$cacheDir/$dataUrl"
}
private fun onShowAd() {
val checkCacheAd = MaxManager.getAd(ads)
if (checkCacheAd == null) {
} else {
MaxManager.setMyListener(checkCacheAd, object : MaxListener {
override fun onFail(ad: MaxAd) {
startSetSkin()
}
override fun onHidden() {
startSetSkin()
}
})
checkCacheAd.showAd()
}
}
private fun initButton() {
binding.downloadBack.setOnClickListener(this)
binding.btnDownload.setOnClickListener(this)
}
private fun initImg() {
try {
Glide
.with(this)
.downloadOnly()
.load(backgroundEntity.coverPath)
// .apply(
// RequestOptions().placeholder(R.drawable.png_loading)
// )
// .diskCacheStrategy(DiskCacheStrategy.ALL)
.addListener(object : RequestListener<File> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File>?,
isFirstResource: Boolean
): Boolean {
Log.d(
"----------",
"onLoadFailed backgroundEntity.coverPath=${backgroundEntity.coverPath} e=${e?.message} "
)
return false
}
override fun onResourceReady(
resource: File?,
model: Any?,
target: Target<File>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
resource?.let {
Log.d("----------", "it.absolutePath=${it.absolutePath}")
val edit = sp.edit()
// 存放键值对
edit.run {
putString(
"${AppConstant.KEY_CUR_Path_img}_${backgroundEntity.skinNumber}",
it.absolutePath
)
apply()
}
val bitmapDrawable =
BitmapDrawable(resources, BitmapFactory.decodeFile(it.absolutePath))
binding.downloadImg.setImageDrawable(bitmapDrawable)
}
return false
}
}).preload()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onClick(v: View?) {
when (v) {
binding.downloadBack -> finish()
binding.btnDownload -> {
applySkin()
}
}
}
private fun applySkin() {
if (!KeyboardManager.isChoose() || !KeyboardManager.isEnable()) {
Toast.makeText(this, getString(R.string.unEnable), Toast.LENGTH_SHORT).show()
val intent = Intent(this, SetKeyboardActivity::class.java)
startActivity(intent)
return
}
onShowAd()
}
private fun startSetSkin(){
binding.downloadProgress.visibility = View.VISIBLE
val zipFile = File(unzipPath)
if (zipFile.exists()) {
// val allThemePath: String = getAllThemePath(backgroundEntity.skinNumber.toString())
val edit = sp.edit()
edit.run {
putString(AppConstant.KEY_CUR_Path, backgroundEntity.skinNumber.toString())
apply()
}
binding.downloadProgress.visibility = View.GONE
Toast.makeText(this, getString(R.string.succ_apply), Toast.LENGTH_LONG).show()
finish()
} else {
getZipData(
backgroundEntity.skinNumber,
backgroundEntity.contentPath,
this@DownloadActivity,
this
)
}
}
private fun getAllThemePath(zip: String): String {
val result = sp.getString(zip, "")
return result!!
}
private fun getZipData(
skinNumber: Int,
contentPath: String,
context: Context,
listener: ApplyListener
) {
Glide.with(context).asFile().load(contentPath).addListener(object : RequestListener<File> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<File>?,
isFirstResource: Boolean
): Boolean {
listener.applyListener(false, "")
return false
}
override fun onResourceReady(
resource: File?,
model: Any?,
target: Target<File>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
val fileInputStream = FileInputStream(resource)
saveFile(skinNumber, contentPath, fileInputStream, listener)
return false
}
}).preload()
}
private fun saveFile(
skinNumber: Int,
contentPath: String,
fileInputStream: FileInputStream,
listener: ApplyListener
) {
val zipPath = "${cacheDir}/${skinNumber}_zip"
val unZipPath = "${cacheDir}/${skinNumber}"
val b = writeNewFile(fileInputStream, zipPath)
if (b) {
ZipTools.unzip(zipPath, unZipPath)
if (unZipPath.isNotEmpty()) {
listener.applyListener(true, unZipPath)
} else {
listener.applyListener(false, "")
}
}
}
private fun writeNewFile(input: InputStream, filePath: String): Boolean {
var stream: FileOutputStream? = null
var outStream: ByteArrayOutputStream? = null
try {
val outStream = ByteArrayOutputStream()
val bytes = ByteArray(4096)
var length = 0
while (input.read(bytes).also {
length = it
} != -1) {
outStream.write(bytes, 0, length)
}
val file = File(filePath)
if (!file.exists()) {
file.createNewFile()
}
stream = FileOutputStream(file)
stream.run {
write(outStream.toByteArray())
}
outStream.close()
stream.close()
return true
} catch (ex: Exception) {
outStream?.close()
stream?.close()
return false
}
}
override fun applyListener(isSuccess: Boolean, str: String) {
binding.downloadProgress.visibility = View.GONE
if (isSuccess) {
val lastIndexOf: Int = str.lastIndexOf(AppConstant.res_path)
val substring = str.subSequence(0, lastIndexOf + AppConstant.res_path.length).toString()
val edit = sp.edit()
edit.run {
putString(AppConstant.KEY_CUR_Path, backgroundEntity.skinNumber.toString())
apply()
}
edit.run {
putString(
backgroundEntity.skinNumber.toString(),
backgroundEntity.skinNumber.toString()
)
apply()
}
Toast.makeText(this, getString(R.string.succ_apply), Toast.LENGTH_LONG).show()
finish()
} else {
Toast.makeText(this, getString(R.string.fail_apply), Toast.LENGTH_LONG).show()
}
}
}

View File

@ -0,0 +1,56 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.CountDownTimer
import android.util.Log
import android.view.View
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.applovin.mediation.MaxAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityLoadingBinding
import com.sunny.app.soft.timberkeyboardnew.max.MaxListener
import com.sunny.app.soft.timberkeyboardnew.max.MaxManager
import com.sunny.app.soft.timberkeyboardnew.max.WelComManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class LoadingActivity : BaseActivity() {
private lateinit var binding: ActivityLoadingBinding
private val coroutineScope = CoroutineScope(Dispatchers.Main)
private val countTime: Long = 12000
private lateinit var lists: List<MaxInterstitialAd>
private lateinit var timer: CountDownTimer
override fun setRootView(): View {
binding = ActivityLoadingBinding.inflate(layoutInflater)
return binding.root
}
override fun onDestroy() {
super.onDestroy()
timer.cancel()
}
override fun initView() {
super.initView()
timer = WelComManager.initTimer(this,countTime) {
intoMainActivity()
}
}
private fun intoMainActivity() {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
}

View File

@ -0,0 +1,91 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.view.View
import android.view.ViewParent
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityMainBinding
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.MainViewPagerAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.fragment.HomeFragment
import com.sunny.app.soft.timberkeyboardnew.ui.fragment.SettingFragment
class MainActivity :
BaseActivity(),
View.OnClickListener,
ViewPager.OnPageChangeListener {
private lateinit var binding: ActivityMainBinding
private lateinit var fragmentList: MutableList<Fragment>
override fun setRootView(): View {
binding = ActivityMainBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
initViewPager()
initTabButton()
}
private fun initTabButton() {
binding.mainTabHome.setOnClickListener(this)
binding.mainTabSet.setOnClickListener(this)
}
private fun initViewPager() {
fragmentList = mutableListOf()
fragmentList.add(HomeFragment())
fragmentList.add(SettingFragment())
binding.mainViewpager.apply {
adapter = MainViewPagerAdapter(fragmentList, supportFragmentManager)
addOnPageChangeListener(this@MainActivity)
offscreenPageLimit = 0
setTabSelect(0)
}
}
private fun setTabSelect(i: Int) {
when (i) {
0 -> {
binding.mainTabHome.isSelected = true
binding.mainTabSet.isSelected = false
binding.mainTvHome.setTextColor(getColor(R.color.orange))
binding.mainTvSetting.setTextColor(getColor(R.color.black))
binding.mainViewpager.currentItem = 0
}
1 -> {
binding.mainTabHome.isSelected = false
binding.mainTabSet.isSelected = true
binding.mainTvHome.setTextColor(getColor(R.color.black))
binding.mainTvSetting.setTextColor(getColor(R.color.orange))
binding.mainViewpager.currentItem = 1
}
}
}
override fun onClick(v: View?) {
when (v) {
binding.mainTabHome -> {
setTabSelect(0)
}
binding.mainTabSet -> {
setTabSelect(1)
}
}
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
setTabSelect(position)
}
override fun onPageScrollStateChanged(state: Int) {
}
}

View File

@ -0,0 +1,61 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.content.Intent
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivitySelectBinding
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.SelectAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener
class SelectActivity : BaseActivity(), View.OnClickListener {
private lateinit var binding: ActivitySelectBinding
private lateinit var categoryEntity: CategoryEntity
override fun setRootView(): View {
binding = ActivitySelectBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
categoryEntity = intent.getSerializableExtra(AppConstant.KEY_EXTRA) as CategoryEntity
initButton()
initTitle()
initRecyclerView()
}
private fun initRecyclerView() {
binding.selectRecyclerView.apply {
layoutManager = GridLayoutManager(this@SelectActivity, 2)
adapter = SelectAdapter(context, categoryEntity.backgrounds, object : OnBgItemClickListener {
override fun onItemClick(position: Int, backgroundEntity: BackgroundEntity) {
val intent = Intent(this@SelectActivity, DownloadActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, backgroundEntity)
startActivity(intent)
Log.e("TAG", "onItemClick: $backgroundEntity")
}
})
}
}
private fun initTitle() {
binding.selectTitle.text = categoryEntity.name
}
private fun initButton() {
binding.selectBack.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v) {
binding.selectBack -> {
finish()
}
}
}
}

View File

@ -0,0 +1,106 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.app.AlertDialog
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.provider.Settings
import android.view.View
import android.view.inputmethod.InputMethodManager
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityEnableBinding
import com.sunny.app.soft.timberkeyboardnew.tools.KeyboardManager
class SetKeyboardActivity :
BaseActivity(),
View.OnClickListener {
private lateinit var binding: ActivityEnableBinding
private lateinit var inputManager: InputMethodManager
private lateinit var broadcastReceiver: BroadcastReceiver
override fun setRootView(): View {
binding = ActivityEnableBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
inputManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
broadcastReceiver = StepperReceiver()
updateUi()
register()
initButton()
}
private fun initButton() {
binding.setKeyboardBack.setOnClickListener(this)
binding.setKeyboardSteps1.setOnClickListener(this)
binding.setKeyboardSteps2.setOnClickListener(this)
}
private fun register() {
registerReceiver(broadcastReceiver, IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED))
}
inner class StepperReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
updateUi()
}
}
private fun updateUi() {
if (KeyboardManager.isEnable()) {
binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_grey)
} else {
binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_orange)
}
if (KeyboardManager.isChoose()) {
binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_grey)
} else {
binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_orange)
}
if (KeyboardManager.isChoose() && KeyboardManager.isEnable()) {
showInfoDialog()
}
}
private fun showInfoDialog() {
AlertDialog.Builder(this).apply {
title = "Settings"
setMessage("You have successfully activated the soft keyboard!")
setPositiveButton("OK") { _, _ -> finish() }
}.create().show()
}
override fun onResume() {
super.onResume()
updateUi()
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(broadcastReceiver)
}
override fun onClick(v: View?) {
when (v) {
binding.setKeyboardBack -> finish()
binding.setKeyboardSteps1 -> chooseKeyboard()
binding.setKeyboardSteps2 -> settingKeyboard()
}
}
private fun settingKeyboard() {
inputManager.showInputMethodPicker()
}
private fun chooseKeyboard() {
val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
startActivity(intent)
}
}

View File

@ -0,0 +1,111 @@
package com.sunny.app.soft.timberkeyboardnew.ui.adapter
import android.content.Context
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnItemClickListener
class HomeViewAdapter(
private val context: Context,
private val modelList: List<CategoryEntity>,
private val listener: OnItemClickListener
) : RecyclerView.Adapter<HomeViewAdapter.ItemViewHolder>() {
inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val titleView: TextView = itemView.findViewById(R.id.item_title)
val imgItemView: ImageView = itemView.findViewById(R.id.item_img)
val rootItemLayout: CardView = itemView.findViewById<CardView>(R.id.item_root)
val pd: ProgressBar = itemView.findViewById<ProgressBar>(R.id.pb)
fun loadImg(context: Context, url: String, img: ImageView) {
try {
Glide
.with(context)
.load(url)
.thumbnail(0.5f)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
pd.visibility = View.INVISIBLE
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
pd.visibility = View.INVISIBLE
return false
}
})
// .apply(
// RequestOptions().placeholder(R.drawable.png_loading)
// )
.transition(DrawableTransitionOptions.withCrossFade())
.into(img)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.item_classification, parent, false)
return ItemViewHolder(view)
}
override fun getItemCount(): Int {
return modelList.size
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val category = modelList[position]
holder.loadImg(context, category.coverPath, holder.imgItemView)
holder.rootItemLayout.setOnClickListener {
listener.onItemClick(position, category)
}
holder.titleView.text = category.name
}
}

View File

@ -0,0 +1,20 @@
package com.sunny.app.soft.timberkeyboardnew.ui.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
class MainViewPagerAdapter(
private val fragmentList: List<Fragment>,
fragmentManager: FragmentManager
) :
FragmentPagerAdapter(fragmentManager) {
override fun getCount(): Int {
return fragmentList.size
}
override fun getItem(position: Int): Fragment {
return fragmentList[position]
}
}

View File

@ -0,0 +1,98 @@
package com.sunny.app.soft.timberkeyboardnew.ui.adapter
import android.content.Context
import android.graphics.drawable.Drawable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ProgressBar
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.Target
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener
class SelectAdapter(
private val context: Context,
private val backgroundEntityList: List<BackgroundEntity>,
private val listener: OnBgItemClickListener
) : RecyclerView.Adapter<SelectAdapter.ViewHolder>() {
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val imgItemView: ImageView = itemView.findViewById(R.id.item_img)
val rootItemLayout: CardView = itemView.findViewById<CardView>(R.id.item_root)
val pd: ProgressBar = itemView.findViewById<ProgressBar>(R.id.select_pd)
fun loadImg(context: Context, url: String, imgView: ImageView) {
pd.visibility = View.VISIBLE
try {
Glide
.with(context)
.load(url)
.thumbnail(0.1f)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
pd.visibility = View.GONE
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
pd.visibility = View.GONE
return false
}
})
// .apply(
// RequestOptions().placeholder(R.drawable.png_loading)
// )
.transition(DrawableTransitionOptions.withCrossFade())
.into(imgView)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.item_background, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int {
return backgroundEntityList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val backgroundEntity = backgroundEntityList[position]
holder.rootItemLayout.setOnClickListener {
listener.onItemClick(position, backgroundEntity)
}
holder.loadImg(context, backgroundEntity.coverPath, holder.imgItemView)
}
}

View File

@ -0,0 +1,24 @@
package com.sunny.app.soft.timberkeyboardnew.ui.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
abstract class BaseFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return setRootView()
}
abstract fun setRootView(): View
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
}
open fun initView() {
}
}

View File

@ -0,0 +1,85 @@
package com.sunny.app.soft.timberkeyboardnew.ui.fragment
import android.content.Intent
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager
import com.applovin.mediation.MaxAd
import com.applovin.mediation.ads.MaxInterstitialAd
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.data.DataManager
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentHomeBinding
import com.sunny.app.soft.timberkeyboardnew.max.MaxListener
import com.sunny.app.soft.timberkeyboardnew.max.MaxManager
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.ui.activity.SelectActivity
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.HomeViewAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnItemClickListener
class HomeFragment :
BaseFragment() {
private lateinit var binding: FragmentHomeBinding
private lateinit var ads:List<MaxInterstitialAd>
private lateinit var data:CategoryEntity
override fun setRootView(): View {
binding = FragmentHomeBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
ads = MaxManager.onLoadAd()
initTitle()
initViewPager()
}
private fun initViewPager() {
val categoryEntityList = DataManager().getModelList()
binding.homeRecyclerView.apply {
layoutManager = LinearLayoutManager(requireContext()).apply {
orientation = LinearLayoutManager.VERTICAL
}
adapter = HomeViewAdapter(requireContext(), categoryEntityList, object : OnItemClickListener {
override fun onItemClick(position: Int, categoryEntity: CategoryEntity) {
data = categoryEntity
onShowAd()
}
})
}
}
private fun enterList(){
val intent = Intent(requireContext(), SelectActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, data)
startActivity(intent)
}
fun onShowAd() {
val checkCacheAd = MaxManager.getAd(ads)
if (checkCacheAd == null) {
} else {
MaxManager.setMyListener(checkCacheAd, object : MaxListener {
override fun onFail(ad: MaxAd) {
enterList()
}
override fun onHidden() {
enterList()
}
})
checkCacheAd.showAd()
}
}
private fun initTitle() {
binding.homeTitle.text = App.appContext.getString(R.string.app_name)
}
}

View File

@ -0,0 +1,52 @@
package com.sunny.app.soft.timberkeyboardnew.ui.fragment
import android.content.Intent
import android.net.Uri
import android.view.View
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentSettingBinding
import com.sunny.app.soft.timberkeyboardnew.ui.activity.SetKeyboardActivity
class SettingFragment : BaseFragment(), View.OnClickListener {
private lateinit var binding: FragmentSettingBinding
override fun setRootView(): View {
binding = FragmentSettingBinding.inflate(layoutInflater)
return binding.root
}
override fun initView() {
super.initView()
binding.settingLayoutRating.setOnClickListener(this)
binding.settingLayoutShare.setOnClickListener(this)
binding.settingLayoutSetKeyboard.setOnClickListener(this)
}
override fun onClick(v: View?) {
when (v) {
binding.settingLayoutRating -> {
val url = getString(R.string.link) + App.appContext.packageName
val intent = Intent(Intent.ACTION_VIEW)
intent.setData(Uri.parse(url))
startActivity(intent)
}
binding.settingLayoutShare -> {
val url = getString(R.string.link) + App.appContext.packageName
val intent = Intent(Intent.ACTION_SEND)
intent.setType("text/plain")
intent.putExtra(Intent.EXTRA_TEXT, url)
startActivity(intent)
}
binding.settingLayoutSetKeyboard -> {
val intent = Intent(
requireContext(),
SetKeyboardActivity::class.java
)
startActivity(intent)
}
}
}
}

View File

@ -0,0 +1,5 @@
package com.sunny.app.soft.timberkeyboardnew.ui.listener
interface ApplyListener {
fun applyListener(isSuccess: Boolean, str: String)
}

View File

@ -0,0 +1,8 @@
package com.sunny.app.soft.timberkeyboardnew.ui.listener
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
interface OnBgItemClickListener {
fun onItemClick(position: Int, backgroundEntity: BackgroundEntity)
}

View File

@ -0,0 +1,8 @@
package com.sunny.app.soft.timberkeyboardnew.ui.listener
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
interface OnItemClickListener {
fun onItemClick(position: Int, categoryEntity: CategoryEntity)
}

View File

@ -0,0 +1,322 @@
package com.sunny.app.soft.timberkeyboardnew.ui.view
import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Rect
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.graphics.drawable.StateListDrawable
import android.inputmethodservice.Keyboard
import android.inputmethodservice.KeyboardView
import android.os.Build
import android.util.AttributeSet
import android.util.Xml
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import org.xmlpull.v1.XmlPullParser
import java.io.File
import java.io.StringReader
@Suppress("DEPRECATION")
class MyKeyboardView @JvmOverloads constructor(
var myContext: Context,
attributeSet: AttributeSet? = null,
style: Int = 0
) : KeyboardView(myContext, attributeSet, style) {
inner class MyConfig {
lateinit var functionBackgroundDraw: Drawable
lateinit var spBackgroundDraw: Drawable
lateinit var normalBackgroundDraw: Drawable
var icShittLock: Drawable? =
ContextCompat.getDrawable(context, R.drawable.svg_shift)
var icDel: Drawable? =
ContextCompat.getDrawable(context, R.drawable.svg_delete)
var allBg: Drawable? =
ContextCompat.getDrawable(context, R.mipmap.main_bg)
var icBshift: Drawable? =
ContextCompat.getDrawable(context, R.drawable.svg_shift)
var icSshift: Drawable? =
ContextCompat.getDrawable(context, R.drawable.svg_shift)
var keycolor: Int = context.resources.getColor(R.color.white33, null)
private val sp: SharedPreferences = context.getSharedPreferences(
AppConstant.SHARE_NAME,
Context.MODE_PRIVATE
)
private fun getbgic(con: Context, filePath: String): Drawable? {
if (!File(filePath).exists()) {
return null
}
return BitmapDrawable(con.resources, BitmapFactory.decodeFile(filePath))
}
private fun getStatus(draw: Drawable, drawPress: Drawable): StateListDrawable {
return StateListDrawable().apply {
addState(intArrayOf(android.R.attr.state_pressed), drawPress)
addState(intArrayOf(), draw)
}
}
private fun gettextcolor(colorXmlPath: String) {
val file = File(colorXmlPath)
if (!file.exists()) return
val xmlP = Xml.newPullParser()
xmlP.setInput(StringReader(file.readText()))
xmlP.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
var eventT = xmlP.eventType
while (eventT != XmlPullParser.END_DOCUMENT) {
if (eventT == XmlPullParser.START_TAG && (xmlP.name == "color" || xmlP.name == "item")) {
val value = xmlP.getAttributeValue(null, "name")
if (value != null && value == AppConstant.title_color) {
keycolor = Color.parseColor(xmlP.nextText())
}
}
eventT = xmlP.next()
}
}
init {
val default =
ContextCompat.getDrawable(context, R.drawable.png_keybg)
val press = ContextCompat.getDrawable(
context,
R.drawable.png_keybg_press
)
if (press != null) {
if (default != null) {
val listDrawable = getStatus(default, press)
functionBackgroundDraw = listDrawable
normalBackgroundDraw = listDrawable
spBackgroundDraw = listDrawable
}
}
}
fun updateConfig(con: Context) {
sp.getString(AppConstant.KEY_CUR_Path, "")?.let { Entity_ID ->
val unzipPath = "${con.cacheDir}/${Entity_ID}/skin_${Entity_ID}/"
getbgic(
con,
unzipPath.plus(AppConstant.getnormalBg(Entity_ID))
)?.let { drawBG ->
getbgic(
con,
unzipPath.plus(AppConstant.getnormalBg(Entity_ID))
)?.let { drawPressBG ->
normalBackgroundDraw = getStatus(drawBG, drawPressBG)
}
}
gettextcolor(Entity_ID.plus(AppConstant.color_path))
getbgic(con, unzipPath.plus(AppConstant.getnormalBg(Entity_ID)))?.let { drawBG ->
getbgic(
con,
unzipPath.plus(AppConstant.getnormalBg(Entity_ID))
)?.let { drawPressBG ->
spBackgroundDraw = getStatus(drawBG, drawPressBG)
}
}
getbgic(con, sp.getString("${AppConstant.KEY_CUR_Path_img}_${Entity_ID}", "")!!)?.run {
allBg = this
}
// ok
getbgic(
con,
unzipPath.plus(AppConstant.getFunBg(Entity_ID))
)?.let { drawBG ->
getbgic(
con,
unzipPath.plus(AppConstant.getFunBg(Entity_ID))
)?.let { drawPressBG ->
functionBackgroundDraw = getStatus(drawBG, drawPressBG)
}
}
// ok
getbgic(con, unzipPath.plus(AppConstant.getCaps(Entity_ID)))?.let {
icSshift = it
icBshift = it
}
getbgic(
con,
unzipPath.plus(AppConstant.getDeleteRes(Entity_ID))
)?.let { drawBG ->
icDel = getStatus(drawBG, drawBG)
}
getbgic(con, unzipPath.plus(AppConstant.getCapsenable(Entity_ID)))?.let {
icShittLock = it
}
}
}
}
var config = MyConfig()
var shiftStatus = AppConstant.Shift_S
var xmlMode = AppConstant.xml0
private var myPaint: Paint = Paint().apply {
isAntiAlias = true
textAlign = Paint.Align.CENTER
textSize = myContext.resources.displayMetrics.scaledDensity * 16f
color = config.keycolor
}
@SuppressLint("SuspiciousIndentation")
private fun andDraw(
myKey: Keyboard.Key,
keyBG: Drawable,
icon: Drawable?,
canvas: Canvas,
) {
myKey.run {
keyBG.run {
bounds = Rect(
x.plus(paddingLeft),
y.plus(paddingTop),
width.plus(x.plus(paddingLeft)),
height.plus(y.plus(paddingTop))
)
state = currentDrawableState
draw(canvas)
}
}
myKey.run {
icon?.apply {
myKey.icon = this
var icon_w = myKey.icon.intrinsicWidth.toFloat()
val icon_wr = icon_w / myKey.width.toFloat()
var icon_h = myKey.icon.intrinsicHeight.toFloat()
val icon_hr = icon_h / myKey.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
myKey.icon.let {
it.bounds = Rect().apply {
top =
(myKey.y + paddingTop + (myKey.height - icon_h) / 2f).toInt()
left =
(myKey.x + paddingLeft + (myKey.width - icon_w) / 2f).toInt()
bottom = (top + icon_h).toInt()
right = (left + icon_w).toInt()
}
it.draw(canvas)
}
}
myPaint.color = config.keycolor
if (!label.isNullOrEmpty()) {
val y1 = y.plus(paddingRight).plus((height.div(2f)))
.plus((myPaint.textSize.minus(myPaint.descent())).div(2f))
val x1 = x.plus(paddingLeft).plus((width.div(2f)))
canvas.drawText(label.toString(), x1, y1, myPaint)
}
}
}
private fun getCurIc(): Drawable? {
return when (shiftStatus) {
AppConstant.Shift_B_lo -> config.icShittLock
AppConstant.Shift_B -> config.icBshift
AppConstant.Shift_S -> config.icSshift
else -> config.icSshift
}
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
keyboard.keys.forEach {
when (it.codes[0]) {
Keyboard.KEYCODE_SHIFT -> {
andDraw(
it,
config.functionBackgroundDraw,
getCurIc(),
canvas
)
}
AppConstant.SHIFT_NUMBER, AppConstant.SHIFT_SYMBOL -> {
andDraw(it, config.functionBackgroundDraw, null, canvas)
}
Keyboard.KEYCODE_DELETE -> {
andDraw(
it,
config.functionBackgroundDraw,
config.icDel,
canvas
)
}
Keyboard.KEYCODE_MODE_CHANGE, Keyboard.KEYCODE_DONE -> {
andDraw(
it,
config.functionBackgroundDraw,
null,
canvas
)
}
else -> {
andDraw(it, config.normalBackgroundDraw, null, canvas)
}
}
}
}
fun upUi(con: Context) {
config.updateConfig(con)
background = config.allBg
invalidate()
}
}

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,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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

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

View File

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

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" />
<corners android:radius="20dp" />
</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">
<solid android:color="#7E7E7E"/>
<corners android:radius="24dp"/>
</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">
<solid android:color="@color/orange" />
<corners android:radius="24dp" />
</shape>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item android:state_pressed="false">
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
<corners android:radius="5dp"/>
</shape>
</item>
</selector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M232.7,0h558.5a232.7,232.7 0,0 1,232.7 232.7v558.5a232.7,232.7 0,0 1,-232.7 232.7L232.7,1024a232.7,232.7 0,0 1,-232.7 -232.7L0,232.7a232.7,232.7 0,0 1,232.7 -232.7zM670.9,711.8L471.1,512l199.8,-199.8L605.1,246.4 339.5,512 605.1,777.6l65.8,-65.8z"
android:fillColor="#2c2c2c"/>
</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: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,9 @@
<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="M999,153a82.8,82.8 0,0 0,-59.4 -25L937.9,128h0.1,-640a81.7,81.7 0,0 0,-67.8 37.7l-0.2,0.3L0,512l230,346A81.8,81.8 0,0 0,298 896h641.7c23.3,0 44.3,-9.6 59.4,-25a82.9,82.9 0,0 0,25 -59.5v-1.6,0.1L1024,214 1024,212.5c0,-23.3 -9.6,-44.4 -25,-59.4zM780.3,695.8a42.3,42.3 0,0 1,-60.2 0l-122,-123.7 -124,124a42.6,42.6 0,0 1,-60 0c-7.7,-7.7 -12.4,-18.3 -12.4,-30s4.7,-22.3 12.4,-30l124,-124 -124,-124a42.3,42.3 0,0 1,0 -60,42.6 42.6,0 0,1 60,0l124,124 122,-123.7a42.2,42.2 0,0 1,60.2 0,42.2 42.2,0 0,1 0.2,59.7l-122.4,124 122.4,124a42.2,42.2 0,0 1,-0.2 59.7z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M160,448a31.1,31.1 0,0 1,-23 -9,31.1 31.1,0 0,1 -9,-23v-256a31.1,31.1 0,0 1,9 -23,31.1 31.1,0 0,1 23,-9h256a31.1,31.1 0,0 1,23 9c6,6 9,13.7 9,23v256a31.1,31.1 0,0 1,-9 23,31.1 31.1,0 0,1 -23,9h-256zM608,448a31.1,31.1 0,0 1,-23 -9,31.1 31.1,0 0,1 -9,-23v-256a31.1,31.1 0,0 1,9 -23,31.1 31.1,0 0,1 23,-9h256a31.1,31.1 0,0 1,23 9c6,6 9,13.7 9,23v256a31.1,31.1 0,0 1,-9 23,31.1 31.1,0 0,1 -23,9h-256zM160,896a31.1,31.1 0,0 1,-23 -9,31.1 31.1,0 0,1 -9,-23v-256a31.1,31.1 0,0 1,9 -23,31.1 31.1,0 0,1 23,-9h256a31.1,31.1 0,0 1,23 9c6,6 9,13.7 9,23v256a31.1,31.1 0,0 1,-9 23,31.1 31.1,0 0,1 -23,9h-256zM608,896a31.1,31.1 0,0 1,-23 -9,31.1 31.1,0 0,1 -9,-23v-256a31.1,31.1 0,0 1,9 -23,31.1 31.1,0 0,1 23,-9h256a31.1,31.1 0,0 1,23 9c6,6 9,13.7 9,23v256a31.1,31.1 0,0 1,-9 23,31.1 31.1,0 0,1 -23,9h-256z"
android:fillColor="#2c2c2c"
android:fillAlpha="0.96"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M844.8,883.2l-256,0c-19.2,0 -38.4,-19.2 -38.4,-38.4l0,-256c0,-19.2 19.2,-38.4 38.4,-38.4l256,0c19.2,0 38.4,19.2 38.4,38.4l0,256C883.2,864 864,883.2 844.8,883.2zM844.8,480l-256,0c-19.2,0 -38.4,-19.2 -38.4,-38.4l0,-256c0,-19.2 19.2,-38.4 38.4,-38.4l256,0c19.2,0 38.4,19.2 38.4,38.4l0,256C883.2,460.8 864,480 844.8,480zM435.2,883.2l-256,0c-19.2,0 -38.4,-19.2 -38.4,-38.4l0,-256c0,-19.2 19.2,-38.4 38.4,-38.4l256,0c19.2,0 38.4,19.2 38.4,38.4l0,256C480,864 460.8,883.2 435.2,883.2zM435.2,480l-256,0c-19.2,0 -38.4,-19.2 -38.4,-38.4l0,-256c0,-19.2 19.2,-38.4 38.4,-38.4l256,0c19.2,0 38.4,19.2 38.4,38.4l0,256C480,460.8 460.8,480 435.2,480z"
android:fillColor="#FF7530"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M465.6,81.9a51.8,51.8 0,0 1,92.8 0l120.3,243.8 268.8,39a51.8,51.8 0,0 1,28.8 88.3l-194.6,189.8 46.1,267.8a51.8,51.8 0,0 1,-75.2 54.7l-240.6,-128 -240.6,128a51.8,51.8 0,0 1,-75.2 -54.7l46.1,-267.8 -194.6,-189.8a51.8,51.8 0,0 1,28.8 -88.3l268.8,-39z"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M1014.7,411.1c-1.9,-10 -9.1,-18 -18.4,-20.3 -52.6,-12.4 -97.9,-47.8 -125,-97.6 -27.1,-49 -33.3,-108.1 -17.1,-162.4 2.8,-9.8 -0.2,-20.4 -7.5,-26.9 -48.3,-44.6 -103.8,-79.2 -163.9,-102 -9.1,-3.4 -19.3,-0.9 -26,6.6C619.4,51.5 566.8,75.5 512,74.8c-53.7,0.3 -105.1,-23.1 -142.1,-64.7C363.1,0.8 351.4,-2.5 341.2,2 281.1,24.9 225.5,59.8 177.3,104.7c-7.3,6.5 -10.3,17.1 -7.5,26.9 16,54 9.8,112.8 -17.1,161.6 -27.1,49.8 -72.5,85.2 -125.1,97.6 -9.4,2.2 -16.7,10.2 -18.4,20.3a556.3,556.3 0,0 0,0 201.7c1.8,10.1 9,18.2 18.4,20.3 52.4,12.2 97.8,47.3 125,96.8 27.1,49.1 33.3,108.1 17.1,162.4 -2.8,9.8 0.2,20.4 7.5,26.9 48.3,44.6 103.8,79.2 163.9,102h8.2c6.7,0 13.1,-2.9 17.8,-8 74.8,-84.2 199.1,-87.6 277.8,-7.6 2.4,2.5 4.8,5 7.1,7.6 7,10.2 20,13.7 30.7,8 61,-22.2 117.6,-56.6 166.7,-101.2 7.3,-6.5 10.3,-17.2 7.5,-26.9 -17.3,-54.1 -12,-113.4 14.3,-163.1 27.2,-49.5 72.5,-84.6 125,-96.8 9.4,-2.2 16.7,-10.2 18.4,-20.3a553.3,553.3 0,0 0,-0 -201.7zM512,716c-112.9,0.3 -204.7,-91 -204.9,-204 0,-112.6 91.8,-204 204.9,-204h0.1a205.4,205.4 0,0 1,144.9 59.7,203.6 203.6,0 0,1 60,144.3c-0,112.6 -91.7,204 -205,204z"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M1014.7,411.1c-1.9,-10 -9.1,-18 -18.4,-20.3 -52.6,-12.4 -97.9,-47.8 -125,-97.6 -27.1,-49 -33.3,-108.1 -17.1,-162.4 2.8,-9.8 -0.2,-20.4 -7.5,-26.9 -48.3,-44.6 -103.8,-79.2 -163.9,-102 -9.1,-3.4 -19.3,-0.9 -26,6.6C619.4,51.5 566.8,75.5 512,74.8c-53.7,0.3 -105.1,-23.1 -142.1,-64.7C363.1,0.8 351.4,-2.5 341.2,2 281.1,24.9 225.5,59.8 177.3,104.7c-7.3,6.5 -10.3,17.1 -7.5,26.9 16,54 9.8,112.8 -17.1,161.6 -27.1,49.8 -72.5,85.2 -125.1,97.6 -9.4,2.2 -16.7,10.2 -18.4,20.3a556.3,556.3 0,0 0,0 201.7c1.8,10.1 9,18.2 18.4,20.3 52.4,12.2 97.8,47.3 125,96.8 27.1,49.1 33.3,108.1 17.1,162.4 -2.8,9.8 0.2,20.4 7.5,26.9 48.3,44.6 103.8,79.2 163.9,102h8.2c6.7,0 13.1,-2.9 17.8,-8 74.8,-84.2 199.1,-87.6 277.8,-7.6 2.4,2.5 4.8,5 7.1,7.6 7,10.2 20,13.7 30.7,8 61,-22.2 117.6,-56.6 166.7,-101.2 7.3,-6.5 10.3,-17.2 7.5,-26.9 -17.3,-54.1 -12,-113.4 14.3,-163.1 27.2,-49.5 72.5,-84.6 125,-96.8 9.4,-2.2 16.7,-10.2 18.4,-20.3a553.3,553.3 0,0 0,-0 -201.7zM512,716c-112.9,0.3 -204.7,-91 -204.9,-204 0,-112.6 91.8,-204 204.9,-204h0.1a205.4,205.4 0,0 1,144.9 59.7,203.6 203.6,0 0,1 60,144.3c-0,112.6 -91.7,204 -205,204z"
android:fillColor="#FF7530"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M778.6,653.7c-43.7,0 -82.5,20.9 -107.1,53.2l-283,-168.5c3.2,-12.4 5.1,-25.3 5.1,-38.7 0,-3.9 -0.3,-7.7 -0.6,-11.5l283.2,-170.6c24.7,28.9 61.4,47.3 102.5,47.3 74.4,0 134.8,-60.3 134.8,-134.8 0,-74.4 -60.3,-134.8 -134.8,-134.8 -74.4,0 -134.8,60.3 -134.8,134.8 0,14.8 2.4,28.9 6.8,42.2L369.9,418c-27.3,-43.4 -75.4,-72.3 -130.4,-72.3 -85.1,0 -154,69 -154,154s69,154 154,154c45.6,0 86.4,-19.9 114.6,-51.4L648.3,754.5c-2.8,10.9 -4.5,22.2 -4.5,34 0,74.4 60.3,134.8 134.8,134.8 74.4,0 134.8,-60.3 134.8,-134.8C913.4,714.1 853,653.7 778.6,653.7L778.6,653.7 778.6,653.7zM778.6,653.7"
android:fillColor="#2c2c2c"/>
</vector>

View File

@ -0,0 +1,9 @@
<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="M693.3,874.7a32,32 0,0 1,4.4 63.7L693.3,938.7h-362.7a32,32 0,0 1,-4.4 -63.7l4.4,-0.3h362.7zM469.6,101.2a74.7,74.7 0,0 1,95.1 8.7l4.6,5 335.6,402.7a74.7,74.7 0,0 1,-51.2 122.2l-6.1,0.3h-122.3v96a74.7,74.7 0,0 1,-62.2 73.6l-6.3,0.8 -6.1,0.3h-277.3a74.7,74.7 0,0 1,-74.4 -68.6L298.7,736 298.6,640L176.4,640a74.7,74.7 0,0 1,-35.5 -9l-6.4,-3.8 -6,-4.5a74.7,74.7 0,0 1,-13.7 -99.7l4.1,-5.4 335.6,-402.7 4.6,-5 5,-4.6 5.4,-4.1zM520.2,155.8a10.7,10.7 0,0 0,-12.6 -2.9l-2.4,1.5 -1.4,1.4 -335.6,402.7a10.7,10.7 0,0 0,5.7 17.2l2.5,0.3L330.7,576a32,32 0,0 1,31.7 27.6l0.3,4.4v128a10.7,10.7 0,0 0,8.2 10.4l2.5,0.3h277.3a10.7,10.7 0,0 0,10.4 -8.2l0.3,-2.4v-128a32,32 0,0 1,27.6 -31.7l4.4,-0.3h154.2a10.7,10.7 0,0 0,9.5 -15.4l-1.3,-2 -335.6,-402.7z"
android:fillColor="#ffffff"/>
</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,121 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/orange_light"
android:orientation="vertical"
tools:context=".ui.activity.SelectActivity">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:id="@+id/download_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:background="@color/white"
android:padding="8dp"
android:src="@drawable/svg_back" />
<TextView
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@color/white"
android:gravity="center"
android:text="@string/download_title"
android:textColor="@color/black"
android:textSize="18sp" />
<View
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@color/white" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/download_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="16dp"
android:backgroundTint="@color/white"
app:cardCornerRadius="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
app:cardCornerRadius="20dp">
<ImageView
android:id="@+id/download_img"
android:layout_width="match_parent"
android:layout_height="240dp"
android:scaleType="centerCrop"
android:src="@drawable/png_item" />
<FrameLayout
android:id="@+id/download_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"
android:visibility="invisible">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminateTint="@color/orange" />
</FrameLayout>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/bg_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/orange"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/btn_download"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginStart="70dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white"
android:gravity="center"
android:text="@string/download"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>

View File

@ -0,0 +1,93 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/orange_light"
android:orientation="vertical"
tools:context=".ui.activity.SetKeyboardActivity">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:id="@+id/setKeyboard_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:background="@color/white"
android:padding="8dp"
android:src="@drawable/svg_back" />
<TextView
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@color/white"
android:gravity="center"
android:text="@string/enable"
android:textColor="@color/black"
android:textSize="18sp" />
<View
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@color/white" />
</LinearLayout>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="160dp"
android:layout_margin="30dp"
app:cardCornerRadius="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="20dp"
android:gravity="center"
android:lineSpacingExtra="8dp"
android:text="@string/setKeyboard_text"
android:textColor="@color/orange"
android:textSize="12sp" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/setKeyboard_steps1"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginStart="70dp"
android:layout_marginTop="70dp"
android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white"
android:gravity="center"
android:text="@string/setKeyboard_steps1"
android:textColor="@color/black"
android:textSize="12sp" />
<TextView
android:id="@+id/setKeyboard_steps2"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_marginStart="70dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white"
android:gravity="center"
android:text="@string/setKeyboard_steps2"
android:textColor="@color/black"
android:textSize="12sp" />
</LinearLayout>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:background="@color/white"
tools:context=".ui.activity.LoadingActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="80dp"
android:layout_height="80dp"
app:cardCornerRadius="12dp">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/logo" />
</androidx.cardview.widget.CardView>
<TextView
android:layout_width="260dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginBottom="60dp"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/orange"
android:textSize="24sp"
android:textStyle="bold" />
</LinearLayout>
<ProgressBar
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="180dp"
android:indeterminateTint="@color/orange"
android:visibility="visible" />
</FrameLayout>

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.MainActivity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/main_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="bottom"
android:layout_marginStart="60dp"
android:layout_marginEnd="60dp"
android:layout_marginBottom="40dp"
android:backgroundTint="@color/white"
app:cardCornerRadius="28dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="40dp"
android:layout_marginEnd="40dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/main_tab_home"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:padding="2dp"
android:src="@drawable/selector_menu" />
<TextView
android:id="@+id/main_tv_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/home"
android:textColor="@color/black"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/main_tab_set"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:padding="4dp"
android:src="@drawable/selector_setting" />
<TextView
android:id="@+id/main_tv_setting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/setting"
android:textColor="@color/black"
android:textSize="10sp" />
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
</FrameLayout>

View File

@ -0,0 +1,55 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/orange_light"
android:orientation="vertical"
tools:context=".ui.activity.SelectActivity">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:orientation="horizontal">
<ImageView
android:id="@+id/select_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:background="@color/white"
android:padding="8dp"
android:src="@drawable/svg_back" />
<TextView
android:id="@+id/select_title"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:background="@color/white"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/black"
android:textSize="18sp" />
<View
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:background="@color/white" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/select_recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>

View File

@ -0,0 +1,33 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/orange_light"
android:orientation="vertical"
tools:context=".ui.fragment.HomeFragment">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<TextView
android:id="@+id/home_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center_horizontal"
android:paddingBottom="8dp"
android:text="@string/home"
android:textColor="@color/black"
android:textSize="18sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/home_recycler_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>

View File

@ -0,0 +1,133 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/orange_light"
android:orientation="vertical"
tools:context=".ui.fragment.SettingFragment">
<View
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/white" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center_horizontal"
android:paddingBottom="8dp"
android:text="@string/setting"
android:textColor="@color/black"
android:textSize="18sp" />
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="65dp"
android:layout_marginStart="28dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="20dp">
<LinearLayout
android:id="@+id/setting_layout_rating"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/setting_img_rating"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginStart="25dp"
android:src="@drawable/svg_rating" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:gravity="center"
android:text="@string/setting_rating"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="65dp"
android:layout_marginStart="28dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="20dp">
<LinearLayout
android:id="@+id/setting_layout_share"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/setting_img_link"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginStart="25dp"
android:src="@drawable/svg_share" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:gravity="center"
android:text="@string/setting_share"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_marginStart="28dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="28dp"
app:cardCornerRadius="20dp">
<LinearLayout
android:id="@+id/setting_layout_setKeyboard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/setting_img_setKeyboard"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginStart="25dp"
android:src="@drawable/png_setting_off" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:gravity="center"
android:text="@string/setting_setKeyboard"
android:textColor="@color/black"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/item_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="20dp"
android:backgroundTint="@color/white"
app:cardCornerRadius="20dp"
app:cardElevation="13dp">
<!-- <androidx.cardview.widget.CardView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_gravity="center_horizontal"-->
<!-- android:layout_margin="4dp"-->
<!-- app:cardCornerRadius="20dp">-->
<ImageView
android:id="@+id/item_img"
android:layout_width="match_parent"
android:layout_height="80dp"
android:scaleType="fitXY"
android:src="@drawable/png_item" />
<ProgressBar
android:id="@+id/select_pd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminateTint="@color/orange" />
<!-- </androidx.cardview.widget.CardView>-->
</androidx.cardview.widget.CardView>

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/item_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:backgroundTint="@color/white"
app:cardCornerRadius="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
app:cardCornerRadius="20dp">
<ImageView
android:id="@+id/item_img"
android:layout_width="match_parent"
android:layout_height="240dp"
android:scaleType="centerCrop"
android:src="@drawable/png_item" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/pb"
android:indeterminateTint="@color/orange" />
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/orange"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.sunny.app.soft.timberkeyboardnew.ui.view.MyKeyboardView
android:id="@+id/my_custom_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:keyBackground="@drawable/shape_white_keyboard"
android:keyTextSize="15sp"
android:labelTextSize="15sp"
android:paddingTop="3dp"
android:paddingBottom="3dp" />
</FrameLayout>

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: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@ -0,0 +1,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.TimberKeyboardNew" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your dark theme here. -->
<!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
</style>
</resources>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF2C2C2C</color>
<color name="white">#FFFFFFFF</color>
<color name="orange">#FFFF7530</color>
<color name="orange_light">#FFFED480</color>
<color name="white33">#55000000</color>
</resources>

View File

@ -0,0 +1,26 @@
<resources>
<string name="app_name">Custom Keyboard</string>
<string name="home">Home</string>
<string name="setting">Setting</string>
<string name="setting_rating">Rate Us</string>
<string name="setting_share">Share App</string>
<string name="setting_setKeyboard">Set Keyboard</string>
<string name="link">https://play.google.com/store/apps/details?id=</string>
<string name="enable">Enable Keyboard</string>
<string name="setKeyboard_text">Please follow the steps below to enable the keyboard theme of your choice!</string>
<string name="setKeyboard_steps1">Step 1: Select Keyboard</string>
<string name="setKeyboard_steps2">Step 2: Enable Keyboard</string>
<string name="download">Download and Setting</string>
<string name="download_title">Set this skin</string>
<string name="unEnable">If the keyboard is not enabled, please set it in the settings</string>
<string name="succ_apply">Application successful</string>
<string name="fail_apply">Application failed, please try again</string>
<string name="delete_res">skin_%s_delete_emoji.png</string>
<string name="but_res">skin_%s_style_1_btn.9.png</string>
<string name="caps_res">skin_%s_caps_enabled.png</string>
<string name="caps_no_res">skin_%s_caps_disabled.png</string>
<string name="normal_res">skin_%s_style_1_btn.9.png</string>
</resources>

View File

@ -0,0 +1,9 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.TimberKeyboardNew" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.TimberKeyboardNew" parent="Base.Theme.TimberKeyboardNew" />
</resources>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
android:icon="@drawable/ic_launcher_background"
android:imeSubtypeLocale="en_US"
android:imeSubtypeMode="keyboard"
android:label="@string/app_name" />
</input-method>

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:keyHeight="46dp"
android:verticalGap="3dp">
<Row
android:horizontalGap="0.5%"
android:keyWidth="9.45%"
android:keyHeight="46dp"
android:rowEdgeFlags="top">
<Key
android:codes="113"
android:keyEdgeFlags="left"
android:keyLabel="q" />
<Key
android:codes="119"
android:keyLabel="w" />
<Key
android:codes="101"
android:keyLabel="e" />
<Key
android:codes="114"
android:keyLabel="r" />
<Key
android:codes="116"
android:keyLabel="t" />
<Key
android:codes="121"
android:keyLabel="y" />
<Key
android:codes="117"
android:keyLabel="u" />
<Key
android:codes="105"
android:keyLabel="i" />
<Key
android:codes="111"
android:keyLabel="o" />
<Key
android:codes="112"
android:keyEdgeFlags="right"
android:keyLabel="p" />
</Row>
<Row
android:horizontalGap="0.5%"
android:keyWidth="9.444444%"
android:keyHeight="46dp">
<Key
android:codes="97"
android:horizontalGap="5.5%"
android:keyLabel="a" />
<Key
android:codes="115"
android:keyLabel="s" />
<Key
android:codes="100"
android:keyLabel="d" />
<Key
android:codes="102"
android:keyLabel="f" />
<Key
android:codes="103"
android:keyLabel="g" />
<Key
android:codes="104"
android:keyLabel="h" />
<Key
android:codes="106"
android:keyLabel="j" />
<Key
android:codes="107"
android:keyLabel="k" />
<Key
android:codes="108"
android:keyLabel="l" />
</Row>
<Row
android:horizontalGap="0.5%"
android:keyWidth="9.5%"
android:keyHeight="46dp">
<!--shift-->
<Key
android:codes="-1"
android:isModifier="true"
android:isSticky="true"
android:keyWidth="14.25%"
android:keyEdgeFlags="left" />
<Key
android:codes="122"
android:keyLabel="z" />
<Key
android:codes="120"
android:keyLabel="x" />
<Key
android:codes="99"
android:keyLabel="c" />
<Key
android:codes="118"
android:keyLabel="v" />
<Key
android:codes="98"
android:keyLabel="b" />
<Key
android:codes="110"
android:keyLabel="n" />
<Key
android:codes="109"
android:keyLabel="m" />
<!--delete-->
<Key
android:codes="-5"
android:isModifier="true"
android:isRepeatable="true"
android:keyWidth="14.25%"
android:keyEdgeFlags="right" />
</Row>
<Row
android:horizontalGap="0.5%"
android:keyWidth="9.5%"
android:keyHeight="46dp"
android:rowEdgeFlags="bottom">
<!--mode change 切到模式2-->
<Key
android:codes="-2"
android:keyWidth="14.25%"
android:keyEdgeFlags="left"
android:keyLabel="\?123" />
<Key
android:codes="44"
android:keyLabel="," />
<Key
android:codes="32"
android:keyWidth="49.5%"
android:keyLabel="English" />
<Key
android:codes="46"
android:keyLabel="." />
<!--Done-->
<Key
android:codes="-4"
android:keyWidth="14.25%"
android:keyEdgeFlags="right"
android:keyLabel="Done" />
</Row>
</Keyboard>

View File

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:verticalGap="3dp">
<Row
android:keyWidth="9.45%"
android:keyHeight="46dp"
android:horizontalGap="0.5%"
android:rowEdgeFlags="top">
<Key
android:codes="49"
android:keyEdgeFlags="left"
android:keyLabel="1" />
<Key android:keyLabel="2"
android:codes="50"/>
<Key android:keyLabel="3"
android:codes="51"/>
<Key android:keyLabel="4"
android:codes="52"/>
<Key android:keyLabel="5"
android:codes="53"/>
<Key android:keyLabel="6"
android:codes="54"/>
<Key android:keyLabel="7"
android:codes="55"/>
<Key android:keyLabel="8"
android:codes="56"/>
<Key android:keyLabel="9"
android:codes="57"/>
<Key
android:keyEdgeFlags="right"
android:codes="48"
android:keyLabel="0" />
</Row>
<Row
android:keyWidth="9.444444%"
android:keyHeight="46dp"
android:horizontalGap="0.5%">
<Key
android:keyEdgeFlags="left"
android:keyLabel="\@"
android:horizontalGap="5.5%"
android:codes="64"/>
<Key android:keyLabel="#"
android:codes="35"/>
<Key android:keyLabel="\$"
android:codes="36"/>
<Key android:keyLabel="%"
android:codes="37"/>
<Key android:keyLabel="&amp;"
android:codes="38"/>
<Key android:keyLabel="-"
android:codes="45"/>
<Key android:keyLabel="+"
android:codes="43"/>
<Key android:keyLabel="("
android:codes="40"/>
<Key
android:keyEdgeFlags="right"
android:codes="41"
android:keyLabel=")" />
</Row>
<Row
android:keyHeight="46dp"
android:keyWidth="9.5%"
android:horizontalGap="0.5%">
<!--more 切换到符号键盘模式-->
<Key
android:codes="-300"
android:isModifier="true"
android:keyWidth="14.25%"
android:keyLabel="more"
android:keyEdgeFlags="left" />
<Key android:keyLabel="*"
android:codes="42" />
<!-- "-->
<Key android:keyLabel="&#034;"
android:codes="34" />
<Key android:keyLabel="'"
android:codes="39" />
<Key android:keyLabel=":"
android:codes="58" />
<Key android:keyLabel=";"
android:codes="59" />
<Key android:keyLabel="!"
android:codes="33" />
<Key android:keyLabel="\?"
android:codes="63" />
<!--delete-->
<Key
android:codes="-5"
android:keyWidth="14.25%"
android:isModifier="true"
android:isRepeatable="true"
android:keyEdgeFlags="right" />
</Row>
<Row
android:horizontalGap="0.5%"
android:keyHeight="46dp"
android:rowEdgeFlags="bottom"
android:keyWidth="9.5%">
<!-- 返回模式1 -->
<Key
android:codes="-2"
android:keyWidth="14.25%"
android:keyEdgeFlags="left"
android:keyLabel="ABC" />
<Key android:keyLabel=","
android:codes="44" />
<Key android:keyLabel="_"
android:codes="95" />
<Key
android:codes="32"
android:keyWidth="29.5%"
android:keyLabel="English" />
<Key android:keyLabel="/"
android:codes="47" />
<Key android:keyLabel="."
android:codes="46" />
<!--Done-->
<Key
android:codes="-4"
android:keyLabel="Done"
android:keyWidth="14.25%"
android:keyEdgeFlags="right" />
</Row>
</Keyboard>

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:verticalGap="3dp">
<Row
android:keyWidth="9.45%"
android:keyHeight="46dp"
android:horizontalGap="0.5%"
android:rowEdgeFlags="top">
<Key
android:codes="126"
android:keyEdgeFlags="left"
android:keyLabel="~" />
<Key android:keyLabel="`"
android:codes="96"/>
<Key android:keyLabel="|"
android:codes="124"/>
<Key android:keyLabel="•"
android:codes="149"/>
<Key android:keyLabel="✔"
android:codes="10004"/>
<Key android:keyLabel="π"
android:codes="960"/>
<Key android:keyLabel="÷"
android:codes="247"/>
<Key android:keyLabel="×"
android:codes="215"/>
<Key android:keyLabel="¶"
android:codes="182"/>
<Key
android:keyEdgeFlags="right"
android:codes="8710"
android:keyLabel="∆" />
</Row>
<Row
android:keyWidth="9.444444%"
android:keyHeight="46dp"
android:horizontalGap="0.5%">
<Key
android:keyEdgeFlags="left"
android:keyLabel="£"
android:horizontalGap="5.5%"
android:codes="163"/>
<Key android:keyLabel="¢"
android:codes="65504"/>
<Key android:keyLabel="€"
android:codes="8364"/>
<Key android:keyLabel="¥"
android:codes="165"/>
<Key android:keyLabel="^"
android:codes="94"/>
<Key android:keyLabel="°"
android:codes="176"/>
<Key android:keyLabel="="
android:codes="61"/>
<Key android:keyLabel="{"
android:codes="123"/>
<Key
android:keyEdgeFlags="right"
android:codes="125"
android:keyLabel="}" />
</Row>
<Row
android:keyHeight="46dp"
android:keyWidth="9.5%"
android:horizontalGap="0.5%">
<!-- shift-->
<Key
android:codes="-301"
android:isModifier="true"
android:keyWidth="14.25%"
android:keyLabel="\?123"
android:keyEdgeFlags="left" />
<Key android:keyLabel="\\"
android:codes="92" />
<Key android:keyLabel="Ⓒ"
android:codes="9400" />
<Key android:keyLabel="®"
android:codes="174" />
<Key android:keyLabel="™"
android:codes="8482" />
<Key android:keyLabel="℅"
android:codes="8453" />
<Key android:keyLabel="["
android:codes="91" />
<Key android:keyLabel="]"
android:codes="93" />
<!--delete-->
<Key
android:codes="-5"
android:keyWidth="14.25%"
android:isModifier="true"
android:isRepeatable="true"
android:keyEdgeFlags="right" />
</Row>
<Row
android:horizontalGap="0.5%"
android:keyHeight="46dp"
android:rowEdgeFlags="bottom"
android:keyWidth="9.5%">
<!--mode change 回到模式1-->
<Key
android:codes="-2"
android:keyWidth="14.25%"
android:keyEdgeFlags="left"
android:keyLabel="ABC" />
<Key android:keyLabel=","
android:codes="46" />
<Key android:keyLabel="&lt;"
android:codes="60" />
<Key
android:codes="32"
android:keyWidth="29.5%"
android:keyLabel="English" />
<Key android:keyLabel="&gt;"
android:codes="62" />
<Key android:keyLabel="."
android:codes="46" />
<!--Done-->
<Key
android:codes="-4"
android:keyLabel="Done"
android:keyWidth="14.25%"
android:keyEdgeFlags="right" />
</Row>
</Keyboard>

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