aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/kotlin/ca/allanwang/kau/logging/KauLogger.kt
blob: 14655f006e818392199a70452cecec9096848479 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
@file:Suppress("NOTHING_TO_INLINE")

package ca.allanwang.kau.logging

import android.os.Looper
import android.util.Log


/**
 * Created by Allan Wang on 2017-05-28.
 *
 * Base logger class with a predefined tag
 * This may be extended by an object to effectively replace [Log]
 */
open class KauLogger(val tag: String) {

    open var enabled = true
    open var showPrivateText = false
    open var messageJoiner: (msg: String, privMsg: String) -> String = { msg, privMsg -> "$msg: $privMsg" }

    /**
     * Filter pass-through to decide what we wish to log
     * By default, we will ignore verbose and debug logs
     * @returns {@code true} to log the message, {@code false} to ignore
     */
    open var filter: (Int) -> Boolean = { it != Log.VERBOSE && it != Log.DEBUG }

    open fun disable(disable: Boolean = true): KauLogger {
        enabled = !disable
        return this
    }

    open fun debug(enable: Boolean) {
        filter = if (enable) { _ -> true } else { i -> i != Log.VERBOSE && i != Log.DEBUG }
        showPrivateText = enable
    }

    open fun log(priority: Int, message: String?, privateMessage: String?, t: Throwable? = null) {
        if (!shouldLog(priority, message, privateMessage, t)) return
        logImpl(priority, message, privateMessage, t)
    }

    protected open fun shouldLog(priority: Int, message: String?, privateMessage: String?, t: Throwable?): Boolean
            = enabled && filter(priority)

    protected open fun logImpl(priority: Int, message: String?, privateMessage: String?, t: Throwable?) {
        val text = if (showPrivateText) {
            if (message == null) privateMessage
            else if (privateMessage == null) message
            else messageJoiner(message, privateMessage)
        } else message

        if (t != null) Log.e(tag, text ?: "Error", t)
        else if (!text.isNullOrBlank()) Log.println(priority, tag, text)
    }

    open fun v(text: String?, privateText: String? = null) = log(Log.VERBOSE, text, privateText)
    open fun d(text: String?, privateText: String? = null) = log(Log.DEBUG, text, privateText)
    open fun i(text: String?, privateText: String? = null) = log(Log.INFO, text, privateText)
    open fun e(text: String?, privateText: String? = null) = log(Log.ERROR, text, privateText)
    open fun a(text: String?, privateText: String? = null) = log(Log.ASSERT, text, privateText)
    open fun e(t: Throwable?, text: String?, privateText: String? = null) = log(Log.ERROR, text, privateText, t)
    open fun eThrow(text: String?) {
        if (text != null)
            e(Throwable(text), text)
    }

    /**
     * Log the looper
     */
    open fun checkThread(id: Int) {
        val name = Thread.currentThread().name
        val status = if (Looper.myLooper() == Looper.getMainLooper()) "is" else "is not"
        d("$id $status in the main thread - thread name: $name")
    }
}