Add private space support
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user