Initial commit

This commit is contained in:
Alex Abudaev 2026-04-03 22:54:06 +08:00
parent efe8e4a550
commit 31ea334898
6 changed files with 82 additions and 31 deletions

View file

@ -4,7 +4,6 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.webkit.CookieManager
import android.webkit.WebView
@ -16,18 +15,29 @@ class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
companion object {
private const val BASE_URL = "https://duck.ai"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView = findViewById(R.id.webView)
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.databaseEnabled = true
webView.settings.setSupportZoom(false)
webView.settings.loadWithOverviewMode = true
webView.settings.useWideViewPort = true
setupWebView()
loadUrlFromIntent()
}
private fun setupWebView() {
webView.settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
databaseEnabled = true
setSupportZoom(false)
loadWithOverviewMode = true
useWideViewPort = true
}
webView.isFocusable = true
webView.isFocusableInTouchMode = true
@ -35,13 +45,26 @@ class MainActivity : AppCompatActivity() {
CookieManager.getInstance().setAcceptCookie(true)
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
webView.webViewClient = WebViewClientOverride()
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
view?.postDelayed({
view.evaluateJavascript(
"setTimeout(() => {" +
" const input = document.querySelector('input[type=\"text\"], textarea[id*=\"message\"], [role=\"combobox\"]');" +
" if(input) { input.focus(); input.click(); }" +
"}, 100);"
) { _ -> }
}, 800)
}
}
}
private fun loadUrlFromIntent() {
val query = intent?.data?.getQueryParameter("q")
val url = if (query != null) {
"https://duck.ai/?q=${Uri.encode(query)}"
"$BASE_URL/?q=${Uri.encode(query)}"
} else {
"https://duck.ai/"
BASE_URL
}
webView.loadUrl(url)
@ -52,32 +75,29 @@ class MainActivity : AppCompatActivity() {
}, 800)
}
private inner class WebViewClientOverride : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
view?.postDelayed({
view.evaluateJavascript(
"setTimeout(() => {" +
" const input = document.querySelector('input[type=\"text\"], textarea[id*=\"message\"], [role=\"combobox\"]');" +
" if(input) { input.focus(); input.click(); }" +
"}, 100);"
) { _ -> }
}, 800)
}
}
private fun showKeyboard() {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
webView.requestFocus()
imm.showSoftInput(webView, InputMethodManager.SHOW_IMPLICIT)
}
override fun onPause() {
webView.onPause()
super.onPause()
}
override fun onResume() {
webView.onResume()
super.onResume()
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
this.intent = intent
val query = intent?.data?.getQueryParameter("q")
if (query != null) {
val url = "https://duck.ai/?q=${Uri.encode(query)}"
val url = "$BASE_URL/?q=${Uri.encode(query)}"
webView.loadUrl(url)
webView.postDelayed({
webView.requestFocus()
@ -85,4 +105,9 @@ class MainActivity : AppCompatActivity() {
}, 1000)
}
}
override fun onDestroy() {
webView.destroy()
super.onDestroy()
}
}

View file

@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/webViewContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="?attr/colorSurface">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -3,7 +3,7 @@
android:id="@+id/widget_container"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@drawable/widget_background"
android:background="?attr/colorPrimaryContainer"
android:gravity="center"
android:orientation="horizontal"
android:paddingHorizontal="16dp">
@ -12,6 +12,7 @@
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_search"
android:tint="?attr/colorOnPrimaryContainer"
android:contentDescription="@string/search" />
<TextView
@ -19,7 +20,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:text="@string/ask_ai"
android:textColor="#1a1a1a"
android:textColor="?attr/colorOnPrimaryContainer"
android:textSize="16sp"
android:textStyle="bold" />

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FF5722</color>
<color name="ic_launcher_background">#6750A4</color>
</resources>

View file

@ -4,4 +4,9 @@
<string name="search">Search</string>
<string name="search_duckai">Search DuckAI</string>
<string name="ask_ai">Ask AI</string>
<string name="clear_history">Clear Chat History</string>
<string name="clear_history_confirm">Clear all chat history?</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="history_cleared">Chat history cleared</string>
</resources>

View file

@ -1,4 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.DuckAI" parent="Theme.Material3.DayNight.NoActionBar" />
<style name="Theme.DuckAI" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">#6750A4</item>
<item name="colorOnPrimary">#FFFFFF</item>
<item name="colorPrimaryContainer">#EADDFF</item>
<item name="colorOnPrimaryContainer">#21005D</item>
<item name="colorSecondary">#625B71</item>
<item name="colorOnSecondary">#FFFFFF</item>
<item name="colorSecondaryContainer">#E8DEF8</item>
<item name="colorOnSecondaryContainer">#1D192B</item>
<item name="colorTertiary">#7D5260</item>
<item name="colorOnTertiary">#FFFFFF</item>
<item name="colorTertiaryContainer">#FFD8E4</item>
<item name="colorOnTertiaryContainer">#31111D</item>
<item name="colorError">#B3261E</item>
<item name="colorOnError">#FFFFFF</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
</style>
</resources>