Commit 58771fc4 authored by Max Kellermann's avatar Max Kellermann

Android: obtain music directory from Environment.getExternalStoragePublicDirectory()

parent 1e06c66c
......@@ -252,12 +252,17 @@ libjava_a_SOURCES = \
src/java/File.cxx src/java/File.hxx \
src/java/String.cxx src/java/String.hxx
noinst_LIBRARIES += libandroid.a
libandroid_a_SOURCES = \
src/android/Environment.cxx src/android/Environment.hxx
libandroid_a_CPPFLAGS = $(AM_CPPFLAGS) -Iandroid/build/include
noinst_LIBRARIES += libmain.a
libmain_a_SOURCES = \
src/Main.cxx src/Main.hxx
libmain_a_CPPFLAGS = $(AM_CPPFLAGS) -Iandroid/build/include
src_mpd_LDADD += libjava.a
src_mpd_LDADD += libandroid.a libjava.a
all-local: android/build/bin/Main-debug.apk
clean-local:
......
......@@ -92,6 +92,7 @@
#ifdef ANDROID
#include "java/Global.hxx"
#include "java/File.hxx"
#include "android/Environment.hxx"
#include "org_musicpd_Bridge.h"
#endif
......@@ -679,8 +680,11 @@ Java_org_musicpd_Bridge_run(JNIEnv *env, jclass)
{
Java::Init(env);
Java::File::Initialise(env);
Environment::Initialise(env);
mpd_main(0, nullptr);
Environment::Deinitialise(env);
}
#endif
/*
Copyright_License {
XCSoar Glide Computer - http://www.xcsoar.org/
Copyright (C) 2000-2013 The XCSoar Project
A detailed list of copyright holders can be found in the file "AUTHORS".
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
*/
#include "Environment.hxx"
#include "java/Class.hxx"
#include "java/String.hxx"
#include "java/File.hxx"
#include "util/StringUtil.hxx"
namespace Environment {
static Java::TrivialClass cls;
static jmethodID getExternalStorageDirectory_method;
static jmethodID getExternalStoragePublicDirectory_method;
static jstring getExternalStorageDirectory(JNIEnv *env);
};
void
Environment::Initialise(JNIEnv *env)
{
cls.Find(env, "android/os/Environment");
getExternalStorageDirectory_method =
env->GetStaticMethodID(cls, "getExternalStorageDirectory",
"()Ljava/io/File;");
getExternalStoragePublicDirectory_method =
env->GetStaticMethodID(cls, "getExternalStoragePublicDirectory",
"(Ljava/lang/String;)Ljava/io/File;");
}
void
Environment::Deinitialise(JNIEnv *env)
{
cls.Clear(env);
}
static jstring
ToAbsolutePathChecked(JNIEnv *env, jobject file)
{
if (file == nullptr)
return nullptr;
jstring path = Java::File::getAbsolutePath(env, file);
env->DeleteLocalRef(file);
return path;
}
static jstring
Environment::getExternalStorageDirectory(JNIEnv *env)
{
jobject file = env->CallStaticObjectMethod(cls,
getExternalStorageDirectory_method);
return ToAbsolutePathChecked(env, file);
}
char *
Environment::getExternalStorageDirectory(char *buffer, size_t max_size)
{
JNIEnv *env = Java::GetEnv();
jstring value = getExternalStorageDirectory(env);
if (value == nullptr)
return nullptr;
Java::String value2(env, value);
value2.CopyTo(env, buffer, max_size);
return buffer;
}
static jstring
getExternalStoragePublicDirectory(JNIEnv *env, const char *type)
{
if (Environment::getExternalStoragePublicDirectory_method == nullptr)
/* needs API level 8 */
return nullptr;
Java::String type2(env, type);
jobject file = env->CallStaticObjectMethod(Environment::cls,
Environment::getExternalStoragePublicDirectory_method,
type2.Get());
return ToAbsolutePathChecked(env, file);
}
char *
Environment::getExternalStoragePublicDirectory(char *buffer, size_t max_size,
const char *type)
{
JNIEnv *env = Java::GetEnv();
jstring path = ::getExternalStoragePublicDirectory(env, type);
if (path == nullptr)
return nullptr;
Java::String path2(env, path);
path2.CopyTo(env, buffer, max_size);
return buffer;
}
/*
Copyright_License {
XCSoar Glide Computer - http://www.xcsoar.org/
Copyright (C) 2000-2013 The XCSoar Project
A detailed list of copyright holders can be found in the file "AUTHORS".
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
*/
#ifndef MPD_ANDROID_ENVIRONMENT_HXX
#define MPD_ANDROID_ENVIRONMENT_HXX
#include <jni.h>
#include <stddef.h>
namespace Environment {
void Initialise(JNIEnv *env);
void Deinitialise(JNIEnv *env);
/**
* Determine the mount point of the external SD card.
*/
char *getExternalStorageDirectory(char *buffer, size_t max_size);
char *getExternalStoragePublicDirectory(char *buffer, size_t max_size,
const char *type);
};
#endif
......@@ -20,7 +20,7 @@
#include "config.h"
// Use X Desktop guidelines where applicable
#if !defined(__APPLE__) && !defined(WIN32)
#if !defined(__APPLE__) && !defined(WIN32) && !defined(ANDROID)
#define USE_XDG
#endif
......@@ -47,6 +47,11 @@
#include <utility>
#endif
#ifdef ANDROID
#include "java/Global.hxx"
#include "android/Environment.hxx"
#endif
#ifndef WIN32
class PasswdEntry
{
......@@ -240,6 +245,14 @@ AllocatedPath GetUserMusicDir()
return GetStandardDir(CSIDL_MYMUSIC);
#elif defined(USE_XDG)
return GetUserDir("XDG_MUSIC_DIR");
#elif defined(ANDROID)
char buffer[1024];
if (Environment::getExternalStoragePublicDirectory(buffer,
sizeof(buffer),
"Music") == nullptr)
return AllocatedPath::Null();
return AllocatedPath::FromUTF8(buffer);
#else
return AllocatedPath::Null();
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment