CLOSES #455, CLOSES #487, CLOSES #501, CLOSES #540, CLOSES #585, CLOSES #591, CLOSES #593, CLOSES #595, CLOSES #597, CLOSES #599, CLOSES #600, CLOSES #606, CLOSES #607, CLOSES #610, CLOSES #613, CLOSES #616, CLOSES #620, CLOSES #626, CLOSES #632, CLOSES #633, CLOSES #647

This commit is contained in:
bryanthaboi
2026-08-02 08:17:16 -04:00
parent ebbc55c4d0
commit 35b3fa6d9c
87 changed files with 6349 additions and 285 deletions
@@ -253,6 +253,41 @@ bool restartApp()
return result;
}
bool httpDownload(const char *url, const char *destPath, const char *userAgent, const char *accept)
{
if (url == nullptr || destPath == nullptr)
return false;
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
jclass activity = env->FindClass("org/love2d/android/GameActivity");
// Old APK / new liblove skew: report "no transport" the same way a
// missing curl does, instead of aborting on a missing method (#597).
jmethodID method = env->GetStaticMethodID(activity, "httpDownload",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z");
if (method == nullptr)
{
env->ExceptionClear();
env->DeleteLocalRef(activity);
return false;
}
jstring jurl = env->NewStringUTF(url);
jstring jdest = env->NewStringUTF(destPath);
jstring jua = env->NewStringUTF(userAgent != nullptr ? userAgent : "gen1recomp");
jstring jaccept = accept != nullptr ? env->NewStringUTF(accept) : nullptr;
jboolean result = env->CallStaticBooleanMethod(activity, method, jurl, jdest, jua, jaccept);
env->DeleteLocalRef(jurl);
env->DeleteLocalRef(jdest);
env->DeleteLocalRef(jua);
if (jaccept != nullptr)
env->DeleteLocalRef(jaccept);
env->DeleteLocalRef(activity);
return result;
}
/*
* Helper functions for the filesystem module
*/
@@ -90,6 +90,14 @@ bool syncHealthSteps();
**/
bool restartApp();
/**
* Blocking HTTPS GET into destPath (GameActivity.httpDownload). Android has
* no curl binary, so this is the transport src/core/HostShell.lua uses there
* for the mod index and mod updates (#597). userAgent / accept may be null.
* Returns whether a complete file was written.
**/
bool httpDownload(const char *url, const char *destPath, const char *userAgent, const char *accept);
/*
* Helper functions for the filesystem module
*/
@@ -230,6 +230,20 @@ bool System::restartApp() const
#endif
}
bool System::httpDownload(const char *url, const char *destPath,
const char *userAgent, const char *accept) const
{
#ifdef LOVE_ANDROID
return love::android::httpDownload(url, destPath, userAgent, accept);
#else
LOVE_UNUSED(url);
LOVE_UNUSED(destPath);
LOVE_UNUSED(userAgent);
LOVE_UNUSED(accept);
return false;
#endif
}
bool System::hasBackgroundMusic() const
{
#if defined(LOVE_ANDROID)
@@ -141,6 +141,14 @@ public:
**/
virtual bool restartApp() const;
/**
* Blocking HTTPS GET into an absolute host path (Android only; false
* elsewhere). Android has no curl, which is what every other platform
* fetches the mod index with (#597).
**/
virtual bool httpDownload(const char *url, const char *destPath,
const char *userAgent = nullptr, const char *accept = nullptr) const;
/**
* Gets if the user is playing music on background.
* Throws an exception on unsupported platforms.
@@ -123,6 +123,16 @@ int w_restartApp(lua_State *L)
return 1;
}
int w_httpDownload(lua_State *L)
{
const char *url = luaL_checkstring(L, 1);
const char *dest = luaL_checkstring(L, 2);
const char *ua = luaL_optstring(L, 3, nullptr);
const char *accept = luaL_optstring(L, 4, nullptr);
luax_pushboolean(L, instance()->httpDownload(url, dest, ua, accept));
return 1;
}
int w_hasBackgroundMusic(lua_State *L)
{
lua_pushboolean(L, instance()->hasBackgroundMusic());
@@ -142,6 +152,7 @@ static const luaL_Reg functions[] =
{ "createFile", w_createFile },
{ "syncHealthSteps", w_syncHealthSteps },
{ "restartApp", w_restartApp },
{ "httpDownload", w_httpDownload },
{ "hasBackgroundMusic", w_hasBackgroundMusic },
{ 0, 0 }
};