Skip to content
Closed
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
7 changes: 4 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ ext {

android {
defaultConfig {
applicationId "com.duckduckgo.mobile.android"
// applicationId "com.duckduckgo.mobile.android"
applicationId "com.duckduckgo.mobile.android.duckai.poc"

minSdk min_sdk
targetSdk target_sdk
Expand Down Expand Up @@ -140,8 +141,8 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
manifestPlaceholders = [
appIcon : "@mipmap/ic_launcher_red",
appIconRound: "@mipmap/ic_launcher_red_round"
appIcon : "@mipmap/ic_launcher_purple",
appIconRound: "@mipmap/ic_launcher_purple_round"
]

if (project.hasProperty('useUploadSigning')) {
Expand Down
12 changes: 8 additions & 4 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ import com.duckduckgo.di.scopes.ActivityScope
import com.duckduckgo.duckchat.api.DuckAiFeatureState
import com.duckduckgo.duckchat.api.DuckChat
import com.duckduckgo.duckchat.impl.ui.DuckChatWebViewFragment
import com.duckduckgo.duckchat.impl.ui.DuckChatWebViewFragment.Companion.KEY_DUCK_AI_TABS
import com.duckduckgo.duckchat.impl.ui.DuckChatWebViewFragment.Companion.KEY_DUCK_AI_URL
import com.duckduckgo.navigation.api.GlobalActivityStarter
import com.duckduckgo.savedsites.impl.bookmarks.BookmarksActivity.Companion.SAVED_SITE_URL_EXTRA
Expand Down Expand Up @@ -753,7 +754,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
is Command.ShowSystemDefaultAppsActivity -> showSystemDefaultAppsActivity(command.intent)
is Command.ShowSystemDefaultBrowserDialog -> showSystemDefaultBrowserDialog(command.intent)
is Command.ShowUndoDeleteTabsMessage -> showTabsDeletedSnackbar(command.tabIds)
is Command.OpenDuckChat -> openDuckChat(command.duckChatUrl, command.duckChatSessionActive, command.withTransition)
is Command.OpenDuckChat -> openDuckChat(command.duckChatUrl, command.duckChatSessionActive, command.withTransition, command.tabs)
Command.LaunchTabSwitcher -> currentTab?.launchTabSwitcherAfterTabsUndeleted()
}
}
Expand Down Expand Up @@ -839,7 +840,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
globalActivityStarter.start(this, DownloadsScreenNoParams)
}

private fun closeDuckChat() {
fun closeDuckChat() {
isDuckChatVisible = false
externalIntentProcessingState.onDuckAiClosed()
val fragment = duckAiFragment
Expand All @@ -856,15 +857,16 @@ open class BrowserActivity : DuckDuckGoActivity() {
url: String?,
duckChatSessionActive: Boolean,
withTransition: Boolean,
tabs: Int,
) {
duckAiFragment?.let { fragment ->
if (duckChatSessionActive) {
restoreDuckChat(fragment, withTransition)
} else {
launchNewDuckChat(url, withTransition)
launchNewDuckChat(url, withTransition, tabs)
}
} ?: run {
launchNewDuckChat(url, withTransition)
launchNewDuckChat(url, withTransition, tabs)
}

currentTab?.getOmnibar()?.omnibarView?.omnibarTextInput?.let {
Expand All @@ -875,6 +877,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
private fun launchNewDuckChat(
duckChatUrl: String?,
withTransition: Boolean,
tabs: Int,
) {
val wasFragmentVisible = duckAiFragment?.isVisible ?: false
val fragment =
Expand All @@ -883,6 +886,7 @@ open class BrowserActivity : DuckDuckGoActivity() {
arguments =
Bundle().apply {
putString(KEY_DUCK_AI_URL, duckChatUrl)
putInt(KEY_DUCK_AI_TABS, tabs)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -920,6 +920,7 @@ class BrowserTabFragment :
InputScreenActivityResultCodes.NEW_SEARCH_REQUESTED -> {
data?.getStringExtra(InputScreenActivityResultParams.SEARCH_QUERY_PARAM)?.let { query ->
submitQuery(query)
browserActivity?.closeDuckChat()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class BrowserViewModel @Inject constructor(
data class ShowSystemDefaultBrowserDialog(val intent: Intent) : Command()
data class ShowSystemDefaultAppsActivity(val intent: Intent) : Command()
data class ShowUndoDeleteTabsMessage(val tabIds: List<String>) : Command()
data class OpenDuckChat(val duckChatUrl: String?, val duckChatSessionActive: Boolean, val withTransition: Boolean) : Command()
data class OpenDuckChat(val duckChatUrl: String?, val duckChatSessionActive: Boolean, val withTransition: Boolean, val tabs: Int) : Command()
}

var viewState: MutableLiveData<ViewState> = MutableLiveData<ViewState>().also {
Expand Down Expand Up @@ -464,7 +464,7 @@ class BrowserViewModel @Inject constructor(

fun openDuckChat(duckChatUrl: String?, duckChatSessionActive: Boolean, withTransition: Boolean) {
logcat(INFO) { "Duck.ai openDuckChat duckChatSessionActive $duckChatSessionActive" }
command.value = OpenDuckChat(duckChatUrl, duckChatSessionActive, withTransition)
command.value = OpenDuckChat(duckChatUrl, duckChatSessionActive, withTransition, tabs.value.size)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import android.webkit.WebChromeClient.FileChooserParams
import android.webkit.WebSettings
import android.webkit.WebView
import androidx.annotation.AnyThread
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
Expand Down Expand Up @@ -161,8 +160,10 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
private var pendingUploadTask: ValueCallback<Array<Uri>>? = null

private val root: ViewGroup by lazy { binding.root }
private val toolbar: Toolbar? by lazy { binding.includeToolbar.toolbar }

// private val toolbar: Toolbar? by lazy { binding.includeToolbar.toolbar }
internal val simpleWebview: WebView by lazy { binding.simpleWebview }
internal val tabSwitcher by lazy { binding.inputFieldTabsMenu }

@SuppressLint("SetJavaScriptEnabled")
override fun onViewCreated(
Expand All @@ -171,15 +172,16 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
) {
super.onViewCreated(view, savedInstanceState)

toolbar?.let {
it.setNavigationIcon(com.duckduckgo.mobile.android.R.drawable.ic_arrow_left_24)
it.setNavigationOnClickListener {
requireActivity().onBackPressed()
}
it.setTitle(R.string.duck_chat_title)
}
// toolbar?.let {
// it.setNavigationIcon(com.duckduckgo.mobile.android.R.drawable.ic_arrow_left_24)
// it.setNavigationOnClickListener {
// requireActivity().onBackPressed()
// }
// it.setTitle(R.string.duck_chat_title)
// }

val url = arguments?.getString(KEY_DUCK_AI_URL) ?: "https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=5"
val tabs = arguments?.getInt(KEY_DUCK_AI_TABS) ?: 0

simpleWebview.let {
it.webViewClient = webViewClient
Expand Down Expand Up @@ -305,6 +307,8 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
pendingUploadTask = null
}

tabSwitcher.count = tabs

// Observe ViewModel commands
viewModel.commands
.onEach { command ->
Expand Down Expand Up @@ -604,5 +608,6 @@ open class DuckChatWebViewFragment : DuckDuckGoFragment(R.layout.activity_duck_c
"Mozilla/5.0 (Linux; Android 16) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/124.0.0.0 Mobile DuckDuckGo/5 Safari/537.36"
private const val REQUEST_CODE_CHOOSE_FILE = 100
const val KEY_DUCK_AI_URL: String = "KEY_DUCK_AI_URL"
const val KEY_DUCK_AI_TABS: String = "KEY_DUCK_AI_TABS"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,176 @@
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.duckduckgo.app.about.AboutDuckDuckGoActivity">
android:orientation="vertical">

<include
android:id="@+id/includeToolbar"
layout="@layout/include_default_toolbar" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/inputModeWidgetLayout"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_marginStart="@dimen/omnibarCardMarginHorizontal"
android:paddingTop="2dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spacer">

<com.google.android.material.card.MaterialCardView
android:id="@+id/inputModeWidgetCard"
style="@style/Widget.DuckDuckGo.OmnibarCardView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:cardElevation="0dp"
android:layout_marginTop="2dp"
app:layout_constraintEnd_toStartOf="@id/inputModeMainButtonsContainer"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:strokeColor="?attr/daxColorAccentBlue"
app:strokeWidth="@dimen/omnibarOutlineWidth">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<LinearLayout
android:id="@+id/inputModeWidgetCardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="@dimen/keyline_0">

<ImageView
android:id="@+id/daxIcon"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
android:layout_gravity="center"
android:importantForAccessibility="no"
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_duckai"
tools:visibility="visible" />

<com.duckduckgo.common.ui.view.text.DaxTextView
android:id="@+id/inputField"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
app:typography="body1"
app:textType="primary"
android:text="Duck.ai" />

<ImageView
android:id="@+id/inputFieldVoiceInputButton"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
android:layout_gravity="top"
android:background="@drawable/selectable_item_experimental_background"
android:gravity="center"
android:importantForAccessibility="no"
android:scaleType="center"
android:visibility="gone"
app:srcCompat="@drawable/ic_microphone_24"
tools:visibility="visible" />

<ImageView
android:id="@+id/inputFieldClearText"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
android:layout_gravity="top"
android:background="@drawable/selectable_item_experimental_background"
android:gravity="center"
android:importantForAccessibility="no"
android:scaleType="centerInside"
android:visibility="gone"
app:srcCompat="@drawable/ic_close_circle_small_secondary_24" />

</LinearLayout>

<FrameLayout
android:id="@+id/inputScreenButtonsContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="8dp"
android:visibility="gone" />

</LinearLayout>

</com.google.android.material.card.MaterialCardView>

<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/inputModeMainButtonsContainer"
android:layout_width="wrap_content"
android:layout_height="@dimen/toolbarIcon"
android:layout_marginStart="@dimen/keyline_2"
app:layout_constraintBottom_toBottomOf="@id/inputModeWidgetCard"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/inputModeWidgetCard"
app:layout_constraintTop_toTopOf="@id/inputModeWidgetCard">

<FrameLayout
android:id="@+id/inputFieldFireButton"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
android:background="@drawable/selectable_item_experimental_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/inputFieldTabsMenu"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<ImageView
android:id="@+id/fireIconImageView"
android:layout_width="@dimen/bottomNavIcon"
android:layout_height="@dimen/bottomNavIcon"
android:layout_gravity="center"
android:scaleType="center"
android:src="@drawable/ic_fire_24" />
</FrameLayout>

<com.duckduckgo.browser.ui.tabs.NewTabSwitcherButton
android:id="@+id/inputFieldTabsMenu"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/inputFieldBrowserMenu"
app:layout_constraintStart_toEndOf="@id/inputFieldFireButton"
app:layout_constraintTop_toTopOf="parent" />

<FrameLayout
android:id="@+id/inputFieldBrowserMenu"
android:layout_width="@dimen/toolbarIcon"
android:layout_height="@dimen/toolbarIcon"
android:background="@drawable/selectable_item_experimental_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/inputFieldTabsMenu"
app:layout_constraintTop_toTopOf="parent">

<ImageView
android:id="@+id/browserMenuImageView"
android:layout_width="@dimen/bottomNavIcon"
android:layout_height="@dimen/bottomNavIcon"
android:layout_gravity="center"
android:scaleType="center"
android:src="@drawable/ic_menu_vertical_24" />

</FrameLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

<WebView
android:id="@+id/simpleWebview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="@id/inputModeWidgetCard"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

</LinearLayout>
</LinearLayout>
Loading