Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
e506a0c
[CHORE] 1.0.3 (5) -> 1.1.3 (6)
DongChyeon Jul 29, 2025
dae6d95
[CHORE] CI 쀑볡 μ‹€ν–‰ λ°©μ§€ 슀크립트 μΆ”κ°€
DongChyeon Jul 29, 2025
2eefdad
[FIX] λ―Έμ…˜ μ—†μŒ 선택 μ‹œ λ―Έμ…˜ ν™”λ©΄ 이동 λ°©μ§€
DongChyeon Jul 29, 2025
c4c31bf
[FIX] release push μ‹œμ—λŠ” CI λ―Έμ‹€ν–‰
DongChyeon Jul 30, 2025
3d31b34
[FIX] λ―Έμ…˜ 미리보기 μ‹œ λ°”ν…€ μ‹œνŠΈκ°€ λ‚΄λ €κ°€μ§€ μ•ŠλŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ OrbitBottomSheetLayout을 화면…
DongChyeon Jul 30, 2025
1dff49a
[UI] μ•ŒλžŒ ν•΄μ œ ν™”λ©΄ NavigationBar μ˜μ—­μ— 검은색 배경을 μΆ”κ°€
DongChyeon Jul 30, 2025
5cbce78
[UI] API 35 이상 여뢀에 따라 λ°”ν…€μ‹œνŠΈ half-expanded 높이 계산 방식 λΆ„κΈ° 처리.
DongChyeon Jul 30, 2025
5817da1
[REFACTOR] snapshotFlowλ₯Ό 톡해 SheetValue λ³€ν™” 감지 및 BottomSheetExpandState…
DongChyeon Jul 30, 2025
9786b30
[FEAT] μ•ŒλžŒ 리슀트 λ°”ν…€ μ‹œνŠΈκ°€ νŽΌμ³μ§€λ©΄ 툴팁 숨기기
DongChyeon Jul 30, 2025
67a832b
[FEAT] λ―Έμ…˜ 미리보기 ν›„ λŒμ•„μ™”μ„ λ•Œ μƒνƒœ 보쑴을 μœ„ν•΄ rememberSaveable둜 μ„€μ •κ°’ μ €μž₯
DongChyeon Jul 30, 2025
62f0783
[REFACTOR] popUpTo μ œλ„€λ¦­ νƒ€μž… 적용
DongChyeon Jul 30, 2025
e8f852f
[UI] λ―Έμ…˜ 선택 λ‹¨κ³„μ—μ„œ μ„ νƒλœ λ―Έμ…˜μ„ ν‘œμ‹œν•˜λŠ” UI μΆ”κ°€
DongChyeon Jul 31, 2025
9d6b45a
[REFACTOR/#246] Fortune κ΄€λ ¨ DataStore μƒνƒœ 및 둜직 λ¦¬νŒ©ν† λ§
DongChyeon Aug 20, 2025
16f5dd7
[FEAT/#246] 였늘의 μš΄μ„Έ λ°œκΈ‰ WorkManager κ΅¬ν˜„
DongChyeon Aug 20, 2025
290f07a
[FEAT/#246] μ•ŒλžŒμ΄ 울릴 λ•Œ FortuneTaskSchedulerλ₯Ό μ΄μš©ν•΄μ„œ 였늘의 μš΄μ„Έ λ°œκΈ‰ μž‘μ—… μ˜ˆμ•½
DongChyeon Aug 20, 2025
35c402c
[FEAT/#246] Hilt κ΄€λ ¨ μ˜μ‘΄μ„± μΆ”κ°€
DongChyeon Aug 20, 2025
f57e976
[REMOVE/#246] μš΄μ„Έ 확인 여뢀와 관계 없이 λ―Έμ…˜ ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜λ„λ‘ λ³€κ²½
DongChyeon Aug 20, 2025
1240faf
[FEAT/#246] 였늘 μšΈλ¦¬λŠ” 첫 μ•ŒλžŒ ν•΄μ œ μ‹œμ—λ§Œ μš΄μ„Έ λ…ΈμΆœ
DongChyeon Aug 20, 2025
9065182
[FEAT/#246] μ•ŒλžŒμ˜ λ―Έμ…˜ νƒ€μž…μ΄ NONE이 μ•„λ‹ˆλΌλ©΄ λ―Έμ…˜ ν™”λ©΄μœΌλ‘œ 이동
DongChyeon Aug 20, 2025
38ca81e
[FEAT/#246] 이미 생성 μ€‘μ΄κ±°λ‚˜ ν™•μΈν•˜μ§€ μ•Šμ€ μš΄μ„Έκ°€ μžˆμ„ κ²½μš°μ—λ§Œ μš΄μ„Έ ν™”λ©΄μœΌλ‘œ 이동
DongChyeon Aug 20, 2025
955c93c
[REFACTOR/#246] μš΄μ„Έ 데이터λ₯Ό Flow둜 κ΄€μ°°ν•˜λ„λ‘ λ³€κ²½
DongChyeon Aug 20, 2025
1957cbc
[REFACTOR/#246] `hasNewFortuneFlow`λ₯Ό `shouldShowFortuneToolTipFlow`둜 λ³€κ²½
DongChyeon Aug 20, 2025
ac3376d
[FEAT/#246] μš΄μ„Έ 확인 μ•ˆν–ˆμ„ λ•Œ μ•ŒλžŒ 클릭 μ‹œ μš΄μ„Έ ν™”λ©΄μœΌλ‘œ 이동
DongChyeon Aug 20, 2025
ed02958
[FIX/#246] 였늘 μš΄μ„Έ 생성을 쀑볡 μš”μ²­ν•˜μ§€ μ•Šλ„λ‘ μˆ˜μ •
DongChyeon Aug 20, 2025
b277849
[FEAT/#246] μ•ŒλžŒ ν•΄μ œ μ‹œ isFirstToday ν”Œλž˜κ·Έλ₯Ό Fortune ν™”λ©΄μœΌλ‘œ μ „λ‹¬ν•˜μ—¬ 보상 μ—¬λΆ€ νŒλ‹¨
DongChyeon Aug 20, 2025
979670c
[REMOVE/#246] `hasTodayFortuneFlow` μ‚­μ œ
DongChyeon Aug 20, 2025
d30beba
[FIX/#246] compileSdkλ₯Ό android λΈ”λ‘μœΌλ‘œ 이동
DongChyeon Aug 20, 2025
9ba43ed
[CHORE/#246] WorkManager κΈ°λ³Έ μ΄ˆκΈ°ν™” λΉ„ν™œμ„±ν™”
DongChyeon Aug 20, 2025
8f482e5
[REFACTOR/#246] `AlarmInteractionActivityReceiver`μ—μ„œ `goAsync`λ₯Ό μ‚¬μš©ν•˜μ—¬ …
DongChyeon Aug 20, 2025
486302d
[CHORE/#246] WorkManager ν…ŒμŠ€νŠΈ μ˜μ‘΄μ„± 뢄리
DongChyeon Aug 20, 2025
e155d60
[FIX/#246] `Alarm.ringsToday`둜직 μˆ˜μ •
DongChyeon Aug 20, 2025
53dff08
[FIX/#246] DataStoreμ—μ„œ 데이터λ₯Ό μ½μ–΄μ˜€μ§€ λͺ»ν•  λ•Œ emptyPreferences()λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μˆ˜μ •
DongChyeon Aug 20, 2025
ff346c1
[FIX/#246] λ‹¨λ°œ μ•ŒλžŒμ„ ν•΄μ œν–ˆμ„ λ•Œλ„ 비ꡐꡰ에 ν¬ν•¨λ˜λ„λ‘ μˆ˜μ •
DongChyeon Aug 20, 2025
abaa8ea
[FIX/#246] μ•ŒλžŒ λ―Έμ…˜μ΄ 없을 λ•Œμ—λ„ shouldShowMissionStartκ°€ true둜 μ„€μ •λ˜λŠ” 버그 μˆ˜μ •
DongChyeon Aug 20, 2025
9cdb8ba
[REFACTOR/#246] 졜초 μ•ŒλžŒ ν•΄μ œ μ‹œ μš΄μ„Έ νšλ“ μ—¬λΆ€λ₯Ό `SavedStateHandle` λŒ€μ‹  `UserPrefe…
DongChyeon Aug 20, 2025
4b6993a
[REMOVE/#246] UserPreferences, MissionViewModel 디버그 둜그 제거
DongChyeon Aug 20, 2025
0cdb890
[FIX/#246] 였늘의 μš΄μ„Έκ°€ μ‘΄μž¬ν•˜κ³ , 툴팁이 보여지지 μ•Šμ•˜μ„ κ²½μš°μ—λ§Œ νˆ΄νŒμ„ λ…ΈμΆœν•˜λ„λ‘ 쑰건 μˆ˜μ •
DongChyeon Aug 20, 2025
fdd4fe2
[FIX/#246] μ•ŒλžŒ ν•΄μ œ 이벀트 λ‘œκΉ… μ‹œ earliestIdToday μ‚¬μš©
DongChyeon Aug 21, 2025
3532b26
[FEAT/#246] μš΄μ„Έ 생성 λ‘œλ”© ν™”λ©΄ λ‘œν‹° μ• λ‹ˆλ©”μ΄μ…˜ 적용
DongChyeon Sep 6, 2025
500862c
[REMOVE/#246] μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” `@Auth`, `@NoneAuth`, `@S3` Qualifier 제거
DongChyeon Sep 6, 2025
a7723cd
Merge pull request #247 from YAPP-Github/feat/#246-fortune-api-call-t…
DongChyeon Sep 8, 2025
a0721fd
[FEAT/#248] μ•ŒλžŒ μŠ€μΌ€μ€„λ§ μ‹œ 호좜 ν•¨μˆ˜ 좔적 둜그 μΆ”κ°€
DongChyeon Sep 8, 2025
57a42df
[FIX/#248] collect -> first λ³€κ²½μœΌλ‘œ DB λ³€κ²½ μ‹œ 반볡 λ“±λ‘λ˜λŠ” 버그 μˆ˜μ •
DongChyeon Sep 8, 2025
117f65d
Merge pull request #249 from YAPP-Github/bugfix/#248-alarm-one-time-r…
DongChyeon Sep 8, 2025
63a9e48
[FEAT/#251] FortuneCreateStatusFlow λ…ΈμΆœ
DongChyeon Sep 14, 2025
d62398b
[REFACTOR/#251] FortuneCreateStatusFlow 기반으둜 λΆ„κΈ° 처리
DongChyeon Sep 14, 2025
e8ce1d1
[FEAT/#251] 였늘 μƒμ„±λœ μš΄μ„Έκ°€ μžˆμ–΄μ•Όλ§Œ fortuneCreateStatusκ°€ Success λ°˜ν™˜
DongChyeon Sep 14, 2025
75ceb3a
[FIX/#251] μš΄μ„Έ 생성 μ‹€νŒ¨ λ˜λŠ” Idle μƒνƒœμΌ λ•Œ ν™ˆμœΌλ‘œ μ΄λ™ν•˜λ„λ‘ μˆ˜μ •
DongChyeon Sep 14, 2025
b9a7b68
[FIX/#251] ν™•μΈν•˜μ§€ μ•Šμ€ μš΄μ„Έκ°€ μžˆμ„ κ²½μš°μ—λ§Œ μš΄μ„Έ ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜λ„λ‘ μˆ˜μ •
DongChyeon Sep 14, 2025
83c9ade
[FIX/#251] μš΄μ„Έ 생성 μƒνƒœ νŒλ³„ μ‹œ isCreating 쑰건 μš°μ„  확인
DongChyeon Sep 14, 2025
0c0c8a9
Merge pull request #252 from YAPP-Github/refactor/#251-fortune-create…
DongChyeon Sep 14, 2025
bb6b286
[UI/#253] μ—…λ°μ΄νŠΈ 곡지 λ°”ν…€μ‹œνŠΈ UI
DongChyeon Sep 15, 2025
45c2695
[FEAT/#253] μ—…λ°μ΄νŠΈ 곡지 λ°”ν…€μ‹œνŠΈ λ…ΈμΆœ μ—¬λΆ€ 관리 λ‘œμ§μ„ μœ„ν•œ λ³€μˆ˜ μΆ”κ°€
DongChyeon Sep 15, 2025
1922f93
[FEAT/#253] μ•± 버전 정보λ₯Ό μ œκ³΅ν•˜λŠ” DI λͺ¨λ“ˆ μΆ”κ°€
DongChyeon Sep 15, 2025
f52fffe
[FEAT/#253] λ‹€μ‹œ 보지 μ•ŠκΈ° λˆ„λ₯Έ 버전λͺ…, λ‹«κΈ° λ²„νŠΌ λˆ„λ₯Έ λ‚ μ§œ Flow λ…ΈμΆœ
DongChyeon Sep 15, 2025
82e6e41
[REFACTOR/#253] closed -> shown으둜 넀이밍 μˆ˜μ •
DongChyeon Sep 15, 2025
5957794
[FEAT/#253] μ•± μ—…λ°μ΄νŠΈ 곡지 λ°”ν…€μ‹œνŠΈ λ…ΈμΆœ 둜직 ViewModel에 연동
DongChyeon Sep 15, 2025
c111a02
[UI/#253] UpdateNoticeBottomSheet 배경 dimmed 처리
DongChyeon Sep 15, 2025
3f12acd
[FEAT/#253] μ•± 버전λͺ…에 따라 λ™μ μœΌλ‘œ μ—…λ°μ΄νŠΈ λ°°λ„ˆ URL 생성
DongChyeon Sep 15, 2025
1f0e17a
[REFACTOR/#253] BottomSheet -> Notice 넀이밍 μˆ˜μ •
DongChyeon Sep 15, 2025
27d79db
[REFACTOR/#253] λ‚ μ§œ μ €μž₯ 방식을 Stringμ—μ„œ Long(EpochDay)으둜 λ³€κ²½
DongChyeon Sep 15, 2025
020b8ce
[FIX/#253] λ―Έμ…˜ μˆ˜ν–‰ ν›„ μš΄μ„Έκ°€ 생성 μ€‘μ΄κ±°λ‚˜ 아직 μ•ˆ λ³Έ μš΄μ„Έκ°€ μžˆμ„ λ•Œλ§Œ μš΄μ„Έ ν™”λ©΄μœΌλ‘œ 이동
DongChyeon Sep 15, 2025
e724cd2
[FEAT/#253] λ„€νŠΈμ›Œν¬κ°€ μ—°κ²°λœ μƒν™©μ—μ„œλ§Œ μ—…λ°μ΄νŠΈ λ°”ν…€μ‹œνŠΈ λ…ΈμΆœ
DongChyeon Sep 15, 2025
de737d4
[CHORE/#253] λͺ¨λ“ˆ μ˜μ‘΄μ„± κ·Έλž˜ν”„ μ—…λ°μ΄νŠΈ
DongChyeon Sep 15, 2025
a58c58d
Merge pull request #254 from YAPP-Github/feat/#253-update-notice-bott…
DongChyeon Sep 15, 2025
f1fd6b6
[FIX/#253] μ—…λ°μ΄νŠΈ 이미지 클릭 μ‹œ λ°”ν…€μ‹œνŠΈκ°€ λ‹«νžˆμ§€ μ•Šλ„λ‘ μˆ˜μ •
DongChyeon Sep 15, 2025
210924b
[REFACTOR] snapshotFlow에 distinctUntilChanged μΆ”κ°€ν•˜μ—¬ λΆˆν•„μš”ν•œ 이벀트 λ°©μ§€
DongChyeon Sep 16, 2025
700e803
[REFACTOR] goAsync() 적용으둜 μž¬λΆ€νŒ… μ‹œ μ•ŒλžŒ μž¬λ“±λ‘ μ•ˆμ •μ„± κ°•ν™”
DongChyeon Sep 16, 2025
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
7 changes: 0 additions & 7 deletions .github/workflows/android_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,6 @@ on:
- '**/*.kt'
- 'build.gradle'
- 'app/**'
push:
branches:
- 'release/**'
paths:
- '**/*.kt'
- 'build.gradle'
- 'app/**'

jobs:
build:
Expand Down
7 changes: 5 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ plugins {

android {
namespace = "com.yapp.orbit"
compileSdk = 35

defaultConfig {
versionCode = 5
versionName = "1.0.3"
versionCode = 6
versionName = "1.1.3"
targetSdk = 35
}

Expand Down Expand Up @@ -53,4 +54,6 @@ dependencies {
implementation(libs.firebase.crashlytics)
implementation(libs.play.services.ads)
implementation(libs.kotlin.reflect)
implementation(libs.hilt.worker)
implementation(libs.androidx.work.runtime)
}
15 changes: 12 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
android:name=".OrbitApplication"
Expand Down Expand Up @@ -46,9 +47,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="orbitapp"
android:host="mission"/>
<data android:scheme="orbitapp" />
</intent-filter>
</activity>

Expand Down Expand Up @@ -80,5 +79,15 @@
<service
android:name="com.yapp.alarm.services.AlarmService"
android:foregroundServiceType="mediaPlayback" />

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
tools:node="remove" />
</provider>
</application>
</manifest>
13 changes: 12 additions & 1 deletion app/src/main/java/com/yapp/orbit/OrbitApplication.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package com.yapp.orbit

import android.app.Application
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import com.google.android.gms.ads.MobileAds
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject

@HiltAndroidApp
class OrbitApplication : Application() {
class OrbitApplication() : Application(), Configuration.Provider {

@Inject lateinit var workerFactory: HiltWorkerFactory

override fun onCreate() {
super.onCreate()
MobileAds.initialize(this)
}

override val workManagerConfiguration: Configuration
get() = Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
47 changes: 13 additions & 34 deletions app/src/main/java/com/yapp/orbit/OrbitNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,16 @@ import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsBottomHeight
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import androidx.navigation.compose.NavHost
import com.yapp.common.navigation.OrbitNavigator
import com.yapp.common.navigation.rememberOrbitNavigator
Expand All @@ -34,9 +26,9 @@ import com.yapp.mission.missionScreen
import com.yapp.onboarding.onboardingNavGraph
import com.yapp.setting.settingNavGraph
import com.yapp.splash.splashScreen
import com.yapp.ui.component.bottomsheet.OrbitBottomSheetLayout
import com.yapp.ui.component.bottomsheet.OrbitBottomSheetState
import com.yapp.ui.component.bottomsheet.rememberOrbitBottomSheetState
import com.yapp.ui.component.navigation.NavigationBarScrim
import com.yapp.ui.component.snackbar.CustomSnackBarVisuals
import com.yapp.ui.component.snackbar.OrbitSnackBar
import com.yapp.webview.webViewScreen
Expand All @@ -51,18 +43,16 @@ internal fun OrbitNavHost(
val snackBarHostState = remember { SnackbarHostState() }

Box {
OrbitBottomSheetLayout(sheetState = bottomSheetState) {
Scaffold(
modifier = modifier,
snackbarHost = { OrbitSnackBarHost(snackBarHostState) },
containerColor = OrbitTheme.colors.gray_900,
) {
OrbitNavigationGraph(
navigator = navigator,
bottomSheetState = bottomSheetState,
snackBarHostState = snackBarHostState,
)
}
Scaffold(
modifier = modifier,
snackbarHost = { OrbitSnackBarHost(snackBarHostState) },
containerColor = OrbitTheme.colors.gray_900,
) {
OrbitNavigationGraph(
navigator = navigator,
bottomSheetState = bottomSheetState,
snackBarHostState = snackBarHostState,
)
}

NavigationBarScrim()
Expand All @@ -76,6 +66,7 @@ private fun OrbitNavigationGraph(
snackBarHostState: SnackbarHostState,
) {
NavHost(
modifier = Modifier.navigationBarsPadding(),
navController = navigator.navController,
startDestination = navigator.startDestination,
) {
Expand All @@ -89,18 +80,6 @@ private fun OrbitNavigationGraph(
}
}

@Composable
private fun BoxScope.NavigationBarScrim() {
Box(
modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth()
.windowInsetsBottomHeight(WindowInsets.navigationBars)
.background(Color.Black)
.zIndex(1f),
)
}

@Composable
private fun OrbitSnackBarHost(
snackBarHostState: SnackbarHostState,
Expand Down
18 changes: 18 additions & 0 deletions app/src/main/java/com/yapp/orbit/di/AppVersionModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.yapp.orbit.di

import com.yapp.orbit.BuildConfig
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Named
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object AppVersionModule {
@Provides
@Singleton
@Named("appVersion")
fun provideAppVersion(): String = BuildConfig.VERSION_NAME
}
2 changes: 2 additions & 0 deletions build-logic/src/main/java/com/yapp/convention/HiltAndroid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ internal fun Project.configureHiltAndroid() {
dependencies {
"implementation"(libs.findLibrary("hilt.android").get())
"ksp"(libs.findLibrary("hilt.android.compiler").get())
"ksp"(libs.findLibrary("androidx-hilt-compiler").get())
"implementation"(libs.findLibrary("hilt-navigation-compose").get())
"implementation"(libs.findLibrary("hilt-worker").get())
}
}

Expand Down
3 changes: 0 additions & 3 deletions build-logic/src/main/java/orbit.android.feature.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import com.yapp.convention.configureHiltAndroid
import com.yapp.convention.libs

plugins {
id("orbit.android.library")
id("orbit.android.compose")
}

configureHiltAndroid()

dependencies {
implementation(project(":core:designsystem"))
implementation(project(":core:ui"))
Expand Down
16 changes: 13 additions & 3 deletions core/alarm/src/main/java/com/yapp/alarm/AndroidAlarmScheduler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.yapp.alarm

import android.app.AlarmManager
import android.app.Application
import android.util.Log
import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForSchedule
import com.yapp.alarm.pendingIntent.schedule.createAlarmReceiverPendingIntentForUnSchedule
import com.yapp.domain.model.Alarm
Expand All @@ -16,6 +17,15 @@ class AndroidAlarmScheduler @Inject constructor(
private val alarmTimeCalculator: AlarmTimeCalculator,
) : AlarmScheduler {

private fun logSchedule(tag: String, alarm: Alarm, triggerMillis: Long, extra: String = "") {
Log.d("ScheduleTrace", "scheduleAlarm Called", Throwable())
Log.d(
"AlarmSchedule",
"[$tag] id=${alarm.id}, repeatDays=${alarm.repeatDays}, " +
"time=${java.time.Instant.ofEpochMilli(triggerMillis)} $extra",
)
}

override fun scheduleAlarm(alarm: Alarm) {
val selectedDays = alarm.repeatDays.toAlarmDays()

Expand All @@ -31,7 +41,7 @@ class AndroidAlarmScheduler @Inject constructor(
private fun setRepeatingAlarm(day: AlarmDay, alarm: Alarm) {
val triggerMillis = alarmTimeCalculator.calculateNextRepeatingTimeMillis(alarm, day)
val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day)

logSchedule("REPEAT", alarm, triggerMillis, "day=$day")
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerMillis,
Expand All @@ -42,7 +52,7 @@ class AndroidAlarmScheduler @Inject constructor(
private fun setNonRepeatingAlarm(alarm: Alarm) {
val triggerMillis = alarmTimeCalculator.calculateNonRepeatingTimeMillis(alarm)
val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm)

logSchedule("NON_REPEAT", alarm, triggerMillis)
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerMillis,
Expand All @@ -53,7 +63,7 @@ class AndroidAlarmScheduler @Inject constructor(
fun rescheduleUpcomingWeeklyAlarm(alarm: Alarm, day: AlarmDay) {
val triggerMillis = alarmTimeCalculator.calculateNextWeeklyRescheduledTimeMillis(alarm, day)
val pendingIntent = createAlarmReceiverPendingIntentForSchedule(app, alarm, day)

logSchedule("RESCHEDULE_WEEKLY", alarm, triggerMillis, "day=$day")
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerMillis,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ package com.yapp.alarm.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.core.net.toUri
import com.yapp.alarm.AlarmConstants
import com.yapp.domain.model.FortuneCreateStatus
import com.yapp.domain.model.MissionType
import com.yapp.domain.repository.FortuneRepository
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import kotlinx.coroutines.withContext
import javax.inject.Inject

@AndroidEntryPoint
Expand All @@ -31,29 +31,69 @@ class AlarmInteractionActivityReceiver(private val activity: ComponentActivity)

if (!isSnoozed) {
val notificationId = intent.getLongExtra(AlarmConstants.EXTRA_NOTIFICATION_ID, -1L)
val missionType = intent.getIntExtra(AlarmConstants.EXTRA_MISSION_TYPE, -1)
val missionTypeRaw = intent.getIntExtra(AlarmConstants.EXTRA_MISSION_TYPE, -1)
val missionCount = intent.getIntExtra(AlarmConstants.EXTRA_MISSION_COUNT, -1)

if (notificationId == -1L || missionType == -1 || missionCount == -1) {
Log.e("AlarmInteraction", "ν•„μˆ˜ κ°’ λˆ„λ½")
return
}
val missionType = MissionType.fromInt(missionTypeRaw)

val hasValidMissionData = (
notificationId != -1L &&
missionType != MissionType.NONE &&
missionCount != -1
)

val pending = goAsync()
CoroutineScope(Dispatchers.Main).launch {
try {
if (!hasValidMissionData) {
val (fortuneCreateStatus, hasUnseenFortune) = withContext(Dispatchers.IO) {
val status = fortuneRepository.fortuneCreateStatusFlow.first()
val unseen = fortuneRepository.hasUnseenFortuneFlow.first()
status to unseen
}

CoroutineScope(Dispatchers.IO).launch {
val fortuneDate = fortuneRepository.fortuneDateFlow.firstOrNull()
val todayDate = LocalDate.now().format(DateTimeFormatter.ISO_DATE)

if (fortuneDate != todayDate) {
context?.let {
val uriString =
"orbitapp://mission?notificationId=$notificationId&missionType=$missionType&missionCount=$missionCount"
val missionIntent =
Intent(Intent.ACTION_VIEW, uriString.toUri()).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setPackage(context.packageName)
when (fortuneCreateStatus) {
is FortuneCreateStatus.Creating -> {
context?.let { ctx ->
val uri = "orbitapp://fortune".toUri()
val fortuneIntent = Intent(Intent.ACTION_VIEW, uri).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setPackage(ctx.packageName)
}
ctx.startActivity(fortuneIntent)
}
}
it.startActivity(missionIntent)

is FortuneCreateStatus.Success -> {
if (hasUnseenFortune) {
context?.let { ctx ->
val uri = "orbitapp://fortune".toUri()
val fortuneIntent =
Intent(Intent.ACTION_VIEW, uri).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setPackage(ctx.packageName)
}
ctx.startActivity(fortuneIntent)
}
}
}

FortuneCreateStatus.Failure, FortuneCreateStatus.Idle -> { }
}
} else {
context?.let { ctx ->
val uriString =
"orbitapp://mission?notificationId=$notificationId&missionType=${missionType.value}&missionCount=$missionCount"
val missionIntent =
Intent(Intent.ACTION_VIEW, uriString.toUri()).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
setPackage(ctx.packageName)
}
ctx.startActivity(missionIntent)
}
}
} finally {
pending.finish()
}
}
}
Expand Down
Loading