1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2024-09-20 00:39: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.di.DaggerAppComponent
import io.github.wulkanowy.services.sync.SyncWorkerFactory
import io.github.wulkanowy.utils.ActivityLifecycleLogger
import io.github.wulkanowy.utils.CrashlyticsTree
import io.github.wulkanowy.utils.DebugLogTree
import io.reactivex.exceptions.UndeliverableException
@ -51,6 +52,7 @@ class WulkanowyApp : DaggerApplication() {
} else {
Timber.plant(CrashlyticsTree())
}
registerActivityLifecycleCallbacks(ActivityLifecycleLogger())
}
private fun initCrashlytics() {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -14,7 +14,7 @@ class LoginPresenter @Inject constructor(errorHandler: ErrorHandler) : BasePrese
initAdapter()
showActionBar(false)
}
Timber.i("Login view is attached")
Timber.i("Login view was initialized")
}
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) {
super.onAttachView(view)
Timber.i("Lucky number view is attached")
view.run {
initView()
showContent(false)
enableSwipe(false)
}
Timber.i("Lucky number view was initialized")
loadData()
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,10 +2,11 @@ package io.github.wulkanowy.utils
import android.os.Bundle
import com.google.firebase.analytics.FirebaseAnalytics
import javax.inject.Inject
import javax.inject.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?>) {
Bundle().apply {

View File

@ -1,7 +1,16 @@
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 timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
class DebugLogTree : Timber.DebugTree() {
@ -20,3 +29,88 @@ class CrashlyticsTree : Timber.Tree() {
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 {
ext.kotlin_version = '1.3.30'
ext.kotlin_version = '1.3.31'
repositories {
mavenCentral()
google()