module std::os::android @if(env::ANDROID);


enum AndroidLogPriority : (CInt val)
{
	ANDROID_LOG_UNKNOWN { 0 },
	ANDROID_LOG_DEFAULT { 1 },
	ANDROID_LOG_VERBOSE { 2 },
	ANDROID_LOG_DEBUG   { 3 },
	ANDROID_LOG_INFO    { 4 },
	ANDROID_LOG_WARN    { 5 },
	ANDROID_LOG_ERROR   { 6 },
	ANDROID_LOG_FATAL   { 7 },
	ANDROID_LOG_SILENT  { 8 }
}

enum AndroidLogId : (CInt val)
{
	LOG_ID_MIN      { 0 },
	LOG_ID_MAIN     { 0 },
	LOG_ID_RADIO    { 1 },
	LOG_ID_EVENTS   { 2 },
	LOG_ID_SYSTEM   { 3 },
	LOG_ID_CRASH    { 4 },
	LOG_ID_STATS    { 5 },
	LOG_ID_SECURITY { 6 },
	LOG_ID_KERNEL   { 7 },
	LOG_ID_MAX      { 7 },
	LOG_ID_DEFAULT  { 0x7FFFFFFF }
}

struct AndroidLogMessage @packed
{
	usz struct_size;
	CInt buffer_id;
	CInt priority;
	ZString tag;
	ZString file;
	CUInt line;
	ZString message;
}

extern fn CInt log_write(AndroidLogPriority prio, ZString tag, ZString text) @cname("__android_log_write");
extern fn CInt log_print(AndroidLogPriority prio, ZString tag, ZString fmt, ...) @cname("__android_log_print");
extern fn void log_assert(ZString cond, ZString tag, ZString fmt, ...) @cname("__android_log_assert");

fn bool log_id_is_valid(AndroidLogId id)
{
	return id >= LOG_ID_MIN && id < LOG_ID_MAX;
}

extern fn CInt log_buf_write(CInt bufID, CInt prio, ZString tag, ZString text) @cname("__android_log_buf_write");
extern fn CInt log_buf_print(CInt bufID, CInt prio, ZString tag, ZString fmt, ...) @cname("__android_log_buf_print");

alias LoggerFunction = fn void(AndroidLogMessage* log_message);
alias AborterFunction = fn void(ZString abort_message);

extern fn void log_write_log_message(AndroidLogMessage log_message) @cname("__android_log_write_log_message");
extern fn void log_set_logger(LoggerFunction logger) @cname("__android_log_set_logger");
extern fn void log_logd_logger(AndroidLogMessage log_message) @cname("__android_log_logd_logger");
extern fn void log_stderr_logger(AndroidLogMessage log_message) @cname("__android_log_stderr_logger");
extern fn void log_set_aborter(AborterFunction aborter) @cname("__android_log_set_aborter");
extern fn void log_call_aborter(ZString abort_message) @cname("__android_log_call_aborter");
extern fn void log_default_aborter(ZString abort_message) @cname("__android_log_default_aborter");
extern fn CInt log_is_loggable(CInt prio, ZString tag, CInt default_prio) @cname("__android_log_is_loggable");
extern fn CInt log_is_loggable_len(CInt prio, ZString tag, isz len, CInt default_prio) @cname("__android_log_is_loggable_len");
extern fn CInt log_set_minimum_priority(CInt priority) @cname("__android_log_set_minimum_priority");
extern fn CInt log_get_minimum_priority() @cname("__android_log_get_minimum_priority");
extern fn void log_set_default_tag(ZString tag) @cname("__android_log_set_default_tag");
