1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2024-09-20 02:19:08 -05:00

Add activity and fragment lifecycle logging (#327)

This commit is contained in:
Rafał Borcz 2019-04-26 23:53:02 +02:00 committed by Mikołaj Pich
parent 4464812651
commit 4a36d78709
23 changed files with 122 additions and 21 deletions

View File

@ -16,6 +16,7 @@ import io.github.wulkanowy.BuildConfig.CRASHLYTICS_ENABLED
import io.github.wulkanowy.BuildConfig.DEBUG import io.github.wulkanowy.BuildConfig.DEBUG
import io.github.wulkanowy.di.DaggerAppComponent import io.github.wulkanowy.di.DaggerAppComponent
import io.github.wulkanowy.services.sync.SyncWorkerFactory import io.github.wulkanowy.services.sync.SyncWorkerFactory
import io.github.wulkanowy.utils.ActivityLifecycleLogger
import io.github.wulkanowy.utils.CrashlyticsTree import io.github.wulkanowy.utils.CrashlyticsTree
import io.github.wulkanowy.utils.DebugLogTree import io.github.wulkanowy.utils.DebugLogTree
import io.reactivex.exceptions.UndeliverableException import io.reactivex.exceptions.UndeliverableException
@ -51,6 +52,7 @@ class WulkanowyApp : DaggerApplication() {
} else { } else {
Timber.plant(CrashlyticsTree()) Timber.plant(CrashlyticsTree())
} }
registerActivityLifecycleCallbacks(ActivityLifecycleLogger())
} }
private fun initCrashlytics() { private fun initCrashlytics() {

View File

@ -9,7 +9,6 @@ import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import io.github.wulkanowy.BuildConfig.DEBUG import io.github.wulkanowy.BuildConfig.DEBUG
import io.github.wulkanowy.WulkanowyApp import io.github.wulkanowy.WulkanowyApp
import io.github.wulkanowy.utils.FirebaseAnalyticsHelper
import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.SchedulersProvider
import javax.inject.Named import javax.inject.Named
import javax.inject.Singleton import javax.inject.Singleton
@ -30,7 +29,7 @@ internal class AppModule {
@Singleton @Singleton
@Provides @Provides
fun provideFirebaseAnalyticsHelper(context: Context) = FirebaseAnalyticsHelper(FirebaseAnalytics.getInstance(context)) fun provideFirebaseAnalytics(context: Context) = FirebaseAnalytics.getInstance(context)
@Singleton @Singleton
@Provides @Provides

View File

@ -11,6 +11,7 @@ import dagger.android.AndroidInjection
import dagger.android.DispatchingAndroidInjector import dagger.android.DispatchingAndroidInjector
import dagger.android.support.HasSupportFragmentInjector import dagger.android.support.HasSupportFragmentInjector
import io.github.wulkanowy.R import io.github.wulkanowy.R
import io.github.wulkanowy.utils.FragmentLifecycleLogger
import javax.inject.Inject import javax.inject.Inject
abstract class BaseActivity : AppCompatActivity(), BaseView, HasSupportFragmentInjector { abstract class BaseActivity : AppCompatActivity(), BaseView, HasSupportFragmentInjector {
@ -18,6 +19,9 @@ abstract class BaseActivity : AppCompatActivity(), BaseView, HasSupportFragmentI
@Inject @Inject
lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment> lateinit var supportFragmentInjector: DispatchingAndroidInjector<Fragment>
@Inject
lateinit var fragmentLifecycleLogger: FragmentLifecycleLogger
@Inject @Inject
lateinit var themeManager: ThemeManager lateinit var themeManager: ThemeManager
@ -27,6 +31,7 @@ abstract class BaseActivity : AppCompatActivity(), BaseView, HasSupportFragmentI
AndroidInjection.inject(this) AndroidInjection.inject(this)
themeManager.applyTheme(this) themeManager.applyTheme(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true)
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
} }

View File

@ -44,7 +44,7 @@ class AboutFragment : BaseFragment(), AboutView, MainView.TitledView {
.withFields(R.string::class.java.fields) .withFields(R.string::class.java.fields)
.withCheckCachedDetection(false) .withCheckCachedDetection(false)
.withExcludedLibraries("fastadapter", "AndroidIconics", "Jsoup", "Retrofit", "okio", .withExcludedLibraries("fastadapter", "AndroidIconics", "Jsoup", "Retrofit", "okio",
"OkHttp", "Butterknife", "CircleImageView") "Butterknife", "CircleImageView")
.withOnExtraListener { presenter.onExtraSelect(it) }) .withOnExtraListener { presenter.onExtraSelect(it) })
}.let { }.let {
fragmentCompat.onCreateView(inflater.context, inflater, container, savedInstanceState, it) fragmentCompat.onCreateView(inflater.context, inflater, container, savedInstanceState, it)

View File

@ -17,7 +17,7 @@ class AboutPresenter @Inject constructor(
override fun onAttachView(view: AboutView) { override fun onAttachView(view: AboutView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("About view is attached") Timber.i("About view was initialized")
} }
fun onExtraSelect(type: Libs.SpecialButton?) { fun onExtraSelect(type: Libs.SpecialButton?) {

View File

@ -19,8 +19,8 @@ class AccountPresenter @Inject constructor(
override fun onAttachView(view: AccountView) { override fun onAttachView(view: AccountView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Account dialog is attached")
view.initView() view.initView()
Timber.i("Account dialog view was initialized")
loadData() loadData()
} }

View File

@ -37,8 +37,8 @@ class AttendancePresenter @Inject constructor(
fun onAttachView(view: AttendanceView, date: Long?) { fun onAttachView(view: AttendanceView, date: Long?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Attendance view is attached")
view.initView() view.initView()
Timber.i("Attendance view was initialized")
loadData(ofEpochDay(date ?: now().previousOrSameSchoolDay.toEpochDay())) loadData(ofEpochDay(date ?: now().previousOrSameSchoolDay.toEpochDay()))
reloadView() reloadView()
} }

View File

@ -35,8 +35,8 @@ class AttendanceSummaryPresenter @Inject constructor(
fun onAttachView(view: AttendanceSummaryView, subjectId: Int?) { fun onAttachView(view: AttendanceSummaryView, subjectId: Int?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Attendance summary view is attached with subject id ${subjectId ?: -1}")
view.initView() view.initView()
Timber.i("Attendance summary view was initialized with subject id ${subjectId ?: -1}")
loadData(subjectId ?: -1) loadData(subjectId ?: -1)
loadSubjects() loadSubjects()
} }

View File

@ -36,8 +36,8 @@ class ExamPresenter @Inject constructor(
fun onAttachView(view: ExamView, date: Long?) { fun onAttachView(view: ExamView, date: Long?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Exam view is attached")
view.initView() view.initView()
Timber.i("Exam view was initialized")
loadData(ofEpochDay(date ?: now().nextOrSameSchoolDay.toEpochDay())) loadData(ofEpochDay(date ?: now().nextOrSameSchoolDay.toEpochDay()))
reloadView() reloadView()
} }

View File

@ -27,12 +27,12 @@ class GradePresenter @Inject constructor(
fun onAttachView(view: GradeView, savedIndex: Int?) { fun onAttachView(view: GradeView, savedIndex: Int?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Grade view is attached")
selectedIndex = savedIndex ?: 0 selectedIndex = savedIndex ?: 0
view.run { view.run {
initView() initView()
enableSwipe(false) enableSwipe(false)
} }
Timber.i("Grade view was initialized with $selectedIndex index")
loadData() loadData()
} }

View File

@ -34,8 +34,8 @@ class HomeworkPresenter @Inject constructor(
fun onAttachView(view: HomeworkView, date: Long?) { fun onAttachView(view: HomeworkView, date: Long?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Homework view is attached")
view.initView() view.initView()
Timber.i("Homework view was initialized")
loadData(LocalDate.ofEpochDay(date ?: LocalDate.now().nextOrSameSchoolDay.toEpochDay())) loadData(LocalDate.ofEpochDay(date ?: LocalDate.now().nextOrSameSchoolDay.toEpochDay()))
reloadView() reloadView()
} }

View File

@ -14,7 +14,7 @@ class LoginPresenter @Inject constructor(errorHandler: ErrorHandler) : BasePrese
initAdapter() initAdapter()
showActionBar(false) showActionBar(false)
} }
Timber.i("Login view is attached") Timber.i("Login view was initialized")
} }
fun onFormViewAccountLogged(students: List<Student>, loginData: Triple<String, String, String>) { fun onFormViewAccountLogged(students: List<Student>, loginData: Triple<String, String, String>) {

View File

@ -21,12 +21,12 @@ class LuckyNumberPresenter @Inject constructor(
override fun onAttachView(view: LuckyNumberView) { override fun onAttachView(view: LuckyNumberView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Lucky number view is attached")
view.run { view.run {
initView() initView()
showContent(false) showContent(false)
enableSwipe(false) enableSwipe(false)
} }
Timber.i("Lucky number view was initialized")
loadData() loadData()
} }

View File

@ -26,8 +26,8 @@ class MainPresenter @Inject constructor(
super.onAttachView(view) super.onAttachView(view)
view.run { view.run {
startMenuIndex = if (initMenuIndex != -1) initMenuIndex else prefRepository.startMenuIndex startMenuIndex = if (initMenuIndex != -1) initMenuIndex else prefRepository.startMenuIndex
Timber.i("Main view is attached with $startMenuIndex menu index")
initView() initView()
Timber.i("Main view was initialized with $startMenuIndex menu index")
} }
syncManager.startSyncWorker() syncManager.startSyncWorker()

View File

@ -16,10 +16,10 @@ class MessagePresenter @Inject constructor(
override fun onAttachView(view: MessageView) { override fun onAttachView(view: MessageView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Message view is attached")
disposable.add(Completable.timer(150, MILLISECONDS, schedulers.mainThread) disposable.add(Completable.timer(150, MILLISECONDS, schedulers.mainThread)
.subscribe { .subscribe {
view.initView() view.initView()
Timber.i("Message view was initialized")
loadData() loadData()
}) })
} }

View File

@ -32,7 +32,7 @@ class SendMessagePresenter @Inject constructor(
fun onAttachView(view: SendMessageView, message: Message?, reply: Boolean?) { fun onAttachView(view: SendMessageView, message: Message?, reply: Boolean?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Send message view is attached") Timber.i("Send message view was initialized")
loadData(message, reply) loadData(message, reply)
view.apply { view.apply {
message?.let { message?.let {

View File

@ -10,8 +10,8 @@ class MorePresenter @Inject constructor(errorHandler: ErrorHandler) : BasePresen
override fun onAttachView(view: MoreView) { override fun onAttachView(view: MoreView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("More view is attached")
view.initView() view.initView()
Timber.i("More view was initialized")
loadData() loadData()
} }

View File

@ -23,8 +23,8 @@ class NotePresenter @Inject constructor(
override fun onAttachView(view: NoteView) { override fun onAttachView(view: NoteView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Note view is attached")
view.initView() view.initView()
Timber.i("Note view was initialized")
loadData() loadData()
} }

View File

@ -21,7 +21,7 @@ class SettingsPresenter @Inject constructor(
override fun onAttachView(view: SettingsView) { override fun onAttachView(view: SettingsView) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Settings view is attached") Timber.i("Settings view was initialized")
view.setServicesSuspended(preferencesRepository.serviceEnableKey, now().isHolidays) view.setServicesSuspended(preferencesRepository.serviceEnableKey, now().isHolidays)
} }

View File

@ -35,8 +35,8 @@ class TimetablePresenter @Inject constructor(
fun onAttachView(view: TimetableView, date: Long?) { fun onAttachView(view: TimetableView, date: Long?) {
super.onAttachView(view) super.onAttachView(view)
Timber.i("Timetable is attached")
view.initView() view.initView()
Timber.i("Timetable was initialized")
loadData(ofEpochDay(date ?: now().nextOrSameSchoolDay.toEpochDay())) loadData(ofEpochDay(date ?: now().nextOrSameSchoolDay.toEpochDay()))
reloadView() reloadView()
} }

View File

@ -2,10 +2,11 @@ package io.github.wulkanowy.utils
import android.os.Bundle import android.os.Bundle
import com.google.firebase.analytics.FirebaseAnalytics import com.google.firebase.analytics.FirebaseAnalytics
import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
class FirebaseAnalyticsHelper(private val analytics: FirebaseAnalytics) { class FirebaseAnalyticsHelper @Inject constructor(private val analytics: FirebaseAnalytics) {
fun logEvent(name: String, vararg params: Pair<String, Any?>) { fun logEvent(name: String, vararg params: Pair<String, Any?>) {
Bundle().apply { Bundle().apply {

View File

@ -1,7 +1,16 @@
package io.github.wulkanowy.utils package io.github.wulkanowy.utils
import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
class DebugLogTree : Timber.DebugTree() { class DebugLogTree : Timber.DebugTree() {
@ -20,3 +29,88 @@ class CrashlyticsTree : Timber.Tree() {
else Crashlytics.logException(t) else Crashlytics.logException(t)
} }
} }
class ActivityLifecycleLogger : Application.ActivityLifecycleCallbacks {
override fun onActivityPaused(activity: Activity?) {
activity?.let { Timber.d("${it::class.java.simpleName} PAUSED") }
}
override fun onActivityResumed(activity: Activity?) {
activity?.let { Timber.d("${it::class.java.simpleName} RESUMED") }
}
override fun onActivityStarted(activity: Activity?) {
activity?.let { Timber.d("${it::class.java.simpleName} STARTED") }
}
override fun onActivityDestroyed(activity: Activity?) {
activity?.let { Timber.d("${it::class.java.simpleName} DESTROYED") }
}
override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) {
activity?.let { Timber.d("${it::class.java.simpleName} SAVED INSTANCE STATE") }
}
override fun onActivityStopped(activity: Activity?) {
activity?.let { Timber.d("${it::class.java.simpleName} STOPPED") }
}
override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
activity?.let { Timber.d("${it::class.java.simpleName} CREATED ${checkSavedState(savedInstanceState)}") }
}
}
@Singleton
class FragmentLifecycleLogger @Inject constructor() : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentViewCreated(fm: FragmentManager, f: Fragment, v: View, savedInstanceState: Bundle?) {
Timber.d("${f::class.java.simpleName} VIEW CREATED ${checkSavedState(savedInstanceState)}")
}
override fun onFragmentStopped(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} STOPPED")
}
override fun onFragmentCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
Timber.d("${f::class.java.simpleName} CREATED ${checkSavedState(savedInstanceState)}")
}
override fun onFragmentResumed(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} RESUMED")
}
override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) {
Timber.d("${f::class.java.simpleName} ATTACHED")
}
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} DESTROYED")
}
override fun onFragmentSaveInstanceState(fm: FragmentManager, f: Fragment, outState: Bundle) {
Timber.d("${f::class.java.simpleName} SAVED INSTANCE STATE")
}
override fun onFragmentStarted(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} STARTED")
}
override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} VIEW DESTROYED")
}
override fun onFragmentActivityCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
Timber.d("${f::class.java.simpleName} ACTIVITY CREATED ${checkSavedState(savedInstanceState)}")
}
override fun onFragmentPaused(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} PAUSED")
}
override fun onFragmentDetached(fm: FragmentManager, f: Fragment) {
Timber.d("${f::class.java.simpleName} DETACHED")
}
}
private fun checkSavedState(savedInstanceState: Bundle?) = if (savedInstanceState == null) "(STATE IS NULL)" else ""

View File

@ -1,5 +1,5 @@
buildscript { buildscript {
ext.kotlin_version = '1.3.30' ext.kotlin_version = '1.3.31'
repositories { repositories {
mavenCentral() mavenCentral()
google() google()