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

View file

@ -30,7 +30,9 @@ interface Action {
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? {

View file

@ -77,7 +77,7 @@ class AppAction(private var appInfo: AppInfo) : Action {
}
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) }
}
}

View file

@ -10,16 +10,20 @@ import de.jrpie.android.launcher.getUserFromId
* Represents an app installed on the users device.
* 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 {
val u = user
return "$packageName;$u"
var ret = "$packageName;$u"
activityName?.let { ret += ";$activityName" }
return ret;
}
override fun equals(other: Any?): Boolean {
if(other is AppInfo) {
return other.user == user && other.packageName == packageName
&& other.activityName == activityName;
}
return super.equals(other)
}
@ -33,7 +37,9 @@ class AppInfo(val packageName: CharSequence, val user: Int = INVALID_USER) {
): LauncherActivityInfo? {
val launcherApps = context.getSystemService(Service.LAUNCHER_APPS_SERVICE) as LauncherApps
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 packageName = values[0]
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(
AppInfo(activityInfo.applicationInfo.packageName, activityInfo.user.hashCode()),
AppInfo(activityInfo.applicationInfo.packageName, activityInfo.name, activityInfo.user.hashCode()),
activityInfo.label,
activityInfo.getBadgedIcon(0),
activityInfo.applicationInfo.flags.and(ApplicationInfo.FLAG_SYSTEM) != 0