diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
index af53fa5d3c3a..b4641ef2e700 100644
--- a/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
+++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
@@ -90,6 +90,7 @@ import com.duckduckgo.common.ui.viewbinding.viewBinding
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.common.utils.playstore.PlayStoreUtils
import com.duckduckgo.di.scopes.ActivityScope
+import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.navigation.api.GlobalActivityStarter
import com.duckduckgo.savedsites.impl.bookmarks.BookmarksActivity.Companion.SAVED_SITE_URL_EXTRA
import com.duckduckgo.site.permissions.impl.ui.SitePermissionScreenNoParams
@@ -156,6 +157,9 @@ open class BrowserActivity : DuckDuckGoActivity() {
@Inject
lateinit var tabManager: TabManager
+ @Inject
+ lateinit var duckChat: DuckChat
+
private val lastActiveTabs = TabList()
private var _currentTab: BrowserTabFragment? = null
@@ -468,6 +472,11 @@ open class BrowserActivity : DuckDuckGoActivity() {
return
}
+ if (intent.getBooleanExtra(OPEN_DUCK_CHAT, false)) {
+ duckChat.openDuckChat()
+ return
+ }
+
val existingTabId = intent.getStringExtra(OPEN_EXISTING_TAB_ID_EXTRA)
if (existingTabId != null) {
openExistingTab(existingTabId)
@@ -712,6 +721,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
openExistingTabId: String? = null,
isLaunchFromClearDataAction: Boolean = false,
isLaunchFromDedicatedWebView: Boolean = false,
+ openDuckChat: Boolean = false,
): Intent {
val intent = Intent(context, BrowserActivity::class.java)
intent.putExtra(EXTRA_TEXT, queryExtra)
@@ -724,6 +734,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
intent.putExtra(OPEN_EXISTING_TAB_ID_EXTRA, openExistingTabId)
intent.putExtra(LAUNCH_FROM_CLEAR_DATA_ACTION, isLaunchFromClearDataAction)
intent.putExtra(LAUNCH_FROM_DEDICATED_WEBVIEW, isLaunchFromDedicatedWebView)
+ intent.putExtra(OPEN_DUCK_CHAT, openDuckChat)
return intent
}
@@ -741,6 +752,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
const val LAUNCH_FROM_EXTERNAL_EXTRA = "LAUNCH_FROM_EXTERNAL_EXTRA"
private const val LAUNCH_FROM_CLEAR_DATA_ACTION = "LAUNCH_FROM_CLEAR_DATA_ACTION"
private const val LAUNCH_FROM_DEDICATED_WEBVIEW = "LAUNCH_FROM_DEDICATED_WEBVIEW"
+ private const val OPEN_DUCK_CHAT = "OPEN_DUCK_CHAT_EXTRA"
private const val MAX_ACTIVE_TABS = 40
}
diff --git a/app/src/main/java/com/duckduckgo/app/global/shortcut/AppShortcutCreator.kt b/app/src/main/java/com/duckduckgo/app/global/shortcut/AppShortcutCreator.kt
index a8dfdee7068f..4301f797ceae 100644
--- a/app/src/main/java/com/duckduckgo/app/global/shortcut/AppShortcutCreator.kt
+++ b/app/src/main/java/com/duckduckgo/app/global/shortcut/AppShortcutCreator.kt
@@ -35,6 +35,7 @@ import com.duckduckgo.appbuildconfig.api.isInternalBuild
import com.duckduckgo.common.ui.themepreview.ui.AppComponentsActivity
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
+import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.savedsites.impl.bookmarks.BookmarksActivity
import com.squareup.anvil.annotations.ContributesTo
import dagger.Module
@@ -73,6 +74,7 @@ class AppShortcutCreator @Inject constructor(
private val context: Context,
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
private val appBuildConfig: AppBuildConfig,
+ private val duckChat: DuckChat,
private val dispatchers: DispatcherProvider,
) {
@@ -84,6 +86,10 @@ class AppShortcutCreator @Inject constructor(
shortcutList.add(buildClearDataShortcut(context))
shortcutList.add(buildBookmarksShortcut(context))
+ if (duckChat.isEnabled()) {
+ shortcutList.add(buildDuckChatShortcut(context))
+ }
+
if (appBuildConfig.isInternalBuild()) {
shortcutList.add(buildAndroidDesignSystemShortcut(context))
}
@@ -151,10 +157,23 @@ class AppShortcutCreator @Inject constructor(
.build().toShortcutInfo()
}
+ private fun buildDuckChatShortcut(context: Context): ShortcutInfo {
+ val browserActivity = BrowserActivity.intent(context, openDuckChat = true).also { it.action = Intent.ACTION_VIEW }
+ val stackBuilder = TaskStackBuilder.create(context)
+ .addNextIntent(browserActivity)
+
+ return ShortcutInfoCompat.Builder(context, SHORTCUT_ID_DUCK_AI)
+ .setShortLabel(context.getString(com.duckduckgo.duckchat.impl.R.string.duck_chat_title))
+ .setIcon(IconCompat.createWithResource(context, R.drawable.ic_app_shortcuts_duck_ai))
+ .setIntents(stackBuilder.intents)
+ .build().toShortcutInfo()
+ }
+
companion object {
private const val SHORTCUT_ID_CLEAR_DATA = "clearData"
private const val SHORTCUT_ID_NEW_TAB = "newTab"
private const val SHORTCUT_ID_SHOW_BOOKMARKS = "showBookmarks"
private const val SHORTCUT_ID_DESIGN_SYSTEM_DEMO = "designSystemDemo"
+ private const val SHORTCUT_ID_DUCK_AI = "duckAIDemo"
}
}
diff --git a/app/src/main/res/drawable/ic_app_shortcuts_duck_ai.xml b/app/src/main/res/drawable/ic_app_shortcuts_duck_ai.xml
new file mode 100644
index 000000000000..8ffbc14d4c40
--- /dev/null
+++ b/app/src/main/res/drawable/ic_app_shortcuts_duck_ai.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/common/common-ui/src/main/res/values/design-system-colors.xml b/common/common-ui/src/main/res/values/design-system-colors.xml
index 83d2034ca5e5..147bf40e77d5 100644
--- a/common/common-ui/src/main/res/values/design-system-colors.xml
+++ b/common/common-ui/src/main/res/values/design-system-colors.xml
@@ -126,6 +126,7 @@
#9A3216
#5132A9
+ #A276FF
#24FFCC33
#FFCC33