init
15
.gitignore
vendored
Normal 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
@ -0,0 +1 @@
|
||||
/build
|
||||
BIN
app/CustomKeyboard.jks
Normal file
79
app/build.gradle.kts
Normal 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
@ -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
@ -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 { *; }
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
48
app/src/main/AndroidManifest.xml
Normal 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>
|
||||
95
app/src/main/assets/Abstract.json
Normal 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
|
||||
}]
|
||||
}
|
||||
71
app/src/main/assets/Chinese.json
Normal 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
|
||||
}]
|
||||
}
|
||||
135
app/src/main/assets/Christmas.json
Normal 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
|
||||
}]
|
||||
}
|
||||
95
app/src/main/assets/Glitter.json
Normal 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
|
||||
}]
|
||||
}
|
||||
71
app/src/main/assets/Halloween.json
Normal 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
|
||||
}]
|
||||
}
|
||||
95
app/src/main/assets/Pastel.json
Normal 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
|
||||
}]
|
||||
}
|
||||
95
app/src/main/assets/Unicorn.json
Normal 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
|
||||
}]
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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( );
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@ -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]
|
||||
}
|
||||
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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() {
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package com.sunny.app.soft.timberkeyboardnew.ui.listener
|
||||
|
||||
interface ApplyListener {
|
||||
fun applyListener(isSuccess: Boolean, str: String)
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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)
|
||||
|
||||
}
|
||||
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal 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>
|
||||
170
app/src/main/res/drawable/ic_launcher_background.xml
Normal 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>
|
||||
BIN
app/src/main/res/drawable/png_item.png
Normal file
|
After Width: | Height: | Size: 650 KiB |
BIN
app/src/main/res/drawable/png_keybg.9.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
app/src/main/res/drawable/png_keybg_press.9.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
app/src/main/res/drawable/png_setting_off.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
app/src/main/res/drawable/png_setting_on.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
7
app/src/main/res/drawable/selector_menu.xml
Normal 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>
|
||||
7
app/src/main/res/drawable/selector_setting.xml
Normal 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>
|
||||
6
app/src/main/res/drawable/shape_r20_white.xml
Normal 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>
|
||||
7
app/src/main/res/drawable/shape_r24_grey.xml
Normal 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>
|
||||
7
app/src/main/res/drawable/shape_r24_orange.xml
Normal 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>
|
||||
16
app/src/main/res/drawable/shape_white_keyboard.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_back.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_dele.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_delete.xml
Normal 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>
|
||||
10
app/src/main/res/drawable/svg_menu_off.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_menu_on.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_rating.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_setting_off.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_setting_on.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_share.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_shift.xml
Normal 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>
|
||||
9
app/src/main/res/drawable/svg_shift_lit.xml
Normal 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>
|
||||
121
app/src/main/res/layout/activity_download.xml
Normal 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>
|
||||
93
app/src/main/res/layout/activity_enable.xml
Normal 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>
|
||||
47
app/src/main/res/layout/activity_loading.xml
Normal 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>
|
||||
86
app/src/main/res/layout/activity_main.xml
Normal 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>
|
||||
55
app/src/main/res/layout/activity_select.xml
Normal 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>
|
||||
33
app/src/main/res/layout/fragment_home.xml
Normal 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>
|
||||
133
app/src/main/res/layout/fragment_setting.xml
Normal 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>
|
||||
40
app/src/main/res/layout/item_background.xml
Normal 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>
|
||||
|
||||
53
app/src/main/res/layout/item_classification.xml
Normal 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>
|
||||
|
||||
19
app/src/main/res/layout/view_input.xml
Normal 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>
|
||||
6
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal 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>
|
||||
6
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal 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>
|
||||
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 982 B |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/logo.png
Normal file
|
After Width: | Height: | Size: 206 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/main_bg.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
7
app/src/main/res/values-night/themes.xml
Normal 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>
|
||||
9
app/src/main/res/values/colors.xml
Normal 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>
|
||||
26
app/src/main/res/values/strings.xml
Normal 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>
|
||||
9
app/src/main/res/values/themes.xml
Normal 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>
|
||||
13
app/src/main/res/xml/backup_rules.xml
Normal 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>
|
||||
19
app/src/main/res/xml/data_extraction_rules.xml
Normal 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>
|
||||
8
app/src/main/res/xml/key_view.xml
Normal 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>
|
||||
151
app/src/main/res/xml/keyboard_letter.xml
Normal 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>
|
||||
149
app/src/main/res/xml/keyboard_number.xml
Normal 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="&"
|
||||
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="""
|
||||
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>
|
||||
157
app/src/main/res/xml/keyboard_symbol.xml
Normal 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="<"
|
||||
android:codes="60" />
|
||||
<Key
|
||||
android:codes="32"
|
||||
android:keyWidth="29.5%"
|
||||
android:keyLabel="English" />
|
||||
|
||||
<Key android:keyLabel=">"
|
||||
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>
|
||||