You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
9.2 KiB
216 lines
9.2 KiB
/* |
|
* android_jni_bridge.h — JNI bridge API (C side) |
|
* |
|
* Provides lifecycle management and callbacks between C core and Kotlin. |
|
* For Android, compiled via NDK into libutun_lite.so. |
|
*/ |
|
#ifndef ANDROID_JNI_BRIDGE_H |
|
#define ANDROID_JNI_BRIDGE_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include <stdbool.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/* ── Callback types (C → Kotlin) ── */ |
|
|
|
typedef void (*utun_log_fn)(int level, const char* category, const char* message); |
|
|
|
typedef void (*utun_event_fn)(int event_type, const char* json_data); |
|
|
|
typedef const char* (*utun_config_string_fn)(const char* key); |
|
typedef int64_t (*utun_config_int64_fn)(const char* key); |
|
typedef int (*utun_config_int_fn)(const char* key); |
|
|
|
struct utun_bridge_config { |
|
utun_config_string_fn get_string; |
|
utun_config_int64_fn get_int64; |
|
utun_config_int_fn get_int; |
|
}; |
|
|
|
/* ── Initialize uTun core (legacy stub — use start for real init) ── */ |
|
|
|
bool utun_bridge_init(const char* db_path, int control_port, |
|
utun_log_fn on_log, |
|
utun_event_fn on_event, |
|
const struct utun_bridge_config* config); |
|
|
|
/* ── Start full uTun stack from INI config text ── */ |
|
int utun_bridge_start(const char* config_text); |
|
|
|
/* ── Shutdown uTun core ── */ |
|
void utun_bridge_destroy(void); |
|
|
|
/* ── Actions (Kotlin → C) ── */ |
|
|
|
void utun_bridge_send_message(const char* channel_id, const char* text); |
|
void utun_bridge_create_channel(const char* name, const char* channel_id); |
|
void utun_bridge_connect_node(const char* address, int port, const char* pubkey_hex); |
|
|
|
/* Join channel via invite link. |
|
addr_data format: family(1) + socketId(1) + address(4|16) + port(2 BE) per addr */ |
|
void utun_bridge_join_channel(uint64_t channel_id, uint64_t node_id, |
|
const uint8_t* pubkey_bin, |
|
const uint8_t* addrs_data, int addr_count, |
|
int addrs_data_len, uint64_t join_key); |
|
|
|
/* Connect to all peers of a channel (auto-connect on select) */ |
|
void utun_bridge_connect_channel(const char* channel_id); |
|
|
|
/* Однократная попытка подключения к конкретному узлу канала (ручной "Connect"). */ |
|
void utun_bridge_connect_member_node(const char* channel_id, uint64_t node_id); |
|
|
|
/* ── Queries ── */ |
|
|
|
char* utun_bridge_get_channels_json(void); |
|
char* utun_bridge_get_messages_json(const char* channel_id, int limit); |
|
uint64_t utun_bridge_get_my_node_id(void); |
|
|
|
/* ── Restart (config update, key regen, DB clear) ── */ |
|
|
|
void utun_bridge_restart(const char* config_text); |
|
|
|
/* ── Лёгкое обновление сокетов (auto_sockets=android) ── */ |
|
|
|
void utun_bridge_update_sockets(const char* config_text); |
|
|
|
/* ── Health check ── */ |
|
|
|
void utun_bridge_ping(void); |
|
int utun_bridge_is_responsive(void); |
|
|
|
/* ── Voice recording ── */ |
|
|
|
int utun_bridge_voice_start(const char* channel_id); |
|
int utun_bridge_voice_feed(const int16_t* samples, int count); |
|
int utun_bridge_voice_stop(int* out_duration_ms); |
|
void utun_bridge_voice_cancel(void); |
|
int utun_bridge_voice_is_active(void); |
|
void utun_bridge_voice_set_preset(int preset); |
|
int utun_bridge_voice_get_preset(void); |
|
void utun_bridge_voice_set_compressor(int enabled); |
|
int utun_bridge_voice_get_compressor(void); |
|
void utun_bridge_voice_set_compressor_config(int max_gain_db, int lookback_ms, int lookahead_ms, |
|
float rise_rate_per_sec, float target_level_db); |
|
float utun_bridge_voice_get_peak_level(void); |
|
|
|
/* ── Attachment ── */ |
|
|
|
int utun_bridge_attachment_send(const char* channel_id, const char* file_path, const char* db_path); |
|
int utun_bridge_attachment_download(const char* channel_id, int64_t msg_id); |
|
|
|
/* Отправка видеосообщения (src — готовый mp4, без транскода) */ |
|
int utun_bridge_video_send(const char* channel_id, const char* file_path, const char* db_path, |
|
int duration_ms, int width, int height); |
|
|
|
/* Отправка фото (src — готовый jpeg, без транскода) */ |
|
int utun_bridge_photo_send(const char* channel_id, const char* file_path, const char* db_path, |
|
int width, int height); |
|
|
|
/* ── Voice playback (Opus decode) ── */ |
|
|
|
void* utun_bridge_voice_decode_open(const char* file_path, |
|
int* out_sample_rate, int* out_channels, |
|
int* out_total_samples); |
|
int utun_bridge_voice_decode_read(void* handle, int16_t* buf, int max_samples); |
|
void utun_bridge_voice_decode_close(void* handle); |
|
|
|
/* ── P2P аудио-звонок (сигналинг + медиа) ── */ |
|
|
|
void utun_bridge_call_start(const char* ch_id, uint64_t peer_node_id, uint64_t call_id); |
|
void utun_bridge_call_accept(uint64_t call_id); |
|
void utun_bridge_call_decline(uint64_t call_id); |
|
void utun_bridge_call_hangup(uint64_t call_id); |
|
int utun_bridge_call_is_online(const char* ch_id, uint64_t peer_node_id); |
|
|
|
/* Аудио-движок звонка (call_audio.c, единый голосовой стек): PCM из AudioRecord → |
|
* Opus → peer (feed); принятый Opus → джиттер+декод+stretch → PCM (pull). */ |
|
int utun_bridge_call_audio_start(uint64_t call_id); |
|
int utun_bridge_call_audio_feed(uint64_t call_id, const int16_t* pcm, int count); |
|
int utun_bridge_call_audio_pull(uint64_t call_id, int16_t* out, int max_samples); |
|
void utun_bridge_call_audio_stop(void); |
|
|
|
/* ── Рация (PTT walkie-talkie): подписка + аудио-движок ── */ |
|
|
|
void utun_bridge_radio_set_active(uint64_t group_id, int on); |
|
int utun_bridge_radio_subscribers(uint64_t group_id); |
|
int utun_bridge_radio_audio_start(uint64_t group_id); |
|
int utun_bridge_radio_audio_feed(uint64_t group_id, const int16_t* pcm, int count); |
|
int utun_bridge_radio_audio_pull(uint64_t group_id, int16_t* out, int max_samples); |
|
void utun_bridge_radio_audio_stop(void); |
|
void utun_bridge_radio_talk_begin(uint64_t group_id); |
|
void utun_bridge_radio_talk_end(uint64_t group_id); |
|
|
|
/* ── Invite link (for sharing) — асинхронно через uasync-поток. |
|
Результат приходит событиями CHAT_EVT_INVITE_CANDIDATES / CHAT_EVT_INVITE_LINK_READY. ── */ |
|
void utun_bridge_request_invite_candidates(const char* channel_id); |
|
void utun_bridge_request_invite_link(const char* channel_id, uint64_t target_node_id, uint64_t request_id); |
|
|
|
/* ── Debug ── */ |
|
|
|
void utun_bridge_set_debug_level(const char* category, const char* level); |
|
|
|
/* ── Chat settings ── */ |
|
|
|
void utun_bridge_chat_setting_set(const char* name, const char* value); |
|
int utun_bridge_chat_setting_get_int(const char* name, int def); |
|
|
|
/* ── Channel members ── */ |
|
|
|
char* utun_bridge_get_channel_members_json(const char* channel_id); |
|
char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_id); |
|
void utun_bridge_set_member_nick(const char* channel_id, uint64_t node_id, const char* nick); |
|
int utun_bridge_is_channel_owner(const char* channel_id); |
|
void utun_bridge_set_member_flags(const char* channel_id, uint64_t node_id, |
|
int admin, int supernode, int moder, int storage, |
|
int verified, int deleted); |
|
|
|
char* utun_bridge_get_member_links_json(uint64_t node_id); |
|
|
|
/* Передать канальный приватный ключ (права админа) другому узлу. */ |
|
void utun_bridge_transfer_admin(const char* channel_id, uint64_t node_id); |
|
|
|
/* Локально удалить канал (drop таблиц, соединений, медиа, db_sync). */ |
|
void utun_bridge_delete_channel(const char* channel_id); |
|
|
|
/* ── Per-channel «play sound on message» (троттлинг db_sync на сервере) ── */ |
|
|
|
int utun_bridge_get_sound_on_message(const char* channel_id); |
|
void utun_bridge_set_sound_on_message(const char* channel_id, int on); |
|
|
|
/* ── Local sockets state (for auto-mode display) ── */ |
|
|
|
char* utun_bridge_get_local_sockets_json(void); |
|
|
|
/* ── Network change notification (ConnectivityManager → auto_socket) ── */ |
|
|
|
void utun_bridge_on_network_change(void); |
|
|
|
/* ── App foreground/background (Android lifecycle) → client_activity ── */ |
|
|
|
void utun_bridge_set_active(int active); |
|
|
|
/* ── External network activity (ConnectivityManager) → standby early wake ── */ |
|
|
|
void utun_bridge_notify_network_active(void); |
|
|
|
/* ── Connection monitor (post collect functions to uasync thread) ── */ |
|
|
|
void utun_bridge_collect_conn_list(void); |
|
void utun_bridge_collect_conn_metrics(uint64_t peer_node_id); |
|
|
|
/* ── DM (личные сообщения) ── |
|
* dm_start/dm_send выполняются асинхронно через uasync (трамплины dm_core). |
|
* Результат dm_start — событие CHAT_EVT_DM_CONV_UPDATED. */ |
|
void utun_bridge_dm_start(uint64_t node_id, const char* source_ch_id, const char* peer_name); |
|
void utun_bridge_dm_send(const char* conv_id, const char* text); |
|
char* utun_bridge_dm_list_conversations_json(void); |
|
char* utun_bridge_dm_list_messages_json(const char* conv_id, int count, int offset); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
#endif /* ANDROID_JNI_BRIDGE_H */
|
|
|