diff --git a/loader/src/platform/android/main.cpp b/loader/src/platform/android/main.cpp index 471b162ed..f15001461 100644 --- a/loader/src/platform/android/main.cpp +++ b/loader/src/platform/android/main.cpp @@ -17,7 +17,7 @@ extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* rese glDeleteVertexArraysOESEXT = (PFNGLDELETEVERTEXARRAYSOESPROC)eglGetProcAddress("glDeleteVertexArraysOES"); geodeEntry(nullptr); - return JNI_VERSION_1_1; + return JNI_VERSION_1_6; } extern "C" [[gnu::visibility("default")]] void emptyFunction(void*) { diff --git a/loader/src/platform/android/util.cpp b/loader/src/platform/android/util.cpp index 8da055a5c..dacc4a844 100644 --- a/loader/src/platform/android/util.cpp +++ b/loader/src/platform/android/util.cpp @@ -9,14 +9,41 @@ using namespace geode::prelude; #include #include +#include +#include + bool utils::clipboard::write(std::string const& data) { + JniMethodInfo t; + if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "writeClipboard", "(Ljava/lang/String;)V")) { + jstring stringArg1 = t.env->NewStringUTF(data.c_str()); + + t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1); + + t.env->DeleteLocalRef(stringArg1); + t.env->DeleteLocalRef(t.classID); + return true; + } return false; } std::string utils::clipboard::read() { + JniMethodInfo t; + if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "readClipboard", "()Ljava/lang/String;")) { + jstring stringResult = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID); + + std::string result = JniHelper::jstring2string(stringResult); + + t.env->DeleteLocalRef(stringResult); + t.env->DeleteLocalRef(t.classID); + return result; + } return ""; } +CCPoint cocos::getMousePos() { + return CCPoint(0, 0); +} + ghc::filesystem::path dirs::getGameDir() { return ghc::filesystem::path( "/storage/emulated/0/Android/data/com.geode.launcher/files/game" @@ -44,7 +71,17 @@ void utils::web::openLinkInBrowser(std::string const& url) { CCApplication::sharedApplication()->openURL(url.c_str()); } -bool utils::file::openFolder(ghc::filesystem::path const&) { +bool utils::file::openFolder(ghc::filesystem::path const& path) { + JniMethodInfo t; + if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "openFolder", "(Ljava/lang/String;)Z")) { + jstring stringArg1 = t.env->NewStringUTF(path.string().c_str()); + + jboolean result = t.env->CallStaticBooleanMethod(t.classID, t.methodID, stringArg1); + + t.env->DeleteLocalRef(stringArg1); + t.env->DeleteLocalRef(t.classID); + return result; + } return false; } @@ -58,16 +95,50 @@ void geode::utils::game::launchLoaderUninstaller(bool deleteSaveData) { } void geode::utils::game::exit() { + if (CCApplication::sharedApplication() && + (GameManager::get()->m_playLayer || GameManager::get()->m_levelEditorLayer)) { + log::error("Cannot exit in PlayLayer or LevelEditorLayer!"); + return; + } + AppDelegate::get()->trySaveGame(); + // AppDelegate::get()->showLoadingCircle(false, true); + CCDirector::get()->getActionManager()->addAction(CCSequence::create( CCDelayTime::create(0.5f), CCCallFunc::create(nullptr, callfunc_selector(MenuLayer::endGame)), nullptr - ), CCDirector::get()->getRunningScene(), false);; + ), CCDirector::get()->getRunningScene(), false); } void geode::utils::game::restart() { + if (CCApplication::sharedApplication() && + (GameManager::get()->m_playLayer || GameManager::get()->m_levelEditorLayer)) { + log::error("Cannot restart in PlayLayer or LevelEditorLayer!"); + return; + } + + class Exit : public CCObject { + public: + void restart() { + JniMethodInfo t; + if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "restartGame", "()V")) { + t.env->CallStaticVoidMethod(t.classID, t.methodID); + + t.env->DeleteLocalRef(t.classID); + } + } + }; // Not implemented - log::error("Restarting the game is not implemented on android"); + // log::error("Restarting the game is not implemented on android"); + + AppDelegate::get()->trySaveGame(); + // AppDelegate::get()->showLoadingCircle(false, true); + + CCDirector::get()->getActionManager()->addAction(CCSequence::create( + CCDelayTime::create(0.5f), + CCCallFunc::create(nullptr, callfunc_selector(Exit::restart)), + nullptr + ), CCDirector::get()->getRunningScene(), false); } #endif diff --git a/loader/src/platform/mac/util.mm b/loader/src/platform/mac/util.mm index 31111cfa5..e09712659 100644 --- a/loader/src/platform/mac/util.mm +++ b/loader/src/platform/mac/util.mm @@ -207,7 +207,7 @@ @implementation FileDialog void geode::utils::game::exit() { if (CCApplication::sharedApplication() && (GameManager::get()->m_playLayer || GameManager::get()->m_levelEditorLayer)) { - log::error("Cannot restart in PlayLayer or LevelEditorLayer!"); + log::error("Cannot exit in PlayLayer or LevelEditorLayer!"); return; }