Skip to content

Commit

Permalink
Duck Chat: App Shortcut (#5678)
Browse files Browse the repository at this point in the history
Task/Issue URL:
https://app.asana.com/0/1157893581871903/1209421941687939

### Description
This PR adds a shortcut to Duck.ai

### Steps to test this PR

_Access to Duck.ai shortcut_
- [x] Install the app 
- [x] Verify duck.ai is enabled
- [x] Close the app and long tap on the home icon 
- [x] Verify Duck.ai is visible and tap on it
- [x] Verify Duck.ai opens

_Duck chat disabled_
- [x] Install the app 
- [x] Verify duck.ai is enabled
- [x] Close the app and long tap on the home icon 
- [x] Verify Duck.ai is visible and tap on it
- [x] Disable duck.ai via Settings
- [x] Close the app and long tap on the home icon 
- [x] Verify Duck.ai is not visible
  • Loading branch information
malmstein authored Feb 27, 2025
1 parent 9bc4c17 commit 2b158df
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 0 deletions.
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 = "duckAI"
}
}
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

0 comments on commit 2b158df

Please sign in to comment.