mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-20 04:31:09 +02:00
bzinga
This commit is contained in:
@@ -183,6 +183,18 @@ void vibrate(double seconds)
|
||||
env->DeleteLocalRef(activity);
|
||||
}
|
||||
|
||||
bool showFilePicker()
|
||||
{
|
||||
JNIEnv *env = (JNIEnv*) SDL_AndroidGetJNIEnv();
|
||||
jclass activity = env->FindClass("org/love2d/android/GameActivity");
|
||||
|
||||
jmethodID method = env->GetStaticMethodID(activity, "showRomFilePicker", "()Z");
|
||||
jboolean result = env->CallStaticBooleanMethod(activity, method);
|
||||
|
||||
env->DeleteLocalRef(activity);
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* Helper functions for the filesystem module
|
||||
*/
|
||||
|
||||
@@ -59,6 +59,14 @@ bool openURL(const std::string &url);
|
||||
|
||||
void vibrate(double seconds);
|
||||
|
||||
/**
|
||||
* Shows the system's "pick a document" UI (Storage Access Framework).
|
||||
* Returns true if the picker was launched; the picked file (if any) is
|
||||
* copied asynchronously by GameActivity.onActivityResult into the app's
|
||||
* external save directory, not returned here -- see src/import/RomImporter.lua.
|
||||
**/
|
||||
bool showFilePicker();
|
||||
|
||||
/*
|
||||
* Helper functions for the filesystem module
|
||||
*/
|
||||
|
||||
@@ -186,6 +186,18 @@ bool Filesystem::setIdentity(const char *ident, bool appendToPath)
|
||||
|
||||
save_path_full = storage_path + std::string("/save/") + save_identity;
|
||||
|
||||
// love::android::mkdir is a single mkdir(), not mkdir -p: on a genuinely
|
||||
// first-ever launch (nothing has touched this app's external-files dir
|
||||
// before) save_directory doesn't exist yet either, so creating
|
||||
// save_path_full in one step fails with ENOENT and PHYSFS_mount below
|
||||
// silently never mounts anything for the rest of this process -- not
|
||||
// just the save dir, but everything routed through it (save.lua/
|
||||
// options.lua, the ROM-derived asset cache, RomImporter's Android
|
||||
// folder scan). Ensure each level exists in order instead.
|
||||
if (!love::android::directoryExists(save_directory.c_str()) &&
|
||||
!love::android::mkdir(save_directory.c_str()))
|
||||
SDL_Log("Error: Could not create save directory %s!", save_directory.c_str());
|
||||
|
||||
if (!love::android::directoryExists(save_path_full.c_str()) &&
|
||||
!love::android::mkdir(save_path_full.c_str()))
|
||||
SDL_Log("Error: Could not create save directory %s!", save_path_full.c_str());
|
||||
@@ -338,6 +350,26 @@ bool Filesystem::setupWriteDirectory()
|
||||
std::string temp_writedir = getDriveRoot(save_path_full);
|
||||
std::string temp_createdir = skipDriveRoot(save_path_full);
|
||||
|
||||
#ifdef LOVE_ANDROID
|
||||
// getUserDirectory() falls back to $HOME/getpwuid() (physfs_platform_posix.c),
|
||||
// which is meaningless on Android and unrelated to save_path_full (an
|
||||
// SDL_AndroidGet*StoragePath() subdirectory -- see setIdentity above), so
|
||||
// the generic check below never matches and falls through to setting the
|
||||
// write dir to the drive root ("/"), which no Android app can write to.
|
||||
// Anchor to the real Android storage root instead.
|
||||
std::string androidStorageRoot = isAndroidSaveExternal()
|
||||
? SDL_AndroidGetExternalStoragePath() : SDL_AndroidGetInternalStoragePath();
|
||||
if (save_path_full.find(androidStorageRoot) == 0)
|
||||
{
|
||||
temp_writedir = androidStorageRoot;
|
||||
temp_createdir = save_path_full.substr(androidStorageRoot.length());
|
||||
|
||||
size_t startpos = temp_createdir.find_first_not_of('/');
|
||||
if (startpos != std::string::npos)
|
||||
temp_createdir = temp_createdir.substr(startpos);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
// On some sandboxed platforms, physfs will break when its write directory
|
||||
// is the root of the drive and it tries to create a folder (even if the
|
||||
// folder's path is in a writable location.) If the user's home folder is
|
||||
|
||||
@@ -180,6 +180,15 @@ void System::vibrate(double seconds) const
|
||||
#endif
|
||||
}
|
||||
|
||||
bool System::pickFile() const
|
||||
{
|
||||
#ifdef LOVE_ANDROID
|
||||
return love::android::showFilePicker();
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool System::hasBackgroundMusic() const
|
||||
{
|
||||
#if defined(LOVE_ANDROID)
|
||||
|
||||
@@ -106,6 +106,15 @@ public:
|
||||
*/
|
||||
virtual void vibrate(double seconds) const;
|
||||
|
||||
/**
|
||||
* Shows the platform's native "pick a file" UI, if one is available.
|
||||
* Android only for now; the result (if any) is not returned here -- see
|
||||
* love::android::showFilePicker and src/import/RomImporter.lua.
|
||||
*
|
||||
* @return Whether the picker was shown.
|
||||
**/
|
||||
virtual bool pickFile() const;
|
||||
|
||||
/**
|
||||
* Gets if the user is playing music on background.
|
||||
* Throws an exception on unsupported platforms.
|
||||
|
||||
@@ -95,6 +95,12 @@ int w_vibrate(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int w_pickFile(lua_State *L)
|
||||
{
|
||||
luax_pushboolean(L, instance()->pickFile());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int w_hasBackgroundMusic(lua_State *L)
|
||||
{
|
||||
lua_pushboolean(L, instance()->hasBackgroundMusic());
|
||||
@@ -110,6 +116,7 @@ static const luaL_Reg functions[] =
|
||||
{ "getPowerInfo", w_getPowerInfo },
|
||||
{ "openURL", w_openURL },
|
||||
{ "vibrate", w_vibrate },
|
||||
{ "pickFile", w_pickFile },
|
||||
{ "hasBackgroundMusic", w_hasBackgroundMusic },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user