From ded56526ff99d10f2030780d007920fe13390ca5 Mon Sep 17 00:00:00 2001 From: yongsuk44 Date: Sat, 13 Apr 2024 14:06:20 +0900 Subject: [PATCH 1/2] Refactor image loading from ContentProvider to IO thread --- .../samples/socialite/ui/IconPainter.kt | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/google/android/samples/socialite/ui/IconPainter.kt b/app/src/main/java/com/google/android/samples/socialite/ui/IconPainter.kt index 2fa58b4b..7fffad41 100644 --- a/app/src/main/java/com/google/android/samples/socialite/ui/IconPainter.kt +++ b/app/src/main/java/com/google/android/samples/socialite/ui/IconPainter.kt @@ -16,19 +16,34 @@ package com.google.android.samples.socialite.ui +import android.graphics.drawable.Drawable import android.net.Uri import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.produceState import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalContext import androidx.core.graphics.drawable.IconCompat import com.google.accompanist.drawablepainter.rememberDrawablePainter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext /** * Creates and remembers a [Painter] from a bitmap icon specified by the [contentUri]. */ @Composable fun rememberIconPainter(contentUri: Uri): Painter { - val icon = IconCompat.createWithAdaptiveBitmapContentUri(contentUri) val context = LocalContext.current - return rememberDrawablePainter(drawable = icon.loadDrawable(context)) + + val loadDrawable by produceState( + initialValue = null, + key1 = contentUri, + ) { + value = withContext(Dispatchers.IO) { + val icon = IconCompat.createWithAdaptiveBitmapContentUri(contentUri) + icon.loadDrawable(context) + } + } + + return rememberDrawablePainter(drawable = loadDrawable) } From 97f714299e9ed0431ebdd835be0fe59f49d04e9f Mon Sep 17 00:00:00 2001 From: yongsuk44 Date: Tue, 16 Apr 2024 20:26:33 +0900 Subject: [PATCH 2/2] Add TTFD MacrobenchmarkRule --- .../com/google/android/samples/socialite/ui/home/ChatList.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/google/android/samples/socialite/ui/home/ChatList.kt b/app/src/main/java/com/google/android/samples/socialite/ui/home/ChatList.kt index e68a27e4..0d7c5572 100644 --- a/app/src/main/java/com/google/android/samples/socialite/ui/home/ChatList.kt +++ b/app/src/main/java/com/google/android/samples/socialite/ui/home/ChatList.kt @@ -17,6 +17,7 @@ package com.google.android.samples.socialite.ui.home import android.annotation.SuppressLint +import androidx.activity.compose.ReportDrawnWhen import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth @@ -47,6 +48,8 @@ internal fun ChatList( onChatClicked: (chatId: Long) -> Unit, modifier: Modifier = Modifier, ) { + ReportDrawnWhen { chats.isNotEmpty() } + @SuppressLint("InlinedApi") // Granted at install time on API <33. val notificationPermissionState = rememberPermissionState( android.Manifest.permission.POST_NOTIFICATIONS,