1//
 2// Created by Han Yin on 10/31/25.
 3//
 4
 5#ifndef AICHAT_LOGGING_H
 6#define AICHAT_LOGGING_H
 7
 8#endif //AICHAT_LOGGING_H
 9
10#pragma once
11#include <android/log.h>
12
13#ifndef LOG_TAG
14#define LOG_TAG "ai-chat"
15#endif
16
17#ifndef LOG_MIN_LEVEL
18#if defined(NDEBUG)
19#define LOG_MIN_LEVEL ANDROID_LOG_INFO
20#else
21#define LOG_MIN_LEVEL ANDROID_LOG_VERBOSE
22#endif
23#endif
24
25static inline int ai_should_log(int prio) {
26    return __android_log_is_loggable(prio, LOG_TAG, LOG_MIN_LEVEL);
27}
28
29#if LOG_MIN_LEVEL <= ANDROID_LOG_VERBOSE
30#define LOGv(...) do { if (ai_should_log(ANDROID_LOG_VERBOSE)) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__); } while (0)
31#else
32#define LOGv(...) ((void)0)
33#endif
34
35#if LOG_MIN_LEVEL <= ANDROID_LOG_DEBUG
36#define LOGd(...) do { if (ai_should_log(ANDROID_LOG_DEBUG)) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__); } while (0)
37#else
38#define LOGd(...) ((void)0)
39#endif
40
41#define LOGi(...)   do { if (ai_should_log(ANDROID_LOG_INFO )) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__); } while (0)
42#define LOGw(...)   do { if (ai_should_log(ANDROID_LOG_WARN )) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__); } while (0)
43#define LOGe(...)   do { if (ai_should_log(ANDROID_LOG_ERROR)) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__); } while (0)
44
45static inline int android_log_prio_from_ggml(enum ggml_log_level level) {
46    switch (level) {
47        case GGML_LOG_LEVEL_ERROR: return ANDROID_LOG_ERROR;
48        case GGML_LOG_LEVEL_WARN:  return ANDROID_LOG_WARN;
49        case GGML_LOG_LEVEL_INFO:  return ANDROID_LOG_INFO;
50        case GGML_LOG_LEVEL_DEBUG: return ANDROID_LOG_DEBUG;
51        default:                   return ANDROID_LOG_DEFAULT;
52    }
53}
54
55static inline void aichat_android_log_callback(enum ggml_log_level level,
56                                              const char* text,
57                                              void* /*user*/) {
58    const int prio = android_log_prio_from_ggml(level);
59    if (!ai_should_log(prio)) return;
60    __android_log_write(prio, LOG_TAG, text);
61}