diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index 5f592078d..a58a9804e 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -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() { diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index b8e1249e6..da1d8f7a8 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -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 diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 64c804a24..7fedac6b8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -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 + @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) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt index 52caf731e..6815b45f2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutFragment.kt @@ -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) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt index 116dbef35..0b6db107c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/about/AboutPresenter.kt @@ -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?) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt index 0fc6cc45c..7f41699fe 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/AccountPresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt index ec471c16a..ec3d57e34 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt index 8b17f7437..09ad8980f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryPresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 4b6ef298b..a18f7b2a4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index 2357e0637..6a8d4d580 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 739d44947..de85d8d11 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt index fb025beea..00242a7dc 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginPresenter.kt @@ -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, loginData: Triple) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt index 74ab0d1fe..8ef638db7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/LuckyNumberPresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 30f3b920f..e8d9402c5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -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() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt index 8e7af5124..888df0400 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessagePresenter.kt @@ -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() }) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt index 32e3d5b20..8dedaba01 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/send/SendMessagePresenter.kt @@ -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 { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt index 5fea241c7..a7626ec0d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/more/MorePresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt index 32e2a4adf..136a44135 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/note/NotePresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt index 6deb0a75c..c25198d56 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsPresenter.kt @@ -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) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index ebda3931a..5b837f076 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -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() } diff --git a/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt index feb33e5d7..e7ac9c99f 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -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) { Bundle().apply { diff --git a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt index 565374130..5a6cc2bfd 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt @@ -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 "" diff --git a/build.gradle b/build.gradle index c27fe437f..ac6bde63f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.30' + ext.kotlin_version = '1.3.31' repositories { mavenCentral() google()