Use lifecycle-scoped IO for screen work
This commit is contained in:
@@ -19,7 +19,11 @@ import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import se.ajpanton.notificationlog.data.EncryptedImageStore
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
/** Full-screen image viewer kept within MainActivity so opening it does not re-lock the app. */
|
||||
class ImageViewerDialogFragment : DialogFragment() {
|
||||
@@ -67,27 +71,25 @@ class ImageViewerDialogFragment : DialogFragment() {
|
||||
val targetWidth = resources.displayMetrics.widthPixels
|
||||
val targetHeight = resources.displayMetrics.heightPixels
|
||||
val appContext = requireContext().applicationContext
|
||||
Thread {
|
||||
val bitmap = runCatching {
|
||||
lifecycleScope.launch {
|
||||
val bitmap = withContext(Dispatchers.IO) { runCatching {
|
||||
EncryptedImageStore(appContext).read(imageId)?.let { bytes ->
|
||||
decodeForViewer(bytes, targetWidth, targetHeight)
|
||||
}
|
||||
}.getOrNull()
|
||||
activity?.runOnUiThread {
|
||||
if (!isAdded) return@runOnUiThread
|
||||
progress.visibility = View.GONE
|
||||
if (bitmap == null) {
|
||||
root.addView(TextView(requireContext()).apply {
|
||||
text = "[image]"
|
||||
setTextColor(Color.WHITE)
|
||||
textSize = 18f
|
||||
}, FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER))
|
||||
} else {
|
||||
image.setImageBitmap(bitmap)
|
||||
image.visibility = View.VISIBLE
|
||||
}
|
||||
}.getOrNull() }
|
||||
if (!isAdded) return@launch
|
||||
progress.visibility = View.GONE
|
||||
if (bitmap == null) {
|
||||
root.addView(TextView(requireContext()).apply {
|
||||
text = "[image]"
|
||||
setTextColor(Color.WHITE)
|
||||
textSize = 18f
|
||||
}, FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER))
|
||||
} else {
|
||||
image.setImageBitmap(bitmap)
|
||||
image.visibility = View.VISIBLE
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
}
|
||||
|
||||
private fun decodeForViewer(bytes: ByteArray, targetWidth: Int, targetHeight: Int): Bitmap? {
|
||||
|
||||
Reference in New Issue
Block a user