fix: store activityName in AppInfo to support apps with multiple main activities

This commit is contained in:
Josia Pietsch 2024-09-25 21:33:50 +02:00
parent 525ffe6b53
commit a6c72f100a
Signed by: jrpie
GPG key ID: E70B571D66986A2D
5 changed files with 19 additions and 17 deletions

View file

@ -160,15 +160,8 @@ fun loadApps(packageManager: PackageManager, context: Context) {
// TODO: shortcuts - launcherApps.getShortcuts() // TODO: shortcuts - launcherApps.getShortcuts()
val users = userManager.userProfiles val users = userManager.userProfiles
for (user in users) { for (user in users) {
for (activityInfo in launcherApps.getActivityList(null, user)) { launcherApps.getActivityList(null, user).forEach {
val app = AppInfo(activityInfo.applicationInfo.packageName, user.hashCode()) loadList.add(DetailedAppInfo(it))
val detailedAppInfo = DetailedAppInfo(
app,
activityInfo.label,
activityInfo.getBadgedIcon(0),
activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0
)
loadList.add(detailedAppInfo)
} }
} }
@ -180,7 +173,7 @@ fun loadApps(packageManager: PackageManager, context: Context) {
i.addCategory(Intent.CATEGORY_LAUNCHER) i.addCategory(Intent.CATEGORY_LAUNCHER)
val allApps = packageManager.queryIntentActivities(i, 0) val allApps = packageManager.queryIntentActivities(i, 0)
for (ri in allApps) { for (ri in allApps) {
val app = AppInfo(ri.activityInfo.packageName, AppInfo.INVALID_USER) val app = AppInfo(ri.activityInfo.packageName, null, AppInfo.INVALID_USER)
val detailedAppInfo = DetailedAppInfo( val detailedAppInfo = DetailedAppInfo(
app, app,
ri.loadLabel(packageManager), ri.loadLabel(packageManager),

View file

@ -30,7 +30,9 @@ interface Action {
return LauncherAction.byId(id) return LauncherAction.byId(id)
} }
return AppAction(AppInfo(id, user ?: INVALID_USER)) val values = id.split(";")
return AppAction(AppInfo(values[0], values.getOrNull(1), user ?: INVALID_USER))
} }
fun forGesture(gesture: Gesture): Action? { fun forGesture(gesture: Gesture): Action? {

View file

@ -77,7 +77,7 @@ class AppAction(private var appInfo: AppInfo) : Action {
} }
override fun writeToIntent(intent: Intent) { override fun writeToIntent(intent: Intent) {
intent.putExtra("action_id", appInfo.packageName) intent.putExtra("action_id", "${appInfo.packageName};${appInfo.activityName}");
appInfo.user?.let { intent.putExtra("user", it) } appInfo.user?.let { intent.putExtra("user", it) }
} }
} }

View file

@ -10,16 +10,20 @@ import de.jrpie.android.launcher.getUserFromId
* Represents an app installed on the users device. * Represents an app installed on the users device.
* Contains the minimal amount of data required to identify the app. * Contains the minimal amount of data required to identify the app.
*/ */
class AppInfo(val packageName: CharSequence, val user: Int = INVALID_USER) { class AppInfo(val packageName: CharSequence, val activityName: CharSequence?, val user: Int = INVALID_USER) {
fun serialize(): String { fun serialize(): String {
val u = user val u = user
return "$packageName;$u" var ret = "$packageName;$u"
activityName?.let { ret += ";$activityName" }
return ret;
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if(other is AppInfo) { if(other is AppInfo) {
return other.user == user && other.packageName == packageName return other.user == user && other.packageName == packageName
&& other.activityName == activityName;
} }
return super.equals(other) return super.equals(other)
} }
@ -33,7 +37,9 @@ class AppInfo(val packageName: CharSequence, val user: Int = INVALID_USER) {
): LauncherActivityInfo? { ): LauncherActivityInfo? {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
return getUserFromId(user, context)?.let { userHandle -> return getUserFromId(user, context)?.let { userHandle ->
launcherApps.getActivityList(packageName.toString(), userHandle).firstOrNull() launcherApps.getActivityList(packageName.toString(), userHandle).firstOrNull { app ->
activityName == null || app.name == activityName
}
} }
} }
@ -45,7 +51,8 @@ class AppInfo(val packageName: CharSequence, val user: Int = INVALID_USER) {
val values = serialized.split(";") val values = serialized.split(";")
val packageName = values[0] val packageName = values[0]
val user = Integer.valueOf(values[1]) val user = Integer.valueOf(values[1])
return AppInfo(packageName, user) val activityName = values.getOrNull(2)
return AppInfo(packageName, activityName, user)
} }
} }
} }

View file

@ -16,7 +16,7 @@ class DetailedAppInfo(
) { ) {
constructor(activityInfo: LauncherActivityInfo) : this( constructor(activityInfo: LauncherActivityInfo) : this(
AppInfo(activityInfo.applicationInfo.packageName, activityInfo.user.hashCode()), AppInfo(activityInfo.applicationInfo.packageName, activityInfo.name, activityInfo.user.hashCode()),
activityInfo.label, activityInfo.label,
activityInfo.getBadgedIcon(0), activityInfo.getBadgedIcon(0),
activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0 activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0