Skip to content

Commit f125341

Browse files
committed
hook up to input screen
1 parent 78b76f5 commit f125341

File tree

5 files changed

+98
-0
lines changed

5 files changed

+98
-0
lines changed

app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,14 @@ open class BrowserActivity : DuckDuckGoActivity() {
10121012
val intent = TabSwitcherActivity.intent(this@BrowserActivity)
10131013
tabSwitcherActivityResult.launch(intent)
10141014
}
1015+
is DuckChatSharedViewModel.Command.SearchRequested -> {
1016+
currentTab?.submitQuery(command.query)
1017+
closeDuckChat()
1018+
}
1019+
1020+
is DuckChatSharedViewModel.Command.OpenTab -> {
1021+
openExistingTab(command.tabId)
1022+
}
10151023
}
10161024
}
10171025
}

duckchat/duckchat-api/src/main/java/com/duckduckgo/duckchat/api/viewmodel/DuckChatSharedViewModel.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,22 @@ class DuckChatSharedViewModel() : ViewModel() {
3939
}
4040
}
4141

42+
fun onSearchRequested(query: String) {
43+
viewModelScope.launch {
44+
_command.send(Command.SearchRequested(query))
45+
}
46+
}
47+
48+
fun openExistingTab(tabId: String) {
49+
viewModelScope.launch {
50+
_command.send(Command.OpenTab(tabId))
51+
}
52+
}
53+
4254
sealed class Command {
4355
object LaunchFire : Command()
4456
object LaunchTabSwitcher : Command()
57+
data class SearchRequested(val query: String) : Command()
58+
data class OpenTab(val tabId: String) : Command()
4559
}
4660
}

duckchat/duckchat-impl/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ dependencies {
4141
implementation project(':history-api')
4242
implementation project(':saved-sites-api')
4343
implementation project(':remote-messaging-api')
44+
implementation project(':navigation-api')
4445

4546
anvil project(path: ':anvil-compiler')
4647
implementation project(path: ':anvil-annotations')

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/DuckChatOmnibarLayout.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class DuckChatOmnibarLayout @JvmOverloads constructor(
5050
fun onBrowserMenuPressed()
5151

5252
fun onHistoryMenuPressed()
53+
54+
fun onInputFieldPressed()
5355
}
5456

5557
init {
@@ -76,6 +78,7 @@ class DuckChatOmnibarLayout @JvmOverloads constructor(
7678
}
7779

7880
inputCard.setOnClickListener {
81+
omnibarItemPressedListener?.onInputFieldPressed()
7982
}
8083
}
8184

duckchat/duckchat-impl/src/main/java/com/duckduckgo/duckchat/impl/ui/DuckChatWebViewFragment.kt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ import android.webkit.WebChromeClient
3636
import android.webkit.WebChromeClient.FileChooserParams
3737
import android.webkit.WebSettings
3838
import android.webkit.WebView
39+
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
3940
import androidx.annotation.AnyThread
4041
import androidx.appcompat.widget.Toolbar
42+
import androidx.core.app.ActivityOptionsCompat
4143
import androidx.core.content.ContextCompat
4244
import androidx.fragment.app.activityViewModels
4345
import androidx.lifecycle.Lifecycle
@@ -66,6 +68,11 @@ import com.duckduckgo.downloads.api.DownloadStateListener
6668
import com.duckduckgo.downloads.api.DownloadsFileActions
6769
import com.duckduckgo.downloads.api.FileDownloader
6870
import com.duckduckgo.downloads.api.FileDownloader.PendingFileDownload
71+
import com.duckduckgo.duckchat.api.inputscreen.BrowserAndInputScreenTransitionProvider
72+
import com.duckduckgo.duckchat.api.inputscreen.InputScreenActivityParams
73+
import com.duckduckgo.duckchat.api.inputscreen.InputScreenActivityResultCodes
74+
import com.duckduckgo.duckchat.api.inputscreen.InputScreenActivityResultParams
75+
import com.duckduckgo.duckchat.api.inputscreen.InputScreenBrowserButtonsConfig
6976
import com.duckduckgo.duckchat.api.viewmodel.DuckChatSharedViewModel
7077
import com.duckduckgo.duckchat.impl.DuckChatInternal
7178
import com.duckduckgo.duckchat.impl.R
@@ -85,6 +92,7 @@ import com.duckduckgo.duckchat.impl.ui.filechooser.capture.launcher.UploadFromEx
8592
import com.duckduckgo.js.messaging.api.JsMessageCallback
8693
import com.duckduckgo.js.messaging.api.JsMessaging
8794
import com.duckduckgo.js.messaging.api.SubscriptionEventData
95+
import com.duckduckgo.navigation.api.GlobalActivityStarter
8896
import com.duckduckgo.subscriptions.api.SUBSCRIPTIONS_FEATURE_NAME
8997
import com.google.android.material.snackbar.BaseTransientBottomBar
9098
import com.google.android.material.snackbar.Snackbar
@@ -162,6 +170,12 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
162170
@Inject
163171
lateinit var externalCameraLauncher: UploadFromExternalMediaAppLauncher
164172

173+
@Inject
174+
lateinit var globalActivityStarter: GlobalActivityStarter
175+
176+
@Inject
177+
lateinit var browserAndInputScreenTransitionProvider: BrowserAndInputScreenTransitionProvider
178+
165179
private var pendingFileDownload: PendingFileDownload? = null
166180
private val downloadMessagesJob = ConflatedJob()
167181

@@ -386,10 +400,68 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
386400
override fun onHistoryMenuPressed() {
387401
Snackbar.make(root, "History", Snackbar.LENGTH_SHORT).show()
388402
}
403+
404+
override fun onInputFieldPressed() {
405+
launchInputScreen()
406+
}
389407
},
390408
)
391409
}
392410

411+
private fun launchInputScreen() {
412+
// val isTopOmnibar = omnibar.omnibarType != OmnibarType.SINGLE_BOTTOM
413+
// TODO: Support Bottom / Split omnibar
414+
val isTopOmnibar = true
415+
val tabs = arguments?.getInt(KEY_DUCK_AI_TABS) ?: 0
416+
val intent =
417+
globalActivityStarter.startIntent(
418+
requireContext(),
419+
InputScreenActivityParams(
420+
query = "",
421+
isTopOmnibar = true,
422+
browserButtonsConfig = InputScreenBrowserButtonsConfig.Enabled(tabs = tabs),
423+
),
424+
)
425+
val enterTransition = browserAndInputScreenTransitionProvider.getInputScreenEnterAnimation(true)
426+
val exitTransition = browserAndInputScreenTransitionProvider.getBrowserExitAnimation(isTopOmnibar)
427+
val options =
428+
ActivityOptionsCompat.makeCustomAnimation(
429+
requireActivity(),
430+
enterTransition,
431+
exitTransition,
432+
)
433+
inputScreenLauncher.launch(intent, options)
434+
}
435+
436+
private val inputScreenLauncher =
437+
registerForActivityResult(StartActivityForResult()) { result ->
438+
val data = result.data
439+
when (result.resultCode) {
440+
InputScreenActivityResultCodes.NEW_SEARCH_REQUESTED -> {
441+
data?.getStringExtra(InputScreenActivityResultParams.SEARCH_QUERY_PARAM)?.let { query ->
442+
sharedViewModel.onSearchRequested(query)
443+
}
444+
}
445+
446+
InputScreenActivityResultCodes.SWITCH_TO_TAB_REQUESTED -> {
447+
data?.getStringExtra(InputScreenActivityResultParams.TAB_ID_PARAM)?.let { tabId ->
448+
sharedViewModel.openExistingTab(tabId)
449+
}
450+
}
451+
452+
InputScreenActivityResultCodes.MENU_REQUESTED -> {
453+
}
454+
455+
InputScreenActivityResultCodes.TAB_SWITCHER_REQUESTED -> {
456+
sharedViewModel.onTabSwitcherCLicked()
457+
}
458+
459+
InputScreenActivityResultCodes.FIRE_BUTTON_REQUESTED -> {
460+
sharedViewModel.onFireButtonClicked()
461+
}
462+
}
463+
}
464+
393465
data class FileChooserRequestedParams(
394466
val filePickingMode: Int,
395467
val acceptMimeTypes: List<String>,

0 commit comments

Comments
 (0)