Exit dialog for home screen
Update button only enabled when their is change in the full name input box in UserProfileActivity.kt MoreActivity songs list and api integration of songs and playing all songs one by one.
This commit is contained in:
@@ -48,6 +48,7 @@ import com.woka.onboard.OnboardActivity
|
||||
import com.woka.onboard.OnboardActivity.Companion.ADD_CHILD_INTENT
|
||||
import com.woka.onboard.OnboardActivity.Companion.LOG_IN_INTENT
|
||||
import com.woka.onboard.OnboardActivity.Companion.ONBOARD_ACTIVITY_INTENT
|
||||
import com.woka.shop.MyOrdersActivity
|
||||
import com.woka.utils.DecisionDialog
|
||||
import com.woka.utils.LOCALE_ENGLISH
|
||||
import com.woka.utils.LOCALE_HINDI
|
||||
@@ -128,7 +129,16 @@ class HomeActivity : WokaBaseActivity(),
|
||||
}else if (binding.bottomNav.getSelectedTab() != HOME){
|
||||
binding.bottomNav.selectTab(HOME)
|
||||
}else {
|
||||
super.onBackPressed()
|
||||
decisionDialog.title = getString(R.string.app_name_caps)
|
||||
decisionDialog.message = getString(R.string.do_you_want_to_exit_from_the_woka_app)
|
||||
|
||||
decisionDialog.setPositiveButton(getString(R.string.yes)){
|
||||
super.onBackPressed()
|
||||
}
|
||||
|
||||
decisionDialog.setNegativeButton(getString(R.string.no))
|
||||
|
||||
decisionDialog.show()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,6 +369,12 @@ class HomeActivity : WokaBaseActivity(),
|
||||
)
|
||||
}
|
||||
|
||||
sbMyOrdersCard.setOnClickListener {
|
||||
startActivity(
|
||||
Intent(this@HomeActivity, MyOrdersActivity::class.java)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@ import androidx.activity.enableEdgeToEdge
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.google.android.exoplayer2.ExoPlayer
|
||||
import androidx.recyclerview.widget.SimpleItemAnimator
|
||||
import com.google.android.exoplayer2.MediaItem
|
||||
import com.woka.R
|
||||
import com.woka.databinding.ActivityMoreHomeBinding
|
||||
import com.woka.modules.blogs.BlogsAdapter
|
||||
@@ -21,6 +22,7 @@ import com.woka.utils.hide
|
||||
import com.woka.utils.lightStatusBar
|
||||
import com.woka.utils.show
|
||||
|
||||
|
||||
class MoreHomeActivity : WokaBaseActivity() {
|
||||
|
||||
private lateinit var binding: ActivityMoreHomeBinding
|
||||
@@ -31,11 +33,9 @@ class MoreHomeActivity : WokaBaseActivity() {
|
||||
|
||||
private lateinit var songsAdapter: WokaSongsAdapter
|
||||
|
||||
private var player: ExoPlayer? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
with(window){
|
||||
with(window) {
|
||||
enterTransition = Fade()
|
||||
}
|
||||
enableEdgeToEdge()
|
||||
@@ -47,7 +47,7 @@ class MoreHomeActivity : WokaBaseActivity() {
|
||||
insets
|
||||
}
|
||||
|
||||
with(window){
|
||||
with(window) {
|
||||
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
statusBarColor = Color.TRANSPARENT
|
||||
navigationBarColor = getColor(R.color.more_bg)
|
||||
@@ -57,7 +57,7 @@ class MoreHomeActivity : WokaBaseActivity() {
|
||||
viewModel = ViewModelProvider(this)[MoreViewModel::class.java]
|
||||
|
||||
blogsAdapter = BlogsAdapter()
|
||||
songsAdapter = WokaSongsAdapter()
|
||||
songsAdapter = WokaSongsAdapter(this)
|
||||
|
||||
initViews()
|
||||
|
||||
@@ -66,6 +66,11 @@ class MoreHomeActivity : WokaBaseActivity() {
|
||||
setObservers()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
songsAdapter.releasePlayer()
|
||||
}
|
||||
|
||||
private fun clickEvents() {
|
||||
binding.apply {
|
||||
more.setOnClickListener {
|
||||
@@ -74,53 +79,68 @@ class MoreHomeActivity : WokaBaseActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun initViews(){
|
||||
private fun initViews() {
|
||||
binding.apply {
|
||||
rvBlogs.adapter = blogsAdapter
|
||||
rvWokaSongs.adapter = songsAdapter
|
||||
(rvWokaSongs.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
|
||||
}
|
||||
}
|
||||
|
||||
private fun setObservers() {
|
||||
BlogsRepository.blogsLiveData.observe(this){
|
||||
when(it){
|
||||
BlogsRepository.blogsLiveData.observe(this) {
|
||||
when (it) {
|
||||
is ApiResult.Error -> {
|
||||
binding.blogsTxt.hide()
|
||||
binding.rvBlogs.hide()
|
||||
}
|
||||
|
||||
is ApiResult.Loading -> {
|
||||
binding.blogsTxt.hide()
|
||||
binding.rvBlogs.hide()
|
||||
}
|
||||
|
||||
is ApiResult.Success -> {
|
||||
it.data?.blogs?.let {blogList ->
|
||||
it.data?.blogs?.let { blogList ->
|
||||
binding.blogsTxt.show()
|
||||
binding.rvBlogs.show()
|
||||
|
||||
blogsAdapter.submitList(blogList)
|
||||
}
|
||||
}
|
||||
|
||||
null -> {}
|
||||
}
|
||||
}
|
||||
|
||||
WokaSongsRepository.wokaSongsLiveData.observe(this){
|
||||
when(it){
|
||||
WokaSongsRepository.wokaSongsLiveData.observe(this) {
|
||||
when (it) {
|
||||
is ApiResult.Error -> {
|
||||
binding.wokaSongsTxt.hide()
|
||||
binding.rvWokaSongs.hide()
|
||||
}
|
||||
|
||||
is ApiResult.Loading -> {
|
||||
binding.wokaSongsTxt.hide()
|
||||
binding.rvWokaSongs.hide()
|
||||
}
|
||||
|
||||
is ApiResult.Success -> {
|
||||
|
||||
it.data?.paint_data?.let {songList ->
|
||||
it.data?.paint_data?.let { songList ->
|
||||
binding.wokaSongsTxt.show()
|
||||
binding.rvWokaSongs.show()
|
||||
|
||||
songsAdapter.submitList(songList)
|
||||
val mediaItems = mutableListOf<MediaItem>()
|
||||
|
||||
for (song in songList) {
|
||||
song?.content_more_details?.get(0)?.url?.let { url ->
|
||||
mediaItems.add(MediaItem.fromUri(url))
|
||||
}
|
||||
}
|
||||
|
||||
songsAdapter.submitSongList(songList, mediaItems)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@ import kotlinx.coroutines.launch
|
||||
|
||||
class ProfileViewModel: ViewModel() {
|
||||
|
||||
var currentFullName: String? = null
|
||||
|
||||
private val _updateProfileLiveData = MutableLiveData<ApiResult<Any>>()
|
||||
val updateProfileLiveData: LiveData<ApiResult<Any>>
|
||||
get() = _updateProfileLiveData
|
||||
|
||||
@@ -5,8 +5,10 @@ import android.os.Bundle
|
||||
import android.transition.Slide
|
||||
import android.view.Gravity.END
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.core.content.res.ResourcesCompat
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.widget.addTextChangedListener
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import com.bumptech.glide.Glide
|
||||
import com.woka.R
|
||||
@@ -88,6 +90,10 @@ class UserProfileActivity : WokaBaseActivity() {
|
||||
}
|
||||
|
||||
private fun setObservers() {
|
||||
binding.fullName.addTextChangedListener {
|
||||
enableUpdateBtn(viewModel.currentFullName != it.toString())
|
||||
}
|
||||
|
||||
userPrefs?.userLiveData?.observe(this){
|
||||
when(it){
|
||||
is ApiResult.Error -> {
|
||||
@@ -97,6 +103,7 @@ class UserProfileActivity : WokaBaseActivity() {
|
||||
is ApiResult.Loading -> {}
|
||||
is ApiResult.Success -> {
|
||||
it.data?.result?.let { userData ->
|
||||
viewModel.currentFullName = userData.fullname
|
||||
updateUserData(userData)
|
||||
}
|
||||
}
|
||||
@@ -162,6 +169,8 @@ class UserProfileActivity : WokaBaseActivity() {
|
||||
|
||||
birthdate.text = userData.birthdate
|
||||
|
||||
enableUpdateBtn(viewModel.currentFullName != fullName.text.toString())
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,4 +205,9 @@ class UserProfileActivity : WokaBaseActivity() {
|
||||
|
||||
selectedGender = gender
|
||||
}
|
||||
|
||||
private fun enableUpdateBtn(enable: Boolean){
|
||||
binding.update.isEnabled = enable
|
||||
binding.update.alpha = if (enable) 1f else 0.5f
|
||||
}
|
||||
}
|
||||
@@ -1,34 +1,50 @@
|
||||
package com.woka.modules.wokasongs
|
||||
|
||||
import android.content.Context
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.AsyncDifferConfig
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import androidx.recyclerview.widget.ListAdapter
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
||||
import com.google.android.exoplayer2.ExoPlayer
|
||||
import com.google.android.exoplayer2.MediaItem
|
||||
import com.google.android.exoplayer2.PlaybackException
|
||||
import com.google.android.exoplayer2.Player
|
||||
import com.woka.R
|
||||
import com.woka.databinding.WokaSongViewHolderBinding
|
||||
import com.woka.modules.wokasongs.models.SongData
|
||||
import java.util.concurrent.Executors
|
||||
import com.woka.utils.hide
|
||||
import com.woka.utils.show
|
||||
|
||||
class WokaSongsAdapter(config: AsyncDifferConfig<SongData>): ListAdapter<SongData, WokaSongsAdapter.SongViewHolder>(config) {
|
||||
class WokaSongsAdapter(context: Context): RecyclerView.Adapter<WokaSongsAdapter.SongViewHolder>() {
|
||||
|
||||
inner class SongViewHolder(val binding: WokaSongViewHolderBinding): ViewHolder(binding.root)
|
||||
|
||||
companion object{
|
||||
private val DIFF_UTILS = object : DiffUtil.ItemCallback<SongData>(){
|
||||
override fun areItemsTheSame(oldItem: SongData, newItem: SongData): Boolean =
|
||||
oldItem.id == newItem.id
|
||||
private var player: ExoPlayer
|
||||
private var currentPlayingPos = -1
|
||||
|
||||
override fun areContentsTheSame(oldItem: SongData, newItem: SongData): Boolean =
|
||||
oldItem == newItem
|
||||
}
|
||||
private var songList = mutableListOf<SongData>()
|
||||
|
||||
private val ASYNC_DIFF_CONFIG = AsyncDifferConfig.Builder(DIFF_UTILS)
|
||||
.setBackgroundThreadExecutor(Executors.newSingleThreadExecutor())
|
||||
.build()
|
||||
init {
|
||||
player = ExoPlayer.Builder(context).build()
|
||||
player.addListener(object : Player.Listener{
|
||||
override fun onEvents(player: Player, events: Player.Events) {
|
||||
super.onEvents(player, events)
|
||||
if (currentPlayingPos >= 0)
|
||||
notifyItemChanged(currentPlayingPos)
|
||||
}
|
||||
|
||||
override fun onPlayerError(error: PlaybackException) {
|
||||
super.onPlayerError(error)
|
||||
if (currentPlayingPos >= 0)
|
||||
notifyItemChanged(currentPlayingPos)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
constructor(): this(ASYNC_DIFF_CONFIG)
|
||||
fun releasePlayer(){
|
||||
player.stop()
|
||||
player.release()
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongViewHolder {
|
||||
return SongViewHolder(
|
||||
@@ -37,10 +53,76 @@ class WokaSongsAdapter(config: AsyncDifferConfig<SongData>): ListAdapter<SongDat
|
||||
)
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = songList.size
|
||||
|
||||
override fun onBindViewHolder(holder: SongViewHolder, position: Int) {
|
||||
val songData = getItem(position)
|
||||
if (position >= songList.size) return
|
||||
|
||||
val songData = songList[position]
|
||||
holder.binding.apply {
|
||||
title.text = songData.title
|
||||
totalTime.text = try {
|
||||
if (songData.song_duration?.split(":")?.get(0)?.toInt() == 0)
|
||||
songData.song_duration.substring(3)
|
||||
else
|
||||
songData.song_duration
|
||||
}catch (e: Exception){
|
||||
songData.song_duration
|
||||
}
|
||||
|
||||
root.setOnClickListener {
|
||||
if (currentPlayingPos == holder.absoluteAdapterPosition){
|
||||
if (player.isLoading){
|
||||
return@setOnClickListener
|
||||
}
|
||||
if (player.isPlaying){
|
||||
player.pause()
|
||||
}else{
|
||||
player.play()
|
||||
}
|
||||
}else{
|
||||
player.pause()
|
||||
if (currentPlayingPos >= 0) notifyItemChanged(currentPlayingPos)
|
||||
|
||||
currentPlayingPos = holder.absoluteAdapterPosition
|
||||
|
||||
player.seekTo(holder.absoluteAdapterPosition, 0)
|
||||
player.play()
|
||||
}
|
||||
}
|
||||
|
||||
if (currentPlayingPos == holder.absoluteAdapterPosition){
|
||||
if (player.isLoading){
|
||||
progressBar.show()
|
||||
playBtn.hide()
|
||||
}else if (player.isPlaying){
|
||||
progressBar.hide()
|
||||
playBtn.show()
|
||||
playBtn.setImageResource(R.drawable.ic_pause)
|
||||
}else{
|
||||
progressBar.hide()
|
||||
playBtn.show()
|
||||
playBtn.setImageResource(R.drawable.ic_play)
|
||||
}
|
||||
}else{
|
||||
progressBar.hide()
|
||||
playBtn.show()
|
||||
playBtn.setImageResource(R.drawable.ic_play)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun submitSongList(list: List<SongData?>, mediaItems: MutableList<MediaItem>) {
|
||||
songList.clear()
|
||||
for (song in list){
|
||||
song?.let {
|
||||
songList.add(it)
|
||||
}
|
||||
}
|
||||
|
||||
player.addMediaItems(mediaItems)
|
||||
player.prepare()
|
||||
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
41
app/src/main/java/com/woka/shop/MyOrdersActivity.kt
Normal file
41
app/src/main/java/com/woka/shop/MyOrdersActivity.kt
Normal file
@@ -0,0 +1,41 @@
|
||||
package com.woka.shop
|
||||
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import com.woka.R
|
||||
import com.woka.databinding.ActivityMyOrdersBinding
|
||||
import com.woka.utils.WokaBaseActivity
|
||||
import com.woka.utils.lightStatusBar
|
||||
|
||||
class MyOrdersActivity : WokaBaseActivity() {
|
||||
|
||||
private lateinit var binding: ActivityMyOrdersBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
binding = ActivityMyOrdersBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
||||
insets
|
||||
}
|
||||
|
||||
window.navigationBarColor = getColor(R.color.my_orders_img_color)
|
||||
window.lightStatusBar(true)
|
||||
|
||||
clickEvents()
|
||||
}
|
||||
|
||||
private fun clickEvents() {
|
||||
binding.apply {
|
||||
backBtn.setOnClickListener {
|
||||
onBackPressedDispatcher.onBackPressed()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user