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