/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.amnezia.vpn import android.content.Context import java.io.File import java.time.LocalDateTime import android.util.Log as nativeLog /* * Drop in replacement for android.util.Log * Also stores a copy of all logs in tmp/amnezia_daemon_logs.txt */ class Log { val LOG_MAX_FILE_SIZE = 204800 private var file: File private constructor(context: Context) { val tempDIR = context.cacheDir file = File(tempDIR, "amnezia_daemon_logs.txt") if (file.length() > LOG_MAX_FILE_SIZE) { file.writeText("") } } companion object { var instance: Log? = null fun init(ctx: Context) { if (instance == null) { instance = Log(ctx) } } fun i(tag: String, message: String) { instance?.write("[info] - ($tag) - $message") if (!BuildConfig.DEBUG) { return; } nativeLog.i(tag, message) } fun v(tag: String, message: String) { instance?.write("($tag) - $message") if (!BuildConfig.DEBUG) { return; } nativeLog.v(tag, message) } fun e(tag: String, message: String) { instance?.write("[error] - ($tag) - $message") if (!BuildConfig.DEBUG) { return; } nativeLog.e(tag, message) } // Only Prints && Logs when in debug, noop in release. fun sensitive(tag: String, message: String?) { if (!BuildConfig.DEBUG) { return; } if (message == null) { return; } e(tag, message) } fun getContent(): String? { return try { instance?.file?.readText() } catch (e: Exception) { "=== Failed to read Daemon Logs === \n ${e.localizedMessage} " } } fun clearFile() { instance?.file?.writeText("") } } private fun write(message: String) { //LocalDateTime.now() //file.appendText("[${LocalDateTime.now()}] $message \n") } }