Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Duck Chat: App Shortcut #5678

Draft
wants to merge 4 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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
}

Expand All @@ -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
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
) {

Expand All @@ -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))
}
Expand Down Expand Up @@ -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"
}
}
27 changes: 27 additions & 0 deletions app/src/main/res/drawable/ic_app_shortcuts_duck_ai.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<!--
~ Copyright (c) 2025 DuckDuckGo
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M5.072,18.583C5.422,18.18 5.346,17.567 4.947,17.213C3.127,15.601 2,13.367 2,10.899C2,5.981 6.477,1.993 12,1.993C17.523,1.993 22,5.981 22,10.899C22,14.631 19.424,17.826 15.769,19.152C13.405,20.236 7.588,21.339 4.268,21.909C3.438,22.052 2.903,21.084 3.455,20.447L5.072,18.583ZM12.382,6.284C12.282,5.886 11.717,5.886 11.618,6.284L11.247,7.767C10.953,8.942 10.036,9.86 8.861,10.154L7.377,10.524C6.98,10.624 6.98,11.189 7.377,11.288L8.861,11.659C10.036,11.953 10.953,12.87 11.247,14.045L11.618,15.529C11.717,15.926 12.282,15.926 12.382,15.529L12.753,14.045C13.047,12.87 13.964,11.953 15.139,11.659L16.623,11.288C17.02,11.189 17.02,10.624 16.623,10.524L15.139,10.154C13.964,9.86 13.047,8.942 12.753,7.767L12.382,6.284Z"
android:fillColor="@color/purple40"
android:fillAlpha="0.84"
android:fillType="evenOdd"/>
</vector>
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
<color name="red70">#9A3216</color>

<color name="purple50">#5132A9</color>
<color name="purple40">#A276FF</color>

<color name="yellow50_14">#24FFCC33</color>
<color name="yellow50">#FFCC33</color>
Expand Down
Loading