区分是否是搜索按键

This commit is contained in:
litingting 2024-08-23 11:20:40 +08:00
parent e02a7d46f7
commit ffc9dbea88
45 changed files with 936 additions and 140 deletions

View File

@ -28,9 +28,11 @@
<activity android:name=".ui.activity.MainActivity" /> <activity android:name=".ui.activity.MainActivity" />
<activity android:name=".ui.activity.SetKeyboardActivity" /> <activity android:name=".ui.activity.SetKeyboardActivity" />
<activity android:name=".ui.activity.SelectActivity" /> <activity android:name=".ui.activity.ListActivity" />
<activity android:name=".ui.activity.DownloadActivity" /> <activity android:name=".ui.activity.DownloadActivity" />
<activity android:name=".ui.activity.DisplayActivity"
android:launchMode="singleTop"
android:windowSoftInputMode="stateVisible"/>
<service <service
android:name=".service.KeyboardService" android:name=".service.KeyboardService"
android:exported="true" android:exported="true"

View File

@ -18,8 +18,9 @@ public interface BackgroundDao {
long insertData(BackgroundEntity data); long insertData(BackgroundEntity data);
@Query("select * from keyboard order by id desc") @Query("select * from keyboard order by RANDOM() LIMIT 1")
LiveData<List<BackgroundEntity>> queryAll(); BackgroundEntity queryRandomItem();
@Query("select * from keyboard where categoryId = :cateId") @Query("select * from keyboard where categoryId = :cateId")
LiveData<List<BackgroundEntity>> queryCateId(long cateId); LiveData<List<BackgroundEntity>> queryCateId(long cateId);

View File

@ -4,12 +4,16 @@ import android.inputmethodservice.InputMethodService
import android.inputmethodservice.Keyboard import android.inputmethodservice.Keyboard
import android.inputmethodservice.KeyboardView import android.inputmethodservice.KeyboardView
import android.os.SystemClock import android.os.SystemClock
import android.text.InputType
import android.util.Log
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.ViewInputBinding import com.sunny.app.soft.timberkeyboardnew.databinding.ViewInputBinding
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.tools.ZipTools
class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListener { class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListener {
@ -20,6 +24,10 @@ class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListe
private var mouble = false private var mouble = false
private var laTime = -3L private var laTime = -3L
private var curImeAction = EditorInfo.IME_ACTION_UNSPECIFIED
private var imm: InputMethodManager? = null
private fun keyCase(toBig: Boolean, keyboard: Keyboard) { private fun keyCase(toBig: Boolean, keyboard: Keyboard) {
for (key in keyboard.keys) { for (key in keyboard.keys) {
if (!key.label.isNullOrEmpty()) { if (!key.label.isNullOrEmpty()) {
@ -68,15 +76,28 @@ class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListe
keyboard = Keyboard(this@KeyboardService, views[0]) keyboard = Keyboard(this@KeyboardService, views[0])
isEnabled = true isEnabled = true
} }
imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
return binding.root return binding.root
} }
override fun onWindowShown() { override fun onWindowShown() {
super.onWindowShown() super.onWindowShown()
binding.myCustomInput.upUi(this@KeyboardService)
curImeAction = ZipTools.getTextForImeAction(currentInputEditorInfo.imeOptions)
Log.d(App.TAG, "=======${curImeAction}")
binding.myCustomInput.upUi(this@KeyboardService, curImeAction)
} }
override fun onPress(primaryCode: Int) { override fun onPress(primaryCode: Int) {
mouble = false mouble = false
if (primaryCode == Keyboard.KEYCODE_SHIFT) { if (primaryCode == Keyboard.KEYCODE_SHIFT) {
@ -87,6 +108,7 @@ class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListe
} }
} }
override fun onRelease(primaryCode: Int) { override fun onRelease(primaryCode: Int) {
} }
@ -126,12 +148,31 @@ class KeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionListe
} }
} }
// 点击完成 // 点击完成/回车/搜索
Keyboard.KEYCODE_DONE -> { Keyboard.KEYCODE_DONE -> {
// currentInputConnection.performEditorAction(EditorInfo.IME_ACTION_SEARCH)
currentInputConnection.performEditorAction(EditorInfo.IME_ACTION_SEARCH) currentInputConnection.performEditorAction(curImeAction)
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager when (curImeAction) {
imm.hideSoftInputFromWindow(binding.myCustomInput.windowToken, 0) EditorInfo.IME_ACTION_NONE -> null
EditorInfo.IME_ACTION_GO -> "go"
EditorInfo.IME_ACTION_SEARCH -> {
// Log.d(App.TAG, "=======IME_ACTION_SEARCH")
}
EditorInfo.IME_ACTION_SEND -> "send"
EditorInfo.IME_ACTION_NEXT -> "next"
EditorInfo.IME_ACTION_DONE -> {
// Log.d(App.TAG, "=======IME_ACTION_DONE")
}
EditorInfo.IME_ACTION_PREVIOUS -> "previous"
else -> {
// Log.d(App.TAG, "=======IME_ACTION_DONE")
}
}
} }
Keyboard.KEYCODE_MODE_CHANGE -> { Keyboard.KEYCODE_MODE_CHANGE -> {

View File

@ -9,7 +9,11 @@ object AppConstant {
const val SHARE_NAME = "sp_name" const val SHARE_NAME = "sp_name"
const val SHIFT_NUMBER = -300 const val SHIFT_NUMBER = -300
const val SHIFT_SYMBOL = -301 const val SHIFT_SYMBOL = -301
const val KEY_CODE_SPACE=32
//空格键
const val KEY_CODE_SPACE = 32
const val KEY_CUR_Skin_Number = "cur_skin_number" const val KEY_CUR_Skin_Number = "cur_skin_number"
const val KEY_CUR_STYLE = "cur_style" const val KEY_CUR_STYLE = "cur_style"
const val KEY_CUR_Bg = "cur_bg" const val KEY_CUR_Bg = "cur_bg"
@ -48,10 +52,15 @@ object AppConstant {
fun getCapsenable(id: String) = String.format(App.appContext.getString(R.string.caps_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 getCaps(id: String) = String.format(App.appContext.getString(R.string.caps_no_res), id)
fun getnormalBg(id: String,style:Int=1) = String.format(App.appContext.getString(R.string.normal_res), id,style) fun getnormalBg(id: String, style: Int = 1) =
String.format(App.appContext.getString(R.string.normal_res), id, style)
//skin_8001_space_arrows_shadows.9 //skin_8001_space_arrows_shadows.9
fun getSpaceBg(id: String) = String.format(App.appContext.getString(R.string.space_res), id) fun getSpaceBg(id: String) = String.format(App.appContext.getString(R.string.space_res), id)
fun getTextColor(id: String,style:Int=1) = String.format(App.appContext.getString(R.string.correct_text_color), id,style)
fun getEnterIcon(id: String) = String.format(App.appContext.getString(R.string.enter_res), id)
fun getTextColor(id: String, style: Int = 1) =
String.format(App.appContext.getString(R.string.correct_text_color), id, style)
} }

View File

@ -0,0 +1,122 @@
package com.sunny.app.soft.timberkeyboardnew.tools
import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import com.anythink.debug.util.a
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.DialogRecommendBinding
import com.sunny.app.soft.timberkeyboardnew.databinding.DialogStepBinding
import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase
import com.sunny.app.soft.timberkeyboardnew.ui.activity.DownloadActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class DialogRecommend(var activity: Activity, var onClose: () -> Unit) : DialogFragment() {
private lateinit var dialogVb: DialogRecommendBinding
private var inputManager: InputMethodManager? = null
private var data: BackgroundEntity? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
dialogVb = DialogRecommendBinding.inflate(inflater, container, false)
init()
return dialogVb.root
}
private fun init() {
isCancelable = false
val window = dialog!!.window
window!!.setBackgroundDrawableResource(R.color.transparent)
window.decorView.setPadding(0, 0, 0, 0)
initBar(window)
val wlp = window.attributes
wlp.gravity = Gravity.CENTER
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT
window.attributes = wlp
dialogVb.close.setOnClickListener {
dismiss()
}
dialogVb.imageview.setOnClickListener {
}
CoroutineScope(Dispatchers.IO).launch {
data = MyDatabase.myDatabase.BackgroundEntityDao().queryRandomItem()
withContext(Dispatchers.Main) {
data?.let { backEntity ->
Glide
.with(App.appContext)
.load(backEntity.coverPath)
.thumbnail(0.5f)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(dialogVb.imageview)
dialogVb.tvApply.setOnClickListener {
val intent = Intent(activity, DownloadActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, backEntity)
startActivity(intent)
dismiss()
}
}
}
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
onClose.invoke()
}
private fun initBar(window: Window) {
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}
companion object {
@JvmStatic
fun newInstance(activity: Activity, onClose: () -> Unit) =
DialogRecommend(activity, onClose)
}
}

View File

@ -0,0 +1,135 @@
package com.sunny.app.soft.timberkeyboardnew.tools
import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.DialogStepBinding
class DialogStep(var activity: Activity,var onClose:()->Unit) : DialogFragment() {
private lateinit var dialogVb: DialogStepBinding
private var inputManager: InputMethodManager? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
dialogVb = DialogStepBinding.inflate(inflater, container, false)
init()
return dialogVb.root
}
private fun choseKeyboard() {
if (inputManager == null)
inputManager = activity.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager?.showInputMethodPicker()
}
private fun EnableKeyboard() {
val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
startActivity(intent)
}
override fun onResume() {
super.onResume()
updateUi()
}
private fun init() {
isCancelable = false
val window = dialog!!.window
window!!.setBackgroundDrawableResource(R.color.transparent)
window.decorView.setPadding(0, 0, 0, 0)
initBar(window)
val wlp = window.attributes
wlp.gravity = Gravity.BOTTOM
wlp.width = WindowManager.LayoutParams.MATCH_PARENT
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT
window.attributes = wlp
dialogVb.close.setOnClickListener {
dismiss()
}
dialogVb.setKeyboardSteps1.setOnClickListener {
EnableKeyboard()
}
dialogVb.setKeyboardSteps2.setOnClickListener {
choseKeyboard()
}
activity.registerReceiver(
StepperReceiver(),
IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED)
)
}
inner class StepperReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
updateUi()
}
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
onClose.invoke()
}
private fun updateUi() {
KeyboardManager.isEnable().let {
dialogVb.setKeyboardSteps1.isSelected = it
dialogVb.tvSteps1.isSelected = it
dialogVb.imOkSteps1.isVisible = it
}
KeyboardManager.isChoose().let {
dialogVb.setKeyboardSteps2.isSelected = it
dialogVb.tvSteps2.isSelected = it
dialogVb.imOkSteps2.isVisible = it
}
if(KeyboardManager.isChoose()&&KeyboardManager.isEnable()){
dismiss()
}
}
private fun initBar(window: Window) {
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
window.decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN
}
companion object {
@JvmStatic
fun newInstance(activity: Activity,onClose:()->Unit) = DialogStep(activity,onClose)
}
}

View File

@ -1,16 +1,19 @@
package com.sunny.app.soft.timberkeyboardnew.tools package com.sunny.app.soft.timberkeyboardnew.tools
import android.graphics.drawable.Drawable
import android.util.Log import android.util.Log
import android.view.inputmethod.EditorInfo
import com.sunny.app.soft.timberkeyboardnew.App import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.ui.listener.ApplyListener import com.sunny.app.soft.timberkeyboardnew.ui.listener.ApplyListener
import java.io.BufferedOutputStream import java.io.BufferedOutputStream
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.io.IOException import java.io.IOException
import java.io.InputStream
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
object ZipTools { object ZipTools {
fun unzip(zipFilePath: String?, destDirectory: String, listener: ApplyListener) { fun unzip(zipFilePath: String?, destDirectory: String, listener: ApplyListener) {
var destDir = File(destDirectory) var destDir = File(destDirectory)
@ -57,4 +60,30 @@ object ZipTools {
} }
fun loadDrawableFromAsset(fileName: String): Drawable? {
val assetManager = App.appContext.assets
var input: InputStream? = null
return try {
input = assetManager.open(fileName)
Drawable.createFromStream(input, null)
} catch (e: IOException) {
Log.e("AssetHelper", "Could not load drawable from asset: $fileName")
null
} finally {
if (input!= null) {
try {
input.close()
} catch (e: IOException) {
Log.e(
"AssetHelper",
"Could not close input stream for asset: $fileName"
)
}
}
}
}
fun getTextForImeAction(imeOptions: Int): Int {
return imeOptions and EditorInfo.IME_MASK_ACTION
}
} }

View File

@ -0,0 +1,42 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.view.View
import android.view.inputmethod.InputMethodManager
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityDisplayBinding
class DisplayActivity : BaseActivity() {
private lateinit var binding: ActivityDisplayBinding
override fun loadAd(): Boolean = true
private var inputMethod: InputMethodManager? = null
private var showInput = false
override fun setRootView(): View {
binding = ActivityDisplayBinding.inflate(layoutInflater)
init()
return binding.root
}
private fun init() {
binding.back.setOnClickListener {
finish()
}
binding.et.requestFocus()
inputMethod = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
showInput = true
}
override fun onResume() {
super.onResume()
if (showInput) {
showInput = false
inputMethod?.showSoftInput(binding.et, InputMethodManager.SHOW_IMPLICIT)
}
}
}

View File

@ -19,6 +19,7 @@ import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityDownloadBinding import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityDownloadBinding
import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.tools.DialogStep
import com.sunny.app.soft.timberkeyboardnew.tools.KeyboardManager import com.sunny.app.soft.timberkeyboardnew.tools.KeyboardManager
import com.sunny.app.soft.timberkeyboardnew.tools.ZipTools import com.sunny.app.soft.timberkeyboardnew.tools.ZipTools
import com.sunny.app.soft.timberkeyboardnew.topon.AdManager import com.sunny.app.soft.timberkeyboardnew.topon.AdManager
@ -46,7 +47,15 @@ class DownloadActivity :
private lateinit var sp: SharedPreferences private lateinit var sp: SharedPreferences
private var stepDialog: DialogStep? = null
private var selectedStyle = 1 private var selectedStyle = 1
private var appliedSkinNumber: String = ""
private var appliedSkinStyle: Int = -1
private var defaultStyle = 0
override fun loadAd(): Boolean = true override fun loadAd(): Boolean = true
override fun setRootView(): View { override fun setRootView(): View {
binding = ActivityDownloadBinding.inflate(layoutInflater) binding = ActivityDownloadBinding.inflate(layoutInflater)
@ -58,6 +67,9 @@ class DownloadActivity :
binding.downloadProgress.visibility = View.VISIBLE binding.downloadProgress.visibility = View.VISIBLE
backgroundEntity = intent.getSerializableExtra(AppConstant.KEY_EXTRA) as BackgroundEntity backgroundEntity = intent.getSerializableExtra(AppConstant.KEY_EXTRA) as BackgroundEntity
sp = getSharedPreferences(AppConstant.SHARE_NAME, Context.MODE_PRIVATE) sp = getSharedPreferences(AppConstant.SHARE_NAME, Context.MODE_PRIVATE)
// sp.registerOnSharedPreferenceChangeListener { sharedPreferences, key ->
//
// }
initImg() initImg()
// unzipPath = /data/user/0/com.sunny.tools.app.soft.test/cache/skin_9 // unzipPath = /data/user/0/com.sunny.tools.app.soft.test/cache/skin_9
@ -76,7 +88,6 @@ class DownloadActivity :
val zipFile = File(unzipPath) val zipFile = File(unzipPath)
if (!zipFile.exists()) { if (!zipFile.exists()) {
getZipData( getZipData(
backgroundEntity.skinNumber,
backgroundEntity.contentPath, backgroundEntity.contentPath,
this@DownloadActivity, this@DownloadActivity,
this this
@ -99,8 +110,11 @@ class DownloadActivity :
} }
} }
Log.d(App.TAG, "-------initList=${listOf.size}") Log.d(App.TAG, "-------initList=${listOf.size}")
val keyAdapter = KeyAdapter(this, listOf) { val keyAdapter = KeyAdapter(this, defaultStyle, listOf) {
selectedStyle = it + 1 selectedStyle = it + 1
if (appliedSkinNumber == backgroundEntity.skinNumber.toString()) {
updateBtn(appliedSkinStyle == selectedStyle)
}
} }
binding.listRecycler.run { binding.listRecycler.run {
adapter = keyAdapter adapter = keyAdapter
@ -125,7 +139,28 @@ class DownloadActivity :
binding.imLike.setOnClickListener(this) binding.imLike.setOnClickListener(this)
} }
/**
* isApplied 是否已经apply
*/
private fun updateBtn(isApplied: Boolean) {
binding.btnDownload.isSelected = isApplied
binding.btnDownload.isEnabled = !isApplied
if (isApplied) {
binding.btnDownload.text = getString(R.string.applied)
} else {
binding.btnDownload.text = getString(R.string.apply)
}
}
private fun initImg() { private fun initImg() {
appliedSkinNumber = sp.getString(AppConstant.KEY_CUR_Skin_Number, "") ?: run { "-1" }
appliedSkinStyle = sp.getInt(AppConstant.KEY_CUR_STYLE, -1)
if (appliedSkinNumber == backgroundEntity.skinNumber.toString()) {
updateBtn(appliedSkinStyle == selectedStyle)
}else{
updateBtn(false)
}
binding.imLike.isSelected = backgroundEntity.like binding.imLike.isSelected = backgroundEntity.like
try { try {
Glide Glide
@ -161,15 +196,20 @@ class DownloadActivity :
MyDatabase.myDatabase.BackgroundEntityDao().updateCollect(backgroundEntity.apply { MyDatabase.myDatabase.BackgroundEntityDao().updateCollect(backgroundEntity.apply {
like = binding.imLike.isSelected like = binding.imLike.isSelected
}) })
Log.d(App.TAG, "-------updateCollect= ${backgroundEntity.skinNumber} ${binding.imLike.isSelected}")
} }
} }
private fun applySkin() { private fun applySkin() {
if (!KeyboardManager.isChoose() || !KeyboardManager.isEnable()) { if (!KeyboardManager.isChoose() || !KeyboardManager.isEnable()) {
Toast.makeText(this, getString(R.string.unEnable), Toast.LENGTH_SHORT).show() if (stepDialog == null) {
val intent = Intent(this, SetKeyboardActivity::class.java) stepDialog = DialogStep.newInstance(this@DownloadActivity) {
startActivity(intent) if (KeyboardManager.isChoose() && KeyboardManager.isEnable()) {
onShowAd()
}
}
}
stepDialog?.show(supportFragmentManager, "")
return return
} }
onShowAd() onShowAd()
@ -188,16 +228,19 @@ class DownloadActivity :
edit.run { edit.run {
putString(AppConstant.KEY_CUR_Skin_Number, backgroundEntity.skinNumber.toString()) putString(AppConstant.KEY_CUR_Skin_Number, backgroundEntity.skinNumber.toString())
putInt(AppConstant.KEY_CUR_STYLE, selectedStyle) putInt(AppConstant.KEY_CUR_STYLE, selectedStyle)
putString(AppConstant.KEY_CUR_Bg,backgroundEntity.coverPath) putString(AppConstant.KEY_CUR_Bg, backgroundEntity.coverPath)
apply() apply()
Log.d(App.TAG, "------putConfig ----skin_Number = ${ backgroundEntity.skinNumber} style=${selectedStyle} ")
} }
binding.downloadProgress.visibility = View.GONE binding.downloadProgress.visibility = View.GONE
Toast.makeText(this, getString(R.string.succ_apply), Toast.LENGTH_LONG).show() Toast.makeText(this, getString(R.string.succ_apply), Toast.LENGTH_LONG).show()
startActivity(Intent(this@DownloadActivity, DisplayActivity::class.java))
finish() finish()
} }
private fun getZipData( private fun getZipData(
skinNumber: Int,
contentPath: String, contentPath: String,
context: Context, context: Context,
listener: ApplyListener listener: ApplyListener

View File

@ -13,7 +13,7 @@ import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.SelectAdapter import com.sunny.app.soft.timberkeyboardnew.ui.adapter.SelectAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener
class SelectActivity : BaseActivity(), View.OnClickListener { class ListActivity : BaseActivity(), View.OnClickListener {
private lateinit var binding: ActivitySelectBinding private lateinit var binding: ActivitySelectBinding
private lateinit var categoryEntity: CategoryEntity private lateinit var categoryEntity: CategoryEntity
@ -34,7 +34,7 @@ class SelectActivity : BaseActivity(), View.OnClickListener {
val selectAdapter = val selectAdapter =
SelectAdapter(this, object : OnBgItemClickListener { SelectAdapter(this, object : OnBgItemClickListener {
override fun onItemClick(position: Int, backgroundEntity: BackgroundEntity) { override fun onItemClick(position: Int, backgroundEntity: BackgroundEntity) {
val intent = Intent(this@SelectActivity, DownloadActivity::class.java) val intent = Intent(this@ListActivity, DownloadActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, backgroundEntity) intent.putExtra(AppConstant.KEY_EXTRA, backgroundEntity)
startActivity(intent) startActivity(intent)
Log.e("TAG", "onItemClick: $backgroundEntity") Log.e("TAG", "onItemClick: $backgroundEntity")
@ -47,7 +47,7 @@ class SelectActivity : BaseActivity(), View.OnClickListener {
} }
binding.selectRecyclerView.apply { binding.selectRecyclerView.apply {
layoutManager = GridLayoutManager(this@SelectActivity, 1) layoutManager = GridLayoutManager(this@ListActivity, 1)
adapter = selectAdapter adapter = selectAdapter
} }
} }

View File

@ -1,10 +1,16 @@
package com.sunny.app.soft.timberkeyboardnew.ui.activity package com.sunny.app.soft.timberkeyboardnew.ui.activity
import android.content.Intent
import android.provider.Settings
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.sunny.app.soft.timberkeyboardnew.R import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityMainBinding import com.sunny.app.soft.timberkeyboardnew.databinding.ActivityMainBinding
import com.sunny.app.soft.timberkeyboardnew.tools.DialogRecommend
import com.sunny.app.soft.timberkeyboardnew.tools.DialogStep
import com.sunny.app.soft.timberkeyboardnew.tools.KeyboardManager
import com.sunny.app.soft.timberkeyboardnew.topon.AdManager import com.sunny.app.soft.timberkeyboardnew.topon.AdManager
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.MainViewPagerAdapter import com.sunny.app.soft.timberkeyboardnew.ui.adapter.MainViewPagerAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.fragment.CollectFragment import com.sunny.app.soft.timberkeyboardnew.ui.fragment.CollectFragment
@ -18,6 +24,11 @@ class MainActivity :
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
private lateinit var fragmentList: MutableList<Fragment> private lateinit var fragmentList: MutableList<Fragment>
private var stepDialog: DialogStep? = null
private var recommendDialog: DialogRecommend? = null
override fun loadAd(): Boolean = true override fun loadAd(): Boolean = true
override fun setRootView(): View { override fun setRootView(): View {
@ -29,6 +40,7 @@ class MainActivity :
super.initView() super.initView()
initViewPager() initViewPager()
initTabButton() initTabButton()
checkStep()
} }
private fun initTabButton() { private fun initTabButton() {
@ -37,6 +49,31 @@ class MainActivity :
binding.mainTabCollect.setOnClickListener(this) binding.mainTabCollect.setOnClickListener(this)
} }
private fun checkStep() {
if (!KeyboardManager.isEnable() || !KeyboardManager.isChoose()) {
if (stepDialog == null) {
stepDialog = DialogStep.newInstance(this@MainActivity) {
showRecommend()
}
}
stepDialog?.show(supportFragmentManager, "")
} else {
showRecommend()
}
}
private fun showRecommend() {
if (recommendDialog == null) {
recommendDialog = DialogRecommend.newInstance(this@MainActivity) {
}
}
recommendDialog?.show(supportFragmentManager, "")
}
private fun initViewPager() { private fun initViewPager() {
fragmentList = mutableListOf() fragmentList = mutableListOf()
fragmentList.add(HomeFragment()) fragmentList.add(HomeFragment())
@ -80,9 +117,11 @@ class MainActivity :
binding.mainTabHome -> { binding.mainTabHome -> {
setTabSelect(0) setTabSelect(0)
} }
binding.mainTabCollect -> { binding.mainTabCollect -> {
setTabSelect(1) setTabSelect(1)
} }
binding.mainTabSet -> { binding.mainTabSet -> {
setTabSelect(2) setTabSelect(2)
} }

View File

@ -52,19 +52,19 @@ class SetKeyboardActivity :
} }
private fun updateUi() { private fun updateUi() {
if (KeyboardManager.isEnable()) { // if (KeyboardManager.isEnable()) {
binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_grey) // binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_grey)
} else { // } else {
binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_orange) // binding.setKeyboardSteps1.setBackgroundResource(R.drawable.shape_r24_orange)
} // }
if (KeyboardManager.isChoose()) { // if (KeyboardManager.isChoose()) {
binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_grey) // binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_grey)
} else { // } else {
binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_orange) // binding.setKeyboardSteps2.setBackgroundResource(R.drawable.shape_r24_orange)
} // }
if (KeyboardManager.isChoose() && KeyboardManager.isEnable()) { // if (KeyboardManager.isChoose() && KeyboardManager.isEnable()) {
showInfoDialog() // showInfoDialog()
} // }
} }

View File

@ -21,11 +21,13 @@ import com.sunny.app.soft.timberkeyboardnew.R
class KeyAdapter( class KeyAdapter(
private val context: Context, private val context: Context,
private var selectedPos: Int = 0,
private val modelList: List<String>, private val modelList: List<String>,
private val listener: (Int) -> Unit private val listener: (Int) -> Unit
) : RecyclerView.Adapter<KeyAdapter.ItemViewHolder>() { ) : RecyclerView.Adapter<KeyAdapter.ItemViewHolder>() {
private var selectedPos: Int = 0
inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {

View File

@ -6,21 +6,16 @@ import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.sunny.app.soft.timberkeyboardnew.App 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.BackgroundEntity import com.sunny.app.soft.timberkeyboardnew.data.entity.BackgroundEntity
import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity import com.sunny.app.soft.timberkeyboardnew.data.entity.CategoryEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentCollectBinding import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentCollectBinding
import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentHomeBinding
import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.topon.AdManager import com.sunny.app.soft.timberkeyboardnew.topon.AdManager
import com.sunny.app.soft.timberkeyboardnew.ui.activity.DownloadActivity import com.sunny.app.soft.timberkeyboardnew.ui.activity.DownloadActivity
import com.sunny.app.soft.timberkeyboardnew.ui.activity.SelectActivity import com.sunny.app.soft.timberkeyboardnew.ui.activity.ListActivity
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.HomeViewAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.SelectAdapter import com.sunny.app.soft.timberkeyboardnew.ui.adapter.SelectAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnBgItemClickListener
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnItemClickListener
class CollectFragment : class CollectFragment :
BaseFragment() { BaseFragment() {
@ -70,7 +65,7 @@ class CollectFragment :
} }
private fun enterList() { private fun enterList() {
val intent = Intent(requireContext(), SelectActivity::class.java) val intent = Intent(requireContext(), ListActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, data) intent.putExtra(AppConstant.KEY_EXTRA, data)
startActivity(intent) startActivity(intent)
} }

View File

@ -6,13 +6,12 @@ import android.view.View
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.sunny.app.soft.timberkeyboardnew.App import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R 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.data.entity.CategoryEntity
import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentHomeBinding import com.sunny.app.soft.timberkeyboardnew.databinding.FragmentHomeBinding
import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase import com.sunny.app.soft.timberkeyboardnew.room.MyDatabase
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
import com.sunny.app.soft.timberkeyboardnew.topon.AdManager import com.sunny.app.soft.timberkeyboardnew.topon.AdManager
import com.sunny.app.soft.timberkeyboardnew.ui.activity.SelectActivity import com.sunny.app.soft.timberkeyboardnew.ui.activity.ListActivity
import com.sunny.app.soft.timberkeyboardnew.ui.adapter.HomeViewAdapter import com.sunny.app.soft.timberkeyboardnew.ui.adapter.HomeViewAdapter
import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnItemClickListener import com.sunny.app.soft.timberkeyboardnew.ui.listener.OnItemClickListener
@ -58,7 +57,7 @@ class HomeFragment :
} }
private fun enterList() { private fun enterList() {
val intent = Intent(requireContext(), SelectActivity::class.java) val intent = Intent(requireContext(), ListActivity::class.java)
intent.putExtra(AppConstant.KEY_EXTRA, data) intent.putExtra(AppConstant.KEY_EXTRA, data)
startActivity(intent) startActivity(intent)
} }

View File

@ -41,11 +41,7 @@ class SettingFragment : BaseFragment(), View.OnClickListener {
} }
binding.settingLayoutSetKeyboard -> { binding.settingLayoutSetKeyboard -> {
val intent = Intent(
requireContext(),
SetKeyboardActivity::class.java
)
startActivity(intent)
} }
} }
} }

View File

@ -15,12 +15,8 @@ import android.inputmethodservice.Keyboard
import android.inputmethodservice.KeyboardView import android.inputmethodservice.KeyboardView
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log import android.util.Log
import android.view.inputmethod.EditorInfo
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.sunny.app.soft.timberkeyboardnew.App import com.sunny.app.soft.timberkeyboardnew.App
import com.sunny.app.soft.timberkeyboardnew.R import com.sunny.app.soft.timberkeyboardnew.R
import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant import com.sunny.app.soft.timberkeyboardnew.tools.AppConstant
@ -35,6 +31,9 @@ class MyKeyboardView @JvmOverloads constructor(
style: Int = 0 style: Int = 0
) : KeyboardView(myContext, attributeSet, style) { ) : KeyboardView(myContext, attributeSet, style) {
private var curimeAction = EditorInfo.IME_ACTION_UNSPECIFIED
inner class MyConfig { inner class MyConfig {
lateinit var functionBackgroundDraw: Drawable lateinit var functionBackgroundDraw: Drawable
lateinit var spBackgroundDraw: Drawable lateinit var spBackgroundDraw: Drawable
@ -50,6 +49,12 @@ class MyKeyboardView @JvmOverloads constructor(
var icSshift: Drawable? = var icSshift: Drawable? =
ContextCompat.getDrawable(context, R.drawable.svg_shift) ContextCompat.getDrawable(context, R.drawable.svg_shift)
var icEnter: Drawable? =
ContextCompat.getDrawable(context, R.drawable.key_ic_enter)
var icSearch: Drawable? =
ContextCompat.getDrawable(context, R.drawable.key_ic_search)
var keycolor: Int = context.resources.getColor(R.color.white33, null) var keycolor: Int = context.resources.getColor(R.color.white33, null)
private val sp: SharedPreferences = context.getSharedPreferences( private val sp: SharedPreferences = context.getSharedPreferences(
@ -73,7 +78,7 @@ class MyKeyboardView @JvmOverloads constructor(
private fun gettextcolornew(filePath: String) { private fun gettextcolornew(filePath: String) {
if(File(filePath).exists()){ if (File(filePath).exists()) {
val decodeFile = BitmapFactory.decodeFile(filePath) val decodeFile = BitmapFactory.decodeFile(filePath)
val pixelColor: Int = decodeFile.getPixel(0, 0) val pixelColor: Int = decodeFile.getPixel(0, 0)
val red = Color.red(pixelColor) val red = Color.red(pixelColor)
@ -84,6 +89,7 @@ class MyKeyboardView @JvmOverloads constructor(
} }
} }
init { init {
val default = val default =
ContextCompat.getDrawable(context, R.drawable.png_keybg) ContextCompat.getDrawable(context, R.drawable.png_keybg)
@ -103,60 +109,43 @@ class MyKeyboardView @JvmOverloads constructor(
fun updateConfig(con: Context) { fun updateConfig(con: Context) {
sp.getString(AppConstant.KEY_CUR_Skin_Number, "")?.let { skin_Number -> sp.getString(AppConstant.KEY_CUR_Skin_Number, "")?.let { skin_Number ->
val unzipPath = ZipTools.getUnzipPath(skin_Number)+"/" val unzipPath = ZipTools.getUnzipPath(skin_Number) + "/"
val style = sp.getInt(AppConstant.KEY_CUR_STYLE, 1) val style = sp.getInt(AppConstant.KEY_CUR_STYLE, 1)
Log.d(App.TAG,"------update="+ unzipPath.plus(AppConstant.getnormalBg(skin_Number,style))) Log.d(App.TAG, "------updateConfig----skin_Number = $skin_Number style=${style} ")
gettextcolornew(unzipPath.plus(AppConstant.getTextColor(skin_Number,style))) gettextcolornew(unzipPath.plus(AppConstant.getTextColor(skin_Number, style)))
getbgic( getbgic(
con, con,
unzipPath.plus(AppConstant.getnormalBg(skin_Number,style)) unzipPath.plus(AppConstant.getnormalBg(skin_Number, style))
)?.let { drawBG -> )?.let { drawBG ->
normalBackgroundDraw = getStatus(drawBG, drawBG) normalBackgroundDraw = getStatus(drawBG, drawBG)
} }
getbgic(con, unzipPath.plus(AppConstant.getSpaceBg(skin_Number)))?.let { drawBG -> getbgic(con, unzipPath.plus(AppConstant.getSpaceBg(skin_Number)))?.let { drawBG ->
spBackgroundDraw = getStatus(drawBG, drawBG) spBackgroundDraw = getStatus(drawBG, drawBG)
} }
sp.getString(AppConstant.KEY_CUR_Bg, "")?.run { sp.getString(AppConstant.KEY_CUR_Bg, "")?.run {
Glide.with(App.appContext).asDrawable().load(this).listener(object :RequestListener<Drawable>{ //file:///android_asset/Abstract/photo_24055_89_44_1654593252.png
override fun onLoadFailed( val replace = this.replace("file:///android_asset/", "")
e: GlideException?, val loadDrawableFromAsset = ZipTools.loadDrawableFromAsset(replace)
model: Any?, loadDrawableFromAsset?.let {
target: Target<Drawable>, allBg = it
isFirstResource: Boolean Log.d(App.TAG, "------updateConfig----allBg ")
): Boolean { }
return false
}
override fun onResourceReady(
resource: Drawable,
model: Any,
target: Target<Drawable>?,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
allBg = resource
return false
}
}).preload()
} }
// ok // ok
getbgic( getbgic(
con, con,
unzipPath.plus(AppConstant.getnormalBg(skin_Number,style)) unzipPath.plus(AppConstant.getnormalBg(skin_Number, style))
)?.let { drawBG -> )?.let { drawBG ->
functionBackgroundDraw = getStatus(drawBG, drawBG) functionBackgroundDraw = getStatus(drawBG, drawBG)
} }
// ok // ok
getbgic(con, unzipPath.plus(AppConstant.getCaps(skin_Number)))?.let { getbgic(con, unzipPath.plus(AppConstant.getCaps(skin_Number)))?.let {
icSshift = it icSshift = it
@ -176,6 +165,10 @@ class MyKeyboardView @JvmOverloads constructor(
icShittLock = it icShittLock = it
} }
getbgic(con, unzipPath.plus(AppConstant.getEnterIcon(skin_Number)))?.let {
icEnter = it
}
} }
} }
} }
@ -196,6 +189,7 @@ class MyKeyboardView @JvmOverloads constructor(
myKey: Keyboard.Key, myKey: Keyboard.Key,
keyBG: Drawable, keyBG: Drawable,
icon: Drawable?, icon: Drawable?,
customerLabel: String? = null,
canvas: Canvas, canvas: Canvas,
) { ) {
myKey.run { myKey.run {
@ -250,12 +244,20 @@ class MyKeyboardView @JvmOverloads constructor(
} }
myPaint.color = config.keycolor myPaint.color = config.keycolor
if (!label.isNullOrEmpty()) {
val y1 = y.plus(paddingRight).plus((height.div(2f))) val y1 = y.plus(paddingRight).plus((height.div(2f)))
.plus((myPaint.textSize.minus(myPaint.descent())).div(2f)) .plus((myPaint.textSize.minus(myPaint.descent())).div(2f))
val x1 = x.plus(paddingLeft).plus((width.div(2f))) val x1 = x.plus(paddingLeft).plus((width.div(2f)))
canvas.drawText(label.toString(), x1, y1, myPaint) customerLabel?.let {
myPaint.textSize = myContext.resources.displayMetrics.scaledDensity * 13f
canvas.drawText(it, x1, y1, myPaint)
}.run {
if (!label.isNullOrEmpty()) {
myPaint.textSize = myContext.resources.displayMetrics.scaledDensity * 16f
canvas.drawText(label.toString(), x1, y1, myPaint)
}
} }
} }
} }
@ -270,6 +272,7 @@ class MyKeyboardView @JvmOverloads constructor(
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
super.onDraw(canvas) super.onDraw(canvas)
keyboard.keys.forEach { keyboard.keys.forEach {
when (it.codes[0]) { when (it.codes[0]) {
Keyboard.KEYCODE_SHIFT -> { Keyboard.KEYCODE_SHIFT -> {
@ -277,45 +280,86 @@ class MyKeyboardView @JvmOverloads constructor(
it, it,
config.functionBackgroundDraw, config.functionBackgroundDraw,
getCurIc(), getCurIc(),
null,
canvas canvas
) )
} }
AppConstant.SHIFT_NUMBER, AppConstant.SHIFT_SYMBOL -> { AppConstant.SHIFT_NUMBER, AppConstant.SHIFT_SYMBOL -> {
andDraw(it, config.functionBackgroundDraw, null, canvas) andDraw(it, config.functionBackgroundDraw, null,null, canvas)
} }
Keyboard.KEYCODE_DELETE -> { Keyboard.KEYCODE_DELETE -> {
andDraw( andDraw(
it, it,
config.functionBackgroundDraw, config.functionBackgroundDraw,
config.icDel, config.icDel,null,
canvas canvas
) )
} }
Keyboard.KEYCODE_MODE_CHANGE, Keyboard.KEYCODE_DONE -> { Keyboard.KEYCODE_MODE_CHANGE -> {
andDraw( andDraw(
it, it,
config.functionBackgroundDraw, config.functionBackgroundDraw,
null, null,null,
canvas canvas
) )
} }
AppConstant.KEY_CODE_SPACE-> { AppConstant.KEY_CODE_SPACE -> {
andDraw(it, config.spBackgroundDraw, null, canvas) andDraw(it, config.spBackgroundDraw, null,null, canvas)
}
Keyboard.KEYCODE_DONE -> {
when (curimeAction) {
// EditorInfo.IME_ACTION_NONE -> {
// Log.d(App.TAG, "=======NONE")
// andDraw(it, config.functionBackgroundDraw, config.icEnter,null, canvas)
// }
// EditorInfo.IME_ACTION_GO -> {
//
// Log.d(App.TAG, "=======go")
// andDraw(it, config.functionBackgroundDraw,null,"Go", canvas)
// }
EditorInfo.IME_ACTION_SEARCH -> {
Log.d(App.TAG, "=======SEARCH")
andDraw(it, config.functionBackgroundDraw, null,"Search", canvas)
}
// EditorInfo.IME_ACTION_SEND -> {
// Log.d(App.TAG, "=======SEND")
// andDraw(it, config.functionBackgroundDraw,null,"Send", canvas)
// }
// EditorInfo.IME_ACTION_NEXT -> {
// Log.d(App.TAG, "=======NEXT")
// andDraw(it, config.functionBackgroundDraw,null,"Next", canvas)
// }
// EditorInfo.IME_ACTION_DONE -> {
// Log.d(App.TAG, "=======DONE")
// andDraw(it, config.functionBackgroundDraw,null,"Done", canvas)
// }
// EditorInfo.IME_ACTION_PREVIOUS -> {
// Log.d(App.TAG, "=======PREVIOUS")
// andDraw(it, config.functionBackgroundDraw,null,"Previous", canvas)
// }
else -> {
Log.d(App.TAG, "=======else")
andDraw(it, config.functionBackgroundDraw,null,"Done", canvas)
}
}
} }
else -> { else -> {
andDraw(it, config.normalBackgroundDraw, null, canvas) andDraw(it, config.normalBackgroundDraw, null, null,canvas)
} }
} }
} }
} }
fun upUi(con: Context) { fun upUi(con: Context, ime: Int) {
curimeAction = ime
config.updateConfig(con) config.updateConfig(con)
background = config.allBg background = config.allBg
invalidate() invalidate()

View File

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

View File

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

View File

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:strokeWidth="1"
android:pathData="M12,0.5L12,0.5A11.5,11.5 0,0 1,23.5 12L23.5,12A11.5,11.5 0,0 1,12 23.5L12,23.5A11.5,11.5 0,0 1,0.5 12L0.5,12A11.5,11.5 0,0 1,12 0.5z"
android:fillColor="#00000000"
android:strokeColor="#ffffff"/>
<path
android:pathData="M16.496,8.511C16.774,8.233 16.774,7.782 16.496,7.504C16.218,7.225 15.767,7.225 15.489,7.504L12,10.993L8.511,7.504C8.233,7.225 7.782,7.225 7.504,7.504C7.225,7.782 7.225,8.233 7.504,8.511L10.993,12L7.504,15.489C7.225,15.767 7.225,16.218 7.504,16.496C7.782,16.774 8.233,16.774 8.511,16.496L12,13.007L15.489,16.496C15.767,16.774 16.218,16.774 16.496,16.496C16.774,16.218 16.774,15.767 16.496,15.489L13.007,12L16.496,8.511Z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="14dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M810.7,213.3a42.7,42.7 0,0 1,42.4 37.7L853.3,256v274.3c0,79.3 -50.9,147.5 -120.5,152.1L725.3,682.7H273.7l97.8,97.8a42.7,42.7 0,0 1,-56.3 63.9l-4,-3.5 -170.7,-170.7a42.7,42.7 0,0 1,0 -60.3l170.7,-170.7a42.7,42.7 0,0 1,63.9 56.3l-3.5,4L273.7,597.3H725.3c19.6,0 39.9,-24.6 42.4,-59.9l0.3,-7.2V256a42.7,42.7 0,0 1,42.7 -42.7z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="14dp"
android:height="14dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M431.6,791c-209.4,0 -379.9,-170.5 -379.9,-379.9 0,-209.4 170.5,-379.9 379.9,-379.9s379.9,170.5 379.9,379.9c0,209.4 -170.5,379.9 -379.9,379.9zM431.6,97.8c-172.5,0 -313.3,140.3 -313.3,313.3 0,172.5 140.3,313.3 313.3,313.3 172.5,0 313.3,-140.3 313.3,-313.3 0,-172.5 -140.8,-313.3 -313.3,-313.3z"
android:fillColor="#ffffff"/>
<path
android:pathData="M676.9,660.5l278.5,278.5c12.8,12.8 12.8,34.3 0,47.1 -12.8,12.8 -34.3,12.8 -47.1,0L629.8,707.6c-12.8,-12.8 -12.8,-34.3 0,-47.1 12.8,-12.8 34.3,-12.8 47.1,0z"
android:fillColor="#ffffff"/>
</vector>

View File

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

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:endColor="@color/end_color"
android:startColor="@color/start_color" />
<corners android:radius="12dp" />
</shape>

View File

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

View File

@ -1,6 +0,0 @@
<?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="15dp" />
</shape>

View File

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

View File

@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="17dp"
android:viewportWidth="16"
android:viewportHeight="17">
<group>
<clip-path
android:pathData="M0,0.605h16v16h-16z"/>
<path
android:pathData="M4.641,8.509C4.348,8.217 3.873,8.217 3.581,8.509C3.288,8.802 3.288,9.276 3.581,9.568L6.665,12.648C6.811,12.794 7.003,12.868 7.195,12.868C7.387,12.868 7.579,12.794 7.725,12.648L14.781,5.602C15.073,5.31 15.073,4.836 14.781,4.544C14.488,4.251 14.013,4.251 13.72,4.544L7.195,11.061L4.641,8.509Z"
android:fillColor="#40C345"/>
<path
android:pathData="M15.94,7.776C15.907,7.463 15.627,7.235 15.313,7.267C15,7.3 14.772,7.58 14.804,7.893C14.828,8.128 14.841,8.367 14.841,8.606C14.841,12.377 11.768,15.446 7.991,15.446C4.214,15.446 1.142,12.377 1.142,8.606C1.142,4.834 4.214,1.765 7.991,1.765C9.339,1.765 10.642,2.155 11.761,2.894C12.025,3.067 12.379,2.995 12.552,2.732C12.726,2.469 12.654,2.116 12.391,1.942C11.085,1.081 9.563,0.625 7.991,0.625C3.585,0.625 0,4.205 0,8.606C0,13.006 3.585,16.586 7.991,16.586C12.397,16.586 15.982,13.006 15.982,8.606C15.982,8.328 15.968,8.049 15.94,7.776Z"
android:fillColor="#000000"/>
</group>
</vector>

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/bg_display"
tools:context=".ui.activity.DisplayActivity">
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="50dp" />
<ImageView
android:id="@+id/back"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_below="@id/view"
android:layout_marginStart="8dp"
android:padding="8dp"
android:src="@mipmap/icon_back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/back"
android:layout_alignBottom="@id/back"
android:layout_toEndOf="@id/back"
android:gravity="center"
android:text="@string/display"
android:id="@+id/tv"
android:textColor="@color/text_color"
android:textSize="19sp" />
<EditText
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="44dp"
android:layout_below="@id/back"
android:layout_marginStart="20dp"
android:layout_marginTop="50dp"
android:hint="@string/display_et"
android:layout_marginEnd="20dp"
android:textSize="14sp"
android:paddingStart="12dp"
android:textColorHint="@color/hint_text_color"
android:textColor="@color/hint_text_color"
android:background="@drawable/bg_edittext"
android:padding="2dp" />
</RelativeLayout>

View File

@ -11,7 +11,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
android:orientation="vertical" android:orientation="vertical"
tools:context=".ui.activity.SelectActivity"> tools:context=".ui.activity.ListActivity">
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
@ -102,11 +102,11 @@
android:layout_marginStart="70dp" android:layout_marginStart="70dp"
android:layout_marginTop="50dp" android:layout_marginTop="50dp"
android:layout_marginEnd="70dp" android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white" android:background="@drawable/selector_step"
android:gravity="center" android:gravity="center"
android:text="@string/download" android:text="@string/apply"
android:textColor="@color/white" android:textColor="@color/step_text_color"
android:textSize="14sp" /> android:textSize="19sp" />
</LinearLayout> </LinearLayout>

View File

@ -63,11 +63,11 @@
<TextView <TextView
android:id="@+id/setKeyboard_steps1" android:id="@+id/setKeyboard_steps1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="44dp" android:layout_height="68dp"
android:layout_marginStart="70dp" android:layout_marginStart="70dp"
android:layout_marginTop="70dp" android:layout_marginTop="70dp"
android:layout_marginEnd="70dp" android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white" android:background="@drawable/selector_step"
android:gravity="center" android:gravity="center"
android:text="@string/setKeyboard_steps1" android:text="@string/setKeyboard_steps1"
android:textColor="@color/white" android:textColor="@color/white"
@ -76,11 +76,11 @@
<TextView <TextView
android:id="@+id/setKeyboard_steps2" android:id="@+id/setKeyboard_steps2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="44dp" android:layout_height="68dp"
android:layout_marginStart="70dp" android:layout_marginStart="70dp"
android:layout_marginTop="30dp" android:layout_marginTop="24dp"
android:layout_marginEnd="70dp" android:layout_marginEnd="70dp"
android:background="@drawable/shape_r20_white" android:background="@drawable/selector_step"
android:gravity="center" android:gravity="center"
android:text="@string/setKeyboard_steps2" android:text="@string/setKeyboard_steps2"
android:textColor="@color/white" android:textColor="@color/white"

View File

@ -6,7 +6,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:background="@color/white" android:background="@color/white"
tools:context=".ui.activity.SelectActivity"> tools:context=".ui.activity.ListActivity">
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -0,0 +1,52 @@
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/close"
android:layout_width="34dp"
android:layout_height="34dp"
android:layout_alignEnd="@id/bg"
android:padding="5dp"
android:src="@drawable/dialog_close" />
<FrameLayout
android:id="@+id/bg"
android:layout_width="280dp"
android:layout_height="332dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:background="@mipmap/bg_recommend"
android:padding="27dp">
<ImageView
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="167dp"
android:layout_gravity="bottom"
android:scaleType="fitXY"
android:src="@mipmap/ic_launcher" />
</FrameLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="38dp"
android:layout_below="@id/bg"
android:id="@+id/tv_apply"
android:layout_centerHorizontal="true"
android:layout_marginTop="21dp"
android:background="@mipmap/bg_recommend_btn"
android:gravity="center"
android:paddingStart="25dp"
android:paddingEnd="25dp"
android:text="@string/apply_now"
android:textColor="@color/white" />
</RelativeLayout>
</FrameLayout>

View File

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/close"
android:layout_width="42dp"
android:layout_height="42dp"
android:layout_alignParentEnd="true"
android:layout_marginEnd="11dp"
android:padding="5dp"
android:src="@drawable/dialog_close" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/bell"
android:layout_marginTop="-55dp"
android:background="@mipmap/dialog_bg"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="65dp"
android:text="@string/active_keyboard"
android:textColor="@color/text_color"
android:textSize="20sp" />
<LinearLayout
android:id="@+id/setKeyboard_steps1"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginStart="22dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="22dp"
android:background="@drawable/selector_step"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_steps1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setKeyboard_steps1"
android:textColor="@color/step_text_color"
android:textIsSelectable="false"
android:textSize="16sp" />
<ImageView
android:id="@+id/im_ok_steps1"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@drawable/step_ok" />
</LinearLayout>
<LinearLayout
android:id="@+id/setKeyboard_steps2"
android:layout_width="match_parent"
android:layout_height="68dp"
android:layout_marginStart="22dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="22dp"
android:layout_marginBottom="60dp"
android:background="@drawable/selector_step"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_steps2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setKeyboard_steps2"
android:textColor="@color/step_text_color"
android:textSize="16sp" />
<ImageView
android:id="@+id/im_ok_steps2"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@drawable/step_ok" />
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/bell"
android:layout_width="wrap_content"
android:layout_height="93dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:src="@mipmap/im_bell" />
</RelativeLayout>
</FrameLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

View File

@ -11,4 +11,10 @@
<color name="white_card">#80FFFFFF</color> <color name="white_card">#80FFFFFF</color>
<color name="transparent">#00FFFFFF</color> <color name="transparent">#00FFFFFF</color>
<color name="color_00">#000000</color> <color name="color_00">#000000</color>
<color name="text_color">#333333</color>
<color name="start_color">#FFAE65</color>
<color name="end_color">#FC6409</color>
<color name="step_ok">#F7F9FC</color>
<color name="et_color">#FFF3E3</color>
<color name="hint_text_color">#F7931A</color>
</resources> </resources>

View File

@ -1,6 +1,6 @@
<resources> <resources>
<string name="app_name">Custom Keyboard</string> <string name="app_name">Custom Keyboard</string>
<string name="active_keyboard">Activate Custom Keyboard</string>
<string name="home">Home</string> <string name="home">Home</string>
<string name="setting">Setting</string> <string name="setting">Setting</string>
<string name="Collection">Collection</string> <string name="Collection">Collection</string>
@ -10,20 +10,25 @@
<string name="link">https://play.google.com/store/apps/details?id=</string> <string name="link">https://play.google.com/store/apps/details?id=</string>
<string name="enable">Enable Keyboard</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_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_steps1">Step 1: Select</string>
<string name="setKeyboard_steps2">Step 2: Enable Keyboard</string> <string name="setKeyboard_steps2">Step 2: Enable</string>
<string name="download">Download and Setting</string> <string name="apply">Apply</string>
<string name="applied">Applied</string>
<string name="apply_now">Apply Now</string>
<string name="download_title">Set this skin</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="unEnable">If the keyboard is not enabled, please set it in the settings</string>
<string name="succ_apply">Application successful</string> <string name="succ_apply">Application successful</string>
<string name="fail_apply">Application failed, please try again</string> <string name="fail_apply">Application failed, please try again</string>
<string name="reenter">Download failed, please re-enter this page</string> <string name="reenter">Download failed, please re-enter this page</string>
<string name="slect_key">Please select the following button background</string> <string name="slect_key">Please select the following button background</string>
<string name="display">Display</string>
<string name="display_et">Enter text to see the effect</string>
<string name="delete_res">skin_%s_delete_emoji.png</string> <string name="delete_res">skin_%s_delete_emoji.png</string>
<string name="caps_res">skin_%s_caps_enabled.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="caps_no_res">skin_%s_caps_disabled.png</string>
<string name="normal_res">skin_%s_style_%s_btn.9.png</string> <string name="normal_res">skin_%s_style_%s_btn.9.png</string>
<string name="enter_res">skin_%s_enter_ic.png</string>
<string name="space_res">skin_%s_space_arrows_shadows.9.png</string> <string name="space_res">skin_%s_space_arrows_shadows.9.png</string>
<string name="correct_text_color">skin_%s_style_%s_autocorrect_text_color.png</string> <string name="correct_text_color">skin_%s_style_%s_autocorrect_text_color.png</string>
<string name="empty_love">No data yet. Come add your favorite keyboard skins.</string> <string name="empty_love">No data yet. Come add your favorite keyboard skins.</string>

View File

@ -2,7 +2,8 @@
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Base.Theme.TimberKeyboardNew" parent="Theme.Material3.DayNight.NoActionBar"> <style name="Base.Theme.TimberKeyboardNew" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. --> <!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> --> <item name="colorPrimary">@color/white</item>
<item name="android:windowBackground">@color/white</item>
</style> </style>
<style name="Theme.TimberKeyboardNew" parent="Base.Theme.TimberKeyboardNew" /> <style name="Theme.TimberKeyboardNew" parent="Base.Theme.TimberKeyboardNew" />

View File

@ -144,8 +144,7 @@
<Key <Key
android:codes="-4" android:codes="-4"
android:keyWidth="14.25%" android:keyWidth="14.25%"
android:keyEdgeFlags="right" android:keyEdgeFlags="right" />
android:keyLabel="Search" />
</Row> </Row>
</Keyboard> </Keyboard>

View File

@ -141,7 +141,7 @@
<!--Done--> <!--Done-->
<Key <Key
android:codes="-4" android:codes="-4"
android:keyLabel="Search"
android:keyWidth="14.25%" android:keyWidth="14.25%"
android:keyEdgeFlags="right" /> android:keyEdgeFlags="right" />
</Row> </Row>

View File

@ -149,7 +149,7 @@
<!--Done--> <!--Done-->
<Key <Key
android:codes="-4" android:codes="-4"
android:keyLabel="Search"
android:keyWidth="14.25%" android:keyWidth="14.25%"
android:keyEdgeFlags="right" /> android:keyEdgeFlags="right" />
</Row> </Row>