Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5bdaf1b
[add/#106] 스플래시 애니메이션 json 추가
vahkjsdf Sep 13, 2026
736655f
[add/#106] 앱 내 로고 및 empty 이미지 추가
vahkjsdf Sep 13, 2026
86731ab
[ui/#106] 메인 탑바 앱 로고 추가
vahkjsdf Sep 13, 2026
15c2926
[ui/#106] 로그인, 회원가입 완료 화면 앱 로고 및 캐릭터 추가
vahkjsdf Sep 13, 2026
69307fd
[ui/#106] 홈 - 빈화면 수정
vahkjsdf Sep 13, 2026
e8278be
[ui/#106] 모임 리스트 빈화면 추가
vahkjsdf Sep 13, 2026
732aafe
[ui/#106] 모임 확정 캐릭터 추가
vahkjsdf Sep 13, 2026
48f9f9c
[ui/#106] 알림 빈화면 추가
vahkjsdf Sep 13, 2026
9d1d1bf
[del/#106] 미사용 코드 제거
vahkjsdf Sep 13, 2026
6a07551
[feat/#106] 앱 이름 및 아이콘 설정
vahkjsdf Sep 15, 2026
322d527
[ui/#106] 알림 빈화면 수정
vahkjsdf Sep 15, 2026
4a4542a
[mod/#106] 로티 애니메이션 json 수정
vahkjsdf Sep 15, 2026
b613d0f
[merge/#106] pulled develop
vahkjsdf Sep 15, 2026
aaf8659
[ui/#106] 홈-다가오는 모임 추가 카드 삭제
vahkjsdf Sep 15, 2026
77617c8
[mod/#106] 모임 상세 조회 - 초 제거
vahkjsdf Sep 15, 2026
d46cdea
[ui/#106] 장소 및 주소 길이로 인한 UI 깨짐 현상 해결
vahkjsdf Sep 15, 2026
c79cb8d
[del/#106] 미사용 확장함수 제거
vahkjsdf Sep 15, 2026
ec39c85
[mod/#106] 초대 링크 문구 수정
vahkjsdf Sep 15, 2026
3f7d01d
[mod/#106] 이미지 placeholder 수정
vahkjsdf Sep 15, 2026
ddf9042
[mod/#106] 추천 장소 호출 전 리스트 초기화
vahkjsdf Sep 15, 2026
6219c84
[mod/#106] 스플래시 애니메이션 json 파일 수정
vahkjsdf Sep 16, 2026
dba660a
[feat/#106] 스플래시 구현
vahkjsdf Sep 16, 2026
829a8c6
[mod/#106] 스플래시 애니매이션 한 줄로 수정
vahkjsdf Sep 16, 2026
15acc49
[mod/#106] 홈 - 확정된 모임 개수 count 수정
vahkjsdf Sep 16, 2026
7fa4b65
[mod/#106] 홈, 모임 리스트 빈 화면 상태 수정
vahkjsdf Sep 16, 2026
4dd4f9c
[mod/#106] 모임 확정 화면 이미지 정렬 수정
vahkjsdf Sep 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:icon="@drawable/ic_moive_logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:roundIcon="@drawable/ic_moive_logo"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.Moiveandroid">
android:theme="@style/Theme.Moive">
<activity
android:name=".presentation.main.MainActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:theme="@style/Theme.Moiveandroid">
android:theme="@style/Theme.Moive">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,45 @@
package com.moive.app.core.designsystem.component.image

import androidx.annotation.DrawableRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.ColorPainter
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
import com.moive.app.R
import com.moive.app.core.designsystem.theme.MoiveTheme.colors

@Composable
fun UrlImage(
url: String,
modifier: Modifier = Modifier,
contentScale: ContentScale = ContentScale.Fit,
contentDescription: String? = null,
@DrawableRes placeholder: Int = R.drawable.ic_launcher_background,
placeholder: Painter = ColorPainter(colors.background.default03),
Comment thread
vahkjsdf marked this conversation as resolved.
) {
if (LocalInspectionMode.current) {
Image(
imageVector = ImageVector.vectorResource(R.drawable.ic_launcher_background),
contentDescription = contentDescription,
contentScale = contentScale,
modifier = modifier
modifier = modifier,
)
} else {
AsyncImage(
model = url,
contentDescription = contentDescription,
contentScale = contentScale,
placeholder = painterResource(placeholder),
error = painterResource(placeholder),
modifier = modifier
modifier = modifier.fillMaxSize(),
placeholder = placeholder,
error = placeholder,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.moive.app.core.designsystem.component.topbar

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
Expand Down Expand Up @@ -30,7 +31,6 @@ import com.moive.app.core.extensions.noRippleClickable

@Composable
fun MoiveMainTopBar(
title: String,
isAlarmUnRead: Boolean,
onNotificationClick: () -> Unit,
modifier: Modifier = Modifier,
Expand All @@ -43,26 +43,18 @@ fun MoiveMainTopBar(
)
.padding(horizontal = 20.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
) {
Image(
painter = painterResource(R.drawable.ic_launcher_background),
painter = painterResource(R.drawable.img_moive_symbol_name),
contentDescription = null,
modifier = Modifier
.size(32.dp)
.clip(
shape = RoundedCornerShape(radius.circular),
.size(
width = 96.dp,
height = 32.dp,
)
)

Spacer(modifier = Modifier.width(8.dp))

Text(
text = title,
color = colors.text.default,
style = typography.title.lgB,
modifier = Modifier.weight(1f),
)

Icon(
imageVector = ImageVector.vectorResource(
if (isAlarmUnRead) R.drawable.ic_bell_notification_24 else R.drawable.ic_bell_24
Expand All @@ -79,7 +71,6 @@ fun MoiveMainTopBar(
private fun MoiveMainTopBarPreview() {
MoiveTheme {
MoiveMainTopBar(
title = "title",
isAlarmUnRead = true,
onNotificationClick = {},
)
Expand Down
13 changes: 0 additions & 13 deletions app/src/main/java/com/moive/app/core/extensions/ContextExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,6 @@ fun Context.openUrl(url: String?): Boolean {
}.isSuccess
}

fun Context.openKakaoMapRoute(
startLatitude: Double,
startLongitude: Double,
endLatitude: Double,
endLongitude: Double,
): Boolean {
val query = "sp=$startLatitude,$startLongitude&ep=$endLatitude,$endLongitude&by=publictransit"
val appUrl = "kakaomap://route?$query"
val webUrl = "https://m.map.kakao.com/scheme/route?$query"

return openUrl(appUrl) || openUrl(webUrl)
}

fun Context.isNotificationEnabled(): Boolean =
NotificationManagerCompat.from(this).areNotificationsEnabled()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ fun MeetingResultResponse.toModel(): MeetingResultModel =
MeetingResultModel(
place = place?.toModel(),
meetingDate = meetingDate,
meetingTime = meetingTime,
meetingTime = meetingTime.take(5),
participants = participants.mapIndexed { index, participant -> participant.toModel(id = index.toLong()) },
)

Expand Down
129 changes: 82 additions & 47 deletions app/src/main/java/com/moive/app/presentation/home/HomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@ package com.moive.app.presentation.home

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
Expand All @@ -21,9 +22,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
Expand All @@ -41,9 +40,8 @@ import com.moive.app.core.designsystem.theme.MoiveTheme.colors
import com.moive.app.core.designsystem.theme.MoiveTheme.radius
import com.moive.app.core.designsystem.theme.MoiveTheme.typography
import com.moive.app.core.extensions.noRippleClickable
import com.moive.app.presentation.common.component.TabChipList
import com.moive.app.presentation.common.component.MyMeetingCardItem
import com.moive.app.presentation.home.component.HomeEmptyMeetingList
import com.moive.app.presentation.common.component.TabChipList
import com.moive.app.presentation.home.component.ConfirmedMeetingPager
import kotlinx.collections.immutable.persistentListOf

Expand Down Expand Up @@ -107,7 +105,6 @@ private fun HomeScreen(
.padding(innerPadding),
) {
MoiveMainTopBar(
title = "MOIVE",
isAlarmUnRead = uiState.isAlarmUnRead,
onNotificationClick = onNotificationClick,
)
Expand All @@ -126,25 +123,41 @@ private fun HomeScreen(
}

item {
if (uiState.upcomingMeetings.isEmpty()) {
Image(
painter = painterResource(R.drawable.ic_launcher_background),
contentDescription = null,
modifier = Modifier
.fillMaxWidth()
.aspectRatio(320f / 220f)
.padding(horizontal = 20.dp)
.clip(
shape = RoundedCornerShape(radius.xxl)
),
contentScale = ContentScale.Crop,
)
} else {
ConfirmedMeetingPager(
meetings = uiState.upcomingMeetings,
onMeetingClick = onMeetingClick,
onAddMeetingClick = onAddMeetingClick,
)
when {
uiState.homeUiState is HomeUiState.Loading -> Unit
uiState.upcomingMeetings.isEmpty() -> {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp)
.background(
color = colors.fill.default06,
shape = RoundedCornerShape(radius.xxl)
)
.padding(top = 26.dp, bottom = 32.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp),
) {
Image(
painter = painterResource(R.drawable.img_character_empty_home),
contentDescription = null,
modifier = Modifier.size(80.dp)
)

Text(
text = "아직 확정된 모임이 없어요.",
color = colors.text.tertiary,
style = typography.body.smNormalR,
)
}
}

else -> {
ConfirmedMeetingPager(
meetings = uiState.upcomingMeetings,
onMeetingClick = onMeetingClick,
)
}
}
}

Expand Down Expand Up @@ -192,29 +205,51 @@ private fun HomeScreen(
Spacer(modifier = Modifier.height(10.dp))
}

if (uiState.displayedMyMeetingList.isEmpty()) {
item {
HomeEmptyMeetingList(
modifier = Modifier.padding(horizontal = 20.dp, vertical = 12.dp),
)
when {
uiState.homeUiState is HomeUiState.Loading -> Unit
uiState.displayedMyMeetingList.isEmpty() -> {
item {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(top = 34.dp, bottom = 48.dp)
.padding(horizontal = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp),
) {
Image(
painter = painterResource(R.drawable.img_character_empty_default),
contentDescription = null,
modifier = Modifier.size(80.dp)
)

Text(
text = "아직 참여 중인 모임이 없어요.",
color = colors.text.subtle,
style = typography.body.smNormalR,
)
}
}
}
} else {
items(
items = uiState.displayedMyMeetingList,
key = { it.id },
) { meeting ->
MyMeetingCardItem(
title = meeting.title,
dateTime = meeting.dateTime ?: "일정 미정",
participantImageList = meeting.participantImageUrls,
extraCount = meeting.extraParticipantCount,
statusText = meeting.statusText,
statusLabelType = meeting.statusLabelType,
onCardClick = { onMyMeetingClick(meeting.id, meeting.statusLabelType) },
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 6.dp),
)

else -> {
items(
items = uiState.displayedMyMeetingList,
key = { it.id },
) { meeting ->
MyMeetingCardItem(
title = meeting.title,
dateTime = meeting.dateTime ?: "일정 미정",
participantImageList = meeting.participantImageUrls,
extraCount = meeting.extraParticipantCount,
statusText = meeting.statusText,
statusLabelType = meeting.statusLabelType,
onCardClick = { onMyMeetingClick(meeting.id, meeting.statusLabelType) },
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp, vertical = 6.dp),
)
}
}
}
}
Expand Down
Loading
Loading