Skip to content

Instantly share code, notes, and snippets.

@Pooh3Mobi
Last active April 23, 2021 11:20
Show Gist options
  • Save Pooh3Mobi/530db4d78fca7e6091a380ce102b977f to your computer and use it in GitHub Desktop.
Save Pooh3Mobi/530db4d78fca7e6091a380ce102b977f to your computer and use it in GitHub Desktop.
LifeCycleObserveableLogger
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
object IndentProvider {
private var depth = 0
private const val SPACE = " "
fun getAndIncrement(): String {
require(depth >= 0)
val indentSpace = (0 until depth).joinToString(separator = "") { SPACE }
depth++
return indentSpace
}
fun incrementAndGet(): String {
require(depth >= 0)
depth++
return (0 until depth).joinToString(separator = "") { SPACE }
}
fun getAndDecrement(): String {
require(depth >= 0)
val indentSpace = (0 until depth).joinToString(separator = "") { SPACE }
depth--
check(depth >= 0)
return indentSpace
}
fun decrementAndGet(): String {
require(depth >= 0)
depth--
check(depth >= 0)
return (0 until depth).joinToString(separator = "") { SPACE }
}
fun current(): String {
require(depth >= 0)
return (0 until depth).joinToString(separator = "") { SPACE }
}
}
class IndentLogger(tag: String) {
private val prefix: String = run {
val tagSize = tag.length
(0 until 13).map { if (it < tagSize) tag[it] else " " }.joinToString(separator = "")
}
fun logAndIncrement(tag: String, msg: String) {
Log.d(tag, "${IndentProvider.getAndIncrement()}[$prefix]-$msg")
}
fun decrementAndLog(tag: String, msg: String) {
Log.d(tag, "${IndentProvider.decrementAndGet()}[$prefix]-$msg")
}
fun log(tag: String, msg: String) {
Log.d(tag, "${IndentProvider.current()}[$prefix]-$msg")
}
}
class LifeCycleObservableLogger(val logger: IndentLogger) : LifecycleObserver {
companion object {
const val TAG = "LifeCycleLog"
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreated() = logger.logAndIncrement(TAG, "ON_CREATE")
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStarted() = logger.logAndIncrement(TAG, "ON_START")
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResumed() = logger.logAndIncrement(TAG, "ON_RESUME")
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPaused() = logger.decrementAndLog(TAG, "ON_PAUSE")
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStopped() = logger.decrementAndLog(TAG, "ON_STOP")
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroyed() = logger.decrementAndLog(TAG, "ON_DESTROY")
fun onSaveInstanceState() = logger.log(TAG, "ON_SAVE_INSTANCE_STATE")
fun onRestoreSavedInstanceState() = logger.log(TAG, "ON_RESTORE_SAVED_INSTANCE_STATE")
fun onConfigurationChanged() = logger.log(TAG, "ON_CONFIGURATION_CHANGED")
fun onCreateView() = logger.log(TAG, "ON_CREATE_VIEW")
fun onViewCreated() = logger.log(TAG, "ON_VIEW_CREATED")
fun onDestroyView() = logger.log(TAG, "ON_DESTROY_VIEW")
fun onViewStateRestored() = logger.log(TAG, "ON_VIEW_STATE_RESTORED")
}
@Pooh3Mobi
Copy link
Author

Pooh3Mobi commented Apr 22, 2021

  • No configChanges options.

launch

D/LifeCycleLog: [FirstFragment]-ON_CREATE
D/LifeCycleLog:   [MainActivity ]-ON_CREATE
D/LifeCycleLog:     [FirstFragment]-ON_CREATE_VIEW
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_CREATED
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_STATE_RESTORED
D/LifeCycleLog:     [FirstFragment]-ON_START
D/LifeCycleLog:       [MainActivity ]-ON_START
D/LifeCycleLog:         [FirstFragment]-ON_RESUME
D/LifeCycleLog:           [MainActivity ]-ON_RESUME

launch other app and back.

 D/LifeCycleLog:           [MainActivity ]-ON_PAUSE
 D/LifeCycleLog:         [FirstFragment]-ON_PAUSE
 D/LifeCycleLog:       [MainActivity ]-ON_STOP
 D/LifeCycleLog:     [FirstFragment]-ON_STOP
 D/LifeCycleLog:     [FirstFragment]-ON_SAVE_INSTANCE_STATE
 D/LifeCycleLog:     [MainActivity ]-ON_SAVE_INSTANCE_STATE
 D/LifeCycleLog:     [FirstFragment]-ON_START
 D/LifeCycleLog:       [MainActivity ]-ON_START
 D/LifeCycleLog:         [FirstFragment]-ON_RESUME
 D/LifeCycleLog:           [MainActivity ]-ON_RESUME

launch other app and back. (don't keep activity)

D/LifeCycleLog:           [MainActivity ]-ON_PAUSE
D/LifeCycleLog:         [FirstFragment]-ON_PAUSE
D/LifeCycleLog:       [MainActivity ]-ON_STOP
D/LifeCycleLog:     [FirstFragment]-ON_STOP
D/LifeCycleLog:     [FirstFragment]-ON_SAVE_INSTANCE_STATE
D/LifeCycleLog:     [MainActivity ]-ON_SAVE_INSTANCE_STATE
D/LifeCycleLog:   [MainActivity ]-ON_DESTROY
D/LifeCycleLog:   [FirstFragment]-ON_DESTROY_VIEW
D/LifeCycleLog: [FirstFragment]-ON_DESTROY
D/LifeCycleLog: [FirstFragment]-ON_CREATE
D/LifeCycleLog:   [MainActivity ]-ON_CREATE
D/LifeCycleLog:     [FirstFragment]-ON_CREATE_VIEW
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_CREATED
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_STATE_RESTORED
D/LifeCycleLog:     [FirstFragment]-ON_START
D/LifeCycleLog:       [MainActivity ]-ON_START
D/LifeCycleLog:         [MainActivity ]-ON_RESTORE_SAVED_INSTANCE_STATE
D/LifeCycleLog:         [FirstFragment]-ON_RESUME
D/LifeCycleLog:           [MainActivity ]-ON_RESUME

rotate

same recreation log with don't keep activity.

D/LifeCycleLog:           [MainActivity ]-ON_PAUSE
D/LifeCycleLog:         [FirstFragment]-ON_PAUSE
D/LifeCycleLog:       [MainActivity ]-ON_STOP
D/LifeCycleLog:     [FirstFragment]-ON_STOP
D/LifeCycleLog:     [FirstFragment]-ON_SAVE_INSTANCE_STATE
D/LifeCycleLog:     [MainActivity ]-ON_SAVE_INSTANCE_STATE
D/LifeCycleLog:   [MainActivity ]-ON_DESTROY
D/LifeCycleLog:   [FirstFragment]-ON_DESTROY_VIEW
D/LifeCycleLog: [FirstFragment]-ON_DESTROY
D/LifeCycleLog: [FirstFragment]-ON_CREATE
D/LifeCycleLog:   [MainActivity ]-ON_CREATE
D/LifeCycleLog:     [FirstFragment]-ON_CREATE_VIEW
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_CREATED
D/LifeCycleLog:     [FirstFragment]-ON_VIEW_STATE_RESTORED
D/LifeCycleLog:     [FirstFragment]-ON_START
D/LifeCycleLog:       [MainActivity ]-ON_START
D/LifeCycleLog:         [MainActivity ]-ON_RESTORE_SAVED_INSTANCE_STATE
D/LifeCycleLog:         [FirstFragment]-ON_RESUME
D/LifeCycleLog:           [MainActivity ]-ON_RESUME

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment