mirror of
https://github.com/wulkanowy/wulkanowy.git
synced 2025-02-21 19:24:44 +01:00
Add activity and fragment lifecycle logging (#327)
This commit is contained in:
parent
4464812651
commit
4a36d78709
@ -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() {
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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?) {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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>) {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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 ""
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.3.30'
|
ext.kotlin_version = '1.3.31'
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user