parent
a4b1ef0005
commit
a7a7eb3e3f
|
@ -161,4 +161,9 @@ dependencies {
|
||||||
implementation "androidx.room:room-runtime:2.5.0"
|
implementation "androidx.room:room-runtime:2.5.0"
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
|
||||||
|
|
||||||
|
implementation "androidx.media3:media3-ui:1.4.1"
|
||||||
|
implementation "androidx.media3:media3-session:1.4.1"
|
||||||
|
implementation "androidx.media3:media3-exoplayer:1.4.1"
|
||||||
|
implementation "androidx.media3:media3-datasource-okhttp:1.4.1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import kr.co.vividnext.sodalive.audio_content.main.GetNewContentUploadCreator
|
||||||
import kr.co.vividnext.sodalive.audio_content.order.GetAudioContentOrderListResponse
|
import kr.co.vividnext.sodalive.audio_content.order.GetAudioContentOrderListResponse
|
||||||
import kr.co.vividnext.sodalive.audio_content.order.OrderRequest
|
import kr.co.vividnext.sodalive.audio_content.order.OrderRequest
|
||||||
import kr.co.vividnext.sodalive.audio_content.order.OrderType
|
import kr.co.vividnext.sodalive.audio_content.order.OrderType
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.player.GenerateUrlResponse
|
||||||
import kr.co.vividnext.sodalive.audio_content.upload.theme.GetAudioContentThemeResponse
|
import kr.co.vividnext.sodalive.audio_content.upload.theme.GetAudioContentThemeResponse
|
||||||
import kr.co.vividnext.sodalive.common.ApiResponse
|
import kr.co.vividnext.sodalive.common.ApiResponse
|
||||||
import kr.co.vividnext.sodalive.explorer.profile.GetAudioContentListResponse
|
import kr.co.vividnext.sodalive.explorer.profile.GetAudioContentListResponse
|
||||||
|
@ -237,4 +238,10 @@ interface AudioContentApi {
|
||||||
@Path("id") audioContentId: Long,
|
@Path("id") audioContentId: Long,
|
||||||
@Header("Authorization") authHeader: String
|
@Header("Authorization") authHeader: String
|
||||||
): Single<ApiResponse<Any>>
|
): Single<ApiResponse<Any>>
|
||||||
|
|
||||||
|
@GET("/audio-content/{id}/generate-url")
|
||||||
|
fun generateUrl(
|
||||||
|
@Path("id") contentId: Long,
|
||||||
|
@Header("Authorization") authHeader: String
|
||||||
|
): Single<ApiResponse<GenerateUrlResponse>>
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package kr.co.vividnext.sodalive.audio_content.player
|
||||||
|
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.AudioContentApi
|
||||||
|
|
||||||
|
class AudioContentGenerateUrlRepository(private val api: AudioContentApi) {
|
||||||
|
fun generateUrl(contentId: Long, token: String) = api.generateUrl(
|
||||||
|
contentId = contentId,
|
||||||
|
authHeader = token
|
||||||
|
)
|
||||||
|
}
|
|
@ -1,11 +1,91 @@
|
||||||
package kr.co.vividnext.sodalive.audio_content.player
|
package kr.co.vividnext.sodalive.audio_content.player
|
||||||
|
|
||||||
|
import android.app.Dialog
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
import android.view.ViewGroup
|
||||||
|
import android.widget.Toast
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.playlist.detail.AudioContentPlaylistContent
|
||||||
|
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||||
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentPlayerBinding
|
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentPlayerBinding
|
||||||
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
|
|
||||||
class AudioContentPlayerFragment : BaseFragment<FragmentAudioContentPlayerBinding>(
|
class AudioContentPlayerFragment(
|
||||||
FragmentAudioContentPlayerBinding::inflate
|
private val screenWidth: Int,
|
||||||
) {
|
private val playlist: List<AudioContentPlaylistContent>
|
||||||
|
) : BottomSheetDialogFragment() {
|
||||||
|
|
||||||
|
private lateinit var loadingDialog: LoadingDialog
|
||||||
|
private lateinit var binding: FragmentAudioContentPlayerBinding
|
||||||
|
|
||||||
|
private val viewModel: AudioContentPlayerViewModel by viewModel()
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
|
||||||
|
|
||||||
|
dialog.setOnShowListener {
|
||||||
|
val bottomSheet = dialog.findViewById<View>(
|
||||||
|
com.google.android.material.R.id.design_bottom_sheet
|
||||||
|
)
|
||||||
|
bottomSheet?.let {
|
||||||
|
val layoutParams = it.layoutParams
|
||||||
|
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
it.layoutParams = layoutParams
|
||||||
|
|
||||||
|
// BottomSheet를 전체 화면으로 설정
|
||||||
|
val behavior = BottomSheetBehavior.from(it)
|
||||||
|
behavior.state = BottomSheetBehavior.STATE_EXPANDED
|
||||||
|
behavior.skipCollapsed = true
|
||||||
|
behavior.isDraggable = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
binding = FragmentAudioContentPlayerBinding.inflate(
|
||||||
|
inflater,
|
||||||
|
container,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
setupView()
|
||||||
|
bindData()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupView() {
|
||||||
|
loadingDialog = LoadingDialog(requireActivity(), layoutInflater)
|
||||||
|
binding.ivClose.setOnClickListener { dismiss() }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun bindData() {
|
||||||
|
viewModel.toastLiveData.observe(viewLifecycleOwner) {
|
||||||
|
Toast.makeText(requireActivity(), it, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
viewModel.isLoading.observe(viewLifecycleOwner) {
|
||||||
|
if (it) {
|
||||||
|
loadingDialog.show(
|
||||||
|
screenWidth,
|
||||||
|
""
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
package kr.co.vividnext.sodalive.audio_content.player
|
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData
|
||||||
|
import androidx.lifecycle.MutableLiveData
|
||||||
|
import com.orhanobut.logger.Logger
|
||||||
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
|
import kr.co.vividnext.sodalive.base.BaseViewModel
|
||||||
|
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
||||||
|
|
||||||
|
class AudioContentPlayerViewModel(
|
||||||
|
private val repository: AudioContentGenerateUrlRepository
|
||||||
|
) : BaseViewModel() {
|
||||||
|
private val _toastLiveData = MutableLiveData<String?>()
|
||||||
|
val toastLiveData: LiveData<String?>
|
||||||
|
get() = _toastLiveData
|
||||||
|
|
||||||
|
private var _isLoading = MutableLiveData(false)
|
||||||
|
val isLoading: LiveData<Boolean>
|
||||||
|
get() = _isLoading
|
||||||
|
|
||||||
|
fun generateUrl(contentId: Long, onSuccess: (String) -> Unit, onFailure: () -> Unit) {
|
||||||
|
if (contentId <= 0) {
|
||||||
|
onFailure()
|
||||||
|
}
|
||||||
|
|
||||||
|
_isLoading.value = true
|
||||||
|
compositeDisposable.add(
|
||||||
|
repository.generateUrl(
|
||||||
|
contentId = contentId,
|
||||||
|
token = "Bearer ${SharedPreferenceManager.token}"
|
||||||
|
)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(
|
||||||
|
{
|
||||||
|
if (it.success && it.data != null) {
|
||||||
|
onSuccess(it.data.contentUrl)
|
||||||
|
} else {
|
||||||
|
if (it.message != null) {
|
||||||
|
_toastLiveData.postValue(it.message)
|
||||||
|
} else {
|
||||||
|
_toastLiveData.postValue(
|
||||||
|
"알 수 없는 오류가 발생했습니다. 다시 시도해 주세요."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
onFailure()
|
||||||
|
}
|
||||||
|
_isLoading.value = false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
_isLoading.value = false
|
||||||
|
it.message?.let { message -> Logger.e(message) }
|
||||||
|
_toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
|
||||||
|
onFailure()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package kr.co.vividnext.sodalive.audio_content.player
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
|
|
||||||
|
class AudioPlayer(context: Context) {
|
||||||
|
val player = ExoPlayer.Builder(context).build()
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package kr.co.vividnext.sodalive.audio_content.player
|
||||||
|
|
||||||
|
import androidx.annotation.Keep
|
||||||
|
import com.google.gson.annotations.SerializedName
|
||||||
|
|
||||||
|
@Keep
|
||||||
|
data class GenerateUrlResponse(
|
||||||
|
@SerializedName("contentUrl") val contentUrl: String
|
||||||
|
)
|
|
@ -11,6 +11,7 @@ import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import coil.load
|
import coil.load
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerFragment
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.modify.AudioContentPlaylistModifyActivity
|
import kr.co.vividnext.sodalive.audio_content.playlist.modify.AudioContentPlaylistModifyActivity
|
||||||
import kr.co.vividnext.sodalive.base.BaseActivity
|
import kr.co.vividnext.sodalive.base.BaseActivity
|
||||||
import kr.co.vividnext.sodalive.base.SodaDialog
|
import kr.co.vividnext.sodalive.base.SodaDialog
|
||||||
|
@ -31,6 +32,10 @@ class AudioContentPlaylistDetailActivity : BaseActivity<ActivityAudioContentPlay
|
||||||
|
|
||||||
private var playlistId: Long = 0
|
private var playlistId: Long = 0
|
||||||
|
|
||||||
|
private val playerFragment: AudioContentPlayerFragment by lazy {
|
||||||
|
AudioContentPlayerFragment(screenWidth, contentList)
|
||||||
|
}
|
||||||
|
|
||||||
private val modifyPlaylistResult = registerForActivityResult(
|
private val modifyPlaylistResult = registerForActivityResult(
|
||||||
ActivityResultContracts.StartActivityForResult()
|
ActivityResultContracts.StartActivityForResult()
|
||||||
) { result ->
|
) { result ->
|
||||||
|
@ -39,6 +44,8 @@ class AudioContentPlaylistDetailActivity : BaseActivity<ActivityAudioContentPlay
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val contentList = mutableListOf<AudioContentPlaylistContent>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
playlistId = intent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_PLAYLIST_ID, 0)
|
playlistId = intent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_PLAYLIST_ID, 0)
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -95,7 +102,10 @@ class AudioContentPlaylistDetailActivity : BaseActivity<ActivityAudioContentPlay
|
||||||
})
|
})
|
||||||
recyclerView.adapter = adapter
|
recyclerView.adapter = adapter
|
||||||
|
|
||||||
binding.llPlay.setOnClickListener { }
|
binding.llPlay.setOnClickListener {
|
||||||
|
if (playerFragment.isAdded) return@setOnClickListener
|
||||||
|
playerFragment.show(supportFragmentManager, playerFragment.tag)
|
||||||
|
}
|
||||||
binding.llShuffle.setOnClickListener { }
|
binding.llShuffle.setOnClickListener { }
|
||||||
binding.tvBack.setOnClickListener { finish() }
|
binding.tvBack.setOnClickListener { finish() }
|
||||||
binding.ivEdit.setOnClickListener {
|
binding.ivEdit.setOnClickListener {
|
||||||
|
@ -155,6 +165,7 @@ class AudioContentPlaylistDetailActivity : BaseActivity<ActivityAudioContentPlay
|
||||||
binding.tvContentCount.text = " ${it.contentCount}개"
|
binding.tvContentCount.text = " ${it.contentCount}개"
|
||||||
binding.tvCreateDate.text = "만든 날짜 ${it.createdDate} "
|
binding.tvCreateDate.text = "만든 날짜 ${it.createdDate} "
|
||||||
adapter.updateItems(it.contentList)
|
adapter.updateItems(it.contentList)
|
||||||
|
this.contentList.addAll(it.contentList)
|
||||||
updateCoverImageLayout(imageUrlList = it.playlistCoverImageList)
|
updateCoverImageLayout(imageUrlList = it.playlistCoverImageList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,10 @@ import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRanki
|
||||||
import kr.co.vividnext.sodalive.audio_content.main.recommend_series.AudioContentMainRecommendSeriesViewModel
|
import kr.co.vividnext.sodalive.audio_content.main.recommend_series.AudioContentMainRecommendSeriesViewModel
|
||||||
import kr.co.vividnext.sodalive.audio_content.modify.AudioContentModifyViewModel
|
import kr.co.vividnext.sodalive.audio_content.modify.AudioContentModifyViewModel
|
||||||
import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel
|
import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.AudioContentPlaylistRepository
|
import kr.co.vividnext.sodalive.audio_content.player.AudioContentGenerateUrlRepository
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerViewModel
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.AudioContentPlaylistListViewModel
|
import kr.co.vividnext.sodalive.audio_content.playlist.AudioContentPlaylistListViewModel
|
||||||
|
import kr.co.vividnext.sodalive.audio_content.playlist.AudioContentPlaylistRepository
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.PlaylistApi
|
import kr.co.vividnext.sodalive.audio_content.playlist.PlaylistApi
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.create.AudioContentPlaylistCreateViewModel
|
import kr.co.vividnext.sodalive.audio_content.playlist.create.AudioContentPlaylistCreateViewModel
|
||||||
import kr.co.vividnext.sodalive.audio_content.playlist.detail.AudioContentPlaylistDetailViewModel
|
import kr.co.vividnext.sodalive.audio_content.playlist.detail.AudioContentPlaylistDetailViewModel
|
||||||
|
@ -276,6 +278,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
|
||||||
viewModel { AudioContentPlaylistDetailViewModel(get()) }
|
viewModel { AudioContentPlaylistDetailViewModel(get()) }
|
||||||
viewModel { AudioContentPlaylistCreateViewModel(get()) }
|
viewModel { AudioContentPlaylistCreateViewModel(get()) }
|
||||||
viewModel { AudioContentPlaylistModifyViewModel(get()) }
|
viewModel { AudioContentPlaylistModifyViewModel(get()) }
|
||||||
|
viewModel { AudioContentPlayerViewModel(get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val repositoryModule = module {
|
private val repositoryModule = module {
|
||||||
|
@ -305,6 +308,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
|
||||||
factory { AlarmListRepository(get()) }
|
factory { AlarmListRepository(get()) }
|
||||||
factory { MenuConfigRepository(get()) }
|
factory { MenuConfigRepository(get()) }
|
||||||
factory { AudioContentPlaylistRepository(get()) }
|
factory { AudioContentPlaylistRepository(get()) }
|
||||||
|
factory { AudioContentGenerateUrlRepository(get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val moduleList = listOf(
|
private val moduleList = listOf(
|
||||||
|
|
|
@ -35,10 +35,10 @@
|
||||||
android:id="@+id/iv_creator_profile"
|
android:id="@+id/iv_creator_profile"
|
||||||
android:layout_width="26.7dp"
|
android:layout_width="26.7dp"
|
||||||
android:layout_height="26.7dp"
|
android:layout_height="26.7dp"
|
||||||
|
android:layout_marginTop="21dp"
|
||||||
android:contentDescription="@null"
|
android:contentDescription="@null"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/iv_creator_follow"
|
|
||||||
app:layout_constraintStart_toStartOf="@+id/tv_title"
|
app:layout_constraintStart_toStartOf="@+id/tv_title"
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_creator_follow"
|
app:layout_constraintTop_toBottomOf="@+id/tv_title"
|
||||||
tools:src="@mipmap/ic_launcher" />
|
tools:src="@mipmap/ic_launcher" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
@ -54,16 +54,6 @@
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_creator_profile"
|
app:layout_constraintTop_toTopOf="@+id/iv_creator_profile"
|
||||||
tools:text="닉네임" />
|
tools:text="닉네임" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_creator_follow"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="21dp"
|
|
||||||
android:contentDescription="@null"
|
|
||||||
android:src="@drawable/btn_follow_big"
|
|
||||||
app:layout_constraintEnd_toEndOf="@+id/tv_title"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/tv_title" />
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="240dp"
|
android:layout_width="240dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -71,7 +61,7 @@
|
||||||
app:layout_constraintBottom_toTopOf="@+id/sb_progress"
|
app:layout_constraintBottom_toTopOf="@+id/sb_progress"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/iv_creator_follow">
|
app:layout_constraintTop_toBottomOf="@+id/iv_creator_profile">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/iv_cover"
|
android:id="@+id/iv_cover"
|
||||||
|
@ -79,28 +69,6 @@
|
||||||
android:layout_height="240dp"
|
android:layout_height="240dp"
|
||||||
android:contentDescription="@null"
|
android:contentDescription="@null"
|
||||||
tools:src="@drawable/img_compleate_book" />
|
tools:src="@drawable/img_compleate_book" />
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="13.3dp"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_like_heart"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:contentDescription="@null"
|
|
||||||
android:src="@drawable/ic_heart_eee" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_comment"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="13.3dp"
|
|
||||||
android:contentDescription="@null"
|
|
||||||
android:src="@drawable/ic_message_square_eee" />
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<SeekBar
|
<SeekBar
|
||||||
|
@ -157,17 +125,6 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_prev_15"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:contentDescription="@null"
|
|
||||||
android:src="@drawable/ic_player_prev_15"
|
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/iv_play_or_pause"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/iv_play_or_pause"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/iv_skip_back"
|
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/iv_skip_forward"
|
android:id="@+id/iv_skip_forward"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -178,17 +135,6 @@
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/iv_next_15"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:contentDescription="@null"
|
|
||||||
android:src="@drawable/ic_player_next_15"
|
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/iv_play_or_pause"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/iv_skip_forward"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/iv_play_or_pause"
|
|
||||||
app:layout_constraintTop_toTopOf="@+id/iv_play_or_pause" />
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/iv_playlist"
|
android:id="@+id/iv_playlist"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|
|
@ -65,6 +65,16 @@
|
||||||
<item name="android:background">@drawable/bg_top_round_corner_16_7_222222</item>
|
<item name="android:background">@drawable/bg_top_round_corner_16_7_222222</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="FullScreenBottomSheetDialogTheme" parent="Theme.MaterialComponents.BottomSheetDialog">
|
||||||
|
<item name="bottomSheetStyle">@style/FullScreenBottomSheetStyle</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="FullScreenBottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
|
||||||
|
<item name="behavior_peekHeight">0dp</item>
|
||||||
|
<item name="android:layout_height">match_parent</item>
|
||||||
|
<item name="android:layout_width">match_parent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
<style name="AlarmDayCheckBox">
|
<style name="AlarmDayCheckBox">
|
||||||
<item name="android:button">@null</item>
|
<item name="android:button">@null</item>
|
||||||
<item name="android:background">@drawable/alarm_day_checkbox_selector</item>
|
<item name="android:background">@drawable/alarm_day_checkbox_selector</item>
|
||||||
|
|
Loading…
Reference in New Issue