Skip to content

Commit

Permalink
refactor: clean up ShortcutUtils
Browse files Browse the repository at this point in the history
- Extract common parts
- Rename to `AppUtils`
  • Loading branch information
WhiredPlanck committed Dec 13, 2024
1 parent 1805d3c commit 00d2e0c
Show file tree
Hide file tree
Showing 10 changed files with 220 additions and 245 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ import com.osfans.trime.ime.broadcast.IntentReceiver
import com.osfans.trime.ime.composition.ComposingPopupWindow
import com.osfans.trime.ime.keyboard.InitializationUi
import com.osfans.trime.ime.keyboard.InputFeedbackManager
import com.osfans.trime.util.ShortcutUtils
import com.osfans.trime.util.findSectionFrom
import com.osfans.trime.util.forceShowSelf
import com.osfans.trime.util.isNightMode
Expand All @@ -67,6 +66,7 @@ import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.consumeEach
import kotlinx.coroutines.launch
import splitties.bitflags.hasFlag
import splitties.systemservices.clipboardManager
import splitties.systemservices.inputMethodManager
import timber.log.Timber
import java.util.Locale
Expand Down Expand Up @@ -262,10 +262,6 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
}
}

fun pasteByChar() {
commitTextByChar(checkNotNull(ShortcutUtils.pasteFromClipboard(this)).toString())
}

private fun setupInputViews(theme: Theme): InputView {
composingPopupWindow?.cancelJob()
val newInputView = InputView(this, rime, theme)
Expand Down Expand Up @@ -879,7 +875,8 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
val et = ic.getExtractedText(etr, 0)
if (et == null) {
Timber.d("hookKeyboard paste, et == null, try commitText")
if (ic.commitText(ShortcutUtils.pasteFromClipboard(this), 1)) {
val clipboardText = clipboardManager.primaryClip?.getItemAt(0)?.coerceToText(this)
if (ic.commitText(clipboardText, 1)) {
return true
}
} else if (ic.performContextMenuAction(android.R.id.paste)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package com.osfans.trime.ime.keyboard

import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.view.KeyEvent
import androidx.lifecycle.lifecycleScope
import com.osfans.trime.R
Expand All @@ -20,7 +21,6 @@ import com.osfans.trime.daemon.launchOnReady
import com.osfans.trime.data.prefs.AppPrefs
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.KeyActionManager
import com.osfans.trime.ime.core.InputView
import com.osfans.trime.ime.core.Speech
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.dependency.InputScope
Expand All @@ -34,11 +34,14 @@ import com.osfans.trime.ime.window.BoardWindowManager
import com.osfans.trime.ui.main.settings.ColorPickerDialog
import com.osfans.trime.ui.main.settings.KeySoundEffectPickerDialog
import com.osfans.trime.ui.main.settings.ThemePickerDialog
import com.osfans.trime.util.ShortcutUtils
import com.osfans.trime.util.ShortcutUtils.openCategory
import com.osfans.trime.util.AppUtils
import com.osfans.trime.util.buildIntentFromAction
import com.osfans.trime.util.buildIntentFromArgument
import com.osfans.trime.util.customFormatDateTime
import com.osfans.trime.util.isAsciiPrintable
import kotlinx.coroutines.launch
import me.tatarka.inject.annotations.Inject
import splitties.systemservices.clipboardManager
import splitties.systemservices.inputMethodManager
import timber.log.Timber

Expand Down Expand Up @@ -102,7 +105,7 @@ class CommonKeyboardActionListener(
showAvailableSchemaPicker()
}
setNegativeButton(R.string.set_ime) { _, _ ->
ShortcutUtils.launchMainActivity(context)
AppUtils.launchMainActivity(context)
}
}
}
Expand Down Expand Up @@ -195,13 +198,29 @@ class CommonKeyboardActionListener(
windowManager.attachWindow(KeyboardWindow)
}
}
"paste_by_char" -> service.pasteByChar()
"set_color_scheme" -> ColorManager.setColorScheme(arg)
else -> {
ShortcutUtils.call(service, action.command, arg)?.let {
"broadcast" -> service.sendBroadcast(Intent(arg))
"clipboard" -> {
clipboardManager.primaryClip?.getItemAt(0)?.coerceToText(service)?.let {
service.commitText(it)
}
}
"commit" -> service.commitText(arg)
"date" -> service.commitText(customFormatDateTime(arg))
"run" ->
service.startActivity(
buildIntentFromArgument(arg)?.apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
},
)
"share_text" -> service.shareText()
else -> {
service.startActivity(
buildIntentFromAction(action.command, arg)?.apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY
},
)
}
}
}
KeyEvent.KEYCODE_VOICE_ASSIST -> Speech(service).startListening() // Speech Recognition
Expand All @@ -211,7 +230,7 @@ class CommonKeyboardActionListener(
"color" -> showColorPicker()
"schema" -> showAvailableSchemaPicker()
"sound" -> showSoundEffectPicker()
else -> ShortcutUtils.launchMainActivity(service)
else -> AppUtils.launchMainActivity(service)
}
}
KeyEvent.KEYCODE_PROG_RED -> showColorPicker()
Expand Down Expand Up @@ -268,7 +287,7 @@ class CommonKeyboardActionListener(
Timber.d("handleKey: hook")
return@postRimeJob
}
if (context.openCategory(keyEventCode)) {
if (AppUtils.launchKeyCategory(service, keyEventCode)) {
Timber.d("handleKey: openCategory")
return@postRimeJob
}
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/osfans/trime/ime/symbol/DbAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.osfans.trime.data.db.DatabaseBean
import com.osfans.trime.data.db.DraftHelper
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.util.ShortcutUtils
import com.osfans.trime.util.AppUtils
import kotlinx.coroutines.launch

class DbAdapter(
Expand Down Expand Up @@ -65,7 +65,7 @@ class DbAdapter(
}

override fun onEdit(bean: DatabaseBean) {
bean.text?.let { ShortcutUtils.launchLiquidKeyboardEdit(ctx, type, bean.id, it) }
bean.text?.let { AppUtils.launchLiquidKeyboardEdit(ctx, type, bean.id, it) }
}

override fun onCollect(bean: DatabaseBean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import androidx.preference.Preference
import com.osfans.trime.R
import com.osfans.trime.ui.components.PaddingPreferenceFragment
import com.osfans.trime.ui.main.MainViewModel
import com.osfans.trime.util.AppUtils
import com.osfans.trime.util.Logcat
import com.osfans.trime.util.ShortcutUtils

class ToolkitFragment : PaddingPreferenceFragment() {
private val viewModel: MainViewModel by activityViewModels()
Expand All @@ -28,7 +28,7 @@ class ToolkitFragment : PaddingPreferenceFragment() {
setTitle(R.string.real_time_logs)
isIconSpaceReserved = false
setOnPreferenceClickListener {
ShortcutUtils.launchLogActivity(context)
AppUtils.launchLogActivity(context)
true
}
},
Expand Down
69 changes: 69 additions & 0 deletions app/src/main/java/com/osfans/trime/util/AppUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// SPDX-FileCopyrightText: 2015 - 2024 Rime community
//
// SPDX-License-Identifier: GPL-3.0-or-later

package com.osfans.trime.util

import android.content.Context
import android.content.Intent
import android.util.SparseArray
import android.view.KeyEvent
import com.osfans.trime.ime.symbol.SymbolBoardType
import com.osfans.trime.ui.main.LiquidKeyboardEditActivity
import com.osfans.trime.ui.main.LogActivity
import com.osfans.trime.ui.main.PrefMainActivity
import timber.log.Timber

object AppUtils {
private val applicationLaunchKeyCategories =
SparseArray<String>().apply {
append(KeyEvent.KEYCODE_EXPLORER, Intent.CATEGORY_APP_BROWSER)
append(KeyEvent.KEYCODE_ENVELOPE, Intent.CATEGORY_APP_EMAIL)
append(KeyEvent.KEYCODE_CONTACTS, Intent.CATEGORY_APP_CONTACTS)
append(KeyEvent.KEYCODE_CALENDAR, Intent.CATEGORY_APP_CALENDAR)
append(KeyEvent.KEYCODE_MUSIC, Intent.CATEGORY_APP_MUSIC)
append(KeyEvent.KEYCODE_CALCULATOR, Intent.CATEGORY_APP_CALCULATOR)
}

fun launchKeyCategory(
context: Context,
keyCode: Int,
): Boolean =
applicationLaunchKeyCategories[keyCode]?.let {
Timber.d("launchKeyCategory: $it")
try {
context.startActivity(
Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, it).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_NO_HISTORY)
},
)
true
} catch (_: Exception) {
false
}
} ?: false

fun launchMainActivity(context: Context) {
context.startActivity<PrefMainActivity> {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
}
}

fun launchLogActivity(context: Context) {
context.startActivity<LogActivity>()
}

fun launchLiquidKeyboardEdit(
context: Context,
type: SymbolBoardType,
id: Int,
text: String,
) {
context.startActivity<LiquidKeyboardEditActivity> {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
putExtra(LiquidKeyboardEditActivity.DB_BEAN_ID, id)
putExtra(LiquidKeyboardEditActivity.DB_BEAN_TEXT, text)
putExtra(LiquidKeyboardEditActivity.LIQUID_KEYBOARD_TYPE, type.name)
}
}
}
56 changes: 56 additions & 0 deletions app/src/main/java/com/osfans/trime/util/Datetime.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.osfans.trime.util

import android.icu.text.DateFormat
import android.icu.util.Calendar
import android.icu.util.ULocale
import android.os.Build
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.TimeZone

fun formatDateTime(timeMillis: Long? = null): String = SimpleDateFormat.getDateTimeInstance().format(timeMillis?.let { Date(it) } ?: Date())

private val iso8601DateFormat by lazy {
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply {
timeZone = TimeZone.getTimeZone("UTC")
}
}

fun iso8601UTCDateTime(timeMillis: Long? = null): String = iso8601DateFormat.format(timeMillis?.let { Date(it) } ?: Date())

fun customFormatDateTime(
pattern: String,
timeMillis: Long? = null,
): String {
val (locale, option) =
if ("@" in pattern) {
val parts = pattern.split(" ", limit = 2)
when (parts.size) {
2 -> if ("@" in parts[0]) parts[0] to parts[1] else parts[0] to ""
1 -> parts[0] to ""
else -> "" to ""
}
} else {
"" to pattern
}
val date = timeMillis?.let { Date(it) } ?: Date()
val loc = Locale(locale)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (option.isEmpty()) {
DateFormat.getDateInstance(DateFormat.LONG, loc).format(date)
} else {
val cal = Calendar.getInstance(ULocale(locale))
android.icu.text
.SimpleDateFormat(option, loc)
.format(cal)
}
} else {
SimpleDateFormat(option, loc).format(date)
}
}
41 changes: 41 additions & 0 deletions app/src/main/java/com/osfans/trime/util/Intent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.osfans.trime.util

import android.content.ComponentName
import android.content.Intent
import android.net.Uri

private const val ANDROID_INTENT_ACTION_PREFIX = "android.intent.action"

fun buildIntentFromArgument(argument: String): Intent? =
if (argument.contains(':')) { // URI
Intent.parseUri(argument, Intent.URI_INTENT_SCHEME)
} else if (argument.contains('/')) {
Intent(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_LAUNCHER)
component = ComponentName.unflattenFromString(argument)
}
} else {
appContext.packageManager.getLaunchIntentForPackage(argument) // Package name
}

fun buildIntentFromAction(
action: String,
argument: String = "",
): Intent? =
when (val fullAction = "$ANDROID_INTENT_ACTION_PREFIX.${action.uppercase()}") {
Intent.ACTION_WEB_SEARCH, Intent.ACTION_SEARCH -> {
buildIntentFromArgument(argument)
}
Intent.ACTION_SEND -> {
Intent(fullAction).apply {
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, argument)
}
}
else -> Intent(fullAction, Uri.parse(argument))
}
Loading

0 comments on commit 00d2e0c

Please sign in to comment.