diff --git a/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/datasource/LocalDataSourceImpl.kt b/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/datasource/LocalDataSourceImpl.kt index 94cfb512..ff241feb 100644 --- a/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/datasource/LocalDataSourceImpl.kt +++ b/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/datasource/LocalDataSourceImpl.kt @@ -163,6 +163,14 @@ class LocalDataSourceImpl @Inject constructor( return getBoolean(KEY_IS_FIRST_OPEN, true) } + override fun saveHomeAlignState(alignState: String) { + putString(KEY_HOME_ALIGN_STATE, alignState) + } + + override fun getHomeAlignState(): String { + return getString(KEY_HOME_ALIGN_STATE, "") + } + companion object { private const val TAG = "preferences" private const val PREF_NAME = "pic_preferences" @@ -171,5 +179,6 @@ class LocalDataSourceImpl @Inject constructor( private const val KEY_USER_NAME = "key_user_name" private const val KEY_VOTE_FIRST_VISIT = "key_vote_first_visit" private const val KEY_IS_FIRST_OPEN = "key_is_first_open" + private const val KEY_HOME_ALIGN_STATE = "key_home_align_state" } } diff --git a/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/repository/ConfigRepositoryImpl.kt b/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/repository/ConfigRepositoryImpl.kt index 38ea64ef..a1dd57cd 100644 --- a/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/repository/ConfigRepositoryImpl.kt +++ b/data/src/main/java/com/mashup/gabbangzip/sharedalbum/data/repository/ConfigRepositoryImpl.kt @@ -14,4 +14,12 @@ class ConfigRepositoryImpl @Inject constructor( override suspend fun getIsFirstOpen(): Boolean { return localDataSource.getIsFirstOpen() } + + override suspend fun saveHomeAlignState(alignState: String) { + localDataSource.saveHomeAlignState(alignState) + } + + override suspend fun getHomeAlignState(): String { + return localDataSource.getHomeAlignState() + } } diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/datasource/LocalDataSource.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/datasource/LocalDataSource.kt index 67549797..392cd934 100644 --- a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/datasource/LocalDataSource.kt +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/datasource/LocalDataSource.kt @@ -15,4 +15,6 @@ interface LocalDataSource { fun getVoteFirstVisit(): Boolean fun saveIsFirstOpen(isFirstOpen: Boolean) fun getIsFirstOpen(): Boolean + fun saveHomeAlignState(alignState: String) + fun getHomeAlignState(): String } diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/repository/ConfigRepository.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/repository/ConfigRepository.kt index 125aacf0..d3071213 100644 --- a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/repository/ConfigRepository.kt +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/repository/ConfigRepository.kt @@ -3,4 +3,6 @@ package com.mashup.gabbangzip.sharedalbum.domain.repository interface ConfigRepository { suspend fun saveIsFirstOpen(isFirstOpen: Boolean) suspend fun getIsFirstOpen(): Boolean + suspend fun saveHomeAlignState(alignState: String) + suspend fun getHomeAlignState(): String } diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetHomeAlignStateUseCase.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetHomeAlignStateUseCase.kt new file mode 100644 index 00000000..c8b2bad6 --- /dev/null +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetHomeAlignStateUseCase.kt @@ -0,0 +1,18 @@ +package com.mashup.gabbangzip.sharedalbum.domain.usecase.config + +import com.mashup.gabbangzip.sharedalbum.domain.repository.ConfigRepository +import dagger.Reusable +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +@Reusable +class GetHomeAlignStateUseCase @Inject constructor( + private val configRepository: ConfigRepository, +) { + operator fun invoke(): Flow { + return flow { + emit(configRepository.getHomeAlignState()) + } + } +} diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetIsFirstOpenUseCase.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetIsFirstOpenUseCase.kt index e2a409ff..f4601f3b 100644 --- a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetIsFirstOpenUseCase.kt +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/GetIsFirstOpenUseCase.kt @@ -1,8 +1,10 @@ package com.mashup.gabbangzip.sharedalbum.domain.usecase.config import com.mashup.gabbangzip.sharedalbum.domain.repository.ConfigRepository +import dagger.Reusable import javax.inject.Inject +@Reusable class GetIsFirstOpenUseCase @Inject constructor( private val configRepository: ConfigRepository, ) { diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveHomeAlignStateUseCase.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveHomeAlignStateUseCase.kt new file mode 100644 index 00000000..a4a596ba --- /dev/null +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveHomeAlignStateUseCase.kt @@ -0,0 +1,14 @@ +package com.mashup.gabbangzip.sharedalbum.domain.usecase.config + +import com.mashup.gabbangzip.sharedalbum.domain.repository.ConfigRepository +import dagger.Reusable +import javax.inject.Inject + +@Reusable +class SaveHomeAlignStateUseCase @Inject constructor( + private val configRepository: ConfigRepository, +) { + suspend operator fun invoke(alignState: String) { + configRepository.saveHomeAlignState(alignState) + } +} diff --git a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveIsFirstOpenUseCase.kt b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveIsFirstOpenUseCase.kt index d563e571..72b50ec7 100644 --- a/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveIsFirstOpenUseCase.kt +++ b/domain/src/main/java/com/mashup/gabbangzip/sharedalbum/domain/usecase/config/SaveIsFirstOpenUseCase.kt @@ -1,8 +1,10 @@ package com.mashup.gabbangzip.sharedalbum.domain.usecase.config import com.mashup.gabbangzip.sharedalbum.domain.repository.ConfigRepository +import dagger.Reusable import javax.inject.Inject +@Reusable class SaveIsFirstOpenUseCase @Inject constructor( private val configRepository: ConfigRepository, ) { diff --git a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeScreen.kt b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeScreen.kt index e9d62c9c..b52a7a14 100644 --- a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeScreen.kt +++ b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row @@ -20,6 +21,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn @@ -42,6 +44,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.ColorPainter @@ -59,6 +62,7 @@ import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray0 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray100 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray20 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray40 +import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray50 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray60 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Gray80 import com.mashup.gabbangzip.sharedalbum.presentation.theme.Malibu @@ -76,6 +80,7 @@ import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.Cl import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.FilterTag import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.GroupHomeUiState import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.GroupInfo +import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.ViewType import com.mashup.gabbangzip.sharedalbum.presentation.ui.model.GroupKeyword import com.mashup.gabbangzip.sharedalbum.presentation.ui.model.GroupStatusType import com.mashup.gabbangzip.sharedalbum.presentation.ui.model.PicPhotoFrame @@ -112,6 +117,7 @@ fun GroupHomeScreen( .padding(innerPadding), groupList = groupHomeUiState.groupList, filterTagList = groupHomeUiState.filterTagList, + currentViewType = groupHomeUiState.viewType, onClickGroupDetail = onClickGroupDetail, onClickEventMake = onClickEventMake, onClickMyPage = onClickMyPage, @@ -121,6 +127,7 @@ fun GroupHomeScreen( onNavigateVote = onNavigateVote, onNavigateGallery = onNavigateGallery, onClickFilterTag = viewModel::clickedFilterTag, + onClickViewType = viewModel::clickedViewType, ) } @@ -142,6 +149,7 @@ fun GroupHomeScreen( modifier: Modifier, groupList: ImmutableList, filterTagList: ImmutableList, + currentViewType: ViewType, onClickGroupDetail: (id: Long) -> Unit, onClickEventMake: (Long) -> Unit, onClickMyPage: () -> Unit, @@ -151,6 +159,7 @@ fun GroupHomeScreen( onNavigateGallery: (eventId: Long) -> Unit, onNavigateVote: (eventId: Long) -> Unit, onClickFilterTag: (FilterTag) -> Unit, + onClickViewType: (ViewType) -> Unit, ) { Box { Column( @@ -164,13 +173,23 @@ fun GroupHomeScreen( rightIconClicked = onClickMyPage, ) - TagFilter( + Box( modifier = Modifier .fillMaxWidth() .wrapContentHeight(), - filterTagList = filterTagList, - onTagClicked = onClickFilterTag, - ) + ) { + TagFilter( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + filterTagList = filterTagList, + onTagClicked = onClickFilterTag, + ) + ViewTypeWithGradient( + currentViewType = currentViewType, + onClickViewType = onClickViewType, + ) + } Spacer( modifier = Modifier @@ -180,33 +199,23 @@ fun GroupHomeScreen( .background(Gray20), ) - LazyColumn { - itemsIndexed(groupList) { index, groupInfo -> - GroupContainer( - modifier = if (index == 0) { - Modifier.padding(top = 24.dp) - } else if (index == groupList.lastIndex) { - Modifier.padding(bottom = 16.dp) - } else { - Modifier - }, - groupInfo = groupInfo, - onGroupDetailClick = onClickGroupDetail, - onClickSendFcmButton = onClickSendFcmButton, + when (currentViewType) { + ViewType.LIST -> { + GroupContainerList( + groupList = groupList, + onClickGroupDetail = onClickGroupDetail, onClickEventMake = onClickEventMake, - onNavigateVote = onNavigateVote, + onClickSendFcmButton = onClickSendFcmButton, onNavigateGallery = onNavigateGallery, + onNavigateVote = onNavigateVote, ) + } - if (groupList.lastIndex != index) { - Spacer( - modifier = Modifier - .padding(top = 46.dp, bottom = 24.dp) - .height(8.dp) - .fillMaxWidth() - .background(color = Gray20), - ) - } + ViewType.GRID -> { + GroupContainerGrid( + groupList = groupList, + onClickGroupDetail = onClickGroupDetail, + ) } } } @@ -221,6 +230,154 @@ fun GroupHomeScreen( } } +@Composable +private fun BoxScope.ViewTypeWithGradient( + currentViewType: ViewType, + onClickViewType: (ViewType) -> Unit, +) { + Box( + modifier = Modifier + .width(100.dp) + .wrapContentHeight() + .background( + brush = Brush.linearGradient( + listOf( + Color.Transparent, + Gray0, + Gray0, + ), + ), + ) + .align(Alignment.CenterEnd), + ) { + ViewTypeButton( + modifier = Modifier + .noRippleClickable { + when (currentViewType) { + ViewType.LIST -> onClickViewType(ViewType.GRID) + ViewType.GRID -> onClickViewType(ViewType.LIST) + } + } + .padding(top = 11.dp, bottom = 11.dp, end = 20.dp) + .wrapContentSize() + .align(Alignment.CenterEnd), + currentViewType = currentViewType, + ) + } +} + +@Composable +private fun ViewTypeButton( + modifier: Modifier, + currentViewType: ViewType, +) { + StableImage( + modifier = modifier, + drawableResId = when (currentViewType) { + ViewType.LIST -> R.drawable.align_grid + ViewType.GRID -> R.drawable.align_list + }, + contentDescription = stringResource( + id = when (currentViewType) { + ViewType.LIST -> R.string.align_grid + ViewType.GRID -> R.string.align_list + }, + ), + colorFilter = ColorFilter.tint(color = Gray50), + ) +} + +@Composable +private fun GroupContainerList( + groupList: ImmutableList, + onClickGroupDetail: (id: Long) -> Unit, + onClickEventMake: (Long) -> Unit, + onClickSendFcmButton: (eventId: Long) -> Unit, + onNavigateGallery: (eventId: Long) -> Unit, + onNavigateVote: (eventId: Long) -> Unit, +) { + LazyColumn { + itemsIndexed(groupList) { index, groupInfo -> + GroupContainer( + modifier = if (index == 0) { + Modifier.padding(top = 24.dp) + } else if (index == groupList.lastIndex) { + Modifier.padding(bottom = 16.dp) + } else { + Modifier + }, + groupInfo = groupInfo, + onGroupDetailClick = onClickGroupDetail, + onClickSendFcmButton = onClickSendFcmButton, + onClickEventMake = onClickEventMake, + onNavigateVote = onNavigateVote, + onNavigateGallery = onNavigateGallery, + ) + + if (groupList.lastIndex != index) { + Spacer( + modifier = Modifier + .padding(top = 46.dp, bottom = 24.dp) + .height(8.dp) + .fillMaxWidth() + .background(color = Gray20), + ) + } + } + } +} + +@Composable +private fun GroupContainerGrid( + groupList: ImmutableList, + onClickGroupDetail: (id: Long) -> Unit, +) { + LazyVerticalGrid( + columns = GridCells.Fixed(2), + contentPadding = PaddingValues(vertical = 18.dp, horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(18.dp), + horizontalArrangement = Arrangement.spacedBy(21.dp), + ) { + items(items = groupList) { groupInfo -> + GroupContainerGridItem( + groupInfo = groupInfo, + onClickGroupDetail = onClickGroupDetail, + ) + } + } +} + +@Composable +private fun GroupContainerGridItem( + groupInfo: GroupInfo, + onClickGroupDetail: (id: Long) -> Unit, +) { + Column( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight() + .noRippleClickable { onClickGroupDetail(groupInfo.id) }, + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + FrontCardImage( + modifier = Modifier.fillMaxSize(), + frameResId = groupInfo.frontImageFrame.frameResId, + imageUrl = groupInfo.cardFrontImageUrl, + backgroundColor = Gray0, + ) + Text( + text = groupInfo.name, + style = PicTypography.headBold16, + color = Gray80, + ) + GroupTag( + modifier = Modifier.fillMaxWidth(), + keyword = groupInfo.keyword, + statusDesc = groupInfo.statusDescription, + ) + } +} + @Composable private fun TagFilter( modifier: Modifier, @@ -230,7 +387,7 @@ private fun TagFilter( LazyRow( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(6.dp), - contentPadding = PaddingValues(horizontal = 10.dp), + contentPadding = PaddingValues(start = 10.dp, end = 70.dp), ) { itemsIndexed(filterTagList, key = { _, item -> item.name }) { _, tagInfo -> PicTag( @@ -747,6 +904,7 @@ private fun GroupHomeScreenPreview() { ), ), ), + currentViewType = ViewType.LIST, onClickGroupDetail = {}, onClickEventMake = {}, onClickMyPage = {}, @@ -756,5 +914,6 @@ private fun GroupHomeScreenPreview() { onNavigateGallery = {}, onNavigateVote = {}, onClickFilterTag = {}, + onClickViewType = {}, ) } diff --git a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeViewModel.kt b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeViewModel.kt index 4d4c187a..d72ccdcc 100644 --- a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeViewModel.kt +++ b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/GroupHomeViewModel.kt @@ -2,10 +2,13 @@ package com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.mashup.gabbangzip.sharedalbum.domain.usecase.config.GetHomeAlignStateUseCase +import com.mashup.gabbangzip.sharedalbum.domain.usecase.config.SaveHomeAlignStateUseCase import com.mashup.gabbangzip.sharedalbum.domain.usecase.group.GetGroupListUseCase import com.mashup.gabbangzip.sharedalbum.presentation.R import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.FilterTag import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.GroupHomeUiState +import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.ViewType import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.toFilterTag import com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model.toUiModel import com.mashup.gabbangzip.sharedalbum.presentation.ui.model.GroupKeyword @@ -15,6 +18,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import java.net.UnknownHostException @@ -23,11 +27,20 @@ import javax.inject.Inject @HiltViewModel class GroupHomeViewModel @Inject constructor( getGroupListUseCase: GetGroupListUseCase, + getHomeAlignStateUseCase: GetHomeAlignStateUseCase, + private val saveHomeAlignStateUseCase: SaveHomeAlignStateUseCase, ) : ViewModel() { private val groupUiState = getGroupListUseCase() private val selectedTagFlow = MutableStateFlow(FilterTag.getTotalFilter()) + private val viewTypeFlow = MutableStateFlow(ViewType.LIST).also { viewTypeFlow -> + viewModelScope.launch { + getHomeAlignStateUseCase() + .map { kotlin.runCatching { ViewType.valueOf(it) }.getOrDefault(ViewType.LIST) } + .collect(viewTypeFlow) + } + } - val uiState = groupUiState.combine(selectedTagFlow) { groupList, selectedTag -> + val uiState = combine(groupUiState, selectedTagFlow, viewTypeFlow) { groupList, selectedTag, viewType -> if (groupList.isEmpty()) { GroupHomeUiState.NoGroup } else { @@ -50,6 +63,7 @@ class GroupHomeViewModel @Inject constructor( .toFilterTag(isSelected = it.keyword == selectedTag.name) }.distinct(), ), + viewType = viewType, ) } }.catch { @@ -72,4 +86,11 @@ class GroupHomeViewModel @Inject constructor( selectedTagFlow.emit(filterTag) } } + + fun clickedViewType(viewType: ViewType) { + viewModelScope.launch { + viewTypeFlow.emit(viewType) + saveHomeAlignStateUseCase(viewType.name) + } + } } diff --git a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/GroupHomeUiState.kt b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/GroupHomeUiState.kt index d82730f5..5686fb84 100644 --- a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/GroupHomeUiState.kt +++ b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/GroupHomeUiState.kt @@ -10,6 +10,8 @@ sealed class GroupHomeUiState { data class GroupList( val groupList: ImmutableList = ImmutableList(emptyList()), val filterTagList: ImmutableList = ImmutableList(emptyList()), + val viewType: ViewType = ViewType.LIST, ) : GroupHomeUiState() + data class Error(@StringRes val errorMessage: Int) : GroupHomeUiState() } diff --git a/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/ViewType.kt b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/ViewType.kt new file mode 100644 index 00000000..0fe25a20 --- /dev/null +++ b/presentation/src/main/java/com/mashup/gabbangzip/sharedalbum/presentation/ui/main/grouphome/model/ViewType.kt @@ -0,0 +1,5 @@ +package com.mashup.gabbangzip.sharedalbum.presentation.ui.main.grouphome.model + +enum class ViewType { + LIST, GRID +} diff --git a/presentation/src/main/res/drawable/align_grid.xml b/presentation/src/main/res/drawable/align_grid.xml new file mode 100644 index 00000000..4ad73acd --- /dev/null +++ b/presentation/src/main/res/drawable/align_grid.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/presentation/src/main/res/drawable/align_list.xml b/presentation/src/main/res/drawable/align_list.xml new file mode 100644 index 00000000..f3f899a2 --- /dev/null +++ b/presentation/src/main/res/drawable/align_list.xml @@ -0,0 +1,12 @@ + + + + diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index bdc4400a..d6508dd0 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -146,6 +146,9 @@ 그룹원들을 쿡 찔렀어요! %d 페이지 온보딩 화면 + 한줄로 보기 + 두줄로 보기 + 그룹 나가기 그룹을 나가실건가요? 그룹을 나가면 함께 네컷을 만들 수 없어요.