Files
Android-key-of-love/app/src/main/java/com/example/myapplication/ImeGuideActivity.kt
2026-02-12 19:40:32 +08:00

236 lines
9.5 KiB
Kotlin

package com.example.myapplication
import android.content.ComponentName
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.inputmethod.InputMethodManager
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplication.network.BehaviorReporter
import com.example.myapplication.utils.ImeUtils
class ImeGuideActivity : AppCompatActivity() {
private val TAG = "ImeGuideActivity"
// 改成可空,避免 findViewById 返回 null 时直接 NPE
private var btnEnable: LinearLayout? = null
private var btnSelect: LinearLayout? = null
private var tvStep1Status: TextView? = null
private var tvStep2Status: TextView? = null
private var btnEnabledText: TextView? = null
private var btnSelectText: TextView? = null
private var btnEnabledimg: ImageView? = null
private var btnSelectimg: ImageView? = null
private var imeObserver: android.database.ContentObserver? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_ime_guide)
BehaviorReporter.report(
isNewUser = false,
"page_id" to "keyboard_permission_guide",
)
Log.d(TAG, "onCreate")
btnEnable = findViewById(R.id.enabled) // btn启用输入法
btnSelect = findViewById(R.id.select) // btn选择输入法
tvStep1Status = findViewById(R.id.Steps) // 第一步的提示
tvStep2Status = findViewById(R.id.stepTips) // 第二步的提示
btnEnabledText = findViewById(R.id.btnEnabledText) // 启用输入法按钮文字
btnSelectText = findViewById(R.id.btnSelectText) // 选择输入法按钮文字
btnEnabledimg = findViewById(R.id.btnEnabledimg) // 启用输入法按钮图片
btnSelectimg = findViewById(R.id.btnSelectimg) // 选择输入法按钮图片
}
override fun onResume() {
super.onResume()
try {
refreshStatus()
} catch (e: Exception) {
Log.e(TAG, "refreshStatus 崩了", e)
}
try {
registerImeObserver()
} catch (e: Exception) {
Log.e(TAG, "registerImeObserver 崩了", e)
}
}
override fun onPause() {
super.onPause()
try {
unregisterImeObserver()
} catch (e: Exception) {
Log.e(TAG, "unregisterImeObserver 崩了", e)
}
}
override fun onBackPressed() {
BehaviorReporter.report(
isNewUser = false,
"page_id" to "keyboard_permission_guide",
"element_id" to "close_btn",
)
super.onBackPressed()
}
private fun registerImeObserver() {
if (imeObserver != null) return
imeObserver = object : android.database.ContentObserver(
android.os.Handler(android.os.Looper.getMainLooper())
) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
try {
refreshStatus()
} catch (e: Exception) {
Log.e(TAG, "onChange -> refreshStatus 崩了", e)
}
}
}
try {
contentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD),
false,
imeObserver!!
)
} catch (e: SecurityException) {
// 部分 ROM/系统可能在这里抛异常
Log.e(TAG, "registerContentObserver SecurityException", e)
} catch (e: Exception) {
Log.e(TAG, "registerContentObserver 其他异常", e)
}
}
private fun unregisterImeObserver() {
imeObserver?.let {
try {
contentResolver.unregisterContentObserver(it)
} catch (e: Exception) {
Log.e(TAG, "unregisterContentObserver 异常", e)
}
}
imeObserver = null
}
/** 刷新步骤状态(是否启用/选择) */
private fun refreshStatus() {
val enabled = isImeEnabled()
val selected = isImeSelected()
// 把所有 view 拿成局部变量并判空,避免 NPE
val enableLayout = btnEnable
val selectLayout = btnSelect
val step1 = tvStep1Status
val step2 = tvStep2Status
val enableText = btnEnabledText
val selectText = btnSelectText
val enableImg = btnEnabledimg
val selectImg = btnSelectimg
if (enableLayout == null || selectLayout == null ||
step1 == null || step2 == null ||
enableText == null || selectText == null ||
enableImg == null || selectImg == null
) {
return
}
// 根据状态设置按钮的点击行为
if (enabled) {
// 输入法已启用时,禁用启用按钮的点击事件
enableLayout.setOnClickListener(null)
} else {
// 输入法未启用时,设置启用按钮的点击事件
enableLayout.setOnClickListener {
startActivity(Intent(Settings.ACTION_INPUT_METHOD_SETTINGS))
}
}
if (selected) {
// 输入法已切换时,禁用选择按钮的点击事件
selectLayout.setOnClickListener(null)
} else {
// 输入法未切换时,设置选择按钮的点击事件
selectLayout.setOnClickListener {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.showInputMethodPicker()
BehaviorReporter.report(
isNewUser = false,
"page_id" to "keyboard_permission_guide",
"element_id" to "open_settings_btn",
)
}
}
if (!enabled && !selected) {
enableLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_unfinished)
selectLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_completed)
enableText.setTextColor(Color.parseColor("#FFFFFF"))
selectText.setTextColor(Color.parseColor("#A1A1A1"))
enableImg.setImageResource(R.drawable.ime_guide_activity_btn_unfinished_img)
selectImg.setImageResource(R.drawable.ime_guide_activity_btn_unfinished_img)
step1.text = getString(R.string.imguide_text1_step1)
step2.text = getString(R.string.imguide_text2_step1)
selectLayout.setOnClickListener(null)
} else if (!enabled && selected) {
enableLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_unfinished)
selectLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_completed)
enableImg.setImageResource(R.drawable.ime_guide_activity_btn_unfinished_img)
selectImg.setImageResource(R.drawable.ime_guide_activity_btn_unfinished_img)
enableText.setTextColor(Color.parseColor("#FFFFFF"))
selectText.setTextColor(Color.parseColor("#A1A1A1"))
step1.text = getString(R.string.imguide_text1_step1)
step2.text = getString(R.string.imguide_text2_step1)
selectLayout.setOnClickListener(null)
} else if (enabled && !selected) {
enableLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_completed)
selectLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_unfinished)
enableImg.setImageResource(R.drawable.ime_guide_activity_btn_completed_img)
selectImg.setImageResource(R.drawable.ime_guide_activity_btn_unfinished_img)
enableText.setTextColor(Color.parseColor("#A1A1A1"))
selectText.setTextColor(Color.parseColor("#FFFFFF"))
step1.text =getString(R.string.imguide_text1_step2)
step2.text = getString(R.string.imguide_text2_step2)
} else if (enabled && selected) {
enableLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_completed)
selectLayout.background = getDrawable(R.drawable.ime_guide_activity_btn_completed)
enableImg.setImageResource(R.drawable.ime_guide_activity_btn_completed_img)
selectImg.setImageResource(R.drawable.ime_guide_activity_btn_completed_img)
enableText.setTextColor(Color.parseColor("#A1A1A1"))
selectText.setTextColor(Color.parseColor("#A1A1A1"))
step1.text =getString(R.string.imguide_text1_step3)
step2.text = getString(R.string.imguide_text2_step3)
BehaviorReporter.report(
isNewUser = false,
"page_id" to "keyboard_permission_guide",
"element_id" to "close_btn",
)
Toast.makeText(this, getString(R.string.imguide_text2_step3_hint), Toast.LENGTH_SHORT).show()
try {
startActivity(Intent(this, GuideActivity::class.java))
} catch (e: Exception) {
Log.e(TAG, "启动 GuideActivity 失败,检查是否在 Manifest 中声明", e)
}
finish()
}
}
private fun isImeEnabled(): Boolean = ImeUtils.isImeEnabled(this)
private fun isImeSelected(): Boolean = ImeUtils.isImeSelected(this)
}