LauncherIconHelp.kt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package io.legato.kazusa.help
  2. import android.content.ComponentName
  3. import android.content.pm.PackageManager
  4. import io.legato.kazusa.R
  5. import io.legato.kazusa.utils.toastOnUi
  6. import splitties.init.appCtx
  7. /**
  8. * Created by GKF on 2018/2/27.
  9. * 更换图标
  10. */
  11. object LauncherIconHelp {
  12. private val packageManager: PackageManager = appCtx.packageManager
  13. private val componentNames = arrayListOf(
  14. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcherw"),
  15. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher0"),
  16. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher1"),
  17. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher2"),
  18. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher3"),
  19. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher4"),
  20. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher5"),
  21. ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher6")
  22. )
  23. // 主Activity的ComponentName
  24. private val mainActivity = ComponentName(
  25. appCtx.packageName,
  26. "${appCtx.packageName}.ui.main.MainActivity"
  27. )
  28. fun changeIcon(icon: String?) {
  29. if (icon.isNullOrEmpty()) return
  30. try {
  31. // 首先禁用主Activity的启动器intent
  32. disableMainActivityLauncher()
  33. // 然后处理所有别名
  34. var matched = false
  35. componentNames.forEach {
  36. val aliasName = it.className.substringAfterLast(".")
  37. if (icon.equals(aliasName, ignoreCase = true)) {
  38. matched = true
  39. packageManager.setComponentEnabledSetting(
  40. it,
  41. PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
  42. PackageManager.DONT_KILL_APP
  43. )
  44. } else {
  45. packageManager.setComponentEnabledSetting(
  46. it,
  47. PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
  48. PackageManager.DONT_KILL_APP
  49. )
  50. }
  51. }
  52. if (!matched) {
  53. enableMainActivityLauncher()
  54. }
  55. // 通知用户图标已更改
  56. appCtx.toastOnUi(R.string.change_icon_success)
  57. } catch (e: Exception) {
  58. e.printStackTrace()
  59. appCtx.toastOnUi(R.string.change_icon_error)
  60. }
  61. }
  62. // 禁用主Activity的启动器功能
  63. private fun disableMainActivityLauncher() {
  64. try {
  65. // 获取当前组件状态
  66. val state = packageManager.getComponentEnabledSetting(mainActivity)
  67. // 如果已经禁用,不需要再次操作
  68. if (state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
  69. packageManager.setComponentEnabledSetting(
  70. mainActivity,
  71. PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
  72. PackageManager.DONT_KILL_APP
  73. )
  74. }
  75. } catch (e: Exception) {
  76. e.printStackTrace()
  77. }
  78. }
  79. // 启用主Activity的启动器功能
  80. private fun enableMainActivityLauncher() {
  81. try {
  82. // 获取当前组件状态
  83. val state = packageManager.getComponentEnabledSetting(mainActivity)
  84. // 如果已经启用,不需要再次操作
  85. if (state != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
  86. packageManager.setComponentEnabledSetting(
  87. mainActivity,
  88. PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
  89. PackageManager.DONT_KILL_APP
  90. )
  91. }
  92. } catch (e: Exception) {
  93. e.printStackTrace()
  94. }
  95. }
  96. }