更换图标处理逻辑 #168
This commit is contained in:
3 files changed
+87
-122
No files matched your search
@@ -34,100 +34,92 @@
|
|||||||
android:theme="@style/Base.AppTheme"
|
android:theme="@style/Base.AppTheme"
|
||||||
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
|
tools:ignore="AllowBackup,GoogleAppIndexingWarning,UnusedAttribute">
|
||||||
<!-- 图标0 -->
|
<!-- 图标0 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcherw"
|
android:name=".ui.main.LauncherW"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcherw"
|
android:icon="@mipmap/launcherw">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher0"
|
android:name=".ui.main.Launcher1"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher0"
|
android:icon="@mipmap/launcher0">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标1 -->
|
<!-- 图标1 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher1"
|
android:name=".ui.main.Launcher2"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher1"
|
android:icon="@mipmap/launcher1">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标2 -->
|
<!-- 图标2 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher2"
|
android:name=".ui.main.Launcher3"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher2"
|
android:icon="@mipmap/launcher2">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标3 -->
|
<!-- 图标3 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher3"
|
android:name=".ui.main.Launcher4"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher3"
|
android:icon="@mipmap/launcher3">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标4 -->
|
<!-- 图标4 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher4"
|
android:name=".ui.main.Launcher5"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher4"
|
android:icon="@mipmap/launcher4">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标5 -->
|
<!-- 图标5 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher5"
|
android:name=".ui.main.Launcher6"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher5"
|
android:icon="@mipmap/launcher5">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 图标6 -->
|
<!-- 图标6 -->
|
||||||
<activity-alias
|
<activity
|
||||||
android:name=".Launcher6"
|
android:name=".ui.main.Launcher7"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:icon="@mipmap/launcher6"
|
android:icon="@mipmap/launcher6">
|
||||||
android:targetActivity=".ui.main.MainActivity">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity-alias>
|
</activity>
|
||||||
<!-- 主界面 -->
|
<!-- 主界面 -->
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.main.MainActivity"
|
android:name=".ui.main.MainActivity"
|
||||||
|
|||||||
@@ -2,7 +2,18 @@ package io.legado.app.help
|
|||||||
|
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Build
|
||||||
import io.legado.app.R
|
import io.legado.app.R
|
||||||
|
import io.legado.app.ui.main.Launcher1
|
||||||
|
import io.legado.app.ui.main.Launcher2
|
||||||
|
import io.legado.app.ui.main.Launcher3
|
||||||
|
import io.legado.app.ui.main.Launcher4
|
||||||
|
import io.legado.app.ui.main.Launcher5
|
||||||
|
import io.legado.app.ui.main.Launcher6
|
||||||
|
import io.legado.app.ui.main.Launcher7
|
||||||
|
import io.legado.app.ui.main.LauncherW
|
||||||
|
import io.legado.app.ui.main.MainActivity
|
||||||
|
import io.legado.app.ui.welcome.WelcomeActivity
|
||||||
import io.legado.app.utils.toastOnUi
|
import io.legado.app.utils.toastOnUi
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
|
|
||||||
@@ -13,97 +24,50 @@ import splitties.init.appCtx
|
|||||||
object LauncherIconHelp {
|
object LauncherIconHelp {
|
||||||
private val packageManager: PackageManager = appCtx.packageManager
|
private val packageManager: PackageManager = appCtx.packageManager
|
||||||
private val componentNames = arrayListOf(
|
private val componentNames = arrayListOf(
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcherw"),
|
ComponentName(appCtx, LauncherW::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher0"),
|
ComponentName(appCtx, Launcher1::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher1"),
|
ComponentName(appCtx, Launcher2::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher2"),
|
ComponentName(appCtx, Launcher3::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher3"),
|
ComponentName(appCtx, Launcher4::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher4"),
|
ComponentName(appCtx, Launcher5::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher5"),
|
ComponentName(appCtx, Launcher6::class.java.name),
|
||||||
ComponentName(appCtx.packageName, "${appCtx.packageName}.Launcher6")
|
ComponentName(appCtx, Launcher7::class.java.name)
|
||||||
)
|
|
||||||
|
|
||||||
// 主Activity的ComponentName
|
|
||||||
private val mainActivity = ComponentName(
|
|
||||||
appCtx.packageName,
|
|
||||||
"${appCtx.packageName}.ui.main.MainActivity"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
fun changeIcon(icon: String?) {
|
fun changeIcon(icon: String?) {
|
||||||
if (icon.isNullOrEmpty()) return
|
if (icon.isNullOrEmpty()) return
|
||||||
|
var hasEnabled = false
|
||||||
try {
|
componentNames.forEach {
|
||||||
// 首先禁用主Activity的启动器intent
|
if (icon.equals(it.className.substringAfterLast("."), true)) {
|
||||||
disableMainActivityLauncher()
|
hasEnabled = true
|
||||||
|
//启用
|
||||||
// 然后处理所有别名
|
|
||||||
var matched = false
|
|
||||||
componentNames.forEach {
|
|
||||||
val aliasName = it.className.substringAfterLast(".")
|
|
||||||
if (icon.equals(aliasName, ignoreCase = true)) {
|
|
||||||
matched = true
|
|
||||||
packageManager.setComponentEnabledSetting(
|
|
||||||
it,
|
|
||||||
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
|
||||||
PackageManager.DONT_KILL_APP
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
packageManager.setComponentEnabledSetting(
|
|
||||||
it,
|
|
||||||
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
|
||||||
PackageManager.DONT_KILL_APP
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!matched) {
|
|
||||||
enableMainActivityLauncher()
|
|
||||||
}
|
|
||||||
|
|
||||||
// 通知用户图标已更改
|
|
||||||
appCtx.toastOnUi(R.string.change_icon_success)
|
|
||||||
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
appCtx.toastOnUi(R.string.change_icon_error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 禁用主Activity的启动器功能
|
|
||||||
private fun disableMainActivityLauncher() {
|
|
||||||
try {
|
|
||||||
// 获取当前组件状态
|
|
||||||
val state = packageManager.getComponentEnabledSetting(mainActivity)
|
|
||||||
|
|
||||||
// 如果已经禁用,不需要再次操作
|
|
||||||
if (state != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
|
|
||||||
packageManager.setComponentEnabledSetting(
|
packageManager.setComponentEnabledSetting(
|
||||||
mainActivity,
|
it,
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
//禁用
|
||||||
|
packageManager.setComponentEnabledSetting(
|
||||||
|
it,
|
||||||
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||||
PackageManager.DONT_KILL_APP
|
PackageManager.DONT_KILL_APP
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
}
|
||||||
e.printStackTrace()
|
if (hasEnabled) {
|
||||||
|
packageManager.setComponentEnabledSetting(
|
||||||
|
ComponentName(appCtx, MainActivity::class.java.name),
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
packageManager.setComponentEnabledSetting(
|
||||||
|
ComponentName(appCtx, MainActivity::class.java.name),
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启用主Activity的启动器功能
|
|
||||||
private fun enableMainActivityLauncher() {
|
|
||||||
try {
|
|
||||||
// 获取当前组件状态
|
|
||||||
val state = packageManager.getComponentEnabledSetting(mainActivity)
|
|
||||||
|
|
||||||
// 如果已经启用,不需要再次操作
|
|
||||||
if (state != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
|
|
||||||
packageManager.setComponentEnabledSetting(
|
|
||||||
mainActivity,
|
|
||||||
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
|
|
||||||
PackageManager.DONT_KILL_APP
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ import kotlin.coroutines.suspendCoroutine
|
|||||||
/**
|
/**
|
||||||
* 主界面
|
* 主界面
|
||||||
*/
|
*/
|
||||||
class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
||||||
BottomNavigationView.OnNavigationItemSelectedListener,
|
BottomNavigationView.OnNavigationItemSelectedListener,
|
||||||
BottomNavigationView.OnNavigationItemReselectedListener {
|
BottomNavigationView.OnNavigationItemReselectedListener {
|
||||||
|
|
||||||
@@ -551,4 +551,13 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class LauncherW : MainActivity()
|
||||||
|
class Launcher1 : MainActivity()
|
||||||
|
class Launcher2 : MainActivity()
|
||||||
|
class Launcher3 : MainActivity()
|
||||||
|
class Launcher4 : MainActivity()
|
||||||
|
class Launcher5 : MainActivity()
|
||||||
|
class Launcher6 : MainActivity()
|
||||||
|
class Launcher7 : MainActivity()
|
||||||
|
|
||||||
|
|
||||||
Reference in new issue
Block a user