Ladybird/Android: Add EditText for URL bar and attach to native WebView

This commit is contained in:
Andrew Kaster 2023-09-23 23:05:15 -06:00 committed by Andrew Kaster
parent a93507231c
commit 4fd915b005
Notes: sideshowbarker 2024-07-17 18:06:52 +09:00
15 changed files with 82 additions and 12 deletions

View File

@ -0,0 +1,16 @@
/*
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "JNIHelpers.h"
#include <AK/Utf16View.h>
namespace Ladybird {
jstring JavaEnvironment::jstring_from_ak_string(String const& str)
{
auto as_utf16 = MUST(AK::utf8_to_utf16(str.code_points()));
return m_env->NewString(as_utf16.data(), as_utf16.size());
}
}

View File

@ -7,6 +7,7 @@
#pragma once
#include <AK/Assertions.h>
#include <AK/String.h>
#include <jni.h>
namespace Ladybird {
@ -37,6 +38,8 @@ public:
JNIEnv* get() const { return m_env; }
jstring jstring_from_ak_string(String const& str);
private:
JavaVM* m_vm = nullptr;
JNIEnv* m_env = nullptr;

View File

@ -34,6 +34,13 @@ WebViewImplementationNative::WebViewImplementationNative(jobject thiz)
JavaEnvironment env(global_vm);
env.get()->CallVoidMethod(m_java_instance, invalidate_layout_method);
};
on_load_start = [this](AK::URL const& url, bool is_redirect) {
JavaEnvironment env(global_vm);
auto url_string = env.jstring_from_ak_string(MUST(url.to_string()));
env.get()->CallVoidMethod(m_java_instance, on_load_start_method, url_string, is_redirect);
env.get()->DeleteLocalRef(url_string);
};
}
void WebViewImplementationNative::create_client(WebView::EnableCallgrindProfiling)

View File

@ -32,6 +32,7 @@ public:
static jclass global_class_reference;
static jmethodID bind_webcontent_method;
static jmethodID invalidate_layout_method;
static jmethodID on_load_start_method;
jobject java_instance() const { return m_java_instance; }

View File

@ -12,6 +12,7 @@ using namespace Ladybird;
jclass WebViewImplementationNative::global_class_reference;
jmethodID WebViewImplementationNative::bind_webcontent_method;
jmethodID WebViewImplementationNative::invalidate_layout_method;
jmethodID WebViewImplementationNative::on_load_start_method;
extern "C" JNIEXPORT void JNICALL
Java_org_serenityos_ladybird_WebViewImplementation_00024Companion_nativeClassInit(JNIEnv* env, jobject /* thiz */)
@ -31,6 +32,11 @@ Java_org_serenityos_ladybird_WebViewImplementation_00024Companion_nativeClassIni
if (!method)
TODO();
WebViewImplementationNative::invalidate_layout_method = method;
method = env->GetMethodID(WebViewImplementationNative::global_class_reference, "onLoadStart", "(Ljava/lang/String;Z)V");
if (!method)
TODO();
WebViewImplementationNative::on_load_start_method = method;
}
extern "C" JNIEXPORT jlong JNICALL

View File

@ -8,15 +8,18 @@ package org.serenityos.ladybird
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.TextView
import org.serenityos.ladybird.databinding.ActivityMainBinding
import java.net.URL
import kotlin.io.path.Path
class LadybirdActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var resourceDir: String
private lateinit var view: WebView
private lateinit var urlEditText: EditText
private var timerService = TimerExecutorService()
override fun onCreate(savedInstanceState: Bundle?) {
@ -28,16 +31,23 @@ class LadybirdActivity : AppCompatActivity() {
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
urlEditText = binding.urlEditText
view = binding.webView
view.onLoadStart = { url: String, _ ->
urlEditText.setText(url, TextView.BufferType.EDITABLE)
}
urlEditText.setOnEditorActionListener { textView: TextView, actionId: Int, _: KeyEvent? ->
when (actionId) {
EditorInfo.IME_ACTION_GO, EditorInfo.IME_ACTION_SEARCH -> view.loadURL(textView.text.toString())
}
false
}
view.initialize(resourceDir)
view.loadURL(intent.dataString ?: "https://ladybird.dev")
}
override fun onStart() {
super.onStart()
// FIXME: This is not the right place to load the homepage :^)
val initialURL = URL("https://ladybird.dev")
view.loadURL(initialURL)
}
override fun onDestroy() {
@ -52,7 +62,10 @@ class LadybirdActivity : AppCompatActivity() {
}
}
private external fun initNativeCode(resourceDir: String, tag: String, timerService: TimerExecutorService)
private external fun initNativeCode(
resourceDir: String, tag: String, timerService: TimerExecutorService
)
private external fun disposeNativeCode()
private external fun execMainEventLoop()

View File

@ -11,12 +11,12 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.util.AttributeSet
import android.view.View
import java.net.URL
// FIXME: This should (eventually) implement NestedScrollingChild3 and ScrollingView
class WebView(context: Context, attributeSet: AttributeSet) : View(context, attributeSet) {
private val viewImpl = WebViewImplementation(this)
private lateinit var contentBitmap: Bitmap
var onLoadStart: (url: String, isRedirect: Boolean) -> Unit = { _, _ -> }
fun initialize(resourceDir: String) {
viewImpl.initialize(resourceDir)
@ -26,7 +26,7 @@ class WebView(context: Context, attributeSet: AttributeSet) : View(context, attr
viewImpl.dispose()
}
fun loadURL(url: URL) {
fun loadURL(url: String) {
viewImpl.loadURL(url)
}
@ -47,4 +47,5 @@ class WebView(context: Context, attributeSet: AttributeSet) : View(context, attr
viewImpl.drawIntoBitmap(contentBitmap);
canvas?.drawBitmap(contentBitmap, 0f, 0f, null)
}
}

View File

@ -33,8 +33,8 @@ class WebViewImplementation(private val view: WebView) {
nativeInstance = 0
}
fun loadURL(url: URL) {
nativeLoadURL(nativeInstance, url.toString())
fun loadURL(url: String) {
nativeLoadURL(nativeInstance, url)
}
fun drawIntoBitmap(bitmap: Bitmap) {
@ -70,6 +70,10 @@ class WebViewImplementation(private val view: WebView) {
view.invalidate()
}
fun onLoadStart(url: String, isRedirect: Boolean) {
view.onLoadStart(url, isRedirect)
}
// Functions implemented in native code
private external fun nativeObjectInit(): Long
private external fun nativeObjectDispose(instance: Long)

View File

@ -16,7 +16,20 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|snap|enterAlways"/>
app:layout_scrollFlags="scroll|snap|enterAlways">
<EditText
android:id="@+id/urlEditText"
style="@style/Widget.AppCompat.EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autofillHints="url"
android:ems="10"
android:hint="@string/url_edit_default"
android:imeOptions="actionGo|actionSearch"
android:inputType="textUri"
android:singleLine="true" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout

View File

@ -12,6 +12,7 @@
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:editTextBackground">@color/grey</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

View File

@ -7,4 +7,5 @@
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="grey">#FF6B6B6B</color>
</resources>

View File

@ -1,3 +1,4 @@
<resources>
<string name="app_name">Ladybird</string>
<string name="url_edit_default">Enter URL...</string>
</resources>

View File

@ -12,6 +12,7 @@
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:editTextBackground">@color/white</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

View File

@ -161,6 +161,7 @@ elseif(ANDROID)
Android/src/main/cpp/WebViewImplementationNativeJNI.cpp
Android/src/main/cpp/ALooperEventLoopImplementation.cpp
Android/src/main/cpp/TimerExecutorService.cpp
Android/src/main/cpp/JNIHelpers.cpp
)
target_link_libraries(ladybird PRIVATE LibArchive jnigraphics android)
else()

View File

@ -57,6 +57,7 @@ else()
../Android/src/main/cpp/WebContentService.cpp
../Android/src/main/cpp/WebContentServiceJNI.cpp
../Android/src/main/cpp/LadybirdServiceBaseJNI.cpp
../Android/src/main/cpp/JNIHelpers.cpp
)
target_link_libraries(webcontent PRIVATE android)
endif()