Skip to content

Commit 05bf712

Browse files
authored
Merge pull request #313 from Team-Clody/develop
[TEST] 5차 스프린트 테스트 앱을 배포합니다.
2 parents e191905 + 858e7ef commit 05bf712

File tree

250 files changed

+6633
-3411
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

250 files changed

+6633
-3411
lines changed

.github/workflows/android_cd.yml

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,18 @@ jobs:
4545
- name: Install Firebase CLI
4646
run: curl -sL https://firebase.tools | bash
4747

48-
# google-services.json
49-
- name: Decode google-services.json
48+
# google-services.json (prod)
49+
- name: Decode Prod google-services.json
5050
env:
5151
FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }}
5252
run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json
5353

54+
# google-services.json (debug)
55+
- name: Decode Debug google-services.json
56+
env:
57+
FIREBASE_DEBUG_SECRET: ${{ secrets.FIREBASE_DEBUG_SECRET }}
58+
run: echo $FIREBASE_DEBUG_SECRET | base64 --decode > app/src/debug/google-services.json
59+
5460
# keystore 복호화
5561
- name: Decode keystore file
5662
env:
@@ -62,28 +68,32 @@ jobs:
6268
# local.properties
6369
- name: Generate local.properties
6470
env:
65-
BASE_URL: ${{ secrets.BASE_URL }}
71+
CLODY_BASE_URL: ${{ secrets.CLODY_BASE_URL }}
72+
CLODY_TEST_URL: ${{ secrets.CLODY_TEST_URL }}
6673
KAKAO_API_KEY: ${{ secrets.KAKAO_API_KEY }}
6774
AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }}
6875
GOOGLE_ADMOB_APP_ID: ${{ secrets.GOOGLE_ADMOB_APP_ID }}
6976
GOOGLE_ADMOB_UNIT_ID: ${{ secrets.GOOGLE_ADMOB_UNIT_ID }}
77+
GOOGLE_AUTH_WEB_CLIENT_ID: ${{ secrets.GOOGLE_AUTH_WEB_CLIENT_ID }}
7078
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
7179
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
7280
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
7381
run: |
74-
echo "baseUrl=$BASE_URL" >> local.properties
82+
echo "clody.base.url=$CLODY_BASE_URL" >> local.properties
83+
echo "clody.test.url=$CLODY_TEST_URL" >> local.properties
7584
echo "kakao.api.key=$KAKAO_API_KEY" >> local.properties
7685
echo "amplitude.api.key=$AMPLITUDE_API_KEY" >> local.properties
77-
echo "googleAdmob.app.id=$GOOGLE_ADMOB_APP_ID" >> local.properties
78-
echo "googleAdmob.unit.id=$GOOGLE_ADMOB_UNIT_ID" >> local.properties
86+
echo "GOOGLE_ADMOB_APP_ID=$GOOGLE_ADMOB_APP_ID" >> local.properties
87+
echo "GOOGLE_ADMOB_UNIT_ID=$GOOGLE_ADMOB_UNIT_ID" >> local.properties
88+
echo "GOOGLE_AUTH_WEB_CLIENT_ID=$GOOGLE_AUTH_WEB_CLIENT_ID" >> local.properties
7989
echo "storeFile=keystore/clody_release.jks" >> local.properties
8090
echo "storePassword=$STORE_PASSWORD" >> local.properties
8191
echo "keyAlias=$KEY_ALIAS" >> local.properties
8292
echo "keyPassword=$KEY_PASSWORD" >> local.properties
8393
84-
# Release APK 빌드
85-
- name: Build Release APK
86-
run: ./gradlew assembleRelease --stacktrace
94+
# Debug APK 빌드
95+
- name: Build Debug APK
96+
run: ./gradlew assembleDebug --stacktrace
8797

8898
# Set up Firebase Service Account Credentials
8999
- name: Set up Firebase Service Account Credentials
@@ -112,22 +122,22 @@ jobs:
112122
- name: Upload APK to Firebase App Distribution
113123
env:
114124
GOOGLE_APPLICATION_CREDENTIALS: $HOME/firebase-credentials.json
115-
FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }}
125+
FIREBASE_DEBUG_APP_ID: ${{ secrets.FIREBASE_DEBUG_APP_ID }}
116126
run: |
117-
echo "🔥 FIREBASE_APP_ID 확인: $FIREBASE_APP_ID"
127+
echo "🔥 FIREBASE_DEBUG_APP_ID 확인: $FIREBASE_DEBUG_APP_ID"
118128
119-
# 만약 FIREBASE_APP_ID가 없으면 에러 출력 후 종료
120-
if [ -z "$FIREBASE_APP_ID" ]; then
121-
echo "❌ ERROR: FIREBASE_APP_ID가 설정되지 않았습니다. GitHub Secrets에서 확인하세요."
129+
# 만약 FIREBASE_DEBUG_APP_ID가 없으면 에러 출력 후 종료
130+
if [ -z "$FIREBASE_DEBUG_APP_ID" ]; then
131+
echo "❌ ERROR: FIREBASE_DEBUG_APP_ID가 설정되지 않았습니다. GitHub Secrets에서 확인하세요."
122132
exit 1
123133
fi
124134
125135
# GOOGLE_APPLICATION_CREDENTIALS 재 설정
126136
export GOOGLE_APPLICATION_CREDENTIALS=$HOME/firebase-credentials.json
127137
echo "GOOGLE_APPLICATION_CREDENTIALS=$GOOGLE_APPLICATION_CREDENTIALS"
128138
129-
firebase appdistribution:distribute app/build/outputs/apk/release/app-release.apk \
130-
--app "$FIREBASE_APP_ID" \
139+
firebase appdistribution:distribute app/build/outputs/apk/debug/app-debug.apk \
140+
--app "$FIREBASE_DEBUG_APP_ID" \
131141
--release-notes "🍀 새로운 테스트 버전이 업로드되었습니다~" \
132142
--groups "clody-tester-group"
133143

.github/workflows/android_ci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ jobs:
6363
FIREBASE_SECRET: ${{ secrets.FIREBASE_SECRET }} # base64로 암호화된 json 사용
6464
run: echo $FIREBASE_SECRET | base64 --decode > app/google-services.json
6565

66+
# Firebase dubug google-services.json 복호화 및 설정
67+
- name: Decode debug google-services.json
68+
env:
69+
FIREBASE_DEBUG_SECRET: ${{ secrets.FIREBASE_DEBUG_SECRET }}
70+
run: |
71+
mkdir -p app/src/debug
72+
echo "$FIREBASE_DEBUG_SECRET" | base64 --decode > app/src/debug/google-services.json
73+
6674
# keystore 복호화
6775
- name: Decode keystore file
6876
env:

app/build.gradle.kts

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@ android {
2525
applicationId = "com.sopt.clody"
2626
minSdk = 28
2727
targetSdk = 35
28-
versionCode = 25
29-
versionName = "1.1.1"
28+
versionCode = 28
29+
versionName = "1.4.0"
3030
val kakaoApiKey: String = properties.getProperty("kakao.api.key")
3131
val amplitudeApiKey: String = properties.getProperty("amplitude.api.key")
3232
val googleAdmobAppId: String = properties.getProperty("GOOGLE_ADMOB_APP_ID", "")
3333
val googleAdmobUnitId: String = properties.getProperty("GOOGLE_ADMOB_UNIT_ID", "")
34+
val googleAuthWebClientId: String = properties.getProperty("GOOGLE_AUTH_WEB_CLIENT_ID", "")
35+
3436
buildConfigField("String", "GOOGLE_ADMOB_APP_ID", "\"$googleAdmobAppId\"")
3537
buildConfigField("String", "GOOGLE_ADMOB_UNIT_ID", "\"$googleAdmobUnitId\"")
3638
buildConfigField("String", "KAKAO_API_KEY", "\"$kakaoApiKey\"")
3739
buildConfigField("String", "AMPLITUDE_API_KEY", "\"$amplitudeApiKey\"")
40+
buildConfigField("String", "GOOGLE_AUTH_WEB_CLIENT_ID", "\"$googleAuthWebClientId\"")
3841
manifestPlaceholders["kakaoRedirectUri"] = "kakao$kakaoApiKey"
3942
manifestPlaceholders["GOOGLE_ADMOB_APP_ID"] = googleAdmobAppId
4043
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -51,8 +54,13 @@ android {
5154

5255
buildTypes {
5356
debug {
57+
applicationIdSuffix = ".dev"
58+
5459
isMinifyEnabled = false
55-
buildConfigField("String", "CLODY_BASE_URL", properties["clody.base.url"].toString())
60+
buildConfigField("String", "CLODY_BASE_URL", properties["clody.test.url"].toString())
61+
62+
manifestPlaceholders["appLabel"] = "@string/app_name_dev"
63+
manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher_dev"
5664
}
5765

5866
release {
@@ -64,6 +72,9 @@ android {
6472
"proguard-rules.pro",
6573
)
6674
signingConfig = signingConfigs.getByName("release")
75+
76+
manifestPlaceholders["appLabel"] = "@string/app_name"
77+
manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher"
6778
}
6879
}
6980
compileOptions {
@@ -77,6 +88,11 @@ android {
7788
buildConfig = true
7889
compose = true
7990
}
91+
testOptions {
92+
unitTests.all {
93+
it.useJUnitPlatform()
94+
}
95+
}
8096
}
8197

8298
dependencies {
@@ -120,10 +136,26 @@ dependencies {
120136
implementation(libs.accompanist.systemuicontroller)
121137
implementation(libs.accompanist.insets)
122138

139+
// Mavericks
140+
implementation(libs.bundles.mavericks)
141+
142+
// Kotest
143+
testImplementation(libs.bundles.kotest)
144+
testImplementation(libs.mockk)
145+
testImplementation(libs.coroutines.test)
146+
147+
// Play Store
148+
implementation(libs.bundles.plays)
149+
123150
// ETC
124151
implementation(libs.timber)
125152
implementation(libs.lottie.compose)
126153
implementation(libs.coil)
127154
implementation(libs.kakao.user)
128155
implementation(libs.kotlinx.datetime)
156+
157+
implementation(libs.androidx.credentials.play.services.auth)
158+
implementation(libs.google.auth)
159+
implementation(libs.androidx.datastore.preferences)
160+
implementation(libs.airbridge)
129161
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="app_name_dev">돈키</string>
4+
</resources>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="app_name_dev">Donkey</string>
4+
</resources>

app/src/main/AndroidManifest.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,24 @@
33
xmlns:tools="http://schemas.android.com/tools">
44

55
<uses-permission android:name="android.permission.INTERNET" />
6+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
67
<uses-permission android:name="android.permission.WAKE_LOCK" />
78
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
89
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
910

1011
<application
11-
android:name=".ClodyApp"
12+
android:name=".ClodyApplication"
1213
android:allowBackup="true"
1314
android:dataExtractionRules="@xml/data_extraction_rules"
1415
android:fullBackupContent="@xml/backup_rules"
1516
android:hardwareAccelerated="true"
16-
android:icon="@mipmap/ic_launcher"
17-
android:label="@string/app_name"
17+
android:icon="${appIcon}"
18+
android:label="${appLabel}"
1819
android:roundIcon="@mipmap/ic_launcher_round"
1920
android:supportsRtl="true"
2021
android:theme="@style/Theme.CLODY"
2122
android:usesCleartextTraffic="true"
23+
tools:replace="android:icon,android:label,android:dataExtractionRules,android:fullBackupContent"
2224
tools:targetApi="31">
2325

2426
<meta-data
@@ -37,7 +39,6 @@
3739
<activity
3840
android:name=".presentation.ui.main.MainActivity"
3941
android:exported="true"
40-
android:label="@string/app_name"
4142
android:theme="@style/Theme.CLODY"
4243
android:windowSoftInputMode="adjustResize">
4344
<intent-filter>
18.7 KB
Loading
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
11
package com.sopt.clody
22

33
import android.app.Application
4+
import co.ab180.airbridge.Airbridge
5+
import co.ab180.airbridge.AirbridgeOptionBuilder
6+
import com.airbnb.mvrx.Mavericks
47
import com.google.firebase.FirebaseApp
58
import com.kakao.sdk.common.KakaoSdk
69
import com.sopt.clody.presentation.utils.amplitude.AmplitudeUtils.initAmplitude
710
import dagger.hilt.android.HiltAndroidApp
811
import timber.log.Timber
912

1013
@HiltAndroidApp
11-
class ClodyApp : Application() {
14+
class ClodyApplication : Application() {
1215
override fun onCreate() {
1316
super.onCreate()
1417
Timber.plant(Timber.DebugTree())
1518
initKakaoSdk()
1619
FirebaseApp.initializeApp(this)
20+
Mavericks.initialize(this)
1721
initAmplitude(applicationContext)
22+
initAirBridge()
1823
}
1924

2025
private fun initKakaoSdk() {
2126
KakaoSdk.init(this, BuildConfig.KAKAO_API_KEY)
2227
}
28+
29+
private fun initAirBridge() {
30+
val option = AirbridgeOptionBuilder("clody", "3ba2277abcd044f29356dc0ee32165ff").build()
31+
Airbridge.initializeSDK(this, option)
32+
}
2333
}

app/src/main/java/com/sopt/clody/core/RewardAdShower.kt renamed to app/src/main/java/com/sopt/clody/core/ad/RewardAdShower.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.sopt.clody.core
1+
package com.sopt.clody.core.ad
22

33
import android.app.Activity
44

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.sopt.clody.core.fcm
2+
3+
import com.google.firebase.ktx.Firebase
4+
import com.google.firebase.messaging.ktx.messaging
5+
import kotlinx.coroutines.tasks.await
6+
import timber.log.Timber
7+
import javax.inject.Inject
8+
9+
class FcmTokenProvider @Inject constructor() {
10+
suspend fun getToken(): String? {
11+
return try {
12+
Firebase.messaging.token.await()
13+
} catch (e: Exception) {
14+
Timber.e("FCM 토큰 수신 실패: ${e.message}")
15+
null
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)