223 lines
9.8 KiB
Kotlin
223 lines
9.8 KiB
Kotlin
package com.simplemobiletools.keyboard.extensions
|
|
|
|
import android.app.KeyguardManager
|
|
import android.content.ClipboardManager
|
|
import android.content.Context
|
|
import android.graphics.Color
|
|
import android.os.IBinder
|
|
import android.os.UserManager
|
|
import android.view.*
|
|
import android.widget.TextView
|
|
import androidx.appcompat.app.AlertDialog
|
|
import androidx.core.content.res.ResourcesCompat
|
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
import com.simplemobiletools.commons.databinding.DialogTitleBinding
|
|
import com.simplemobiletools.commons.extensions.*
|
|
import com.simplemobiletools.commons.helpers.isNougatPlus
|
|
import com.simplemobiletools.commons.models.RadioItem
|
|
import com.simplemobiletools.commons.views.MyTextView
|
|
import com.simplemobiletools.keyboard.R
|
|
import com.simplemobiletools.keyboard.databases.ClipsDatabase
|
|
import com.simplemobiletools.keyboard.helpers.*
|
|
import com.simplemobiletools.keyboard.interfaces.ClipsDao
|
|
|
|
val Context.config: Config get() = Config.newInstance(applicationContext.safeStorageContext)
|
|
|
|
val Context.safeStorageContext: Context
|
|
get() = if (isNougatPlus() && isDeviceInDirectBootMode) {
|
|
createDeviceProtectedStorageContext()
|
|
} else {
|
|
this
|
|
}
|
|
|
|
val Context.isDeviceInDirectBootMode: Boolean
|
|
get() {
|
|
val userManager = getSystemService(Context.USER_SERVICE) as UserManager
|
|
return isNougatPlus() && !userManager.isUserUnlocked
|
|
}
|
|
|
|
val Context.isDeviceLocked: Boolean
|
|
get() {
|
|
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
|
return keyguardManager.isDeviceLocked || keyguardManager.isKeyguardLocked || isDeviceInDirectBootMode
|
|
}
|
|
|
|
val Context.clipsDB: ClipsDao
|
|
get() = ClipsDatabase.getInstance(applicationContext.safeStorageContext).ClipsDao()
|
|
|
|
fun Context.getCurrentClip(): String? {
|
|
val clipboardManager = (getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager)
|
|
return clipboardManager.primaryClip?.getItemAt(0)?.text?.toString()
|
|
}
|
|
|
|
fun Context.getStrokeColor(): Int {
|
|
return if (config.isUsingSystemTheme) {
|
|
if (isUsingSystemDarkTheme()) {
|
|
resources.getColor(R.color.md_grey_800, theme)
|
|
} else {
|
|
resources.getColor(R.color.md_grey_400, theme)
|
|
}
|
|
} else {
|
|
val lighterColor = safeStorageContext.getProperBackgroundColor().lightenColor()
|
|
if (lighterColor == Color.WHITE || lighterColor == Color.BLACK) {
|
|
resources.getColor(R.color.divider_grey, theme)
|
|
} else {
|
|
lighterColor
|
|
}
|
|
}
|
|
}
|
|
|
|
fun Context.getKeyboardDialogBuilder() = if (safeStorageContext.baseConfig.isUsingSystemTheme) {
|
|
MaterialAlertDialogBuilder(this, R.style.MyKeyboard_Alert)
|
|
} else {
|
|
AlertDialog.Builder(this, R.style.MyKeyboard_Alert)
|
|
}
|
|
|
|
fun Context.setupKeyboardDialogStuff(
|
|
windowToken: IBinder,
|
|
view: View,
|
|
dialog: AlertDialog.Builder,
|
|
titleId: Int = 0,
|
|
titleText: String = "",
|
|
cancelOnTouchOutside: Boolean = true,
|
|
callback: ((alertDialog: AlertDialog) -> Unit)? = null
|
|
) {
|
|
val textColor = getProperTextColor()
|
|
val backgroundColor = getProperBackgroundColor()
|
|
val primaryColor = getProperPrimaryColor()
|
|
if (view is ViewGroup) {
|
|
updateTextColors(view)
|
|
} else if (view is MyTextView) {
|
|
view.setColors(textColor, primaryColor, backgroundColor)
|
|
}
|
|
|
|
if (dialog is MaterialAlertDialogBuilder) {
|
|
dialog.create().apply {
|
|
if (titleId != 0) {
|
|
setTitle(titleId)
|
|
} else if (titleText.isNotEmpty()) {
|
|
setTitle(titleText)
|
|
}
|
|
|
|
val lp = window?.attributes
|
|
lp?.token = windowToken
|
|
lp?.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG
|
|
window?.attributes = lp
|
|
window?.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
|
|
|
|
setView(view)
|
|
setCancelable(cancelOnTouchOutside)
|
|
show()
|
|
|
|
val bgDrawable = when {
|
|
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(resources, R.drawable.black_dialog_background, theme)
|
|
baseConfig.isUsingSystemTheme -> ResourcesCompat.getDrawable(resources, R.drawable.dialog_you_background, theme)
|
|
else -> resources.getColoredDrawableWithColor(R.drawable.dialog_bg, baseConfig.backgroundColor)
|
|
}
|
|
|
|
window?.setBackgroundDrawable(bgDrawable)
|
|
callback?.invoke(this)
|
|
}
|
|
} else {
|
|
var title: TextView? = null
|
|
if (titleId != 0 || titleText.isNotEmpty()) {
|
|
title = DialogTitleBinding.inflate(LayoutInflater.from(this)).dialogTitleTextview.apply {
|
|
if (titleText.isNotEmpty()) {
|
|
text = titleText
|
|
} else {
|
|
setText(titleId)
|
|
}
|
|
setTextColor(textColor)
|
|
}
|
|
}
|
|
|
|
// if we use the same primary and background color, use the text color for dialog confirmation buttons
|
|
val dialogButtonColor = if (primaryColor == baseConfig.backgroundColor) {
|
|
textColor
|
|
} else {
|
|
primaryColor
|
|
}
|
|
|
|
dialog.create().apply {
|
|
setView(view)
|
|
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
|
setCustomTitle(title)
|
|
|
|
val lp = window?.attributes
|
|
lp?.token = windowToken
|
|
lp?.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG
|
|
window?.attributes = lp
|
|
window?.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
|
|
|
|
setCanceledOnTouchOutside(cancelOnTouchOutside)
|
|
show()
|
|
getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(dialogButtonColor)
|
|
getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(dialogButtonColor)
|
|
getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(dialogButtonColor)
|
|
|
|
val bgDrawable = when {
|
|
isBlackAndWhiteTheme() -> ResourcesCompat.getDrawable(resources, R.drawable.black_dialog_background, theme)
|
|
baseConfig.isUsingSystemTheme -> ResourcesCompat.getDrawable(resources, R.drawable.dialog_you_background, theme)
|
|
else -> resources.getColoredDrawableWithColor(R.drawable.dialog_bg, baseConfig.backgroundColor)
|
|
}
|
|
|
|
window?.setBackgroundDrawable(bgDrawable)
|
|
callback?.invoke(this)
|
|
}
|
|
}
|
|
}
|
|
|
|
fun Context.getKeyboardLanguages(): ArrayList<RadioItem> {
|
|
return arrayListOf(
|
|
RadioItem(LANGUAGE_BENGALI, getKeyboardLanguageText(LANGUAGE_BENGALI)),
|
|
RadioItem(LANGUAGE_BULGARIAN, getKeyboardLanguageText(LANGUAGE_BULGARIAN)),
|
|
RadioItem(LANGUAGE_DANISH, getKeyboardLanguageText(LANGUAGE_DANISH)),
|
|
RadioItem(LANGUAGE_ENGLISH_QWERTY, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTY)),
|
|
RadioItem(LANGUAGE_ENGLISH_QWERTZ, getKeyboardLanguageText(LANGUAGE_ENGLISH_QWERTZ)),
|
|
RadioItem(LANGUAGE_ENGLISH_DVORAK, getKeyboardLanguageText(LANGUAGE_ENGLISH_DVORAK)),
|
|
RadioItem(LANGUAGE_FRENCH_AZERTY, getKeyboardLanguageText(LANGUAGE_FRENCH_AZERTY)),
|
|
RadioItem(LANGUAGE_FRENCH_BEPO, getKeyboardLanguageText(LANGUAGE_FRENCH_BEPO)),
|
|
RadioItem(LANGUAGE_GERMAN, getKeyboardLanguageText(LANGUAGE_GERMAN)),
|
|
RadioItem(LANGUAGE_GREEK, getKeyboardLanguageText(LANGUAGE_GREEK)),
|
|
RadioItem(LANGUAGE_LITHUANIAN, getKeyboardLanguageText(LANGUAGE_LITHUANIAN)),
|
|
RadioItem(LANGUAGE_NORWEGIAN, getKeyboardLanguageText(LANGUAGE_NORWEGIAN)),
|
|
RadioItem(LANGUAGE_POLISH, getKeyboardLanguageText(LANGUAGE_POLISH)),
|
|
RadioItem(LANGUAGE_ROMANIAN, getKeyboardLanguageText(LANGUAGE_ROMANIAN)),
|
|
RadioItem(LANGUAGE_RUSSIAN, getKeyboardLanguageText(LANGUAGE_RUSSIAN)),
|
|
RadioItem(LANGUAGE_SLOVENIAN, getKeyboardLanguageText(LANGUAGE_SLOVENIAN)),
|
|
RadioItem(LANGUAGE_SPANISH, getKeyboardLanguageText(LANGUAGE_SPANISH)),
|
|
RadioItem(LANGUAGE_SWEDISH, getKeyboardLanguageText(LANGUAGE_SWEDISH)),
|
|
RadioItem(LANGUAGE_TURKISH_Q, getKeyboardLanguageText(LANGUAGE_TURKISH_Q)),
|
|
RadioItem(LANGUAGE_UKRAINIAN, getKeyboardLanguageText(LANGUAGE_UKRAINIAN)),
|
|
RadioItem(LANGUAGE_VIETNAMESE_TELEX, getKeyboardLanguageText(LANGUAGE_VIETNAMESE_TELEX)),
|
|
)
|
|
}
|
|
|
|
fun Context.getKeyboardLanguageText(language: Int): String {
|
|
return when (language) {
|
|
LANGUAGE_BENGALI -> getString(R.string.translation_bengali)
|
|
LANGUAGE_BULGARIAN -> getString(R.string.translation_bulgarian)
|
|
LANGUAGE_DANISH -> getString(R.string.translation_danish)
|
|
LANGUAGE_ENGLISH_DVORAK -> "${getString(R.string.translation_english)} (DVORAK)"
|
|
LANGUAGE_ENGLISH_QWERTZ -> "${getString(R.string.translation_english)} (QWERTZ)"
|
|
LANGUAGE_FRENCH_AZERTY -> "${getString(R.string.translation_french)} (AZERTY)"
|
|
LANGUAGE_FRENCH_BEPO -> "${getString(R.string.translation_french)} (BEPO)"
|
|
LANGUAGE_GERMAN -> getString(R.string.translation_german)
|
|
LANGUAGE_GREEK -> getString(R.string.translation_greek)
|
|
LANGUAGE_LITHUANIAN -> getString(R.string.translation_lithuanian)
|
|
LANGUAGE_NORWEGIAN -> getString(R.string.translation_norwegian)
|
|
LANGUAGE_POLISH -> getString(R.string.translation_polish)
|
|
LANGUAGE_ROMANIAN -> getString(R.string.translation_romanian)
|
|
LANGUAGE_RUSSIAN -> getString(R.string.translation_russian)
|
|
LANGUAGE_SLOVENIAN -> getString(R.string.translation_slovenian)
|
|
LANGUAGE_SPANISH -> getString(R.string.translation_spanish)
|
|
LANGUAGE_SWEDISH -> getString(R.string.translation_swedish)
|
|
LANGUAGE_TURKISH_Q -> "${getString(R.string.translation_turkish)} (Q)"
|
|
LANGUAGE_UKRAINIAN -> getString(R.string.translation_ukrainian)
|
|
LANGUAGE_VIETNAMESE_TELEX -> "${getString(R.string.translation_vietnamese)} (Telex)"
|
|
else -> "${getString(R.string.translation_english)} (QWERTY)"
|
|
}
|
|
}
|
|
|
|
|