(this one is for @charlag)
Calling `PreferenceManager.getDefaultSharedPreferences()` will read the
preference file from disk every time. This PR makes `SharedPreferences`
a singleton so they will only be created once at appstart (with a few
exceptions where it is hard to inject, e.g. in the `openLink` helper)
which should help getting our ANRs down.
```
StrictMode policy violation; ~duration=285 ms: android.os.strictmode.DiskReadViolation
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1666)
at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:8054)
at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:313)
at java.io.File.exists(File.java:813)
at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:790)
at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:781)
at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:737)
at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:962)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:583)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:221)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:221)
at androidx.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:119)
at com.keylesspalace.tusky.BaseActivity.onCreate(BaseActivity.java:96)
...
```
36 lines
1.3 KiB
Kotlin
36 lines
1.3 KiB
Kotlin
@file:JvmName("RelativeTimeUpdater")
|
|
|
|
package com.keylesspalace.tusky.util
|
|
|
|
import android.content.SharedPreferences
|
|
import androidx.fragment.app.Fragment
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.coroutineScope
|
|
import androidx.lifecycle.repeatOnLifecycle
|
|
import com.keylesspalace.tusky.settings.PrefKeys
|
|
import kotlin.time.Duration.Companion.minutes
|
|
import kotlinx.coroutines.delay
|
|
import kotlinx.coroutines.launch
|
|
|
|
private val UPDATE_INTERVAL = 1.minutes
|
|
|
|
/**
|
|
* Helper method to update adapter periodically to refresh timestamp
|
|
* if setting absoluteTimeView is false.
|
|
* Start updates when the Fragment becomes visible and stop when it is hidden.
|
|
*/
|
|
fun Fragment.updateRelativeTimePeriodically(preferences: SharedPreferences, callback: Runnable) {
|
|
val lifecycle = viewLifecycleOwner.lifecycle
|
|
lifecycle.coroutineScope.launch {
|
|
// This child coroutine will launch each time the Fragment moves to the STARTED state
|
|
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
|
|
val useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false)
|
|
if (!useAbsoluteTime) {
|
|
while (true) {
|
|
callback.run()
|
|
delay(UPDATE_INTERVAL)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|