diff --git a/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt b/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt index 29f8b17f6e..0d37eff20f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt @@ -51,11 +51,12 @@ fun UserProfileAvatar( Image( painter = rememberAsyncImagePainter(model = avatarResource), contentDescription = stringResource(R.string.content_description_user_avatar), - contentScale = ContentScale.Crop, modifier = Modifier .padding(dimensions().userAvatarStatusBorderSize) .background(Color.Companion.Black, CircleShape) .size(size) + .clip(CircleShape), + contentScale = ContentScale.FillBounds, ) UserStatusIndicator( status = status, @@ -67,5 +68,5 @@ fun UserProfileAvatar( @Preview @Composable fun UserProfileAvatarPreview() { - UserProfileAvatar(avatarAssetByteArray = null, status = UserStatus.BUSY) {} + UserProfileAvatar(status = UserStatus.BUSY) {} } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeTopBar.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeTopBar.kt index 97ac2c530d..f52f4a8e5d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeTopBar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeTopBar.kt @@ -11,10 +11,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource @@ -42,9 +42,11 @@ fun HomeTopBar( val scrollDownState = viewModel.scrollDownFlow.collectAsState(false) val firstLineElevation = if (!isSearchable || scrollDownState.value) dimensions().topBarElevationHeight else 0.dp - Box( - Modifier.background(Color.Transparent) - ) { + LaunchedEffect(viewModel) { + viewModel.loadUserAvatar() + } + + Box { if (isSearchable) { val searchFieldFullHeightPx = LocalDensity.current.run { (dimensions().topBarSearchFieldHeight + dimensions().topBarElevationHeight).toPx() @@ -71,7 +73,7 @@ fun HomeTopBar( navigationIconType = NavigationIconType.Menu, onNavigationPressed = { scope.launch { drawerState.open() } }, actions = { - UserProfileAvatar(isEnabled = true, status = UserStatus.AVAILABLE) { + UserProfileAvatar(avatarAssetByteArray = viewModel.userAvatar, isEnabled = true, status = UserStatus.AVAILABLE) { scope.launch { viewModel.navigateToUserProfile() } } }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt index 2e738afebd..6122dcde83 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt @@ -1,14 +1,21 @@ package com.wire.android.ui.home import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.wire.android.datastore.UserDataStore import com.wire.android.navigation.NavigationCommand import com.wire.android.navigation.NavigationItem import com.wire.android.navigation.NavigationManager +import com.wire.kalium.logic.feature.asset.GetPublicAssetUseCase +import com.wire.kalium.logic.feature.asset.PublicAssetResult import com.wire.kalium.logic.sync.ListenToEventsUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import javax.inject.Inject @@ -18,9 +25,14 @@ class HomeViewModel @Inject constructor( private val navigationManager: NavigationManager, private val listenToEvents: ListenToEventsUseCase, + private val dataStore: UserDataStore, + private val getPublicAssetUseCase: GetPublicAssetUseCase, private val commonManager: HomeCommonManager ) : ViewModel() { + var userAvatar by mutableStateOf(null) + private set + init { commonManager.onViewModelInit() } @@ -36,6 +48,14 @@ class HomeViewModel suspend fun navigateToUserProfile() = navigateTo(NavigationItem.UserProfile, MY_USER_PROFILE_SUBROUTE) + fun loadUserAvatar() { + viewModelScope.launch { + dataStore.avatarAssetId.first()?.let { + userAvatar = (getPublicAssetUseCase(it) as PublicAssetResult.Success).asset + } + } + } + suspend fun navigateTo(item: NavigationItem, extraRouteId: String = "") { navigationManager.navigate(NavigationCommand(destination = item.getRouteWithArgs(listOf(extraRouteId)))) } diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileScreen.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileScreen.kt index a6f115d164..10c14468dd 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileScreen.kt @@ -398,7 +398,7 @@ private fun OtherAccountItem( modifier = Modifier .fillMaxWidth() .height(dimensions().userProfileOtherAccItemHeight) - .padding(bottom = 1.dp) + .padding(start = dimensions().spacing8x, bottom = 1.dp) .background(MaterialTheme.colorScheme.surface) .selectableBackground(true) { onClick(account.id) } ) { diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileViewModel.kt index 1e03537c2e..f2b13bcf95 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/UserProfileViewModel.kt @@ -1,7 +1,6 @@ package com.wire.android.ui.userprofile import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.runtime.currentRecomposeScope import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue @@ -18,12 +17,9 @@ import com.wire.kalium.logic.feature.asset.GetPublicAssetUseCase import com.wire.kalium.logic.feature.asset.PublicAssetResult import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import javax.inject.Inject // Suppress for now after removing mockMethodForAvatar it should not complain @@ -33,7 +29,7 @@ import javax.inject.Inject class UserProfileViewModel @Inject constructor( private val navigationManager: NavigationManager, private val dataStore: UserDataStore, - private val getUserAvatar: GetPublicAssetUseCase, + private val getPublicAssetUseCase: GetPublicAssetUseCase, private val getSelf: GetSelfUserUseCase ) : ViewModel() { @@ -91,7 +87,7 @@ class UserProfileViewModel @Inject constructor( private suspend fun getAvatarAsByteArrayOrNull(avatarAssetId: UserAssetId): ByteArray? = try { - (getUserAvatar(avatarAssetId) as PublicAssetResult.Success).asset + (getPublicAssetUseCase(avatarAssetId) as PublicAssetResult.Success).asset } catch (e: Exception) { null } diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/image/AvatarPickerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/image/AvatarPickerViewModel.kt index 3d189499a4..af73717e5a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/image/AvatarPickerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/image/AvatarPickerViewModel.kt @@ -7,7 +7,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import androidx.core.content.MimeTypeFilter import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.wire.android.datastore.UserDataStore