Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
d5519d3
결제 진행 중 에러 발생시 팝업으로 안내 하도록 수정
juhwankim-dev Oct 12, 2025
5851701
version up (1.4.6 -> 1.4.7)
juhwankim-dev Oct 12, 2025
6a1bdc1
불필요한 결제 관련 코드 제거
juhwankim-dev Oct 12, 2025
cfc449e
version code up (64 -> 65)
juhwankim-dev Oct 12, 2025
c5a6d62
NR-120 debug 빌드에서만 flipper를 사용하도록 수정
juhwankim-dev Nov 11, 2025
a09ccae
환경변수 재설정 후 feature 환경에서 ci/cd 테스트
juhwankim-dev Nov 14, 2025
bb6c046
Merge branch 'develop' of https://github.com/Next-Room/NextRoom-Andro…
juhwankim-dev Nov 14, 2025
8f15207
Merge branch 'release/1.4.7' of https://github.com/Next-Room/NextRoom…
juhwankim-dev Nov 14, 2025
a401f62
feature로 시작하는 브랜치 모두 ci/cd를 수행하도록 수정
juhwankim-dev Nov 14, 2025
a1cd528
(테스트) feature로 시작하는 브랜치면 firebase distribution에 올리도록 수정
juhwankim-dev Nov 14, 2025
4b62fe3
(테스트) debug, distribution job에 if 조건 제거
juhwankim-dev Nov 14, 2025
b7f65fc
(테스트) firebase에 앱 업로드 완료시 슬랙 채널에 알림 가도록 개선
juhwankim-dev Nov 14, 2025
d8ec120
(테스트) $ 문자 빠진것 추가 및 테스트를 위한 일부 job 주석
juhwankim-dev Nov 14, 2025
a1d9515
(테스트) Build assemble release aab 주석
juhwankim-dev Nov 14, 2025
e9e5efc
(테스트) startsWith로 브랜치 구분하기 테스트
juhwankim-dev Nov 14, 2025
e3f26ce
(테스트) pull request 할때 job 테스트
juhwankim-dev Nov 14, 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
41 changes: 27 additions & 14 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Android CI CD

on:
push:
branches: [ "main", "develop", "release" ]
branches: [ "main", "develop", "release", "feature/*" ]
pull_request:
branches: [ "main", "develop", "release" ]
branches: [ "main", "develop", "release", "feature/*" ]

jobs:
build:
Expand Down Expand Up @@ -60,38 +60,51 @@ jobs:
- name: Build clean
run: ./gradlew clean

- name: Run Android lint
run: ./gradlew lint
# - name: Run Android lint
# run: ./gradlew lint

- name: Build assemble debug apk
run: ./gradlew assembleDebug --stacktrace

- name: Build assemble release aab
run: ./gradlew bundleRelease --stacktrace
# - name: Build assemble release aab
# run: ./gradlew bundleRelease --stacktrace

- name: Upload Debug APK
if: github.event_name == 'push' && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/release')
uses: actions/upload-artifact@v4
with:
name: debug
path: ./app/build/outputs/apk/debug/app-debug.apk

- name: Upload Release APK
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: release
path: ./app/build/outputs/bundle/release/app-release.aab
# - name: Upload Release APK
# if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# uses: actions/upload-artifact@v4
# with:
# name: release
# path: ./app/build/outputs/bundle/release/app-release.aab

- name: Upload apk to Firebase App Distribution
if: github.event_name == 'push' && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/release')
if: github.event_name == 'pull_request' && (
github.ref == 'refs/heads/develop' ||
startsWith(github.ref, 'refs/heads/feature/')
)
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_APP_ID }}
serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
groups: testers
file: app/build/outputs/apk/debug/app-debug.apk

- name: Notify Slack about new distribution
if: github.event_name == 'push'
run: |
curl -X POST -H 'Content-type: application/json' \
--data "{
\"text\": \"🔥 Firebase Distribution 업로드 완료! \n🔧 브랜치: ${GITHUB_REF##*/}\n🔗 커밋: ${GITHUB_SHA}\"
}" \
"$SLACK_WEBHOOK_URL_FIREBASE_DISTRIBUTION"
env:
SLACK_WEBHOOK_URL_FIREBASE_DISTRIBUTION: ${{ secrets.SLACK_WEBHOOK_URL_FIREBASE_DISTRIBUTION }}

- name: Publish to Play Store
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
uses: r0adkll/upload-google-play@v1
Expand Down
3 changes: 0 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,6 @@ dependencies {
implementation(libs.timber)
implementation(libs.billing)

debugImplementation(libs.bundles.flipper)
releaseImplementation(libs.flipper.noop)

implementation(libs.hilt.android)
kapt(libs.hilt.compiler)
}
Expand Down
30 changes: 2 additions & 28 deletions app/src/main/java/com/nextroom/nextroom/NextRoomApplication.kt
Original file line number Diff line number Diff line change
@@ -1,46 +1,20 @@
package com.nextroom.nextroom

import android.app.Application
import com.facebook.flipper.android.AndroidFlipperClient
import com.facebook.flipper.android.utils.FlipperUtils
import com.facebook.flipper.plugins.inspector.DescriptorMapping
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin
import com.facebook.soloader.SoLoader
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
import javax.inject.Inject

@HiltAndroidApp
class NextRoomApplication : Application() {
@Inject
lateinit var flipperNetworkPlugin: NetworkFlipperPlugin
lateinit var flavorExtraFunction: FlavorExtraFunction

override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}

setDebugTool()
}

private fun setDebugTool() {
SoLoader.init(this, false)

if (BuildConfig.DEBUG && FlipperUtils.shouldEnableFlipper(this)) {
val client = AndroidFlipperClient.getInstance(this)
client.addPlugin(InspectorFlipperPlugin(this, DescriptorMapping.withDefaults()))
client.addPlugin(
InspectorFlipperPlugin(
applicationContext,
DescriptorMapping.withDefaults(),
),
)
client.addPlugin(SharedPreferencesFlipperPlugin(this, "app-settings.json"))
client.addPlugin(flipperNetworkPlugin)
client.start()
flavorExtraFunction.initializeFlipper()
}
}
}
6 changes: 6 additions & 0 deletions data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ android {
buildFeatures {
buildConfig = true
}
sourceSets.getByName("debug") {
java.setSrcDirs(listOf("src/debug/java"))
}
sourceSets.getByName("release") {
java.setSrcDirs(listOf("src/release/java"))
}
}

dependencies {
Expand Down
45 changes: 45 additions & 0 deletions data/src/debug/java/com/nextroom/nextroom/FlavorExtraFunction.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.nextroom.nextroom

import android.content.Context
import com.facebook.flipper.android.AndroidFlipperClient
import com.facebook.flipper.android.utils.FlipperUtils
import com.facebook.flipper.plugins.inspector.DescriptorMapping
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin
import com.facebook.soloader.SoLoader
import com.nextroom.nextroom.data.BuildConfig
import okhttp3.Interceptor
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class FlavorExtraFunction @Inject constructor(
private val context: Context,
) {
private lateinit var flipperNetworkPlugin: NetworkFlipperPlugin

fun initializeFlipper() {
SoLoader.init(context, false)

if (BuildConfig.DEBUG && FlipperUtils.shouldEnableFlipper(context)) {
flipperNetworkPlugin = NetworkFlipperPlugin()
val client = AndroidFlipperClient.getInstance(context)
client.addPlugin(InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()))
client.addPlugin(
InspectorFlipperPlugin(
context,
DescriptorMapping.withDefaults(),
),
)
client.addPlugin(SharedPreferencesFlipperPlugin(context, "app-settings.json"))
client.addPlugin(flipperNetworkPlugin)
client.start()
}
}

fun getFlipperInterceptor(): Interceptor {
return FlipperOkhttpInterceptor(flipperNetworkPlugin, true)
}
}
36 changes: 28 additions & 8 deletions data/src/main/java/com/nextroom/nextroom/data/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.nextroom.nextroom.data.di

import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin
import android.content.Context
import com.nextroom.nextroom.FlavorExtraFunction
import com.nextroom.nextroom.data.BuildConfig
import com.nextroom.nextroom.data.datasource.AuthDataSource
import com.nextroom.nextroom.data.datasource.TokenDataSource
Expand All @@ -12,7 +12,9 @@ import com.nextroom.nextroom.data.network.ResultCallAdapterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
Expand Down Expand Up @@ -76,7 +78,7 @@ object NetworkModule {
fun provideAuthOkHttpClient(
authInterceptor: AuthInterceptor,
authAuthenticator: AuthAuthenticator,
flipperPlugin: NetworkFlipperPlugin,
flipperInterceptor: Interceptor?,
): OkHttpClient {
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = if (BuildConfig.DEBUG) {
Expand All @@ -91,15 +93,19 @@ object NetworkModule {
.authenticator(authAuthenticator)
.addInterceptor(authInterceptor)
.addInterceptor(loggingInterceptor)
.addInterceptor(FlipperOkhttpInterceptor(flipperPlugin, true))
.apply {
flipperInterceptor?.let {
addInterceptor(it)
}
}
.build()
}

@Singleton
@Provides
@Named("defaultOkHttpClient")
fun provideDefaultOkHttpClient(
flipperPlugin: NetworkFlipperPlugin,
flipperInterceptor: Interceptor?,
): OkHttpClient {
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = if (BuildConfig.DEBUG) {
Expand All @@ -112,7 +118,11 @@ object NetworkModule {
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.addNetworkInterceptor(FlipperOkhttpInterceptor(flipperPlugin))
.apply {
flipperInterceptor?.let {
addInterceptor(it)
}
}
.build()
}

Expand All @@ -134,7 +144,17 @@ object NetworkModule {

@Singleton
@Provides
fun provideNetworkFlipperPlugin(): NetworkFlipperPlugin {
return NetworkFlipperPlugin()
fun provideFlipperInterceptor(
flavorExtraFunction: FlavorExtraFunction,
): Interceptor? {
return flavorExtraFunction.getFlipperInterceptor()
}

@Singleton
@Provides
fun provideFlavorExtraFunction(
@ApplicationContext context: Context,
): FlavorExtraFunction {
return FlavorExtraFunction(context)
}
}
17 changes: 17 additions & 0 deletions data/src/release/java/com/nextroom/nextroom/FlavorExtraFunction.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.nextroom.nextroom

import android.content.Context
import okhttp3.Interceptor
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class FlavorExtraFunction @Inject constructor(
private val context: Context,
) {
fun initializeFlipper() {
// do nothing
}

fun getFlipperInterceptor(): Interceptor? = null
}
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ minSdk = "24"
review = "2.0.1"
reviewKtx = "2.0.1"
targetSdk = "34"
versionCode = "61"
versionName = "1.4.6"
versionCode = "65"
versionName = "1.4.7"
compileSdk = "34"
targetJvm = "17"
kotlin = "1.9.10"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.nextroom.nextroom.presentation.NavGraphDirections
import com.nextroom.nextroom.presentation.R
import com.nextroom.nextroom.presentation.common.NROneButtonDialog
import com.nextroom.nextroom.presentation.databinding.BottomSheetSubscriptionPromotionBinding
import com.nextroom.nextroom.presentation.databinding.ItemBenefitBinding
import com.nextroom.nextroom.presentation.extension.dpToPx
import com.nextroom.nextroom.presentation.extension.repeatOnStarted
import com.nextroom.nextroom.presentation.extension.safeNavigate
import com.nextroom.nextroom.presentation.extension.snackbar
import com.nextroom.nextroom.presentation.extension.toast
import com.nextroom.nextroom.presentation.ui.billing.BillingEvent
Expand Down Expand Up @@ -95,11 +97,14 @@ class SubscriptionPromotionBottomSheet : BottomSheetDialogFragment() {
binding.acbSubscribe.setOnClickListener {
viewModel.container.stateFlow.value.plan.plans.firstOrNull()?.let {
binding.pbLoading.isVisible = true
billingViewModel.buyPlans(
productId = it.subscriptionProductId,
tag = "",
upDowngrade = false,
)
try {
billingViewModel.buyPlans(
productId = it.subscriptionProductId,
upDowngrade = false,
)
} catch (e: Exception) {
showErrorDialog(e.message ?: "")
}
}
}
binding.ivClose.setOnClickListener {
Expand Down Expand Up @@ -167,6 +172,18 @@ class SubscriptionPromotionBottomSheet : BottomSheetDialogFragment() {
}
}

private fun showErrorDialog(errorText: String) {
NavGraphDirections
.moveToNrOneButtonDialog(
NROneButtonDialog.NROneButtonArgument(
title = getString(R.string.dialog_noti),
message = getString(R.string.error_something),
btnText = getString(R.string.text_confirm),
errorText = errorText
)
).also { findNavController().safeNavigate(it) }
}

data class Benefit(
val title: String,
val desc: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package com.nextroom.nextroom.presentation.ui.billing

sealed interface BillingEvent {
data object PurchaseAcknowledged : BillingEvent
data class PurchaseFailed(val purchaseState: Int) : BillingEvent
data class PurchaseFailed(val errorMessage: String = "", val purchaseState: Int? = null) : BillingEvent
}
Loading
Loading