feat(main): 레거시 직접 진입을 V2 메인으로 전환한다

This commit is contained in:
2026-09-18 14:48:39 +09:00
parent 330148821c
commit 5e114e18a0
13 changed files with 136 additions and 16 deletions
+2 -2
View File
@@ -177,8 +177,8 @@
<activity android:name=".settings.notification.NotificationSettingsActivity" /> <activity android:name=".settings.notification.NotificationSettingsActivity" />
<activity android:name=".settings.notification.NotificationReceiveSettingsActivity" /> <activity android:name=".settings.notification.NotificationReceiveSettingsActivity" />
<activity android:name=".settings.ContentSettingsActivity" /> <activity android:name=".settings.ContentSettingsActivity" />
<activity android:name=".live.reservation_status.LiveReservationStatusActivity" /> <activity android:name=".live.reservation.status.LiveReservationStatusActivity" />
<activity android:name=".live.reservation_status.LiveReservationCancelActivity" /> <activity android:name=".live.reservation.status.LiveReservationCancelActivity" />
<activity android:name=".audio_content.AudioContentActivity" /> <activity android:name=".audio_content.AudioContentActivity" />
<activity android:name=".audio_content.detail.AudioContentDetailActivity" /> <activity android:name=".audio_content.detail.AudioContentDetailActivity" />
<activity android:name=".audio_content.modify.AudioContentModifyActivity" /> <activity android:name=".audio_content.modify.AudioContentModifyActivity" />
@@ -96,7 +96,7 @@ import kr.co.vividnext.sodalive.live.LiveRepository
import kr.co.vividnext.sodalive.live.LiveViewModel import kr.co.vividnext.sodalive.live.LiveViewModel
import kr.co.vividnext.sodalive.live.recommend.LiveRecommendApi import kr.co.vividnext.sodalive.live.recommend.LiveRecommendApi
import kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepository import kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepository
import kr.co.vividnext.sodalive.live.reservation_status.LiveReservationStatusViewModel import kr.co.vividnext.sodalive.live.reservation.status.LiveReservationStatusViewModel
import kr.co.vividnext.sodalive.live.room.LiveRoomViewModel import kr.co.vividnext.sodalive.live.room.LiveRoomViewModel
import kr.co.vividnext.sodalive.live.room.create.LiveRoomCreateViewModel import kr.co.vividnext.sodalive.live.room.create.LiveRoomCreateViewModel
import kr.co.vividnext.sodalive.live.room.detail.LiveRoomDetailViewModel import kr.co.vividnext.sodalive.live.room.detail.LiveRoomDetailViewModel
@@ -5,8 +5,8 @@ import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationRequest import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationRequest
import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationResponse import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationResponse
import kr.co.vividnext.sodalive.live.reservation_status.CancelLiveReservationRequest import kr.co.vividnext.sodalive.live.reservation.status.CancelLiveReservationRequest
import kr.co.vividnext.sodalive.live.reservation_status.GetLiveReservationResponse import kr.co.vividnext.sodalive.live.reservation.status.GetLiveReservationResponse
import kr.co.vividnext.sodalive.live.room.CancelLiveRequest import kr.co.vividnext.sodalive.live.room.CancelLiveRequest
import kr.co.vividnext.sodalive.live.room.EnterOrQuitLiveRoomRequest import kr.co.vividnext.sodalive.live.room.EnterOrQuitLiveRoomRequest
import kr.co.vividnext.sodalive.live.room.LiveRoomStatus import kr.co.vividnext.sodalive.live.room.LiveRoomStatus
@@ -4,7 +4,7 @@ import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationRequest import kr.co.vividnext.sodalive.live.reservation.MakeLiveReservationRequest
import kr.co.vividnext.sodalive.live.reservation_status.CancelLiveReservationRequest import kr.co.vividnext.sodalive.live.reservation.status.CancelLiveReservationRequest
import kr.co.vividnext.sodalive.live.room.CancelLiveRequest import kr.co.vividnext.sodalive.live.room.CancelLiveRequest
import kr.co.vividnext.sodalive.live.room.EnterOrQuitLiveRoomRequest import kr.co.vividnext.sodalive.live.room.EnterOrQuitLiveRoomRequest
import kr.co.vividnext.sodalive.live.room.LiveRoomStatus import kr.co.vividnext.sodalive.live.room.LiveRoomStatus
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import androidx.annotation.Keep import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import android.os.Parcelable import android.os.Parcelable
import androidx.annotation.Keep import androidx.annotation.Keep
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
@@ -18,10 +18,10 @@ import kr.co.vividnext.sodalive.common.SodaLiveApplicationHolder
import kr.co.vividnext.sodalive.databinding.ActivityLiveReservationCancelBinding import kr.co.vividnext.sodalive.databinding.ActivityLiveReservationCancelBinding
import kr.co.vividnext.sodalive.extensions.convertDateFormat import kr.co.vividnext.sodalive.extensions.convertDateFormat
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.mypage.can.status.CanStatusActivity import kr.co.vividnext.sodalive.mypage.can.status.CanStatusActivity
import kr.co.vividnext.sodalive.settings.language.LanguageManager import kr.co.vividnext.sodalive.settings.language.LanguageManager
import kr.co.vividnext.sodalive.settings.language.LocaleHelper import kr.co.vividnext.sodalive.settings.language.LocaleHelper
import kr.co.vividnext.sodalive.v2.main.MainV2Activity
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.util.Locale import java.util.Locale
import java.util.TimeZone import java.util.TimeZone
@@ -117,7 +117,7 @@ class LiveReservationCancelActivity : BaseActivity<ActivityLiveReservationCancel
binding.tvOtherSudaReservation.setOnClickListener { binding.tvOtherSudaReservation.setOnClickListener {
finishAffinity() finishAffinity()
startActivity(Intent(applicationContext, MainActivity::class.java)) startActivity(Intent(applicationContext, MainV2Activity::class.java))
} }
binding.tvCheckCanStatus.setOnClickListener { binding.tvCheckCanStatus.setOnClickListener {
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -1,4 +1,4 @@
package kr.co.vividnext.sodalive.live.reservation_status package kr.co.vividnext.sodalive.live.reservation.status
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@@ -120,13 +120,13 @@ import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewDialog
import kr.co.vividnext.sodalive.live.roulette.RouletteSpinDialog import kr.co.vividnext.sodalive.live.roulette.RouletteSpinDialog
import kr.co.vividnext.sodalive.live.roulette.config.RouletteConfigActivity import kr.co.vividnext.sodalive.live.roulette.config.RouletteConfigActivity
import kr.co.vividnext.sodalive.main.DeepLinkActivity import kr.co.vividnext.sodalive.main.DeepLinkActivity
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.report.ProfileReportDialog import kr.co.vividnext.sodalive.report.ProfileReportDialog
import kr.co.vividnext.sodalive.report.ReportType import kr.co.vividnext.sodalive.report.ReportType
import kr.co.vividnext.sodalive.report.UserReportDialog import kr.co.vividnext.sodalive.report.UserReportDialog
import kr.co.vividnext.sodalive.settings.ContentSettingsActivity import kr.co.vividnext.sodalive.settings.ContentSettingsActivity
import kr.co.vividnext.sodalive.settings.language.LanguageManager import kr.co.vividnext.sodalive.settings.language.LanguageManager
import kr.co.vividnext.sodalive.settings.notification.MemberRole import kr.co.vividnext.sodalive.settings.notification.MemberRole
import kr.co.vividnext.sodalive.v2.main.MainV2Activity
import org.json.JSONObject import org.json.JSONObject
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@@ -379,7 +379,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
val bundle = intent?.getBundleExtra(Constants.EXTRA_DATA) ?: return val bundle = intent?.getBundleExtra(Constants.EXTRA_DATA) ?: return
showDeepLinkNavigationDialog { showDeepLinkNavigationDialog {
val nextIntent = Intent(applicationContext, MainActivity::class.java).apply { val nextIntent = Intent(applicationContext, MainV2Activity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
putExtra(Constants.EXTRA_DATA, bundle) putExtra(Constants.EXTRA_DATA, bundle)
} }
@@ -0,0 +1,73 @@
package kr.co.vividnext.sodalive.live
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import java.io.File
class LiveReservationPackageSourceTest {
@Test
fun `라이브 예약 현황 소스 경로는 패키지 구조와 일치한다`() {
val expectedDirectory = projectPath(
"app/src/main/java/kr/co/vividnext/sodalive/live/reservation/status"
)
val legacyDirectory = projectPath(
"app/src/main/java/kr/co/vividnext/sodalive/live/reservation_status"
)
assertTrue("Package directory not found: $expectedDirectory", expectedDirectory.isDirectory)
assertFalse("Legacy package directory remains: $legacyDirectory", legacyDirectory.exists())
}
@Test
fun `라이브 예약 현황 패키지는 underscore를 사용하지 않는다`() {
val sourceFiles = listOf(
"CancelLiveReservationRequest.kt",
"GetLiveReservationResponse.kt",
"LiveReservationCancelActivity.kt",
"LiveReservationStatusActivity.kt",
"LiveReservationStatusAdapter.kt",
"LiveReservationStatusViewModel.kt"
).map { fileName ->
projectFile("app/src/main/java/kr/co/vividnext/sodalive/live/reservation/status/$fileName")
}
sourceFiles.forEach { file ->
val source = file.readText()
assertTrue(source.contains("package kr.co.vividnext.sodalive.live.reservation.status"))
assertFalse(source.contains("package kr.co.vividnext.sodalive.live.reservation_status"))
}
}
@Test
fun `라이브 예약 현황 참조는 underscore 없는 패키지를 사용한다`() {
val checkedSources = listOf(
projectFile("app/src/main/AndroidManifest.xml"),
projectFile("app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt"),
projectFile("app/src/main/java/kr/co/vividnext/sodalive/live/LiveApi.kt"),
projectFile("app/src/main/java/kr/co/vividnext/sodalive/live/LiveRepository.kt")
)
checkedSources.forEach { file ->
val source = file.readText()
assertFalse(source.contains("kr.co.vividnext.sodalive.live.reservation_status"))
assertFalse(source.contains(".live.reservation_status."))
}
val manifest = checkedSources.first().readText()
assertTrue(manifest.contains(".live.reservation.status.LiveReservationStatusActivity"))
assertTrue(manifest.contains(".live.reservation.status.LiveReservationCancelActivity"))
}
private fun projectFile(relativePath: String): File {
val candidates = listOf(File(relativePath), File("../$relativePath"))
return candidates.firstOrNull { it.exists() }
?: error("Project file not found: $relativePath")
}
private fun projectPath(relativePath: String): File {
val projectRoot = listOf(File("."), File("..")).first { File(it, "app").isDirectory }
return File(projectRoot, relativePath)
}
}
@@ -0,0 +1,47 @@
package kr.co.vividnext.sodalive.v2.main
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
import java.io.File
class MainV2DirectEntrySourceTest {
@Test
fun `라이브룸 딥링크 confirm은 MainV2Activity로 이동한다`() {
val source = projectFile(
"app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt"
).readText()
val receiverSource = source.substringAfter("private val deepLinkConfirmReceiver")
.substringBefore("// region lifecycle")
assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.main.MainV2Activity"))
assertTrue(receiverSource.contains("MainV2Activity::class.java"))
assertTrue(receiverSource.contains("Intent.FLAG_ACTIVITY_CLEAR_TOP"))
assertTrue(receiverSource.contains("Intent.FLAG_ACTIVITY_SINGLE_TOP"))
assertTrue(receiverSource.contains("putExtra(Constants.EXTRA_DATA, bundle)"))
assertFalse(source.contains("import kr.co.vividnext.sodalive.main.MainActivity"))
assertFalse(receiverSource.contains("MainActivity::class.java"))
}
@Test
fun `예약 취소의 다른 수다 예약은 MainV2Activity로 이동한다`() {
val source = projectFile(
"app/src/main/java/kr/co/vividnext/sodalive/live/reservation/status/LiveReservationCancelActivity.kt"
).readText()
val clickSource = source.substringAfter("binding.tvOtherSudaReservation.setOnClickListener")
.substringBefore("binding.tvCheckCanStatus.setOnClickListener")
assertTrue(source.contains("import kr.co.vividnext.sodalive.v2.main.MainV2Activity"))
assertTrue(clickSource.contains("finishAffinity()"))
assertTrue(clickSource.contains("MainV2Activity::class.java"))
assertFalse(source.contains("import kr.co.vividnext.sodalive.main.MainActivity"))
assertFalse(clickSource.contains("MainActivity::class.java"))
}
private fun projectFile(relativePath: String): File {
val candidates = listOf(File(relativePath), File("../$relativePath"))
return candidates.firstOrNull { it.exists() }
?: error("Project file not found: $relativePath")
}
}