From 457d950006f8cdbe5812abe4bde5c6da9a011cc7 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Fri, 19 Apr 2024 23:08:10 +0200 Subject: [PATCH] Add share search action --- .../ui/component/SearchActionIcon.kt | 5 +++- core/i18n/src/main/res/values/strings.xml | 1 + .../searchactions/SearchActionRepository.kt | 3 +++ .../searchactions/actions/SearchAction.kt | 5 ++-- .../searchactions/actions/ShareAction.kt | 25 +++++++++++++++++ .../builders/SearchActionBuilder.kt | 1 + .../builders/ShareActionBuilder.kt | 27 +++++++++++++++++++ .../builders/WebsearchActionBuilder.kt | 2 +- 8 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/ShareAction.kt create mode 100644 data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/ShareActionBuilder.kt diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/component/SearchActionIcon.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/component/SearchActionIcon.kt index c50fd996..a7d51964 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/component/SearchActionIcon.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/component/SearchActionIcon.kt @@ -5,6 +5,7 @@ import android.content.pm.PackageManager import android.graphics.drawable.Drawable import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.rounded.StickyNote2 import androidx.compose.material.icons.rounded.Alarm import androidx.compose.material.icons.rounded.Call import androidx.compose.material.icons.rounded.Email @@ -24,6 +25,7 @@ import androidx.compose.material.icons.rounded.PersonSearch import androidx.compose.material.icons.rounded.Place import androidx.compose.material.icons.rounded.QueryStats import androidx.compose.material.icons.rounded.Search +import androidx.compose.material.icons.rounded.Share import androidx.compose.material.icons.rounded.Sms import androidx.compose.material.icons.rounded.SportsEsports import androidx.compose.material.icons.rounded.StickyNote2 @@ -151,6 +153,7 @@ fun getSearchActionIconVector(icon: SearchActionIcon): ImageVector { SearchActionIcon.Movie -> Icons.Rounded.Movie SearchActionIcon.Music -> Icons.Rounded.MusicNote SearchActionIcon.Game -> Icons.Rounded.SportsEsports - SearchActionIcon.Note -> Icons.Rounded.StickyNote2 + SearchActionIcon.Note -> Icons.AutoMirrored.Rounded.StickyNote2 + SearchActionIcon.Share -> Icons.Rounded.Share } } \ No newline at end of file diff --git a/core/i18n/src/main/res/values/strings.xml b/core/i18n/src/main/res/values/strings.xml index b6f9c964..f06964d9 100644 --- a/core/i18n/src/main/res/values/strings.xml +++ b/core/i18n/src/main/res/values/strings.xml @@ -766,6 +766,7 @@ Email Set alarm Start timer + Share Web search Add to contacts View website diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/SearchActionRepository.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/SearchActionRepository.kt index 16e69904..4406ba6e 100644 --- a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/SearchActionRepository.kt +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/SearchActionRepository.kt @@ -6,6 +6,7 @@ import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.database.AppDatabase import de.mm20.launcher2.database.entities.SearchActionEntity import de.mm20.launcher2.ktx.jsonObjectOf +import de.mm20.launcher2.searchactions.actions.ShareAction import de.mm20.launcher2.searchactions.builders.CallActionBuilder import de.mm20.launcher2.searchactions.builders.CreateContactActionBuilder import de.mm20.launcher2.searchactions.builders.EmailActionBuilder @@ -14,6 +15,7 @@ import de.mm20.launcher2.searchactions.builders.OpenUrlActionBuilder import de.mm20.launcher2.searchactions.builders.ScheduleEventActionBuilder import de.mm20.launcher2.searchactions.builders.SearchActionBuilder import de.mm20.launcher2.searchactions.builders.SetAlarmActionBuilder +import de.mm20.launcher2.searchactions.builders.ShareActionBuilder import de.mm20.launcher2.searchactions.builders.TimerActionBuilder import de.mm20.launcher2.searchactions.builders.WebsearchActionBuilder import kotlinx.coroutines.CoroutineScope @@ -58,6 +60,7 @@ internal class SearchActionRepositoryImpl( TimerActionBuilder(context), OpenUrlActionBuilder(context), WebsearchActionBuilder(context), + ShareActionBuilder(context), ) return allActions diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/SearchAction.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/SearchAction.kt index 0a633e2d..3b2719d6 100644 --- a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/SearchAction.kt +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/SearchAction.kt @@ -33,13 +33,14 @@ enum class SearchActionIcon(private val value: Int) { Movie(18), Music(19), Game(20), - Note(21); + Note(21), + Share(22); fun toInt(): Int { return value } companion object { fun fromInt(value: Int?): SearchActionIcon { - return values().firstOrNull { it.value == value } ?: Search + return entries.firstOrNull { it.value == value } ?: Search } } } \ No newline at end of file diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/ShareAction.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/ShareAction.kt new file mode 100644 index 00000000..b81c0331 --- /dev/null +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/actions/ShareAction.kt @@ -0,0 +1,25 @@ +package de.mm20.launcher2.searchactions.actions + +import android.content.Context +import android.content.Intent +import de.mm20.launcher2.ktx.tryStartActivity + +data class ShareAction( + override val label: String, + val text: String, +) : SearchAction { + override val icon: SearchActionIcon = SearchActionIcon.Share + override val iconColor: Int = 0 + override val customIcon: String? = null + + override fun start(context: Context) { + val intent = Intent.createChooser( + Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, text) + }, + null + ) + context.tryStartActivity(intent) + } +} diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/SearchActionBuilder.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/SearchActionBuilder.kt index 9146b5bd..bc1d5296 100644 --- a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/SearchActionBuilder.kt +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/SearchActionBuilder.kt @@ -69,6 +69,7 @@ interface SearchActionBuilder { "calendar" -> return ScheduleEventActionBuilder(context) "website" -> return OpenUrlActionBuilder(context) "websearch" -> return WebsearchActionBuilder(context) + "share" -> return ShareActionBuilder(context) else -> return null } } diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/ShareActionBuilder.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/ShareActionBuilder.kt new file mode 100644 index 00000000..e6b9e372 --- /dev/null +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/ShareActionBuilder.kt @@ -0,0 +1,27 @@ +package de.mm20.launcher2.searchactions.builders + +import android.content.Context +import de.mm20.launcher2.searchactions.R +import de.mm20.launcher2.searchactions.TextClassificationResult +import de.mm20.launcher2.searchactions.actions.SearchAction +import de.mm20.launcher2.searchactions.actions.SearchActionIcon +import de.mm20.launcher2.searchactions.actions.ShareAction + +class ShareActionBuilder( + override val label: String, +) : SearchActionBuilder { + + constructor(context: Context) : this(context.getString(R.string.search_action_share)) + + override val key: String + get() = "share" + + override val icon: SearchActionIcon = SearchActionIcon.Share + + override fun build(context: Context, classifiedQuery: TextClassificationResult): SearchAction? { + return ShareAction( + context.getString(R.string.search_action_share), + classifiedQuery.text + ) + } +} \ No newline at end of file diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/WebsearchActionBuilder.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/WebsearchActionBuilder.kt index dab35770..92f0fb20 100644 --- a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/WebsearchActionBuilder.kt +++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/WebsearchActionBuilder.kt @@ -17,7 +17,7 @@ class WebsearchActionBuilder( override val key: String get() = "websearch" - override fun build(context: Context, classifiedQuery: TextClassificationResult): SearchAction? { + override fun build(context: Context, classifiedQuery: TextClassificationResult): SearchAction { return WebsearchAction( context.getString(R.string.search_action_websearch), classifiedQuery.text )