diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index e155453f4f..5ad7fd9461 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -201,4 +201,5 @@
Lawnicons not installed.
Icons
Reset to default
+ Open external picker
diff --git a/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt b/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt
index c4645afd0a..c48fc7d9da 100644
--- a/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt
+++ b/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt
@@ -2,6 +2,7 @@ package app.lawnchair.icons
import android.content.ComponentName
import android.content.Context
+import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Resources
import android.content.res.XmlResourceParser
@@ -58,6 +59,13 @@ class CustomIconPack(context: Context, packPackageName: String) :
}
}
+ fun createFromExternalPicker(icon: Intent.ShortcutIconResource): IconPickerItem? {
+ val id = packResources.getIdentifier(icon.resourceName, null, null)
+ if (id == 0) return null
+ val simpleName = packResources.getResourceEntryName(id)
+ return IconPickerItem(packPackageName, simpleName, simpleName, IconType.Normal)
+ }
+
override fun loadInternal() {
val parseXml = getXml("appfilter") ?: return
val compStart = "ComponentInfo{"
diff --git a/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt
index 6acce98964..8b1e645cbb 100644
--- a/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt
+++ b/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt
@@ -1,7 +1,12 @@
package app.lawnchair.ui.preferences
+import android.content.Intent
+import android.content.pm.LauncherApps
import android.graphics.drawable.Drawable
+import android.os.Process
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
+import androidx.activity.compose.rememberLauncherForActivityResult
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
@@ -9,22 +14,24 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
+import androidx.compose.material.DropdownMenuItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
+import androidx.core.content.getSystemService
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavType
import androidx.navigation.navArgument
-import app.lawnchair.icons.IconPack
-import app.lawnchair.icons.IconPackProvider
-import app.lawnchair.icons.IconPickerItem
-import app.lawnchair.icons.filter
+import app.lawnchair.icons.*
+import app.lawnchair.ui.OverflowMenu
import app.lawnchair.ui.preferences.components.*
import app.lawnchair.ui.util.resultSender
+import com.android.launcher3.R
import com.google.accompanist.drawablepainter.rememberDrawablePainter
import com.google.accompanist.insets.ui.LocalScaffoldPadding
import com.google.accompanist.navigation.animation.composable
@@ -67,6 +74,18 @@ fun IconPickerPreference(packageName: String) {
var searchQuery by remember { mutableStateOf("") }
val onClickItem = resultSender()
+ val pickerComponent = remember {
+ val launcherApps = context.getSystemService()!!
+ launcherApps
+ .getActivityList(iconPack.packPackageName, Process.myUserHandle()).firstOrNull()?.componentName
+ }
+ val pickerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
+ val icon = it.data?.getParcelableExtra(
+ Intent.EXTRA_SHORTCUT_ICON_RESOURCE) ?: return@rememberLauncherForActivityResult
+ val entry = (iconPack as CustomIconPack).createFromExternalPicker(icon) ?: return@rememberLauncherForActivityResult
+ onClickItem(entry)
+ }
+
PreferenceSearchScaffold(
searchInput = {
SearchTextField(
@@ -76,7 +95,22 @@ fun IconPickerPreference(packageName: String) {
placeholder = { Text(iconPack.label) },
singleLine = true
)
- }
+ },
+ actions = {
+ if (pickerComponent != null) {
+ OverflowMenu {
+ DropdownMenuItem(onClick = {
+ val intent = Intent("com.novalauncher.THEME")
+ .addCategory("com.novalauncher.category.CUSTOM_ICON_PICKER")
+ .setComponent(pickerComponent)
+ pickerLauncher.launch(intent)
+ hideMenu()
+ }) {
+ Text(text = stringResource(id = R.string.icon_pack_external_picker))
+ }
+ }
+ }
+ },
) {
val scaffoldPadding = LocalScaffoldPadding.current
val innerPadding = remember { MutablePaddingValues() }