Browse Source

trying to add open android web browser, basically took swkb as template

pull/3308/head
Maufeat 3 weeks ago
parent
commit
0d6722aa7a
  1. 11
      src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt
  2. 35
      src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/web/WebBrowser.kt
  3. 4
      src/android/app/src/main/jni/native.cpp
  4. 4
      src/common/CMakeLists.txt
  5. 50
      src/common/android/applets/web_browser.cpp
  6. 30
      src/common/android/applets/web_browser.h
  7. 3
      src/common/android/id_cache.cpp

11
src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt

@ -26,6 +26,7 @@ import org.yuzu.yuzu_emu.model.InstallResult
import org.yuzu.yuzu_emu.model.Patch
import org.yuzu.yuzu_emu.model.GameVerificationResult
import org.yuzu.yuzu_emu.network.NetPlayManager
import org.yuzu.yuzu_emu.applets.web.WebBrowser
/**
* Class which contains methods that interact
@ -457,6 +458,16 @@ object NativeLibrary {
*/
external fun setCurrentAppletId(appletId: Int)
/**
* Launch external URL when Web applet and opens browser
*
* @param String URL
*/
@JvmStatic
fun openExternalUrl(url: String) {
WebBrowser.openExternal(url)
}
/**
* Sets the cabinet mode for launching the cabinet applet.
*

35
src/android/app/src/main/java/org/yuzu/yuzu_emu/applets/web/WebBrowser.kt

@ -0,0 +1,35 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
package org.yuzu.yuzu_emu.applets.web
import android.content.Intent
import android.net.Uri
import androidx.annotation.Keep
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.utils.Log
/**
Should run WebBrowser as a new intent.
*/
@Keep
object WebBrowser {
@JvmStatic
fun openExternal(url: String) {
val activity = NativeLibrary.sEmulationActivity.get() ?: run {
return
}
activity.runOnUiThread {
try {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
activity.startActivity(intent)
} catch (e: Exception) {
Log.error("WebBrowser failed to launch $url: ${e.message}")
}
}
}
}

4
src/android/app/src/main/jni/native.cpp

@ -66,6 +66,7 @@
#include "core/frontend/applets/profile_select.h"
#include "core/frontend/applets/software_keyboard.h"
#include "core/frontend/applets/web_browser.h"
#include "common/android/applets/web_browser.h"
#include "core/hle/service/am/applet_manager.h"
#include "core/hle/service/am/frontend/applets.h"
#include "core/hle/service/filesystem/filesystem.h"
@ -275,6 +276,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
// Initialize system.
jauto android_keyboard = std::make_unique<Common::Android::SoftwareKeyboard::AndroidKeyboard>();
jauto android_webapplet = std::make_unique<Common::Android::WebBrowser::AndroidWebBrowser>();
m_software_keyboard = android_keyboard.get();
m_system.SetShuttingDown(false);
m_system.ApplySettings();
@ -289,7 +291,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string
nullptr, // Photo Viewer
nullptr, // Profile Selector
std::move(android_keyboard), // Software Keyboard
nullptr, // Web Browser
std::move(android_webapplet),// Web Browser
nullptr, // Net Connect
});

4
src/common/CMakeLists.txt

@ -176,7 +176,9 @@ if(ANDROID)
android/multiplayer/multiplayer.cpp
android/multiplayer/multiplayer.h
android/applets/software_keyboard.cpp
android/applets/software_keyboard.h)
android/applets/software_keyboard.h
android/applets/web_browser.cpp
android/applets/web_browser.h)
endif()
if(ARCHITECTURE_x86_64)

50
src/common/android/applets/web_browser.cpp

@ -0,0 +1,50 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#include "common/android/android_common.h"
#include "common/android/id_cache.h"
#include "common/android/applets/web_browser.h"
#include "common/logging/log.h"
static jclass s_native_library_class = nullptr;
static jmethodID s_open_external_url = nullptr;
namespace Common::Android::WebBrowser {
void InitJNI(JNIEnv* env) {
const jclass local = env->FindClass("org/yuzu/yuzu_emu/NativeLibrary");
s_native_library_class = static_cast<jclass>(env->NewGlobalRef(local));
env->DeleteLocalRef(local);
s_open_external_url = env->GetStaticMethodID(s_native_library_class, "openExternalUrl", "(Ljava/lang/String;)V");
}
void CleanupJNI(JNIEnv* env) {
if (s_native_library_class != nullptr) {
env->DeleteGlobalRef(s_native_library_class);
s_native_library_class = nullptr;
}
s_open_external_url = nullptr;
}
void AndroidWebBrowser::OpenLocalWebPage(const std::string& local_url, ExtractROMFSCallback extract_romfs_callback, OpenWebPageCallback callback) const {
LOG_WARNING(Frontend, "(STUBBED)");
callback(Service::AM::Frontend::WebExitReason::WindowClosed, "");
}
void AndroidWebBrowser::OpenExternalWebPage(const std::string& external_url, OpenWebPageCallback callback) const {
// do a dedicated thread, calling from the this thread crashed CPU fiber.
Common::Android::RunJNIOnFiber<void>([&](JNIEnv* env) {
if (env != nullptr && s_native_library_class != nullptr && s_open_external_url != nullptr) {
const jstring j_url = Common::Android::ToJString(env, external_url);
env->CallStaticVoidMethod(s_native_library_class, s_open_external_url, j_url);
env->DeleteLocalRef(j_url);
} else {
LOG_ERROR(Frontend, "JNI not initialized, cannot open {}", external_url);
}
return;
});
callback(Service::AM::Frontend::WebExitReason::WindowClosed, external_url);
}
} // namespace Common::Android::WebBrowser

30
src/common/android/applets/web_browser.h

@ -0,0 +1,30 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <jni.h>
#include <string>
#include "core/frontend/applets/web_browser.h"
namespace Common::Android::WebBrowser {
class AndroidWebBrowser final : public Core::Frontend::WebBrowserApplet {
public:
~AndroidWebBrowser() override = default;
void Close() const override {}
void OpenLocalWebPage(const std::string& local_url,
ExtractROMFSCallback extract_romfs_callback,
OpenWebPageCallback callback) const override;
void OpenExternalWebPage(const std::string& external_url,
OpenWebPageCallback callback) const override;
};
void InitJNI(JNIEnv* env);
void CleanupJNI(JNIEnv* env);
} // namespace Common::Android::WebBrowser

3
src/common/android/id_cache.cpp

@ -4,6 +4,7 @@
#include <jni.h>
#include "applets/software_keyboard.h"
#include "applets/web_browser.h"
#include "common/android/id_cache.h"
#include "common/assert.h"
#include "common/fs/fs_android.h"
@ -602,6 +603,7 @@ namespace Common::Android {
// Initialize applets
Common::Android::SoftwareKeyboard::InitJNI(env);
Common::Android::WebBrowser::InitJNI(env);
return JNI_VERSION;
}
@ -631,6 +633,7 @@ namespace Common::Android {
// UnInitialize applets
SoftwareKeyboard::CleanupJNI(env);
WebBrowser::CleanupJNI(env);
AndroidMultiplayer::NetworkShutdown();
}

Loading…
Cancel
Save