Add private space support

This commit is contained in:
MM20
2024-07-19 17:13:06 +02:00
parent 99c98e4127
commit 3993f9505c
11 changed files with 206 additions and 101 deletions
@@ -1647,4 +1647,38 @@ private val _Google = materialIcon("Icons.Rounded.Google") {
}
val Icons.Rounded.Google
get() = _Google
get() = _Google
private val _PrivateSpace = materialIcon("Icons.Rounded.PrivateSpace") {
materialPath {
moveTo(11.999784f, 1.9998779f)
lineTo(3.9997559f, 5.0002116f)
verticalLineToRelative(6.0895504f)
curveToRelative(0f, 5.049995f, 3.410033f, 9.760447f, 8.0000281f, 10.910446f)
curveToRelative(4.589996f, -1.149999f, 8.000029f, -5.860451f, 8.000029f, -10.910446f)
verticalLineTo(5.0002116f)
close()
moveToRelative(0f, 4.0002727f)
curveToRelative(1.929998f, 0f, 3.500045f, 1.5700466f, 3.500045f, 3.5000447f)
curveToRelative(0f, 1.5799987f, -1.05959f, 2.9098487f, -2.499589f, 3.3398477f)
verticalLineToRelative(2.160075f)
horizontalLineToRelative(1.999878f)
verticalLineToRelative(1.999878f)
horizontalLineTo(13.00024f)
verticalLineToRelative(0.999939f)
horizontalLineTo(10.999845f)
verticalLineTo(12.840043f)
curveTo(9.5598468f, 12.410044f, 8.5002563f, 11.090194f, 8.5002563f, 9.5001953f)
curveToRelative(0f, -1.9299981f, 1.5695297f, -3.5000447f, 3.4995277f, -3.5000447f)
close()
moveToRelative(0f, 1.9998779f)
curveToRelative(-0.827999f, 0f, -1.49965f, 0.6721676f, -1.49965f, 1.5001668f)
curveToRelative(0f, 0.8279987f, 0.671651f, 1.4996497f, 1.49965f, 1.4996497f)
curveToRelative(0.828f, 0f, 1.500167f, -0.671651f, 1.500167f, -1.4996497f)
curveToRelative(0f, -0.8279992f, -0.672167f, -1.5001668f, -1.500167f, -1.5001668f)
close()
}
}
val Icons.Rounded.PrivateSpace
get() = _PrivateSpace
@@ -682,6 +682,7 @@
<string name="icon_picker_filter_all_packs">All icon packs</string>
<string name="apps_profile_main">Personal</string>
<string name="apps_profile_work">Work</string>
<string name="apps_profile_private">Private space</string>
<string name="favorites">Favorites</string>
<string name="favorites_empty">Pinned and frequently used items will appear here</string>
<string name="favorites_empty_tag">There are no items with this tag</string>
@@ -18,7 +18,6 @@ import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.ktx.checkPermission
import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.plugin.contracts.PluginContract
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -65,7 +64,7 @@ enum class PermissionGroup {
Notifications,
AppShortcuts,
Accessibility,
HiddenProfiles,
ManageProfiles,
}
internal class PermissionsManagerImpl(
@@ -91,8 +90,8 @@ internal class PermissionsManagerImpl(
private val appShortcutsPermissionState = MutableStateFlow(
checkPermissionOnce(PermissionGroup.AppShortcuts)
)
private val hiddenProfilesPermissionState = MutableStateFlow(
checkPermissionOnce(PermissionGroup.HiddenProfiles)
private val mManageProfilesPermissionState = MutableStateFlow(
checkPermissionOnce(PermissionGroup.ManageProfiles)
)
override fun requestPermission(context: AppCompatActivity, permissionGroup: PermissionGroup) {
@@ -146,7 +145,7 @@ internal class PermissionsManagerImpl(
}
}
PermissionGroup.HiddenProfiles,
PermissionGroup.ManageProfiles,
PermissionGroup.AppShortcuts -> {
if (isAtLeastApiLevel(29)) {
val roleManager = context.getSystemService<RoleManager>()
@@ -201,7 +200,7 @@ internal class PermissionsManagerImpl(
context.getSystemService<LauncherApps>()?.hasShortcutHostPermission() == true
}
PermissionGroup.HiddenProfiles -> {
PermissionGroup.ManageProfiles -> {
if (isAtLeastApiLevel(29)) {
context.getSystemService<RoleManager>()?.isRoleHeld(RoleManager.ROLE_HOME) == true
} else false
@@ -222,7 +221,7 @@ internal class PermissionsManagerImpl(
PermissionGroup.Notifications -> notificationsPermissionState
PermissionGroup.AppShortcuts -> appShortcutsPermissionState
PermissionGroup.Accessibility -> accessibilityPermissionState
PermissionGroup.HiddenProfiles -> hiddenProfilesPermissionState
PermissionGroup.ManageProfiles -> mManageProfilesPermissionState
}
}
@@ -241,14 +240,14 @@ internal class PermissionsManagerImpl(
PermissionGroup.Notifications -> notificationsPermissionState.value = granted
PermissionGroup.AppShortcuts -> appShortcutsPermissionState.value = granted
PermissionGroup.Accessibility -> accessibilityPermissionState.value = granted
PermissionGroup.HiddenProfiles -> hiddenProfilesPermissionState.value = granted
PermissionGroup.ManageProfiles -> mManageProfilesPermissionState.value = granted
}
}
override fun onResume() {
externalStoragePermissionState.value = checkPermissionOnce(PermissionGroup.ExternalStorage)
appShortcutsPermissionState.value = checkPermissionOnce(PermissionGroup.AppShortcuts)
hiddenProfilesPermissionState.value = checkPermissionOnce(PermissionGroup.HiddenProfiles)
mManageProfilesPermissionState.value = checkPermissionOnce(PermissionGroup.ManageProfiles)
}
override fun reportNotificationListenerState(running: Boolean) {
@@ -8,13 +8,11 @@ import android.content.pm.LauncherApps
import android.os.Process
import android.os.UserHandle
import android.os.UserManager
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.content.getSystemService
import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.plugin.data.get
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -54,6 +52,10 @@ class ProfileManager(
}
}.shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)
val profiles: Flow<List<Profile>> = profileStates.map {
it.map { it.profile }
}.shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1)
init {
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
@@ -82,7 +84,7 @@ class ProfileManager(
)
scope.launch {
if (isAtLeastApiLevel(35)) {
permissionsManager.hasPermission(PermissionGroup.HiddenProfiles).collectLatest {
permissionsManager.hasPermission(PermissionGroup.ManageProfiles).collectLatest {
refreshProfiles()
}
} else {
@@ -108,7 +110,6 @@ class ProfileManager(
)
)
}
Log.d("MM20", "Profiles: $profiles")
profileStates.value = profiles
}
}
@@ -119,19 +120,16 @@ class ProfileManager(
}
}
fun getProfileState(profile: Profile): Flow<Profile.State?> {
fun getProfileState(profile: Profile?): Flow<Profile.State?> {
return profileStates.map { profiles ->
profiles.find { it.profile == profile }?.state
}
}
/**
* This only works when the launcher is installed in the primary profile.
*/
private fun getProfileType(userHandle: UserHandle): Profile.Type {
if (isAtLeastApiLevel(35)) {
val launcherUserInfo = launcherApps.getLauncherUserInfo(userHandle)
return when(launcherUserInfo?.userType) {
return when (launcherUserInfo?.userType) {
UserManager.USER_TYPE_PROFILE_PRIVATE -> Profile.Type.Private
UserManager.USER_TYPE_PROFILE_MANAGED -> Profile.Type.Work
else -> Profile.Type.Personal