diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aeaf415..238397a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -154,6 +154,8 @@
+
+
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt
new file mode 100644
index 0000000..4b2302c
--- /dev/null
+++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AsmrNewContentAllActivity.kt
@@ -0,0 +1,108 @@
+package kr.co.vividnext.sodalive.audio_content.main.v2.asmr
+
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.annotation.OptIn
+import androidx.media3.common.util.UnstableApi
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllAdapter
+import kr.co.vividnext.sodalive.audio_content.all.AudioContentNewAllViewModel
+import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
+import kr.co.vividnext.sodalive.base.BaseActivity
+import kr.co.vividnext.sodalive.common.Constants
+import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
+import kr.co.vividnext.sodalive.common.LoadingDialog
+import kr.co.vividnext.sodalive.databinding.ActivityAsmrNewContentAllBinding
+import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
+import org.koin.android.ext.android.inject
+
+@OptIn(UnstableApi::class)
+class AsmrNewContentAllActivity : BaseActivity(
+ ActivityAsmrNewContentAllBinding::inflate
+) {
+ private val viewModel: AudioContentNewAllViewModel by inject()
+
+ private lateinit var loadingDialog: LoadingDialog
+
+ private lateinit var newContentAdapter: AudioContentNewAllAdapter
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ bindData()
+ viewModel.selectTheme(theme = "ASMR", isFree = false)
+ }
+
+ override fun setupView() {
+ loadingDialog = LoadingDialog(this, layoutInflater)
+ binding.toolbar.tvBack.text = "새로운 ASMR"
+ binding.toolbar.tvBack.setOnClickListener { finish() }
+
+ setupNewContent()
+ }
+
+ private fun setupNewContent() {
+ val spanCount = 3
+ val spacing = 40
+ newContentAdapter = AudioContentNewAllAdapter(
+ itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
+ onClickItem = {
+ startActivity(
+ Intent(this, AudioContentDetailActivity::class.java).apply {
+ putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
+ }
+ )
+ },
+ onClickCreator = {
+ startActivity(
+ Intent(this, UserProfileActivity::class.java).apply {
+ putExtra(Constants.EXTRA_USER_ID, it)
+ }
+ )
+ }
+ )
+
+ binding.rvContent.layoutManager = GridLayoutManager(this, spanCount)
+ binding.rvContent.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
+
+ binding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+ super.onScrolled(recyclerView, dx, dy)
+
+ val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
+ .findLastCompletelyVisibleItemPosition()
+ val itemTotalCount = recyclerView.adapter!!.itemCount - 1
+
+ // 스크롤이 끝에 도달했는지 확인
+ if (!recyclerView.canScrollVertically(1) &&
+ lastVisibleItemPosition == itemTotalCount
+ ) {
+ viewModel.getNewContentList()
+ }
+ }
+ })
+
+ binding.rvContent.adapter = newContentAdapter
+ }
+
+ private fun bindData() {
+ viewModel.isLoading.observe(this) {
+ if (it) {
+ loadingDialog.show(screenWidth)
+ } else {
+ loadingDialog.dismiss()
+ }
+ }
+
+ viewModel.toastLiveData.observe(this) {
+ it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
+ }
+
+ viewModel.newContentListLiveData.observe(this) {
+ newContentAdapter.addItems(it)
+ }
+ }
+}
diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt
index 8286925..2bf0b6a 100644
--- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt
+++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/v2/asmr/AudioContentMainTabAsmrFragment.kt
@@ -151,7 +151,11 @@ class AudioContentMainTabAsmrFragment : BaseFragment(
+ ActivityAsmrNewContentAllBinding::inflate
+) {
+ private val viewModel: AudioContentNewAllViewModel by inject()
+
+ private lateinit var loadingDialog: LoadingDialog
+
+ private lateinit var newContentAdapter: AudioContentNewAllAdapter
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ bindData()
+ viewModel.selectTheme(theme = "다시듣기", isFree = false)
+ }
+
+ override fun setupView() {
+ loadingDialog = LoadingDialog(this, layoutInflater)
+ binding.toolbar.tvBack.text = "새로운 라이브 다시듣기"
+ binding.toolbar.tvBack.setOnClickListener { finish() }
+
+ setupNewContent()
+ }
+
+ private fun setupNewContent() {
+ val spanCount = 3
+ val spacing = 40
+ newContentAdapter = AudioContentNewAllAdapter(
+ itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 3,
+ onClickItem = {
+ startActivity(
+ Intent(this, AudioContentDetailActivity::class.java).apply {
+ putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
+ }
+ )
+ },
+ onClickCreator = {
+ startActivity(
+ Intent(this, UserProfileActivity::class.java).apply {
+ putExtra(Constants.EXTRA_USER_ID, it)
+ }
+ )
+ }
+ )
+
+ binding.rvContent.layoutManager = GridLayoutManager(this, spanCount)
+ binding.rvContent.addItemDecoration(GridSpacingItemDecoration(spanCount, spacing, true))
+
+ binding.rvContent.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+ super.onScrolled(recyclerView, dx, dy)
+
+ val lastVisibleItemPosition = (recyclerView.layoutManager as LinearLayoutManager?)!!
+ .findLastCompletelyVisibleItemPosition()
+ val itemTotalCount = recyclerView.adapter!!.itemCount - 1
+
+ // 스크롤이 끝에 도달했는지 확인
+ if (!recyclerView.canScrollVertically(1) &&
+ lastVisibleItemPosition == itemTotalCount
+ ) {
+ viewModel.getNewContentList()
+ }
+ }
+ })
+
+ binding.rvContent.adapter = newContentAdapter
+ }
+
+ private fun bindData() {
+ viewModel.isLoading.observe(this) {
+ if (it) {
+ loadingDialog.show(screenWidth)
+ } else {
+ loadingDialog.dismiss()
+ }
+ }
+
+ viewModel.toastLiveData.observe(this) {
+ it?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() }
+ }
+
+ viewModel.newContentListLiveData.observe(this) {
+ newContentAdapter.addItems(it)
+ }
+ }
+}
diff --git a/app/src/main/res/layout/activity_asmr_new_content_all.xml b/app/src/main/res/layout/activity_asmr_new_content_all.xml
new file mode 100644
index 0000000..75ba7ef
--- /dev/null
+++ b/app/src/main/res/layout/activity_asmr_new_content_all.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+